Skip to content

Commit ffd528e

Browse files
jeremy-davis-sonarsourcesonartech
authored andcommitted
SONAR-25494 Downloading logs in DCE has the wrong extension (#3501)
GitOrigin-RevId: e1f59dc31e814651dea56ecfceb8b7a08e27f8e8
1 parent eda2fb2 commit ffd528e

File tree

1 file changed

+103
-102
lines changed

1 file changed

+103
-102
lines changed

apps/sq-server/src/main/js/apps/system/components/PageActions.tsx

Lines changed: 103 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919
*/
2020

2121
import { 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';
2324
import { 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';
2526
import { getBaseUrl } from '~sq-server-commons/helpers/system';
27+
import { EditionKey } from '~sq-server-commons/types/editions';
2628
import { getFileNameSuffix } from '../utils';
2729
import 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

Comments
 (0)