1919 */
2020
2121import { Button , ButtonIcon , ButtonVariety , IconEdit } from '@sonarsource/echoes-react' ;
22- import * as React from 'react' ;
22+ import { useCallback , useState } from 'react' ;
23+ import { FormattedMessage , useIntl } from 'react-intl' ;
2324import { ChevronDownIcon , Dropdown , ItemDownload } from '~design-system' ;
24- import { translate } from '~sq-server-commons/helpers/l10n ' ;
25+ import { useAppState } from '~sq-server-commons/context/app-state/withAppStateContext ' ;
2526import { getBaseUrl } from '~sq-server-commons/helpers/system' ;
27+ import { EditionKey } from '~sq-server-commons/types/editions' ;
2628import { getFileNameSuffix } from '../utils' ;
2729import ChangeLogLevelForm from './ChangeLogLevelForm' ;
2830
@@ -33,116 +35,115 @@ interface Props {
3335 serverId ?: string ;
3436}
3537
36- interface State {
37- openLogsLevelForm : boolean ;
38- }
38+ export default function PageActions ( props : Props ) {
39+ const { cluster, logLevel, onLogLevelChange, serverId } = props ;
3940
40- export default class PageActions extends React . PureComponent < Props , State > {
41- constructor ( props : Props ) {
42- super ( props ) ;
43- this . state = {
44- openLogsLevelForm : false ,
45- } ;
46- }
41+ const [ openLogsLevelForm , setOpenLogsLevelForm ] = useState ( false ) ;
42+ const { edition } = useAppState ( ) ;
43+ const intl = useIntl ( ) ;
4744
48- handleLogsLevelOpen = ( ) => {
49- this . setState ( { openLogsLevelForm : true } ) ;
50- } ;
45+ const handleLogsLevelOpen = useCallback ( ( ) => {
46+ setOpenLogsLevelForm ( true ) ;
47+ } , [ ] ) ;
5148
52- handleLogsLevelChange = ( ) => {
53- this . props . onLogLevelChange ( ) ;
54- this . handleLogsLevelClose ( ) ;
55- } ;
49+ const handleLogsLevelClose = useCallback ( ( ) => {
50+ setOpenLogsLevelForm ( false ) ;
51+ } , [ ] ) ;
5652
57- handleLogsLevelClose = ( ) => {
58- this . setState ( { openLogsLevelForm : false } ) ;
59- } ;
53+ const handleLogsLevelChange = useCallback ( ( ) => {
54+ onLogLevelChange ( ) ;
55+ handleLogsLevelClose ( ) ;
56+ } , [ handleLogsLevelClose , onLogLevelChange ] ) ;
6057
61- removeElementFocus = ( event : React . SyntheticEvent < HTMLElement > ) => {
58+ const removeElementFocus = useCallback ( ( event : React . SyntheticEvent < HTMLElement > ) => {
6259 event . currentTarget . blur ( ) ;
63- } ;
64-
65- render ( ) {
66- const infoUrl = getBaseUrl ( ) + '/api/system/info' ;
67- const logsUrl = getBaseUrl ( ) + '/api/system/logs' ;
68- return (
69- < div className = "sw-flex sw-items-center sw-gap-2" >
70- < div className = "sw-flex sw-items-center" >
71- < span >
72- { translate ( 'system.logs_level' ) }
73- { ': ' }
74- < strong > { this . props . logLevel } </ strong >
75- </ span >
76- < ButtonIcon
77- Icon = { IconEdit }
78- ariaLabel = { translate ( 'system.logs_level.change' ) }
79- className = "sw-ml-1"
80- id = "edit-logs-level-button"
81- onClick = { this . handleLogsLevelOpen }
82- variety = { ButtonVariety . DefaultGhost }
83- />
84- </ div >
85-
86- < Dropdown
87- id = "system-logs-download"
88- overlay = {
89- < >
90- < ItemDownload download = "sonarqube_app.log" href = { logsUrl + '?name=app' } >
91- Main Process
92- </ ItemDownload >
93- < ItemDownload download = "sonarqube_ce.log" href = { logsUrl + '?name=ce' } >
94- Compute Engine
95- </ ItemDownload >
60+ } , [ ] ) ;
9661
97- { ! this . props . cluster && (
98- < ItemDownload download = "sonarqube_es.log" href = { logsUrl + '?name=es' } >
99- Search Engine
100- </ ItemDownload >
101- ) }
62+ const infoUrl = getBaseUrl ( ) + '/api/system/info' ;
63+ const logsUrl = getBaseUrl ( ) + '/api/system/logs' ;
10264
103- < ItemDownload download = "sonarqube_web.log" href = { logsUrl + '?name=web' } >
104- Web Server
105- </ ItemDownload >
65+ const filenameTemplate = useCallback (
66+ ( name : string ) => `sonarqube_${ name } .${ edition === EditionKey . datacenter ? 'zip' : 'log' } ` ,
67+ [ edition ] ,
68+ ) ;
10669
107- < ItemDownload download = "sonarqube_access.log" href = { logsUrl + '?name=access' } >
108- Access Logs
109- </ ItemDownload >
70+ return (
71+ < div className = "sw-flex sw-items-center sw-gap-2" >
72+ < div className = "sw-flex sw-items-center" >
73+ < span >
74+ < FormattedMessage id = "system.logs_level" />
75+ { ': ' }
76+ < strong > { logLevel } </ strong >
77+ </ span >
78+ < ButtonIcon
79+ Icon = { IconEdit }
80+ ariaLabel = { intl . formatMessage ( { id : 'system.logs_level.change' } ) }
81+ className = "sw-ml-1"
82+ id = "edit-logs-level-button"
83+ onClick = { handleLogsLevelOpen }
84+ variety = { ButtonVariety . DefaultGhost }
85+ />
86+ </ div >
87+
88+ < Dropdown
89+ id = "system-logs-download"
90+ overlay = {
91+ < >
92+ < ItemDownload download = { filenameTemplate ( 'app' ) } href = { logsUrl + '?name=app' } >
93+ Main Process
94+ </ ItemDownload >
95+ < ItemDownload download = { filenameTemplate ( 'ce' ) } href = { logsUrl + '?name=ce' } >
96+ Compute Engine
97+ </ ItemDownload >
11098
111- < ItemDownload
112- download = "sonarqube_deprecation.log"
113- href = { logsUrl + '?name=deprecation' }
114- >
115- Deprecation Logs
99+ { ! cluster && (
100+ < ItemDownload download = { filenameTemplate ( 'es' ) } href = { logsUrl + '?name=es' } >
101+ Search Engine
116102 </ ItemDownload >
117- </ >
118- }
119- >
120- < Button variety = { ButtonVariety . Primary } >
121- { translate ( 'system.download_logs' ) }
122- < ChevronDownIcon className = "sw-ml-1" />
123- </ Button >
124- </ Dropdown >
125-
126- < Button
127- download = { `sonarqube-system-info-${ getFileNameSuffix ( this . props . serverId ) } .json` }
128- id = "download-link"
129- onClick = { this . removeElementFocus }
130- to = { infoUrl }
131- variety = { ButtonVariety . Primary }
132- >
133- { translate ( 'system.download_system_info' ) }
134- </ Button >
135- { this . state . openLogsLevelForm && (
136- < ChangeLogLevelForm
137- infoMsg = { translate (
138- this . props . cluster ? 'system.cluster_log_level.info' : 'system.log_level.info' ,
139103 ) }
140- logLevel = { this . props . logLevel }
141- onChange = { this . handleLogsLevelChange }
142- onClose = { this . handleLogsLevelClose }
143- />
144- ) }
145- </ div >
146- ) ;
147- }
104+
105+ < ItemDownload download = { filenameTemplate ( 'web' ) } href = { logsUrl + '?name=web' } >
106+ Web Server
107+ </ ItemDownload >
108+
109+ < ItemDownload download = { filenameTemplate ( 'access' ) } href = { logsUrl + '?name=access' } >
110+ Access Logs
111+ </ ItemDownload >
112+
113+ < ItemDownload
114+ download = { filenameTemplate ( 'deprecation' ) }
115+ href = { logsUrl + '?name=deprecation' }
116+ >
117+ Deprecation Logs
118+ </ ItemDownload >
119+ </ >
120+ }
121+ >
122+ < Button variety = { ButtonVariety . Primary } >
123+ < FormattedMessage id = "system.download_logs" />
124+ < ChevronDownIcon className = "sw-ml-1" />
125+ </ Button >
126+ </ Dropdown >
127+
128+ < Button
129+ download = { `sonarqube-system-info-${ getFileNameSuffix ( serverId ) } .json` }
130+ id = "download-link"
131+ onClick = { removeElementFocus }
132+ to = { infoUrl }
133+ variety = { ButtonVariety . Primary }
134+ >
135+ < FormattedMessage id = "system.download_system_info" />
136+ </ Button >
137+ { openLogsLevelForm && (
138+ < ChangeLogLevelForm
139+ infoMsg = { intl . formatMessage ( {
140+ id : cluster ? 'system.cluster_log_level.info' : 'system.log_level.info' ,
141+ } ) }
142+ logLevel = { logLevel }
143+ onChange = { handleLogsLevelChange }
144+ onClose = { handleLogsLevelClose }
145+ />
146+ ) }
147+ </ div >
148+ ) ;
148149}
0 commit comments