aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/components
diff options
context:
space:
mode:
Diffstat (limited to 'server/sonar-web/src/main/js/components')
-rw-r--r--server/sonar-web/src/main/js/components/shared/AppVersionStatus.tsx48
-rw-r--r--server/sonar-web/src/main/js/components/shared/__tests__/AppVersionStatus-test.tsx50
2 files changed, 98 insertions, 0 deletions
diff --git a/server/sonar-web/src/main/js/components/shared/AppVersionStatus.tsx b/server/sonar-web/src/main/js/components/shared/AppVersionStatus.tsx
new file mode 100644
index 00000000000..91e961695e7
--- /dev/null
+++ b/server/sonar-web/src/main/js/components/shared/AppVersionStatus.tsx
@@ -0,0 +1,48 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+import * as React from 'react';
+import { FormattedMessage } from 'react-intl';
+import { useAppState } from '../../app/components/app-state/withAppStateContext';
+import { now, parseDate } from '../../helpers/dates';
+import { translate } from '../../helpers/l10n';
+import DocLink from '../common/DocLink';
+
+export default function AppVersionStatus() {
+ const { version, versionEOL } = useAppState();
+ const isActive = parseDate(versionEOL) > now();
+
+ return (
+ <FormattedMessage
+ id="footer.version"
+ defaultMessage={translate('footer.version')}
+ values={{
+ version,
+ status: (
+ <DocLink
+ to="/setup-and-upgrade/upgrade-the-server/active-versions/"
+ className="little-spacer-left"
+ >
+ {translate(`footer.version.status.${isActive ? 'active' : 'inactive'}`)}
+ </DocLink>
+ ),
+ }}
+ />
+ );
+}
diff --git a/server/sonar-web/src/main/js/components/shared/__tests__/AppVersionStatus-test.tsx b/server/sonar-web/src/main/js/components/shared/__tests__/AppVersionStatus-test.tsx
new file mode 100644
index 00000000000..f60dba440bb
--- /dev/null
+++ b/server/sonar-web/src/main/js/components/shared/__tests__/AppVersionStatus-test.tsx
@@ -0,0 +1,50 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+import { screen } from '@testing-library/react';
+import React from 'react';
+import AppStateContextProvider from '../../../app/components/app-state/AppStateContextProvider';
+import AppVersionStatus from '../../../components/shared/AppVersionStatus';
+import { mockAppState } from '../../../helpers/testMocks';
+import { renderComponent } from '../../../helpers/testReactTestingUtils';
+
+jest.mock('../../../helpers/dates', () => ({
+ ...jest.requireActual('../../../helpers/dates'),
+ now: () => new Date('2022-01-01'),
+}));
+
+it('should render active version if it has not reached EOL', () => {
+ renderAppVersionStatus(mockAppState({ versionEOL: '2022-01-02' }));
+
+ expect(screen.getByRole('link', { name: /footer.version.status.active/ })).toBeInTheDocument();
+});
+
+it('should render inactive version if it has reached EOL', () => {
+ renderAppVersionStatus(mockAppState({ versionEOL: '2021-12-30' }));
+
+ expect(screen.getByRole('link', { name: /footer.version.status.inactive/ })).toBeInTheDocument();
+});
+
+const renderAppVersionStatus = (appState = mockAppState()) => {
+ return renderComponent(
+ <AppStateContextProvider appState={appState}>
+ <AppVersionStatus />
+ </AppStateContextProvider>
+ );
+};