]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-22049 Align the usage of withRouter high order component
authorIsmail Cherri <ismail.cherri@sonarsource.com>
Mon, 22 Apr 2024 16:02:41 +0000 (18:02 +0200)
committerMatteo Mara <matteo.mara@sonarsource.com>
Tue, 30 Apr 2024 08:59:03 +0000 (10:59 +0200)
158 files changed:
server/sonar-web/src/main/js/app/components/ComponentContainer.tsx
server/sonar-web/src/main/js/app/components/PageTracker.tsx
server/sonar-web/src/main/js/app/components/PluginRiskConsent.tsx
server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx
server/sonar-web/src/main/js/app/components/app-state/withAppStateContext.tsx
server/sonar-web/src/main/js/app/components/available-features/withAvailableFeatures.tsx
server/sonar-web/src/main/js/app/components/componentContext/withComponentContext.tsx
server/sonar-web/src/main/js/app/components/current-user/withCurrentUserContext.tsx
server/sonar-web/src/main/js/app/components/extensions/Extension.tsx
server/sonar-web/src/main/js/app/components/global-search/GlobalSearch.tsx
server/sonar-web/src/main/js/app/components/indexation/IndexationNotificationRenderer.tsx
server/sonar-web/src/main/js/app/components/languages/withLanguagesContext.tsx
server/sonar-web/src/main/js/app/components/metrics/withMetricsContext.tsx
server/sonar-web/src/main/js/app/components/nav/component/Menu.tsx
server/sonar-web/src/main/js/app/components/nav/component/branch-like/Menu.tsx
server/sonar-web/src/main/js/apps/audit-logs/components/AuditAppRenderer.tsx
server/sonar-web/src/main/js/apps/background-tasks/components/BackgroundTasksApp.tsx
server/sonar-web/src/main/js/apps/change-admin-password/ChangeAdminPasswordApp.tsx
server/sonar-web/src/main/js/apps/change-admin-password/ChangeAdminPasswordAppRenderer.tsx
server/sonar-web/src/main/js/apps/code/components/CodeApp.tsx
server/sonar-web/src/main/js/apps/code/components/CodeAppRenderer.tsx
server/sonar-web/src/main/js/apps/code/components/ComponentName.tsx
server/sonar-web/src/main/js/apps/code/components/Search.tsx
server/sonar-web/src/main/js/apps/code/components/SourceViewerWrapper.tsx
server/sonar-web/src/main/js/apps/coding-rules/components/CodingRulesApp.tsx
server/sonar-web/src/main/js/apps/coding-rules/query.ts
server/sonar-web/src/main/js/apps/coding-rules/routes.tsx
server/sonar-web/src/main/js/apps/component-measures/components/ComponentMeasuresApp.tsx
server/sonar-web/src/main/js/apps/component-measures/components/MeasureContent.tsx
server/sonar-web/src/main/js/apps/component-measures/components/MeasureOverviewContainer.tsx
server/sonar-web/src/main/js/apps/component-measures/routes.tsx
server/sonar-web/src/main/js/apps/component-measures/utils.ts
server/sonar-web/src/main/js/apps/create/project/Azure/AzureProjectAccordion.tsx
server/sonar-web/src/main/js/apps/create/project/Azure/AzureProjectCreate.tsx
server/sonar-web/src/main/js/apps/create/project/Azure/AzureProjectCreateRenderer.tsx
server/sonar-web/src/main/js/apps/create/project/Azure/AzureProjectsList.tsx
server/sonar-web/src/main/js/apps/create/project/BitbucketCloud/BitbucketCloudProjectCreate.tsx
server/sonar-web/src/main/js/apps/create/project/BitbucketCloud/BitbucketCloudProjectCreateRender.tsx
server/sonar-web/src/main/js/apps/create/project/BitbucketCloud/BitbucketCloudSearchForm.tsx
server/sonar-web/src/main/js/apps/create/project/BitbucketServer/BitbucketImportRepositoryForm.tsx
server/sonar-web/src/main/js/apps/create/project/BitbucketServer/BitbucketProjectAccordion.tsx
server/sonar-web/src/main/js/apps/create/project/BitbucketServer/BitbucketProjectCreate.tsx
server/sonar-web/src/main/js/apps/create/project/CreateProjectPage.tsx
server/sonar-web/src/main/js/apps/create/project/Github/GitHubProjectCreate.tsx
server/sonar-web/src/main/js/apps/create/project/Github/GitHubProjectCreateRenderer.tsx
server/sonar-web/src/main/js/apps/create/project/Gitlab/GitlabProjectCreate.tsx
server/sonar-web/src/main/js/apps/create/project/Gitlab/GitlabProjectCreateRenderer.tsx
server/sonar-web/src/main/js/apps/create/project/Gitlab/GitlabProjectSelectionForm.tsx
server/sonar-web/src/main/js/apps/create/project/components/NewCodeDefinitionSelection.tsx
server/sonar-web/src/main/js/apps/create/project/monorepo/MonorepoProjectCreate.tsx
server/sonar-web/src/main/js/apps/create/project/monorepo/MonorepoProjectHeader.tsx
server/sonar-web/src/main/js/apps/create/project/useProjectCreate.tsx
server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx
server/sonar-web/src/main/js/apps/issues/sidebar/ListStyleFacet.tsx
server/sonar-web/src/main/js/apps/issues/utils.ts
server/sonar-web/src/main/js/apps/marketplace/App.tsx
server/sonar-web/src/main/js/apps/marketplace/MarketplaceAppContainer.tsx
server/sonar-web/src/main/js/apps/marketplace/utils.ts
server/sonar-web/src/main/js/apps/overview/branches/BranchOverviewRenderer.tsx
server/sonar-web/src/main/js/apps/overview/branches/FirstAnalysisNextStepsNotif.tsx
server/sonar-web/src/main/js/apps/overview/branches/MeasuresPanelNoNewCode.tsx
server/sonar-web/src/main/js/apps/overview/utils.tsx
server/sonar-web/src/main/js/apps/permission-templates/components/ActionsCell.tsx
server/sonar-web/src/main/js/apps/permission-templates/components/Header.tsx
server/sonar-web/src/main/js/apps/permission-templates/components/NameCell.tsx
server/sonar-web/src/main/js/apps/permission-templates/components/PermissionTemplatesApp.tsx
server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityApp.tsx
server/sonar-web/src/main/js/apps/projectActivity/utils.ts
server/sonar-web/src/main/js/apps/projectDeletion/Form.tsx
server/sonar-web/src/main/js/apps/projectInformation/badges/__tests__/utils-test.ts
server/sonar-web/src/main/js/apps/projectKey/ProjectKeyApp.tsx
server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx
server/sonar-web/src/main/js/apps/projects/components/ApplicationCreation.tsx
server/sonar-web/src/main/js/apps/projects/components/DefaultPageSelector.tsx
server/sonar-web/src/main/js/apps/projects/components/EmptyFavoriteSearch.tsx
server/sonar-web/src/main/js/apps/projects/components/EmptyInstance.tsx
server/sonar-web/src/main/js/apps/projects/components/FavoriteFilter.tsx
server/sonar-web/src/main/js/apps/projects/components/PageHeader.tsx
server/sonar-web/src/main/js/apps/projects/components/PageSidebar.tsx
server/sonar-web/src/main/js/apps/projects/components/ProjectCreationMenuItem.tsx
server/sonar-web/src/main/js/apps/projects/components/__tests__/CreateApplication-test.tsx
server/sonar-web/src/main/js/apps/projects/components/__tests__/DefaultPageSelector-test.tsx
server/sonar-web/src/main/js/apps/projects/filters/CoverageFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/DuplicationsFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/LanguagesFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/MaintainabilityFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/NewLinesFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/NewMaintainabilityFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/NewReliabilityFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/NewSecurityFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/QualifierFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/QualityGateFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/RangeFacetBase.tsx
server/sonar-web/src/main/js/apps/projects/filters/RatingFacet.tsx
server/sonar-web/src/main/js/apps/projects/filters/ReliabilityFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/SecurityFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/SecurityReviewFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/SizeFilter.tsx
server/sonar-web/src/main/js/apps/projects/filters/TagsFilter.tsx
server/sonar-web/src/main/js/apps/projects/query.ts
server/sonar-web/src/main/js/apps/quality-gates/components/CopyQualityGateForm.tsx
server/sonar-web/src/main/js/apps/quality-gates/components/CreateQualityGateForm.tsx
server/sonar-web/src/main/js/apps/quality-gates/components/DeleteQualityGateForm.tsx
server/sonar-web/src/main/js/apps/quality-gates/components/RenameQualityGateForm.tsx
server/sonar-web/src/main/js/apps/quality-profiles/changelog/ChangelogContainer.tsx
server/sonar-web/src/main/js/apps/quality-profiles/compare/ComparisonContainer.tsx
server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileActions.tsx
server/sonar-web/src/main/js/apps/quality-profiles/components/ProfileContainer.tsx
server/sonar-web/src/main/js/apps/quality-profiles/details/ProfileHeader.tsx
server/sonar-web/src/main/js/apps/quality-profiles/home/CreateProfileForm.tsx
server/sonar-web/src/main/js/apps/quality-profiles/home/LanguageSelect.tsx
server/sonar-web/src/main/js/apps/quality-profiles/home/PageHeader.tsx
server/sonar-web/src/main/js/apps/quality-profiles/qualityProfilesContext.tsx
server/sonar-web/src/main/js/apps/quality-profiles/utils.ts
server/sonar-web/src/main/js/apps/security-hotspots/SecurityHotspotsApp.tsx
server/sonar-web/src/main/js/apps/sessions/components/Login.tsx
server/sonar-web/src/main/js/apps/sessions/components/LoginContainer.tsx
server/sonar-web/src/main/js/apps/settings/components/Languages.tsx
server/sonar-web/src/main/js/apps/settings/components/SettingsAppRenderer.tsx
server/sonar-web/src/main/js/apps/settings/components/SettingsSearch.tsx
server/sonar-web/src/main/js/apps/settings/components/SubCategoryDefinitionsList.tsx
server/sonar-web/src/main/js/apps/settings/components/almIntegration/AlmIntegration.tsx
server/sonar-web/src/main/js/apps/settings/components/authentication/Authentication.tsx
server/sonar-web/src/main/js/apps/system/components/SystemApp.tsx
server/sonar-web/src/main/js/apps/system/utils.ts
server/sonar-web/src/main/js/apps/users/utils.ts
server/sonar-web/src/main/js/apps/web-api/components/Action.tsx
server/sonar-web/src/main/js/apps/web-api/components/Menu.tsx
server/sonar-web/src/main/js/apps/web-api/components/WebApiApp.tsx
server/sonar-web/src/main/js/apps/web-api/utils.ts
server/sonar-web/src/main/js/components/SourceViewer/helpers/loadIssues.ts
server/sonar-web/src/main/js/components/hoc/__tests__/utils-test.ts [deleted file]
server/sonar-web/src/main/js/components/hoc/utils.ts [deleted file]
server/sonar-web/src/main/js/components/hoc/whenLoggedIn.tsx
server/sonar-web/src/main/js/components/hoc/withCLanguageFeature.tsx
server/sonar-web/src/main/js/components/hoc/withIndexationContext.tsx
server/sonar-web/src/main/js/components/hoc/withKeyboardNavigation.tsx
server/sonar-web/src/main/js/components/hoc/withNotifications.tsx
server/sonar-web/src/main/js/components/hoc/withRouter.tsx [deleted file]
server/sonar-web/src/main/js/components/hoc/withScrollTo.tsx
server/sonar-web/src/main/js/components/issue/components/IssueMessage.tsx
server/sonar-web/src/main/js/components/new-code-definition/NCDAutoUpdateMessage.tsx
server/sonar-web/src/main/js/components/tutorials/TutorialSelection.tsx
server/sonar-web/src/main/js/helpers/__tests__/urls-test.ts
server/sonar-web/src/main/js/helpers/query.ts
server/sonar-web/src/main/js/helpers/testMocks.ts
server/sonar-web/src/main/js/helpers/testReactTestingUtils.tsx
server/sonar-web/src/main/js/helpers/urls.ts
server/sonar-web/src/main/js/queries/branch.tsx
server/sonar-web/src/main/js/sonar-aligned/components/hoc/__tests__/utils-test.ts [new file with mode: 0644]
server/sonar-web/src/main/js/sonar-aligned/components/hoc/utils.ts [new file with mode: 0644]
server/sonar-web/src/main/js/sonar-aligned/components/hoc/withRouter.tsx [new file with mode: 0644]
server/sonar-web/src/main/js/sonar-aligned/helpers/__tests__/urls-test.ts [new file with mode: 0644]
server/sonar-web/src/main/js/sonar-aligned/helpers/router.ts [new file with mode: 0644]
server/sonar-web/src/main/js/sonar-aligned/helpers/urls.ts
server/sonar-web/src/main/js/sonar-aligned/types/router.ts [new file with mode: 0644]
server/sonar-web/src/main/js/types/extension.ts
server/sonar-web/src/main/js/types/types.ts

index b8edf5e2c4d48c055cf9a758d097fc2ac85ff7b9..0e96137e0bedec2ade060434db03968391f94942 100644 (file)
@@ -23,11 +23,11 @@ import * as React from 'react';
 import { createPortal } from 'react-dom';
 import { Helmet } from 'react-helmet-async';
 import { Outlet } from 'react-router-dom';
+import { useLocation, useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { validateProjectAlmBinding } from '../../api/alm-settings';
 import { getTasksForComponent } from '../../api/ce';
 import { getComponentData } from '../../api/components';
 import { getComponentNavigation } from '../../api/navigation';
-import { useLocation, useRouter } from '../../components/hoc/withRouter';
 import { translateWithParameters } from '../../helpers/l10n';
 import { HttpStatus } from '../../helpers/request';
 import { getPortfolioUrl, getProjectUrl, getPullRequestUrl } from '../../helpers/urls';
index 65c341f9b70d7fb2f1e6341a2aab2cbf6d2d3fce..94a20c98e3c0200f3b25453dbacb619f74506592 100644 (file)
@@ -19,7 +19,8 @@
  */
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
-import { Location, withRouter } from '../../components/hoc/withRouter';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import { installScript } from '../../helpers/extensions';
 import { getWebAnalyticsPageHandlerFromCache } from '../../helpers/extensionsHandler';
 import { getInstance } from '../../helpers/system';
index 3d781f422f23013cb8126c4b98ffed7dbab9f30b..01e8dd143d6e9c551c85f12052bad5790568c456 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-
 import { ButtonPrimary, Card, CenteredLayout, Title } from 'design-system';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Router } from '~sonar-aligned/types/router';
 import { setSimpleSettingValue } from '../../api/settings';
 import { whenLoggedIn } from '../../components/hoc/whenLoggedIn';
-import { Router, withRouter } from '../../components/hoc/withRouter';
 import { translate } from '../../helpers/l10n';
 import { getBaseUrl } from '../../helpers/system';
 import { hasGlobalPermission } from '../../helpers/users';
index dc1f1781e7e19afe9773c44dcc7732c5a21977ae..c617493d56d6d3c6452ec010ce5ca62b9aaab941 100644 (file)
@@ -21,11 +21,11 @@ import { screen, waitFor } from '@testing-library/react';
 import userEvent from '@testing-library/user-event';
 import React, { useContext } from 'react';
 import { Route } from 'react-router-dom';
+import * as withRouter from '~sonar-aligned/components/hoc/withRouter';
 import { validateProjectAlmBinding } from '../../../api/alm-settings';
 import { getTasksForComponent } from '../../../api/ce';
 import { getComponentData } from '../../../api/components';
 import { getComponentNavigation } from '../../../api/navigation';
-import * as withRouter from '../../../components/hoc/withRouter';
 import { mockProjectAlmBindingConfigurationErrors } from '../../../helpers/mocks/alm-settings';
 import { mockBranch, mockPullRequest } from '../../../helpers/mocks/branch-like';
 import { mockComponent } from '../../../helpers/mocks/component';
@@ -72,9 +72,9 @@ jest.mock('../../utils/handleRequiredAuthorization', () => ({
   default: jest.fn(),
 }));
 
-jest.mock('../../../components/hoc/withRouter', () => ({
+jest.mock('~sonar-aligned/components/hoc/withRouter', () => ({
   __esModule: true,
-  ...jest.requireActual('../../../components/hoc/withRouter'),
+  ...jest.requireActual('~sonar-aligned/components/hoc/withRouter'),
 }));
 
 const ui = {
@@ -466,6 +466,9 @@ describe('tutorials', () => {
     jest.spyOn(withRouter, 'useRouter').mockReturnValue({
       replace: mockedReplace,
       push: jest.fn(),
+      navigate: jest.fn(),
+      searchParams: new URLSearchParams(),
+      setSearchParams: jest.fn(),
     });
 
     renderComponentContainer(
@@ -515,6 +518,9 @@ describe('tutorials', () => {
     jest.spyOn(withRouter, 'useRouter').mockReturnValue({
       replace: mockedReplace,
       push: jest.fn(),
+      navigate: jest.fn(),
+      searchParams: new URLSearchParams(),
+      setSearchParams: jest.fn(),
     });
 
     jest.useFakeTimers();
@@ -568,6 +574,9 @@ describe('tutorials', () => {
     jest.spyOn(withRouter, 'useRouter').mockReturnValue({
       replace: mockedReplace,
       push: jest.fn(),
+      navigate: jest.fn(),
+      searchParams: new URLSearchParams(),
+      setSearchParams: jest.fn(),
     });
 
     jest.useFakeTimers();
index b1236d9bc1efe3f2968700a10ae176825ff2cca6..811c6b249b0fad48497c7ad1d398a2e8136da175 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { getWrappedDisplayName } from '../../../components/hoc/utils';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { AppState } from '../../../types/appstate';
 import { AppStateContext } from './AppStateContext';
 
index 96e4d17232e0898363f7ddb3be47a821d1a08e4f..36355f33366555c9295927b3caab0e555353b8a5 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { getWrappedDisplayName } from '../../../components/hoc/utils';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { Feature } from '../../../types/features';
 import { AvailableFeaturesContext } from './AvailableFeaturesContext';
 
index 5fc508076e6ca633551f8ad63ea9c88340e6e20b..c2b4a9acce78045da4c8eb7e9b5d26e190b8f351 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { getWrappedDisplayName } from '../../../components/hoc/utils';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { ComponentContextShape, ComponentQualifier } from '../../../types/component';
 import { ComponentContext } from './ComponentContext';
 
index 5e8fa2ff2f60f85db5a3feea040707282696da60..f5643d57cfde21f46ac1798efab97d112874b2c7 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { getWrappedDisplayName } from '../../../components/hoc/utils';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { CurrentUserContext, CurrentUserContextInterface } from './CurrentUserContext';
 
 export default function withCurrentUserContext<P>(
index 92941228fff9dec1597df8f5d203458ab04f1127..99ecd9893e47fed4d1399c6729ad846990e25cff 100644 (file)
@@ -17,7 +17,6 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-
 import { withTheme } from '@emotion/react';
 import { QueryClient } from '@tanstack/react-query';
 import { addGlobalErrorMessage, Theme } from 'design-system';
@@ -25,7 +24,8 @@ import { isEqual } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
 import { injectIntl, WrappedComponentProps } from 'react-intl';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { getExtensionStart } from '../../../helpers/extensions';
 import { translate } from '../../../helpers/l10n';
 import { getCurrentL10nBundle } from '../../../helpers/l10nBundle';
index f614f5314c653891a8b235e66c6d29b63f014920..be60a163d75e2892932c0b752063d5062211360a 100644 (file)
@@ -29,11 +29,12 @@ import {
 } from 'design-system';
 import { debounce, uniqBy } from 'lodash';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Router } from '~sonar-aligned/types/router';
 import { getSuggestions } from '../../../api/components';
 import FocusOutHandler from '../../../components/controls/FocusOutHandler';
 import OutsideClickHandler from '../../../components/controls/OutsideClickHandler';
 import Tooltip from '../../../components/controls/Tooltip';
-import { Router, withRouter } from '../../../components/hoc/withRouter';
 import { PopupPlacement } from '../../../components/ui/popups';
 import { isInput, isShortcut } from '../../../helpers/keyboardEventHelpers';
 import { KeyboardKeys } from '../../../helpers/keycodes';
index 5bb714c9697e2e6261776d74ccb2418955331fb4..36d70efcb954ac028c2aef64cd86b498a076847f 100644 (file)
@@ -18,7 +18,6 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 /* eslint-disable react/no-unused-prop-types */
-
 import styled from '@emotion/styled';
 import {
   FlagErrorIcon,
@@ -32,9 +31,9 @@ import {
 } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import DocumentationLink from '../../../components/common/DocumentationLink';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
-import { queryToSearch } from '../../../helpers/urls';
 import { IndexationNotificationType } from '../../../types/indexation';
 import { TaskStatuses, TaskTypes } from '../../../types/tasks';
 
index aa22c91e81a018b8ff429fb51905d02c00d64c88..26ab1594769061fd0cd1775a4deddef84751522b 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { getWrappedDisplayName } from '../../../components/hoc/utils';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { Languages } from '../../../types/languages';
 import { LanguagesContext } from './LanguagesContext';
 
index ab6eb5aa35419072f46216f595c1762b2d040ab9..d2a502d4ce3d5e283783d4198d5948a34bc2be97 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { getWrappedDisplayName } from '../../../components/hoc/utils';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { Dict, Metric } from '../../../types/types';
 import { MetricsContext } from './MetricsContext';
 
index fda6f759b778ab7d9d58a876de0c421e497b1aea..f5db2e2a13d5bad06a9d00327aae850b0db01487 100644 (file)
@@ -26,8 +26,8 @@ import {
   PopupZLevel,
 } from 'design-system';
 import * as React from 'react';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
-import { useLocation } from '../../../../components/hoc/withRouter';
 import { DEFAULT_ISSUES_QUERY } from '../../../../components/shared/utils';
 import { isPullRequest } from '../../../../helpers/branch-like';
 import { hasMessage, translate, translateWithParameters } from '../../../../helpers/l10n';
index 41c75853d573769b9aeefc9da3c1246e1ab5cf3e..24b448c766c0d5e6215b78e63451c8771f63f0cc 100644 (file)
  */
 import { DropdownMenu, InputSearch, ItemDivider, Link } from 'design-system';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { isBranch } from '~sonar-aligned/helpers/branch-like';
-import { Router, withRouter } from '../../../../../components/hoc/withRouter';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
+import { Router } from '~sonar-aligned/types/router';
 import {
   getBrancheLikesAsTree,
   isPullRequest,
@@ -28,7 +30,7 @@ import {
 } from '../../../../../helpers/branch-like';
 import { KeyboardKeys } from '../../../../../helpers/keycodes';
 import { translate } from '../../../../../helpers/l10n';
-import { getBranchLikeUrl, queryToSearch } from '../../../../../helpers/urls';
+import { getBranchLikeUrl } from '../../../../../helpers/urls';
 import { BranchLike, BranchLikeTree } from '../../../../../types/branch-like';
 import { ComponentQualifier } from '../../../../../types/component';
 import { Component } from '../../../../../types/types';
index 98b3de92e9c10d410c82990e3b3f4e804e973384..539b576752e4ec5bcb3d2265c1f5a95e7bc8ca70 100644 (file)
@@ -17,7 +17,6 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-
 import { Link, RadioButtonGroup } from '@sonarsource/echoes-react';
 import { subDays } from 'date-fns';
 import {
@@ -30,10 +29,10 @@ import {
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
 import { now } from '../../../helpers/dates';
 import { translate } from '../../../helpers/l10n';
-import { queryToSearch } from '../../../helpers/urls';
 import '../style.css';
 import { HousekeepingPolicy, RangeOption } from '../utils';
 import DownloadButton from './DownloadButton';
index f462ab82d38fc660ff71379a58abf83c3ce405b4..b5539eb3fccf84a49bf05f8234a78cbd40e8341b 100644 (file)
@@ -22,6 +22,8 @@ import { LargeCenteredLayout, PageContentFontWrapper } from 'design-system';
 import { debounce } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, RawQuery, Router } from '~sonar-aligned/types/router';
 import {
   cancelAllTasks,
   cancelTask as cancelTaskAPI,
@@ -32,12 +34,11 @@ import {
 import withComponentContext from '../../../app/components/componentContext/withComponentContext';
 import ListFooter from '../../../components/controls/ListFooter';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import { toShortISO8601String } from '../../../helpers/dates';
 import { translate } from '../../../helpers/l10n';
 import { parseAsDate } from '../../../helpers/query';
 import { Task, TaskStatuses } from '../../../types/tasks';
-import { Component, Paging, RawQuery } from '../../../types/types';
+import { Component, Paging } from '../../../types/types';
 import { CURRENTS, DEBOUNCE_DELAY, DEFAULT_FILTERS, PAGE_SIZE } from '../constants';
 import { Query, mapFiltersToParameters, updateTask } from '../utils';
 import Header from './Header';
index ad311fe81b61f171d511e95066fa6e1426c106ad..708fd0eb11bb04b9db0cc2cc9afaa23551951ef5 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import { changePassword } from '../../api/users';
 import withAppStateContext from '../../app/components/app-state/withAppStateContext';
-import { Location, withRouter } from '../../components/hoc/withRouter';
 import { AppState } from '../../types/appstate';
 import ChangeAdminPasswordAppRenderer from './ChangeAdminPasswordAppRenderer';
 import { DEFAULT_ADMIN_LOGIN, DEFAULT_ADMIN_PASSWORD } from './constants';
index 43a11c52981f38cbc5125bb2fcfd9f88ee9f1d12..1ce5f38e4ec95f3da6e7f7fa2ddfdd8a254b8461 100644 (file)
@@ -17,7 +17,6 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-
 import { LinkStandalone } from '@sonarsource/echoes-react';
 import {
   ButtonPrimary,
@@ -34,7 +33,7 @@ import {
 } from 'design-system';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
-import { Location } from '../../components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import { translate } from '../../helpers/l10n';
 import { getReturnUrl } from '../../helpers/urls';
 import Unauthorized from '../sessions/components/Unauthorized';
index 9773a641bb9d8dace2a84d01f2946d9c5cc2e785..fcb3b6cd505cf6a53251da60ec8bb9d1be21b1af 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import withComponentContext from '../../../app/components/componentContext/withComponentContext';
 import withMetricsContext from '../../../app/components/metrics/withMetricsContext';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import { CodeScope, getCodeUrl, getProjectUrl } from '../../../helpers/urls';
 import { WithBranchLikesProps, useBranchesQuery } from '../../../queries/branch';
 import { ComponentQualifier, isPortfolioLike } from '../../../types/component';
index 1cb824488c17bc3305b291fa5bcca6b54341dc16..54f38997cee5e40dae74c2363a4df9bf31e4aabf 100644 (file)
@@ -30,10 +30,10 @@ import { difference, intersection } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
 import HelpTooltip from '~sonar-aligned/components/controls/HelpTooltip';
+import { Location } from '~sonar-aligned/types/router';
 import A11ySkipTarget from '../../../components/a11y/A11ySkipTarget';
 import ListFooter from '../../../components/controls/ListFooter';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
-import { Location } from '../../../components/hoc/withRouter';
 import AnalysisMissingInfoMessage from '../../../components/shared/AnalysisMissingInfoMessage';
 import { CCT_SOFTWARE_QUALITY_METRICS, OLD_TAXONOMY_METRICS } from '../../../helpers/constants';
 import { KeyboardKeys } from '../../../helpers/keycodes';
index ac401b378b00b62dcac9db0e9b3406ed77120642..22d5b0c07fdf1b2a181c7f0b7b72ec85427f0cf4 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-
 import { LinkHighlight, LinkStandalone } from '@sonarsource/echoes-react';
 import { Badge, BranchIcon, LightLabel, Note, QualifierIcon } from 'design-system';
 import * as React from 'react';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { translate } from '../../../helpers/l10n';
 import { isDefined } from '../../../helpers/types';
-import { CodeScope, getComponentOverviewUrl, queryToSearch } from '../../../helpers/urls';
+import { CodeScope, getComponentOverviewUrl } from '../../../helpers/urls';
 import { BranchLike } from '../../../types/branch-like';
 import {
   ComponentQualifier,
index bf0bd2bc9e28a0d6aa85593ed8dd119a28e8a1e5..b99f1b76f81b72b2a0609357a96d24252db69436 100644 (file)
@@ -21,9 +21,10 @@ import classNames from 'classnames';
 import { InputSearch, Spinner, ToggleButton } from 'design-system';
 import { isEmpty, omit } from 'lodash';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { getTree } from '../../../api/components';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import { KeyboardKeys } from '../../../helpers/keycodes';
 import { translate } from '../../../helpers/l10n';
 import { BranchLike } from '../../../types/branch-like';
index 1e0d6bd8ceb80a6e33e3ea386f9dd441fe3921d0..2e23d1a35e3cd42a315ed10472e86059a7ea2d41 100644 (file)
@@ -18,9 +18,9 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { Location } from '~sonar-aligned/types/router';
 import SourceViewer from '../../../components/SourceViewer/SourceViewer';
 import withKeyboardNavigation from '../../../components/hoc/withKeyboardNavigation';
-import { Location } from '../../../components/hoc/withRouter';
 import { BranchLike } from '../../../types/branch-like';
 import { Measure } from '../../../types/types';
 
index 94eaa8116921afa1f6d0ecbf73a2a3ab9377acc0..e9b9f0b09e314117965dc2b9f8163313dd1dc7d7 100644 (file)
@@ -30,6 +30,8 @@ import {
 import { keyBy } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, RawQuery, Router } from '~sonar-aligned/types/router';
 import { Profile, searchQualityProfiles } from '../../../api/quality-profiles';
 import { getRulesApp, searchRules } from '../../../api/rules';
 import { getValue } from '../../../api/settings';
@@ -37,14 +39,13 @@ import withCurrentUserContext from '../../../app/components/current-user/withCur
 import A11ySkipTarget from '../../../components/a11y/A11ySkipTarget';
 import ListFooter from '../../../components/controls/ListFooter';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import '../../../components/search-navigator.css';
 import { isInput, isShortcut } from '../../../helpers/keyboardEventHelpers';
 import { KeyboardKeys } from '../../../helpers/keycodes';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 import { SecurityStandard } from '../../../types/security';
 import { SettingsKey } from '../../../types/settings';
-import { Dict, Paging, RawQuery, Rule, RuleActivation } from '../../../types/types';
+import { Dict, Paging, Rule, RuleActivation } from '../../../types/types';
 import { CurrentUser, isLoggedIn } from '../../../types/users';
 import { FiltersHeader } from '../../issues/sidebar/FiltersHeader';
 import {
index 09716f644d8ebd59b0df574b72deb5a215440388..5a4659072ffb2273ec37e623c07b037a573ece84 100644 (file)
@@ -17,6 +17,7 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
+import { RawQuery } from '~sonar-aligned/types/router';
 import {
   cleanQuery,
   parseAsArray,
@@ -35,7 +36,7 @@ import {
   SoftwareImpactSeverity,
   SoftwareQuality,
 } from '../../types/clean-code-taxonomy';
-import { Dict, RawQuery, RuleInheritance } from '../../types/types';
+import { Dict, RuleInheritance } from '../../types/types';
 
 export interface Query {
   activation: boolean | undefined;
index 89b98af44d0b3706137485ca393393a83652f0f0..8ac74338daa61e0404eb4e736cbee49f556b7f35 100644 (file)
@@ -19,7 +19,7 @@
  */
 import React, { useEffect } from 'react';
 import { Route, useLocation, useNavigate } from 'react-router-dom';
-import { RawQuery } from '../../types/types';
+import { RawQuery } from '~sonar-aligned/types/router';
 import CodingRulesApp from './components/CodingRulesApp';
 import { parseQuery, serializeQuery } from './query';
 
index f05615a4f676cfdc244ef1ce044cbe0c1308e3c9..57fb020d3ed03742d5ebb48d68667052b3745a73 100644 (file)
@@ -32,12 +32,13 @@ import { keyBy } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
 import HelpTooltip from '~sonar-aligned/components/controls/HelpTooltip';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { getMeasuresWithPeriod } from '../../../api/measures';
 import { getAllMetrics } from '../../../api/metrics';
 import { ComponentContext } from '../../../app/components/componentContext/ComponentContext';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import { enhanceMeasure } from '../../../components/measure/utils';
 import '../../../components/search-navigator.css';
 import AnalysisMissingInfoMessage from '../../../components/shared/AnalysisMissingInfoMessage';
index 20013d6cbfec4368d2a2493da23ee47d408c0c59..2d217fc8a1c13c2f2c738e95d035daa76bbe0fae 100644 (file)
 import { Highlight, KeyboardHint } from 'design-system';
 import * as React from 'react';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
+import { Router } from '~sonar-aligned/types/router';
 import { getComponentTree } from '../../../api/components';
 import { getMeasures } from '../../../api/measures';
 import SourceViewer from '../../../components/SourceViewer/SourceViewer';
 import A11ySkipTarget from '../../../components/a11y/A11ySkipTarget';
-import { Router } from '../../../components/hoc/withRouter';
 import FilesCounter from '../../../components/ui/FilesCounter';
 import { isSameBranchLike } from '../../../helpers/branch-like';
 import { getComponentMeasureUniqueKey } from '../../../helpers/component';
index 737c7520db11e64735bf5b0c4813eca6113517dd..9455a77c61269dd232992a34039d5ed4a469c21e 100644 (file)
@@ -19,8 +19,8 @@
  */
 import * as React from 'react';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
+import { Router } from '~sonar-aligned/types/router';
 import { getComponentShow } from '../../../api/components';
-import { Router } from '../../../components/hoc/withRouter';
 import { isSameBranchLike } from '../../../helpers/branch-like';
 import { getProjectUrl } from '../../../helpers/urls';
 import { BranchLike } from '../../../types/branch-like';
index 267ad6b1bc1f877b84c225df6eef8c84c7466775..a547a34802e3427aa898c74852e466c8a4aafcc0 100644 (file)
@@ -19,9 +19,9 @@
  */
 import React from 'react';
 import { Navigate, Route, useParams, useSearchParams } from 'react-router-dom';
+import { searchParamsToQuery } from '~sonar-aligned/helpers/router';
 import NavigateWithParams from '../../app/utils/NavigateWithParams';
 import { omitNil } from '../../helpers/request';
-import { searchParamsToQuery } from '../../helpers/urls';
 import ComponentMeasuresApp from './components/ComponentMeasuresApp';
 
 const routes = () => (
index c9fbfe80f03c77273383f7213db6cbe6c61a905d..497e1ff9231802157f7b9cac1c0bc6bc81d3189e 100644 (file)
@@ -19,6 +19,7 @@
  */
 import { groupBy, memoize, sortBy, toPairs } from 'lodash';
 import { isBranch } from '~sonar-aligned/helpers/branch-like';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { enhanceMeasure } from '../../components/measure/utils';
 import { isPullRequest } from '../../helpers/branch-like';
 import {
@@ -54,7 +55,6 @@ import {
   Measure,
   MeasureEnhanced,
   Metric,
-  RawQuery,
 } from '../../types/types';
 import { bubbles } from './config/bubbles';
 import { domains } from './config/domains';
index 72ebbb98a26ecaa7380c79f6f787c3d5a48435b6..dad9932e31dbb71db29afd48a08a6649d506797e 100644 (file)
 import { Accordion, FlagMessage, Link, SearchHighlighter, Spinner } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import ListFooter from '../../../../components/controls/ListFooter';
 import { translate } from '../../../../helpers/l10n';
 import { getBaseUrl } from '../../../../helpers/system';
-import { queryToSearch } from '../../../../helpers/urls';
 import { AzureProject, AzureRepository } from '../../../../types/alm-integration';
 import AlmRepoItem from '../components/AlmRepoItem';
 import { CreateProjectModes } from '../types';
index ef78748573a467b4997c07979c073b73fc71b8ca..576e5bd092e662c541df9ab7bd86ccec3ba27fa3 100644 (file)
 import { LabelValueSelectOption } from 'design-system';
 import React, { useCallback, useEffect, useMemo, useState } from 'react';
 import { GroupBase } from 'react-select';
+import { useLocation, useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import {
   getAzureProjects,
   getAzureRepositories,
   searchAzureRepositories,
 } from '../../../../api/alm-integrations';
-import { useLocation, useRouter } from '../../../../components/hoc/withRouter';
 import { AzureProject, AzureRepository } from '../../../../types/alm-integration';
 import { AlmSettingsInstance } from '../../../../types/alm-settings';
 import { DopSetting } from '../../../../types/dop-translation';
index ee74ec14b1c2c91fe575f891adc13eba1ddd3213..95092bb61ebadbffc950757d63294e92f2bad255 100644 (file)
@@ -27,10 +27,11 @@ import {
 } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { useAppState } from '../../../../app/components/app-state/withAppStateContext';
 import { AvailableFeaturesContext } from '../../../../app/components/available-features/AvailableFeaturesContext';
 import { translate } from '../../../../helpers/l10n';
-import { getGlobalSettingsUrl, queryToSearch } from '../../../../helpers/urls';
+import { getGlobalSettingsUrl } from '../../../../helpers/urls';
 import { AzureProject, AzureRepository } from '../../../../types/alm-integration';
 import { AlmKeys, AlmSettingsInstance } from '../../../../types/alm-settings';
 import { Feature } from '../../../../types/features';
index 8bb9844a9731fa9c2b4cd77bf6e05c72679826ca..38caef1274cdf1b873233c42d92d900498031531 100644 (file)
@@ -21,9 +21,9 @@ import { FlagMessage, Link } from 'design-system';
 import { uniqBy } from 'lodash';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import ListFooter from '../../../../components/controls/ListFooter';
 import { translate, translateWithParameters } from '../../../../helpers/l10n';
-import { queryToSearch } from '../../../../helpers/urls';
 import { AzureProject, AzureRepository } from '../../../../types/alm-integration';
 import { Dict } from '../../../../types/types';
 import { CreateProjectModes } from '../types';
index bb0082602690b21c23fd6e1fae705c34ea258e71..56c40b24f6b867aac0e74ba318e6bc56cf4248ff 100644 (file)
@@ -19,8 +19,8 @@
  */
 import { LabelValueSelectOption } from 'design-system';
 import React, { useCallback, useMemo, useState } from 'react';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import { searchForBitbucketCloudRepositories } from '../../../../api/alm-integrations';
-import { useLocation } from '../../../../components/hoc/withRouter';
 import { BitbucketCloudRepository } from '../../../../types/alm-integration';
 import { AlmKeys } from '../../../../types/alm-settings';
 import { DopSetting } from '../../../../types/dop-translation';
index b38aaa8dadc36fd47214d5f64b288de7a94bbc36..76d6b8ec5c8157a89970cc2d42caf0039b733ca5 100644 (file)
@@ -21,9 +21,9 @@ import { Link, Spinner } from '@sonarsource/echoes-react';
 import { LightPrimary, Title } from 'design-system';
 import React, { useContext } from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { AvailableFeaturesContext } from '../../../../app/components/available-features/AvailableFeaturesContext';
 import { translate } from '../../../../helpers/l10n';
-import { queryToSearch } from '../../../../helpers/urls';
 import { BitbucketCloudRepository } from '../../../../types/alm-integration';
 import { AlmKeys, AlmSettingsInstance } from '../../../../types/alm-settings';
 import { Feature } from '../../../../types/features';
index 35183531dd8ff29a39c665703ded4ca8a160a556..65d07e2f0500e58388134fb9acbfb5bb717f9975 100644 (file)
 import { FlagMessage, InputSearch, LightPrimary, Link } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import ListFooter from '../../../../components/controls/ListFooter';
 import { translate } from '../../../../helpers/l10n';
 import { getBaseUrl } from '../../../../helpers/system';
-import { queryToSearch } from '../../../../helpers/urls';
 import { BitbucketCloudRepository } from '../../../../types/alm-integration';
 import AlmRepoItem from '../components/AlmRepoItem';
 import { REPOSITORY_PAGE_SIZE } from '../constants';
index eb73a856c737eb427b8aa4805811453fb637d9e7..41cba5a4ef8dc70c802413afa3ec1ec34df4e1ad 100644 (file)
@@ -20,8 +20,8 @@
 import { FlagMessage, InputSearch, Link } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { translate } from '../../../../helpers/l10n';
-import { queryToSearch } from '../../../../helpers/urls';
 import {
   BitbucketProject,
   BitbucketProjectRepositories,
index b6671796359d7d5a16ab31068a02567fb35fecbd..cd59f80c057bbe4abf128b6fcd8e829fc28483f6 100644 (file)
@@ -20,9 +20,9 @@
 import { Accordion, FlagMessage, Link } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { translate, translateWithParameters } from '../../../../helpers/l10n';
 import { getBaseUrl } from '../../../../helpers/system';
-import { queryToSearch } from '../../../../helpers/urls';
 import { BitbucketProject, BitbucketRepository } from '../../../../types/alm-integration';
 import AlmRepoItem from '../components/AlmRepoItem';
 import { CreateProjectModes } from '../types';
index a5e25a15aeb873e02bc1feddb0c8f35754d04480..21067c5e98215eda92157feebc984026e49a8664 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { Location, Router } from '~sonar-aligned/types/router';
 import {
   getBitbucketServerProjects,
   getBitbucketServerRepositories,
   searchForBitbucketServerRepositories,
 } from '../../../../api/alm-integrations';
-import { Location, Router } from '../../../../components/hoc/withRouter';
 import {
   BitbucketProject,
   BitbucketProjectRepositories,
index 6515ac7850e065cbf5c26ad3033bcf04a6ecbd86..5870119ab8b60188bbb10bd0234a11433daf4cd6 100644 (file)
@@ -21,12 +21,13 @@ import classNames from 'classnames';
 import { LargeCenteredLayout } from 'design-system';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { getDopSettings } from '../../../api/dop-translation';
 import withAvailableFeatures, {
   WithAvailableFeaturesProps,
 } from '../../../app/components/available-features/withAvailableFeatures';
 import A11ySkipTarget from '../../../components/a11y/A11ySkipTarget';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { AlmKeys, AlmSettingsInstance } from '../../../types/alm-settings';
 import { DopSetting } from '../../../types/dop-translation';
index 6e17618d3f7f2aa10cf0b08e190d96779107e624..1c9d5f744ca5a55f79de128aba617b572e40268c 100644 (file)
@@ -19,8 +19,8 @@
  */
 import { LabelValueSelectOption } from 'design-system';
 import React, { useCallback, useEffect, useMemo, useState } from 'react';
+import { useLocation, useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { getGithubOrganizations, getGithubRepositories } from '../../../../api/alm-integrations';
-import { useLocation, useRouter } from '../../../../components/hoc/withRouter';
 import { GithubOrganization, GithubRepository } from '../../../../types/alm-integration';
 import { AlmInstanceBase, AlmKeys } from '../../../../types/alm-settings';
 import { DopSetting } from '../../../../types/dop-translation';
index 1c7c0df9f55965393dd23cde3b1ddd0b081e8f0a..4c8445b803b2c909f5cc2395e72cd04c3f173d7d 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 /* eslint-disable react/no-unused-prop-types */
-
 import { Link, Spinner } from '@sonarsource/echoes-react';
 import { DarkLabel, FlagMessage, InputSelect, LightPrimary, Title } from 'design-system';
 import React, { useContext, useEffect, useState } from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { useAppState } from '../../../../app/components/app-state/withAppStateContext';
 import { AvailableFeaturesContext } from '../../../../app/components/available-features/AvailableFeaturesContext';
 import { translate } from '../../../../helpers/l10n';
 import { LabelValueSelectOption } from '../../../../helpers/search';
-import { queryToSearch } from '../../../../helpers/urls';
 import { GithubOrganization, GithubRepository } from '../../../../types/alm-integration';
 import { AlmKeys, AlmSettingsInstance } from '../../../../types/alm-settings';
 import { Feature } from '../../../../types/features';
index b6792272ed7b1a134ddc2be8f3c7e67b2d32dabc..d82e0eca756d7f1a4eca90df719355d32e194c1e 100644 (file)
@@ -19,8 +19,8 @@
  */
 import { LabelValueSelectOption } from 'design-system';
 import React, { useCallback, useMemo } from 'react';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import { getGitlabProjects } from '../../../../api/alm-integrations';
-import { useLocation } from '../../../../components/hoc/withRouter';
 import { GitlabProject } from '../../../../types/alm-integration';
 import { AlmKeys } from '../../../../types/alm-settings';
 import { DopSetting } from '../../../../types/dop-translation';
index 4b965923cdde63c358c57ece1d4f33959d232724..1ae69012bf72eefa3438176de8f16afad228eb30 100644 (file)
@@ -21,9 +21,9 @@ import { Link, Spinner } from '@sonarsource/echoes-react';
 import { LightPrimary, Title } from 'design-system';
 import React, { useContext, useEffect, useState } from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { AvailableFeaturesContext } from '../../../../app/components/available-features/AvailableFeaturesContext';
 import { translate } from '../../../../helpers/l10n';
-import { queryToSearch } from '../../../../helpers/urls';
 import { GitlabProject } from '../../../../types/alm-integration';
 import { AlmInstanceBase, AlmKeys, AlmSettingsInstance } from '../../../../types/alm-settings';
 import { Feature } from '../../../../types/features';
index 2f42596321ced4b3bb126511f7b6f80bd1b24cb4..a78e407a33a878949470d00d9bc5b084551e47a8 100644 (file)
@@ -21,11 +21,11 @@ import { Link } from '@sonarsource/echoes-react';
 import { FlagMessage, InputSearch, LightPrimary } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import ListFooter from '../../../../components/controls/ListFooter';
 import Tooltip from '../../../../components/controls/Tooltip';
 import { translate } from '../../../../helpers/l10n';
 import { getBaseUrl } from '../../../../helpers/system';
-import { queryToSearch } from '../../../../helpers/urls';
 import { GitlabProject } from '../../../../types/alm-integration';
 import { Paging } from '../../../../types/types';
 import AlmRepoItem from '../components/AlmRepoItem';
index 9f90b8bc8a4ca11455c1e7b6c5c94280862cbf59..11b0c391cabde985e67f73aa2ff6958216cdd81a 100644 (file)
@@ -34,11 +34,12 @@ import * as React from 'react';
 import { useEffect } from 'react';
 import { FormattedMessage, useIntl } from 'react-intl';
 import { useNavigate, unstable_usePrompt as usePrompt } from 'react-router-dom';
-import { useLocation } from '../../../../components/hoc/withRouter';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import NewCodeDefinitionSelector from '../../../../components/new-code-definition/NewCodeDefinitionSelector';
 import { useDocUrl } from '../../../../helpers/docs';
 import { translate } from '../../../../helpers/l10n';
-import { getProjectUrl, queryToSearch } from '../../../../helpers/urls';
+import { getProjectUrl } from '../../../../helpers/urls';
 import {
   MutationArg,
   useImportProjectMutation,
index 92885d35dbafbb942ae22fb7c396502e000e27de..c766eca3c5094635119e78a7e6abdcc5f0307f2d 100644 (file)
@@ -22,9 +22,9 @@ import { BlueGreySeparator, ButtonPrimary, ButtonSecondary } from 'design-system
 import React, { useEffect, useRef } from 'react';
 import { FormattedMessage } from 'react-intl';
 import { GroupBase } from 'react-select';
+import { useLocation, useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { throwGlobalError } from '~sonar-aligned/helpers/error';
 import { getComponents } from '../../../../api/project-management';
-import { useLocation, useRouter } from '../../../../components/hoc/withRouter';
 import { LabelValueSelectOption } from '../../../../helpers/search';
 import { useProjectBindingsQuery } from '../../../../queries/dop-translation';
 import { AlmKeys } from '../../../../types/alm-settings';
index d4ba81dc8bb344a50b9576209a50770ba683ebeb..1c1dad765285917d77d5e79671c24d46e627bfd7 100644 (file)
@@ -21,7 +21,7 @@ import { LinkStandalone } from '@sonarsource/echoes-react';
 import { LightPrimary, Title } from 'design-system/lib';
 import React from 'react';
 import { FormattedMessage, useIntl } from 'react-intl';
-import { useLocation } from '../../../../components/hoc/withRouter';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import { useDocUrl } from '../../../../helpers/docs';
 
 export function MonorepoProjectHeader() {
index d4df7a6fd2a875a8ee7a4c99cfda2777b9498ce7..1c6c34e3c3e2e9483e229b10645ceefdc0df6cf5 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import { useCallback, useEffect, useMemo, useState } from 'react';
-import { useLocation, useRouter } from '../../../components/hoc/withRouter';
+import { useLocation, useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { isDefined } from '../../../helpers/types';
 import { AlmInstanceBase, AlmKeys } from '../../../types/alm-settings';
 import { DopSetting } from '../../../types/dop-translation';
index 8d9ba6ee15334abc77f7c30e40407373c9e15e11..2ef265fa609c657244d9eddac97ec378bb7d1aca 100644 (file)
@@ -17,7 +17,6 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-
 import styled from '@emotion/styled';
 import { Checkbox, Spinner } from '@sonarsource/echoes-react';
 import classNames from 'classnames';
@@ -35,7 +34,9 @@ import { keyBy, omit, without } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
 import { FormattedMessage } from 'react-intl';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
+import { Location, RawQuery, Router } from '~sonar-aligned/types/router';
 import { listIssues, searchIssues } from '../../../api/issues';
 import { getRuleDetails } from '../../../api/rules';
 import withComponentContext from '../../../app/components/componentContext/withComponentContext';
@@ -49,7 +50,6 @@ import withIndexationContext, {
   WithIndexationContextProps,
 } from '../../../components/hoc/withIndexationContext';
 import withIndexationGuard from '../../../components/hoc/withIndexationGuard';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import IssueTabViewer from '../../../components/rules/IssueTabViewer';
 import '../../../components/search-navigator.css';
 import { DEFAULT_ISSUES_QUERY } from '../../../components/shared/utils';
@@ -72,7 +72,7 @@ import {
   ReferencedRule,
 } from '../../../types/issues';
 import { SecurityStandard } from '../../../types/security';
-import { Component, Dict, Issue, Paging, RawQuery, RuleDetails } from '../../../types/types';
+import { Component, Dict, Issue, Paging, RuleDetails } from '../../../types/types';
 import { CurrentUser, UserBase } from '../../../types/users';
 import * as actions from '../actions';
 import SubnavigationIssuesList from '../issues-subnavigation/SubnavigationIssuesList';
index 5aff62af9dc5583984173217fc75aa6a0f311b0f..0053437ec14923ef6ba93b8546c62060bf5df6b4 100644 (file)
@@ -21,13 +21,14 @@ import { FacetBox, FacetItem, FlagMessage, InputSearch, Note } from 'design-syst
 import { max, sortBy, values, without } from 'lodash';
 import * as React from 'react';
 import { formatMeasure } from '~sonar-aligned/helpers/measures';
+import { RawQuery } from '~sonar-aligned/types/router';
 import ListFooter from '../../../components/controls/ListFooter';
 import Tooltip from '../../../components/controls/Tooltip';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 import { queriesEqual } from '../../../helpers/query';
 import { isDefined } from '../../../helpers/types';
 import { MetricType } from '../../../types/metrics';
-import { Dict, Paging, RawQuery } from '../../../types/types';
+import { Dict, Paging } from '../../../types/types';
 import { FacetItemsList } from './FacetItemsList';
 import { ListStyleFacetFooter } from './ListStyleFacetFooter';
 import { MultipleSelectionHint } from './MultipleSelectionHint';
index 863b73c80fe297edbabe15035f09aec2d40677a5..d5c3eb316c119a868847417155357b4e2c5693d8 100644 (file)
@@ -19,6 +19,7 @@
  */
 import { intersection, isArray, uniq } from 'lodash';
 import { formatMeasure } from '~sonar-aligned/helpers/measures';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { getUsers } from '../../api/users';
 import { DEFAULT_ISSUES_QUERY } from '../../components/shared/utils';
 import {
@@ -49,7 +50,7 @@ import {
 } from '../../types/issues';
 import { MetricType } from '../../types/metrics';
 import { SecurityStandard } from '../../types/security';
-import { Dict, Flow, FlowType, Issue, Paging, RawQuery } from '../../types/types';
+import { Dict, Flow, FlowType, Issue, Paging } from '../../types/types';
 import { RestUser } from '../../types/users';
 
 const OWASP_ASVS_4_0 = 'owaspAsvs-4.0';
index c122f26873ad2cf35ee63778f53b35e63e063af6..2046602b6d74f09c1008fb6cfb950874845e6b34 100644 (file)
@@ -29,12 +29,13 @@ import { sortBy, uniqBy } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
 import { FormattedMessage } from 'react-intl';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { getAvailablePlugins, getInstalledPlugins } from '../../api/plugins';
 import { getValue, setSimpleSettingValue } from '../../api/settings';
 import DocumentationLink from '../../components/common/DocumentationLink';
 import ListFooter from '../../components/controls/ListFooter';
 import Suggestions from '../../components/embed-docs-modal/Suggestions';
-import { Location, Router, withRouter } from '../../components/hoc/withRouter';
 import { translate } from '../../helpers/l10n';
 import { EditionKey } from '../../types/editions';
 import { PendingPluginResult, Plugin, RiskConsent } from '../../types/plugins';
index ea5b733f08c8f73c6e13095aa8b7f820425a6645..8425258e66010fae9c2d98f92cebadd89008b1d3 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import AdminContext from '../../app/components/AdminContext';
 import withAppStateContext from '../../app/components/app-state/withAppStateContext';
-import { Location, withRouter } from '../../components/hoc/withRouter';
 import { AppState } from '../../types/appstate';
 import { EditionKey } from '../../types/editions';
 import { GlobalSettingKeys } from '../../types/settings';
index bfa98d64ec91548f767e27b8c6ab9278d9f6c2a3..c1e53f6dac6d8841b42ee6f9152d759fb56f9611 100644 (file)
  */
 import { findLastIndex, memoize } from 'lodash';
 import { throwGlobalError } from '~sonar-aligned/helpers/error';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { getInstalledPlugins, getUpdatesPlugins } from '../../api/plugins';
 import { cleanQuery, parseAsString, serializeString } from '../../helpers/query';
 import { isDefined } from '../../helpers/types';
 import { InstalledPlugin, Plugin, Update } from '../../types/plugins';
-import { RawQuery } from '../../types/types';
 
 export interface Query {
   filter: string;
index c2ed85529d765b37aa9591b077468e6a5b35d0c2..4d63589d17bec6c4d24ed92cab3393dc462613a3 100644 (file)
@@ -25,8 +25,8 @@ import {
   PageContentFontWrapper,
 } from 'design-system';
 import * as React from 'react';
+import { useLocation, useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import A11ySkipTarget from '../../../components/a11y/A11ySkipTarget';
-import { useLocation, useRouter } from '../../../components/hoc/withRouter';
 import AnalysisMissingInfoMessage from '../../../components/shared/AnalysisMissingInfoMessage';
 import { parseDate } from '../../../helpers/dates';
 import { areCCTMeasuresComputed, isDiffMetric } from '../../../helpers/measures';
index 88737d1605fb6568924cbe98d64826b116600f9e..d6b9a67ffbdbd759dde0bfeffd02a02b5cfcb236 100644 (file)
 import { Link } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import withCurrentUserContext from '../../../app/components/current-user/withCurrentUserContext';
 import DismissableAlert from '../../../components/ui/DismissableAlert';
 import { translate } from '../../../helpers/l10n';
-import { queryToSearch } from '../../../helpers/urls';
 import { useProjectBindingQuery } from '../../../queries/devops-integration';
 import { ComponentQualifier } from '../../../types/component';
 import { Component } from '../../../types/types';
index cae55e0304f9aa6d8b59bd6d59755b521324a1a9..9b9d97189d99b20444d30696b4f42275e94c51ef 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-
 import { Link } from '@sonarsource/echoes-react';
 import { Note, getTabPanelId } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import DocumentationLink from '../../../components/common/DocumentationLink';
 import { Image } from '../../../components/common/Image';
 import { translate } from '../../../helpers/l10n';
-import { CodeScope, queryToSearch } from '../../../helpers/urls';
+import { CodeScope } from '../../../helpers/urls';
 import { Branch } from '../../../types/branch-like';
 import { ComponentQualifier } from '../../../types/component';
 import { NewCodeDefinitionType } from '../../../types/new-code-definition';
index fb824c69b06749d93cc67d935d295c30c7345ffd..211f0e76ed06a29ae05fe063cc1a121c8042fe79 100644 (file)
@@ -21,6 +21,7 @@ import { memoize } from 'lodash';
 import React from 'react';
 import { IntlShape } from 'react-intl';
 import { formatMeasure } from '~sonar-aligned/helpers/measures';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { ISSUETYPE_METRIC_KEYS_MAP } from '../../helpers/issues';
 import { translate } from '../../helpers/l10n';
 import { parseAsString } from '../../helpers/query';
@@ -29,7 +30,7 @@ import { IssueType } from '../../types/issues';
 import { MetricKey, MetricType } from '../../types/metrics';
 import { AnalysisMeasuresVariations, MeasureHistory } from '../../types/project-activity';
 import { QualityGateStatusConditionEnhanced } from '../../types/quality-gates';
-import { Dict, RawQuery } from '../../types/types';
+import { Dict } from '../../types/types';
 
 export const BRANCH_OVERVIEW_METRICS: string[] = [
   // quality gate
index f36ebc7a9db1bae9eadc050088964db6a064f653..8e7c7aac7997ea378a2b01e5d8bdd80938ee815c 100644 (file)
 import { ActionsDropdown, ItemButton, ItemLink, PopupZLevel } from 'design-system';
 import { difference } from 'lodash';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
+import { Router } from '~sonar-aligned/types/router';
 import {
   deletePermissionTemplate,
   setDefaultPermissionTemplate,
   updatePermissionTemplate,
 } from '../../../api/permissions';
-import { Router, withRouter } from '../../../components/hoc/withRouter';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
-import { queryToSearch } from '../../../helpers/urls';
 import { PermissionTemplate } from '../../../types/types';
 import { PERMISSION_TEMPLATES_PATH } from '../utils';
 import DeleteForm from './DeleteForm';
index c085f194ea6160a3ab9b66ca1820667f26e4f0cb..0f6e9b53a6adb3bc3b18c26d11d7fe750edc4207 100644 (file)
  */
 import { ButtonPrimary, FlagMessage, Spinner, Title } from 'design-system';
 import React, { useState } from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { throwGlobalError } from '~sonar-aligned/helpers/error';
+import { Router } from '~sonar-aligned/types/router';
 import { createPermissionTemplate } from '../../../api/permissions';
-import { Router, withRouter } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { useGithubProvisioningEnabledQuery } from '../../../queries/identity-provider/github';
 import { PERMISSION_TEMPLATES_PATH } from '../utils';
index 2fb9652470743b1492e7a86ac6cb6b891a6d4e51..9d3c7df3bf3e625044d25c4943068891c725ac0b 100644 (file)
@@ -19,7 +19,7 @@
  */
 import { CodeSnippet, ContentCell, Link } from 'design-system';
 import * as React from 'react';
-import { queryToSearch } from '../../../helpers/urls';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { PermissionTemplate } from '../../../types/types';
 import { PERMISSION_TEMPLATES_PATH } from '../utils';
 import Defaults from './Defaults';
index 7deeabbea6a0749bb8a3753e1cc414056002e009..451c29772d87b73b768200a1b8fef924a39f8939 100644 (file)
  */
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import { getPermissionTemplates } from '../../../api/permissions';
 import withAppStateContext from '../../../app/components/app-state/withAppStateContext';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
-import { Location, withRouter } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { AppState } from '../../../types/appstate';
 import { Permission, PermissionTemplate } from '../../../types/types';
index bce7c1cc2d8c8390b3f3b0112a7f95ba382e0f08..1b5f437449a6e6a39652961ecd02b45b7253addc 100644 (file)
@@ -18,6 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import React from 'react';
+import { useLocation, useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
 import {
   useComponent,
@@ -30,7 +31,6 @@ import {
   getHistoryMetrics,
   isCustomGraph,
 } from '../../../components/activity-graph/utils';
-import { useLocation, useRouter } from '../../../components/hoc/withRouter';
 import { parseDate } from '../../../helpers/dates';
 import useApplicationLeakQuery from '../../../queries/applications';
 import { useBranchesQuery } from '../../../queries/branch';
index 171b70d1efec3e1dec1616a972ab2c316bb85753..214e03221467601f776b99bcd7303bdaf246f0a1 100644 (file)
@@ -19,6 +19,7 @@
  */
 import { startOfDay } from 'date-fns';
 import { isEqual, uniq } from 'lodash';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { DEFAULT_GRAPH } from '../../components/activity-graph/utils';
 import { parseDate } from '../../helpers/dates';
 import { MEASURES_REDIRECTION } from '../../helpers/measures';
@@ -33,7 +34,7 @@ import {
 } from '../../helpers/query';
 import { MetricKey } from '../../types/metrics';
 import { GraphType, ParsedAnalysis } from '../../types/project-activity';
-import { Dict, RawQuery } from '../../types/types';
+import { Dict } from '../../types/types';
 
 export interface Query {
   category: string;
index ee777e8da5d2e14ebd9180ba765779a832698204..8da90b6c0dd5ad08765dcffea863ca4d56c6aa94 100644 (file)
 
 import { DangerButtonPrimary, addGlobalSuccessMessage } from 'design-system';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Router } from '~sonar-aligned/types/router';
 import { deleteApplication } from '../../api/application';
 import { deletePortfolio, deleteProject } from '../../api/project-management';
 import ConfirmButton from '../../components/controls/ConfirmButton';
-import { Router, withRouter } from '../../components/hoc/withRouter';
 import { translate, translateWithParameters } from '../../helpers/l10n';
 import { isApplication, isPortfolioLike } from '../../types/component';
 import { Component } from '../../types/types';
index bc62bf7812799891e7476fe07f1a813d67a99eb0..54e6db99d167e28377623dfa30b246f12774139a 100644 (file)
@@ -17,7 +17,7 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { Location } from '../../../../components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import { BadgeOptions, BadgeType, getBadgeSnippet, getBadgeUrl } from '../utils';
 
 jest.mock('../../../../helpers/urls', () => ({
index 19d288117fbd0d1ce1f1df72dd9be79ab0a60a83..d7bb648fc4b7708473e9a6f525a617398939c59b 100644 (file)
 import { LargeCenteredLayout, PageContentFontWrapper, Title } from 'design-system';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Router } from '~sonar-aligned/types/router';
 import { changeKey } from '../../api/components';
 import RecentHistory from '../../app/components/RecentHistory';
 import withComponentContext from '../../app/components/componentContext/withComponentContext';
-import { Router, withRouter } from '../../components/hoc/withRouter';
 import { translate } from '../../helpers/l10n';
 import { Component } from '../../types/types';
 import UpdateForm from './UpdateForm';
index 97500dae71da633f4fd747b0c1931b4da14f69cf..738c3cbaf5f912fff346dcf402041c13387dbdfb 100644 (file)
@@ -31,13 +31,14 @@ import { keyBy, mapValues, omitBy, pick } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
 import { useSearchParams } from 'react-router-dom';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, RawQuery, Router } from '~sonar-aligned/types/router';
 import { searchProjects } from '../../../api/components';
 import withAppStateContext from '../../../app/components/app-state/withAppStateContext';
 import withCurrentUserContext from '../../../app/components/current-user/withCurrentUserContext';
 import A11ySkipTarget from '../../../components/a11y/A11ySkipTarget';
 import ScreenPositionHelper from '../../../components/common/ScreenPositionHelper';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import '../../../components/search-navigator.css';
 import handleRequiredAuthentication from '../../../helpers/handleRequiredAuthentication';
 import { translate } from '../../../helpers/l10n';
@@ -46,7 +47,6 @@ import { isDefined } from '../../../helpers/types';
 import { AppState } from '../../../types/appstate';
 import { ComponentQualifier } from '../../../types/component';
 import { MetricKey } from '../../../types/metrics';
-import { RawQuery } from '../../../types/types';
 import { CurrentUser, isLoggedIn } from '../../../types/users';
 import { Query, hasFilterParams, parseUrlQuery } from '../query';
 import '../styles.css';
index e3787b1a6e2d827c3368bb9edb809d5c61e2c456..a2ad67b9f0cb77f7fdc386df994da5b515022fa2 100644 (file)
  */
 import { ButtonSecondary } from 'design-system';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { throwGlobalError } from '~sonar-aligned/helpers/error';
+import { Router } from '~sonar-aligned/types/router';
 import { getComponentNavigation } from '../../../api/navigation';
 import withAppStateContext from '../../../app/components/app-state/withAppStateContext';
 import withCurrentUserContext from '../../../app/components/current-user/withCurrentUserContext';
 import CreateApplicationForm from '../../../app/components/extensions/CreateApplicationForm';
-import { Router, withRouter } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { getComponentAdminUrl, getComponentOverviewUrl } from '../../../helpers/urls';
 import { hasGlobalPermission } from '../../../helpers/users';
index 4b717d9ecb6a341068a1cfb757e0b588231e97be..5fb41e705e196e7cfe0e556a530a108a6eaa09ca 100644 (file)
@@ -19,9 +19,9 @@
  */
 import * as React from 'react';
 import { useNavigate } from 'react-router-dom';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import { searchProjects } from '../../../api/components';
 import withCurrentUserContext from '../../../app/components/current-user/withCurrentUserContext';
-import { useLocation } from '../../../components/hoc/withRouter';
 import { get } from '../../../helpers/storage';
 import { hasGlobalPermission } from '../../../helpers/users';
 import { CurrentUser, isLoggedIn } from '../../../types/users';
index 9d1faa3e990af24487faa5e816ade6fca150f636..f31d32c87cfe17f4cd1296b2b11fe91f79dd5c7b 100644 (file)
@@ -20,8 +20,8 @@
 import { FishVisual, Highlight, StandoutLink } from 'design-system';
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { translate } from '../../../helpers/l10n';
-import { queryToSearch } from '../../../helpers/urls';
 import { Dict } from '../../../types/types';
 import { Query } from '../query';
 
index fca28425603287a0efdb544cc83284c9864cfbac..93d52649d90056b27503ff0b47951bb1aaf23f01 100644 (file)
@@ -19,7 +19,8 @@
  */
 import { ButtonPrimary, FishVisual, Highlight } from 'design-system';
 import * as React from 'react';
-import { Router, withRouter } from '../../../components/hoc/withRouter';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Router } from '~sonar-aligned/types/router';
 import { translate } from '../../../helpers/l10n';
 import { hasGlobalPermission } from '../../../helpers/users';
 import { Permissions } from '../../../types/permissions';
index 58c37097330ca66fbfe6e0fab3234600e5d88072..85b7d5b5e78775e6fdfd5d6ef94bb18f78853959 100644 (file)
@@ -19,8 +19,8 @@
  */
 import { ToggleButton } from 'design-system';
 import * as React from 'react';
+import { withRouter, WithRouterProps } from '~sonar-aligned/components/hoc/withRouter';
 import withCurrentUserContext from '../../../app/components/current-user/withCurrentUserContext';
-import { withRouter, WithRouterProps } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { save } from '../../../helpers/storage';
 import { CurrentUser, isLoggedIn } from '../../../types/users';
index af495b13897ac1ed5c4238af13c56aeaa736da04..4f939c92d32d651a6aa14b68f6068db01727fb4a 100644 (file)
  */
 import { InputSearch, LightLabel, LightPrimary } from 'design-system';
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import HomePageSelect from '../../../components/controls/HomePageSelect';
 import Tooltip from '../../../components/controls/Tooltip';
 import { translate } from '../../../helpers/l10n';
-import { RawQuery } from '../../../types/types';
 import { CurrentUser, isLoggedIn } from '../../../types/users';
 import ApplicationCreation from './ApplicationCreation';
 import PerspectiveSelect from './PerspectiveSelect';
index 393d73cb01367cfa831b675c826c2a5622b8849d..f598577b81adf7ffd3a5f2f130021b3b7a19a2d2 100644 (file)
@@ -20,8 +20,9 @@
 import { BasicSeparator, DangerButtonSecondary, StyledPageTitle } from 'design-system';
 import { flatMap } from 'lodash';
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate } from '../../../helpers/l10n';
-import { Dict, RawQuery } from '../../../types/types';
+import { Dict } from '../../../types/types';
 import CoverageFilter from '../filters/CoverageFilter';
 import DuplicationsFilter from '../filters/DuplicationsFilter';
 import LanguagesFilter from '../filters/LanguagesFilter';
index 85e4547245385d905d051f8ca5a5da575f0aa1f7..6b47f36b6d2f96e249ca31895a3327ebdc1d4d23 100644 (file)
@@ -20,9 +20,9 @@
 
 import { ItemLink } from 'design-system';
 import * as React from 'react';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { Image } from '../../../components/common/Image';
 import { translate } from '../../../helpers/l10n';
-import { queryToSearch } from '../../../helpers/urls';
 import { AlmKeys } from '../../../types/alm-settings';
 
 export interface ProjectCreationMenuItemProps {
index a0715208b1c6623c286b27eb685794669f2fcc32..b27d521398ac48d09f4cfac644fe0163b1222e2b 100644 (file)
  */
 import userEvent from '@testing-library/user-event';
 import * as React from 'react';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { createApplication } from '../../../../api/application';
 import { getComponentNavigation } from '../../../../api/navigation';
 import { mockAppState, mockLoggedInUser, mockRouter } from '../../../../helpers/testMocks';
 import { renderComponent } from '../../../../helpers/testReactTestingUtils';
 import { byRole, byText } from '../../../../helpers/testSelector';
-import { queryToSearch } from '../../../../helpers/urls';
 import { ComponentQualifier, Visibility } from '../../../../types/component';
 import { FCProps } from '../../../../types/misc';
 import { LoggedInUser } from '../../../../types/users';
index d2d7d8ceffce96f6d4b586403f41787a5a339003..054d0c39570c4f40c0ddecc5898cbee680815201 100644 (file)
@@ -20,8 +20,8 @@
 import { render, screen } from '@testing-library/react';
 import * as React from 'react';
 import { MemoryRouter, Route, Routes } from 'react-router-dom';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import { searchProjects } from '../../../../api/components';
-import { useLocation } from '../../../../components/hoc/withRouter';
 import { get } from '../../../../helpers/storage';
 import { mockCurrentUser, mockLoggedInUser } from '../../../../helpers/testMocks';
 import { hasGlobalPermission } from '../../../../helpers/users';
index 4697482312e887457164e81f3316ebe95cc50c0b..73f4796e5a103fb6928118a65b7795a549cba75b 100644 (file)
  */
 import { CoverageIndicator } from 'design-system';
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 import { getCoverageRatingAverageValue, getCoverageRatingLabel } from '../../../helpers/ratings';
 import { MetricKey } from '../../../types/metrics';
-import { RawQuery } from '../../../types/types';
 import { Facet } from '../types';
 import RangeFacetBase from './RangeFacetBase';
 
index 964020f69855292277133c34084602d752c77b25..cada4bc8483f986a4511a223b97f9df6d2e432b0 100644 (file)
@@ -19,9 +19,9 @@
  */
 import { DuplicationsIndicator } from 'design-system';
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 import { duplicationValueToRating, getDuplicationsRatingLabel } from '../../../helpers/ratings';
-import { RawQuery } from '../../../types/types';
 import { Facet } from '../types';
 import RangeFacetBase from './RangeFacetBase';
 
index 94ad678d7fdceb220f3510434b480afcf4b5229c..95be64a967faa0476257ac3eae9fa5f17ce30b5b 100644 (file)
  */
 import { uniqBy } from 'lodash';
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import withLanguagesContext from '../../../app/components/languages/withLanguagesContext';
 import { translate } from '../../../helpers/l10n';
 import { highlightTerm } from '../../../helpers/search';
 import { Language, Languages } from '../../../types/languages';
-import { Dict, RawQuery } from '../../../types/types';
+import { Dict } from '../../../types/types';
 import { ListStyleFacet } from '../../issues/sidebar/ListStyleFacet';
 import { Facet } from '../types';
 
index f4112f04ab9c97c0175adf13d43db66a501d586b..b383a368fd3db667092ee26e925e24d0fdf27160 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { RawQuery } from '../../../types/types';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { Facet } from '../types';
 import RatingFacet from './RatingFacet';
 
index 4ff410e104ead590003beba61b731fbe6ee8644a..4bc25a02e0fcab799c3c8223a6a44b2f2d0ac8ee 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate } from '../../../helpers/l10n';
 import { getSizeRatingLabel } from '../../../helpers/ratings';
 import { MetricKey } from '../../../types/metrics';
-import { RawQuery } from '../../../types/types';
 import { Facet } from '../types';
 import RangeFacetBase from './RangeFacetBase';
 
index f0a77f52f816c64c55380418969a65dd9c9bdfd1..7ecdbd101ab1d7375cad0734c1a18d8afe6239d4 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { RawQuery } from '../../../types/types';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { Facet } from '../types';
 import RatingFacet from './RatingFacet';
 
index 73a6a35bb55044b0c4018fab6d7d2c6de5a6ba21..ab38d55005c10c4856e97e9fcf671495af254d39 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { RawQuery } from '../../../types/types';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { Facet } from '../types';
 import RatingFacet from './RatingFacet';
 
index bcfd064aafcfb0c77c5c7dd9297d7e923a313867..43bded56cec5e743abb71f5aab62a5c9447bb563 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { RawQuery } from '../../../types/types';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { Facet } from '../types';
 import RatingFacet from './RatingFacet';
 
index 99ad08c449c53614de171185eaa05d1bb3fd278b..561806853bbb96c686f4666865520ba21ea49219 100644 (file)
  */
 import { FacetBox, FacetItem } from 'design-system';
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate } from '../../../helpers/l10n';
 import { isDefined } from '../../../helpers/types';
 import { ComponentQualifier } from '../../../types/component';
-import { RawQuery } from '../../../types/types';
 import { FacetItemsList } from '../../issues/sidebar/FacetItemsList';
 import { formatFacetStat } from '../../issues/utils';
 import { Facet } from '../types';
index 43eae115217a90e63523fbd132d60286c7d7c682..0d7bf5234bdb3ca0f54e44423b65a85e45c3e61f 100644 (file)
@@ -21,9 +21,10 @@ import { FacetBox, FacetItem, HelperHintIcon, QualityGateIndicator } from 'desig
 import { without } from 'lodash';
 import * as React from 'react';
 import HelpTooltip from '~sonar-aligned/components/controls/HelpTooltip';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate } from '../../../helpers/l10n';
 import { isDefined } from '../../../helpers/types';
-import { RawQuery, Status } from '../../../types/types';
+import { Status } from '../../../types/types';
 import { FacetItemsList } from '../../issues/sidebar/FacetItemsList';
 import { formatFacetStat } from '../../issues/utils';
 import { Facet } from '../types';
index 3e683acee77535c48f59b23b697bb08f44f36cf4..e11d3046248f1e06d49b4e5aa2b6a19d7fe42b7f 100644 (file)
@@ -20,9 +20,9 @@
 import classNames from 'classnames';
 import { FacetBox, FacetItem, HighlightedFacetItems, LightLabel } from 'design-system';
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate } from '../../../helpers/l10n';
 import { isDefined } from '../../../helpers/types';
-import { RawQuery } from '../../../types/types';
 import { FacetItemsList } from '../../issues/sidebar/FacetItemsList';
 import { formatFacetStat } from '../../issues/utils';
 import { Facet } from '../types';
index 9fd89a2fb4d178fb6f6ce36b8c2f3a8e6958e3be..fe816e6f24f32d86e34f726cd9633be900b3323e 100644 (file)
@@ -20,9 +20,9 @@
 import { MetricsRatingBadge, RatingEnum } from 'design-system';
 import * as React from 'react';
 import { formatMeasure } from '~sonar-aligned/helpers/measures';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 import { MetricType } from '../../../types/metrics';
-import { RawQuery } from '../../../types/types';
 import { Facet } from '../types';
 import RangeFacetBase from './RangeFacetBase';
 
index 0bb65a005e3d0e514c2772e82444ee8672478908..82f29a5f8374e5270f3d9dac27e0e6d5b3539547 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { RawQuery } from '../../../types/types';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { Facet } from '../types';
 import RatingFacet from './RatingFacet';
 
index 6a0ee55f8f0027730c05b0f6bec65d9e259c3ea7..1adb18ec05d242a2c8cbeeeba61ef9e83fe3d4ff 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
-import { RawQuery } from '../../../types/types';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { Facet } from '../types';
 import RatingFacet from './RatingFacet';
 
index 99f97f9221a1216a18416eb66b91ab7a70a276ec..45350adbac8c8b75ce992f8d93fdabb11ce5968f 100644 (file)
 import { MetricsRatingBadge, RatingEnum } from 'design-system';
 import * as React from 'react';
 import { formatMeasure } from '~sonar-aligned/helpers/measures';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 import { MetricType } from '../../../types/metrics';
-import { Dict, RawQuery } from '../../../types/types';
+import { Dict } from '../../../types/types';
 import { Facet } from '../types';
 import RangeFacetBase from './RangeFacetBase';
 
index fe5e316dbe7488235f451e05873173f900fd7804..33ff77ced18f25f369baa67960f3941e1d969867 100644 (file)
@@ -19,9 +19,9 @@
  */
 import { SizeIndicator } from 'design-system';
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { translate } from '../../../helpers/l10n';
 import { getSizeRatingAverageValue, getSizeRatingLabel } from '../../../helpers/ratings';
-import { RawQuery } from '../../../types/types';
 import { Facet } from '../types';
 import RangeFacetBase from './RangeFacetBase';
 
index 1892f732949d59ff8c1076f2b9598e47c286e2e6..44e54f6a8f265a07dae4128248c251945612415f 100644 (file)
  */
 import { size } from 'lodash';
 import * as React from 'react';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { searchProjectTags } from '../../../api/components';
-import { ListStyleFacet } from '../../../apps/issues/sidebar/ListStyleFacet';
 import { translate } from '../../../helpers/l10n';
 import { highlightTerm } from '../../../helpers/search';
-import { Dict, RawQuery } from '../../../types/types';
+import { Dict } from '../../../types/types';
+import { ListStyleFacet } from '../../issues/sidebar/ListStyleFacet';
 import { Facet } from '../types';
 
 interface Props {
index f1a039b03e2d29e43eab4b7930ca496517a3d1da..978b0991430fd02485a2125fa3392a84af0a23cc 100644 (file)
@@ -17,8 +17,9 @@
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
+import { RawQuery } from '~sonar-aligned/types/router';
 import { ComponentQualifier } from '../../types/component';
-import { Dict, RawQuery } from '../../types/types';
+import { Dict } from '../../types/types';
 
 type Level = 'ERROR' | 'WARN' | 'OK';
 
index 8e85a55c22a828b7d99745b127d850d1061588a7..ee09f47d308766fc63b9c9333de8cbfeb9fdefbd 100644 (file)
@@ -19,7 +19,7 @@
  */
 import { ButtonPrimary, FormField, InputField, Modal } from 'design-system';
 import * as React from 'react';
-import { useRouter } from '../../../components/hoc/withRouter';
+import { useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import MandatoryFieldsExplanation from '../../../components/ui/MandatoryFieldsExplanation';
 import { translate } from '../../../helpers/l10n';
 import { getQualityGateUrl } from '../../../helpers/urls';
index 1f774a239f19ca7b3ef83b3017b7c5f6e77b0076..05d5ddc3f1cfe3273e19d1595ebde3a9f116c8a1 100644 (file)
@@ -19,7 +19,7 @@
  */
 import { ButtonSecondary, FormField, InputField, Modal } from 'design-system';
 import * as React from 'react';
-import { useRouter } from '../../../components/hoc/withRouter';
+import { useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import MandatoryFieldsExplanation from '../../../components/ui/MandatoryFieldsExplanation';
 import { translate } from '../../../helpers/l10n';
 import { getQualityGateUrl } from '../../../helpers/urls';
index eda9ced21e157dba95d76150f7671023efc5f0a0..3c92d5e320a4b9cf7057f774ca38ef711e7f3702 100644 (file)
@@ -19,7 +19,7 @@
  */
 import { DangerButtonPrimary, Modal } from 'design-system';
 import * as React from 'react';
-import { useRouter } from '../../../components/hoc/withRouter';
+import { useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 import { getQualityGatesUrl } from '../../../helpers/urls';
 import { useDeleteQualityGateMutation } from '../../../queries/quality-gates';
index cf7bdcea560bfcd9f0efd14973b7ce77ce1f208c..49977a45bc0bbf4d0d833e54f5d1238de05a7649 100644 (file)
@@ -20,7 +20,7 @@
 
 import { ButtonPrimary, FormField, InputField, Modal } from 'design-system';
 import * as React from 'react';
-import { useRouter } from '../../../components/hoc/withRouter';
+import { useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import MandatoryFieldsExplanation from '../../../components/ui/MandatoryFieldsExplanation';
 import { translate } from '../../../helpers/l10n';
 import { getQualityGateUrl } from '../../../helpers/urls';
index 230e0c86b99e7a281309ef218766b5010fdb61fd..1680149c4ab187b3ced2921549cdf40e631d5c75 100644 (file)
@@ -19,8 +19,9 @@
  */
 import { ButtonSecondary, Spinner } from 'design-system';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { ChangelogResponse, getProfileChangelog } from '../../../api/quality-profiles';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import { parseDate, toISO8601WithOffsetString } from '../../../helpers/dates';
 import { translate } from '../../../helpers/l10n';
 import { withQualityProfilesContext } from '../qualityProfilesContext';
index 4732e7ce6db353923003d3aa7eb8fd1bf55bc6d3..aed914a746cd5b80cb5151d246118704b860acc4 100644 (file)
@@ -19,7 +19,7 @@
  */
 import { Spinner } from 'design-system';
 import * as React from 'react';
-import { useLocation, useRouter } from '../../../components/hoc/withRouter';
+import { useLocation, useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { useProfilesCompareQuery } from '../../../queries/quality-profiles';
 import { useGetValueQuery } from '../../../queries/settings';
 import { SettingsKey } from '../../../types/settings';
index d463b47f6cddf902b692ddc9bf58192b78481a9c..92132eabcb18f88806fd073c55967c62ffa28f1d 100644 (file)
@@ -30,6 +30,8 @@ import {
 } from 'design-system';
 import { some } from 'lodash';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Router } from '~sonar-aligned/types/router';
 import {
   changeProfileParent,
   copyProfile,
@@ -38,7 +40,6 @@ import {
   renameProfile,
   setDefaultProfile,
 } from '../../../api/quality-profiles';
-import { Router, withRouter } from '../../../components/hoc/withRouter';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 import { getBaseUrl } from '../../../helpers/system';
 import { getRulesUrl } from '../../../helpers/urls';
index 04ead9dd6273e021418504d6e7f61cada10ee785..0aef030ff9034b8c0a2158c131fb0a2a1acf6135 100644 (file)
@@ -20,7 +20,7 @@
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
 import { Outlet, useSearchParams } from 'react-router-dom';
-import { useLocation } from '../../../components/hoc/withRouter';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
 import ProfileHeader from '../details/ProfileHeader';
 import { useQualityProfilesContext } from '../qualityProfilesContext';
index c82c1e5b429057c9084f8da00d8c99c2796109cb..615ce883cf3ac8be3d9599fd87150f4c219ba9cd 100644 (file)
@@ -20,7 +20,7 @@
 import { Badge, Breadcrumbs, HoverLink, Link, PageContentFontWrapper } from 'design-system';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
-import { useLocation } from '../../../components/hoc/withRouter';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import DateFromNow from '../../../components/intl/DateFromNow';
 import { AdminPageHeader } from '../../../components/ui/AdminPageHeader';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
index 42cda96754853faf5775ef503d83f8ba280cc9ac..de64d5e3cefe409a36f7a19c569ca7512f9bfac4 100644 (file)
@@ -37,13 +37,13 @@ import * as React from 'react';
 import { useRef } from 'react';
 import { useIntl } from 'react-intl';
 import { SingleValue } from 'react-select';
+import { Location } from '~sonar-aligned/types/router';
 import {
   changeProfileParent,
   copyProfile,
   createQualityProfile,
   getImporters,
 } from '../../../api/quality-profiles';
-import { Location } from '../../../components/hoc/withRouter';
 import MandatoryFieldsExplanation from '../../../components/ui/MandatoryFieldsExplanation';
 import { parseAsOptionalString } from '../../../helpers/query';
 import { useProfileInheritanceQuery } from '../../../queries/quality-profiles';
index 5afa7fd15c65ca13e3a8a2e25b335ff3305b3482..13ba07cab46e2eeea6ed90b6372a05a06d64f1ed 100644 (file)
@@ -20,7 +20,7 @@
 import { LabelValueSelectOption, SearchSelectDropdown } from 'design-system';
 import * as React from 'react';
 import { useIntl } from 'react-intl';
-import { useRouter } from '../../../components/hoc/withRouter';
+import { useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { PROFILE_PATH } from '../constants';
 import { getProfilesForLanguagePath } from '../utils';
 
index e8e267ac792ee0371154f11c8397c702330b1dd3..6edfcedc602de8bd3cf805aec3b33b8006c562e8 100644 (file)
@@ -20,8 +20,8 @@
 import { ButtonPrimary, ButtonSecondary, FlagMessage, Link } from 'design-system';
 import * as React from 'react';
 import { useIntl } from 'react-intl';
+import { useLocation, useRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { Actions } from '../../../api/quality-profiles';
-import { useLocation, useRouter } from '../../../components/hoc/withRouter';
 import { useDocUrl } from '../../../helpers/docs';
 import { translate } from '../../../helpers/l10n';
 import { Profile } from '../types';
index 307f0b0167f4aa6310d02a9ff76eb9b8a2afec11..d6d3a5e4e8467f3d590bc3712407fd938586ddd5 100644 (file)
  */
 import React from 'react';
 import { useOutletContext } from 'react-router-dom';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { Actions } from '../../api/quality-profiles';
-import { Exporter, Profile } from '../../apps/quality-profiles/types';
-import { getWrappedDisplayName } from '../../components/hoc/utils';
 import { Language } from '../../types/languages';
+import { Exporter, Profile } from './types';
 
 export interface QualityProfilesContextProps {
   actions: Actions;
index 1e8a6bd0c73218d1a23ef8e43f3ed46e0cc91a68..77e0af58ed41b922478c9c82304c484eae40b6e2 100644 (file)
@@ -19,9 +19,9 @@
  */
 import { differenceInYears } from 'date-fns';
 import { sortBy } from 'lodash';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { Profile as BaseProfile } from '../../api/quality-profiles';
 import { isValidDate, parseDate } from '../../helpers/dates';
-import { queryToSearch } from '../../helpers/urls';
 import { PROFILE_COMPARE_PATH, PROFILE_PATH } from './constants';
 import { Profile } from './types';
 
index c0ab9f2e2201399f86a56ad0e011e33179bc271d..c7a59014fd6657a340097c942c44f78e892a0f93 100644 (file)
 
 import { flatMap, range } from 'lodash';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { getMeasures } from '../../api/measures';
 import { getSecurityHotspotList, getSecurityHotspots } from '../../api/security-hotspots';
 import withComponentContext from '../../app/components/componentContext/withComponentContext';
 import withCurrentUserContext from '../../app/components/current-user/withCurrentUserContext';
 import withIndexationGuard from '../../components/hoc/withIndexationGuard';
-import { Location, Router, withRouter } from '../../components/hoc/withRouter';
 import { getLeakValue } from '../../components/measure/utils';
 import { isPullRequest, isSameBranchLike } from '../../helpers/branch-like';
 import { isInput } from '../../helpers/keyboardEventHelpers';
index ab22b7476089345d33698a1c370ba69b06e21b80..c5f6dd41bbe418ea3905730cfbd054af6274fd6c 100644 (file)
@@ -30,8 +30,8 @@ import {
 } from 'design-system';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
+import { Location } from '~sonar-aligned/types/router';
 import { Image } from '../../../components/common/Image';
-import { Location } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { sanitizeUserInput } from '../../../helpers/sanitize';
 import { getReturnUrl } from '../../../helpers/urls';
index ffa535c4ab32b8deda73e3a996a12e9915c9e51b..6340b62f60f41521df7952c9f86c16d023490adb 100644 (file)
 
 import { addGlobalErrorMessage } from 'design-system';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import { logIn } from '../../../api/auth';
 import { getLoginMessage } from '../../../api/settings';
 import { getIdentityProviders } from '../../../api/users';
-import { Location, withRouter } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { getReturnUrl } from '../../../helpers/urls';
 import { IdentityProvider } from '../../../types/types';
index 2f449fd4a1596a2b90fe0adb934878a860f0fc9a..851c2ef1d13dfab97419f3552a3dd455bd3b84c0 100644 (file)
@@ -20,7 +20,8 @@
 import { PopupZLevel, SearchSelectDropdown, SubHeading } from 'design-system';
 import * as React from 'react';
 import { Options } from 'react-select';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { translate } from '../../../helpers/l10n';
 import { CATEGORY_OVERRIDES, LANGUAGES_CATEGORY } from '../constants';
 import { getCategoryName } from '../utils';
index 81eb038cc9ea7598c9fd1d91b4390ca765bd2778..b93fae4b81929eebc52bc4ec3f639e82f321161d 100644 (file)
@@ -22,8 +22,9 @@ import { LargeCenteredLayout, PageContentFontWrapper, themeBorder } from 'design
 import { uniqBy } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
-import { Location, withRouter } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { ExtendedSettingDefinition } from '../../../types/settings';
 import { Component } from '../../../types/types';
index e91128e2d7a28c1635f9cc502027ff25ad7c0213..9ae187d43b7eefcdd28cdf1c5f5470c57c2fcc81 100644 (file)
@@ -20,7 +20,8 @@
 import { debounce, keyBy } from 'lodash';
 import lunr, { LunrIndex } from 'lunr';
 import * as React from 'react';
-import { Router, withRouter } from '../../../components/hoc/withRouter';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Router } from '~sonar-aligned/types/router';
 import { KeyboardKeys } from '../../../helpers/keycodes';
 import { ExtendedSettingDefinition } from '../../../types/settings';
 import { Component, Dict } from '../../../types/types';
index c5e2614aecf8cb697ad6f74fc0ec17d245abb8d7..6ed1d1d198722755b054fac17d318600819ecbf8 100644 (file)
@@ -20,7 +20,8 @@
 import { BasicSeparator, Note, SubTitle } from 'design-system';
 import { groupBy, sortBy } from 'lodash';
 import * as React from 'react';
-import { Location, withRouter } from '../../../components/hoc/withRouter';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import { sanitizeStringRestricted } from '../../../helpers/sanitize';
 import { SettingDefinitionAndValue } from '../../../types/settings';
 import { Component } from '../../../types/types';
index b1c3c3c504c55311cbb68a5b7ce0132df118a395..4f60586bf1bbc6955234f39956183b6b4dca8193 100644 (file)
@@ -19,6 +19,8 @@
  */
 import { noop } from 'lodash';
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import {
   countBoundProjects,
   deleteConfiguration,
@@ -28,7 +30,6 @@ import {
 import withAvailableFeatures, {
   WithAvailableFeaturesProps,
 } from '../../../../app/components/available-features/withAvailableFeatures';
-import { Location, Router, withRouter } from '../../../../components/hoc/withRouter';
 import {
   AlmBindingDefinitionBase,
   AlmKeys,
index 5358118d64a29205ebdf73b04660e866f5dc6b2e..9ca2271d965a91aeddb8ffde57de773e5854990f 100644 (file)
@@ -24,12 +24,12 @@ import { FlagMessage, SubTitle, ToggleButton, getTabId, getTabPanelId } from 'de
 import * as React from 'react';
 import { FormattedMessage } from 'react-intl';
 import { useSearchParams } from 'react-router-dom';
+import { searchParamsToQuery } from '~sonar-aligned/helpers/router';
 import withAvailableFeatures, {
   WithAvailableFeaturesProps,
 } from '../../../../app/components/available-features/withAvailableFeatures';
 import { Image } from '../../../../components/common/Image';
 import { translate } from '../../../../helpers/l10n';
-import { searchParamsToQuery } from '../../../../helpers/urls';
 import { AlmKeys } from '../../../../types/alm-settings';
 import { Feature } from '../../../../types/features';
 import { ExtendedSettingDefinition } from '../../../../types/settings';
index 6afb506ca263f65735804cac4bf0f33e729e5d4c..664c36e0cb5a9c555c12c7e6801213ed12f3c235 100644 (file)
 import { LargeCenteredLayout, PageContentFontWrapper } from 'design-system';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { getSystemInfo } from '../../../api/system';
 import UpdateNotification from '../../../app/components/update-notification/UpdateNotification';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { SysInfoCluster, SysInfoStandalone } from '../../../types/types';
 import '../styles.css';
index edda387123529c7361ee2a99c7d8a90784d0a642..7e5727e35c78b5976e8490462cbcbb5688908a8a 100644 (file)
@@ -19,9 +19,9 @@
  */
 import { each, memoize, omit, omitBy, pickBy, sortBy } from 'lodash';
 import { formatMeasure } from '~sonar-aligned/helpers/measures';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { cleanQuery, parseAsArray, parseAsString, serializeStringArray } from '../../helpers/query';
 import {
-  RawQuery,
   SysInfoAppNode,
   SysInfoBase,
   SysInfoCluster,
index a595f3c099fabf7dcd4abe7985ed3cadc41296b4..419131862f5b67af52a3e779baa0ad33d38868aa 100644 (file)
@@ -18,8 +18,8 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import { memoize } from 'lodash';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { cleanQuery, parseAsString, serializeString } from '../../helpers/query';
-import { RawQuery } from '../../types/types';
 
 export interface Query {
   search: string;
index 017c0096f98753f7f3df2aa0ee4d32ab83aaf55a..ba33592343782cd40aeff24d65c85924ffc3c24b 100644 (file)
@@ -19,8 +19,8 @@
  */
 import { Badge, Card, LinkBox, LinkIcon, SubHeading, Tabs } from 'design-system';
 import * as React from 'react';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { translate, translateWithParameters } from '../../../helpers/l10n';
-import { queryToSearch } from '../../../helpers/urls';
 import { WebApi } from '../../../types/types';
 import { getActionKey, serializeQuery } from '../utils';
 import ActionChangelog from './ActionChangelog';
index 5943362405dec5cc1ffca0907114b6b51702fbb1..4431c54f42f3585b521129470ef0984d4ed24ba9 100644 (file)
@@ -20,7 +20,7 @@
 import { SubnavigationGroup, SubnavigationItem } from 'design-system';
 import * as React from 'react';
 import { useNavigate } from 'react-router-dom';
-import { queryToSearch } from '../../../helpers/urls';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { WebApi } from '../../../types/types';
 import { Query, actionsFilter, isDomainPathActive, serializeQuery } from '../utils';
 import DeprecatedBadge from './DeprecatedBadge';
index e75cd5e728ee7c88bfb12969e84e1eb85a18aa6d..5cb0fd1201ace191742bb61a9be63d9b46ac7f03 100644 (file)
@@ -29,10 +29,11 @@ import { maxBy } from 'lodash';
 import * as React from 'react';
 import { Helmet } from 'react-helmet-async';
 import { Params, useParams } from 'react-router-dom';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { fetchWebApi } from '../../../api/web-api';
 import A11ySkipTarget from '../../../components/a11y/A11ySkipTarget';
 import Suggestions from '../../../components/embed-docs-modal/Suggestions';
-import { Location, Router, withRouter } from '../../../components/hoc/withRouter';
 import { translate } from '../../../helpers/l10n';
 import { WebApi } from '../../../types/types';
 import '../styles/web-api.css';
index 538b00439b6ddad4fac2bfcbc1bbbfd93dc29842..63fb68f4b3f17c8a2bb128024633b2be77ef919e 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import { memoize } from 'lodash';
+import { RawQuery } from '~sonar-aligned/types/router';
 import {
   cleanQuery,
   parseAsOptionalBoolean,
   parseAsString,
   serializeString,
 } from '../../helpers/query';
-import { RawQuery, WebApi } from '../../types/types';
+import { WebApi } from '../../types/types';
 
 export interface Query {
   search: string;
index a6f137121f5a184ced7bf05ce9f52f5e1e4e3362..4e7652255b6d542ac9c455b4c4454176f0c10112 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { listIssues, searchIssues } from '../../../api/issues';
 import { parseIssueFromResponse } from '../../../helpers/issues';
 import { BranchLike } from '../../../types/branch-like';
-import { Issue, RawQuery } from '../../../types/types';
+import { Issue } from '../../../types/types';
 import { DEFAULT_ISSUES_QUERY } from '../../shared/utils';
 
 // maximum possible value
diff --git a/server/sonar-web/src/main/js/components/hoc/__tests__/utils-test.ts b/server/sonar-web/src/main/js/components/hoc/__tests__/utils-test.ts
deleted file mode 100644 (file)
index 4e5fb00..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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 { getWrappedDisplayName } from '../utils';
-
-it('should compute the name correctly', () => {
-  expect(getWrappedDisplayName({} as any, 'myName')).toBe('myName(Component)');
-
-  class DummyWrapper extends React.Component {}
-
-  expect(getWrappedDisplayName(DummyWrapper, 'myName')).toBe('myName(DummyWrapper)');
-
-  class DummyWrapper2 extends React.Component {
-    static displayName = 'Foo';
-  }
-
-  expect(getWrappedDisplayName(DummyWrapper2, 'myName')).toBe('myName(Foo)');
-});
diff --git a/server/sonar-web/src/main/js/components/hoc/utils.ts b/server/sonar-web/src/main/js/components/hoc/utils.ts
deleted file mode 100644 (file)
index 8d1aa35..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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.
- */
-export function getWrappedDisplayName<P>(
-  WrappedComponent: React.ComponentType<React.PropsWithChildren<P>>,
-  hocName: string,
-) {
-  const wrappedDisplayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component';
-  return `${hocName}(${wrappedDisplayName})`;
-}
index 9b242e469fa26efa9ee8a1468d6ca6a8c435e14d..3065ca26ae7ea7c98abb9723bbdee4bbc83cf9d4 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import withCurrentUserContext from '../../app/components/current-user/withCurrentUserContext';
 import handleRequiredAuthentication from '../../helpers/handleRequiredAuthentication';
 import { CurrentUser, isLoggedIn } from '../../types/users';
-import { getWrappedDisplayName } from './utils';
 
 export function whenLoggedIn<P>(WrappedComponent: React.ComponentType<React.PropsWithChildren<P>>) {
   class Wrapper extends React.Component<P & { currentUser: CurrentUser }> {
index c4a3f46f4bea26282cb8d7298af5ef3018823971..135a77637bb8c8985829dca95ca2f07651840b7f 100644 (file)
@@ -18,8 +18,8 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { LanguagesContext } from '../../app/components/languages/LanguagesContext';
-import { getWrappedDisplayName } from './utils';
 
 export function withCLanguageFeature<P>(
   WrappedComponent: React.ComponentType<
index a8727277a0c6c9b99bc1cfdc5060e03948abe36a..add93b4554539c348d7ddb7ff5d72a9c43a4863d 100644 (file)
@@ -18,9 +18,9 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { IndexationContext } from '../../app/components/indexation/IndexationContext';
 import { IndexationContextInterface } from '../../types/indexation';
-import { getWrappedDisplayName } from './utils';
 
 export interface WithIndexationContextProps {
   indexationContext: IndexationContextInterface;
index ed9bc1cdf3ba8b3bc17ec4bda2522f64a8ed4c14..867e79c0dadb6c0168dafa9035f19c0d5b59305e 100644 (file)
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { getComponentMeasureUniqueKey } from '../../helpers/component';
 import { isInput, isShortcut } from '../../helpers/keyboardEventHelpers';
 import { KeyboardKeys } from '../../helpers/keycodes';
 import { ComponentMeasure } from '../../types/types';
-import { getWrappedDisplayName } from './utils';
 
 export interface WithKeyboardNavigationProps {
   components?: ComponentMeasure[];
index 5e96d0dcc1b30aefd7d379cd9da46129879919d6..e1472c9ed4e9b62d6dc9309b47b33301383bbd86 100644 (file)
  */
 import { uniqWith } from 'lodash';
 import * as React from 'react';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 import { addNotification, getNotifications, removeNotification } from '../../api/notifications';
 import {
   Notification,
   NotificationGlobalType,
   NotificationProjectType,
 } from '../../types/notifications';
-import { getWrappedDisplayName } from './utils';
 
 interface State {
   channels: string[];
diff --git a/server/sonar-web/src/main/js/components/hoc/withRouter.tsx b/server/sonar-web/src/main/js/components/hoc/withRouter.tsx
deleted file mode 100644 (file)
index f3146e3..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * 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 {
-  Location as LocationRouter,
-  Params,
-  useLocation as useLocationRouter,
-  useNavigate,
-  useParams,
-} from 'react-router-dom';
-import { queryToSearch, searchParamsToQuery } from '../../helpers/urls';
-import { RawQuery } from '../../types/types';
-import { getWrappedDisplayName } from './utils';
-
-export interface Location extends LocationRouter {
-  query: RawQuery;
-}
-
-export interface Router {
-  replace: (location: string | Partial<Location>) => void;
-  push: (location: string | Partial<Location>) => void;
-}
-
-export interface WithRouterProps {
-  location: Location;
-  params: Params;
-  router: Router;
-}
-
-export function withRouter<P extends Partial<WithRouterProps>>(
-  WrappedComponent: React.ComponentType<React.PropsWithChildren<P>>,
-): React.ComponentType<React.PropsWithChildren<Omit<P, keyof WithRouterProps>>> {
-  function ComponentWithRouterProp(props: P) {
-    const router = useRouter();
-    const params = useParams();
-    const location = useLocation();
-
-    return <WrappedComponent {...props} location={location} params={params} router={router} />;
-  }
-
-  (ComponentWithRouterProp as React.FC<React.PropsWithChildren<P>>).displayName =
-    getWrappedDisplayName(WrappedComponent, 'withRouter');
-
-  return ComponentWithRouterProp;
-}
-
-export function useRouter() {
-  const navigate = useNavigate();
-
-  const router = React.useMemo(
-    () => ({
-      replace: (path: string | Partial<Location>) => {
-        if ((path as Location).query) {
-          path.search = queryToSearch((path as Location).query);
-        }
-        navigate(path, { replace: true });
-      },
-      push: (path: string | Partial<Location>) => {
-        if ((path as Location).query) {
-          path.search = queryToSearch((path as Location).query);
-        }
-        navigate(path);
-      },
-    }),
-    [navigate],
-  );
-
-  return router;
-}
-
-export function useLocation() {
-  const location = useLocationRouter();
-
-  return { ...location, query: searchParamsToQuery(new URLSearchParams(location.search)) };
-}
index 5578e86670f2007d3fb87a4c1338c040ed013d27..73723ef90dba44dc416ad6b685ba6cefa5c44a39 100644 (file)
@@ -19,7 +19,7 @@
  */
 import * as React from 'react';
 import { findDOMNode } from 'react-dom';
-import { getWrappedDisplayName } from './utils';
+import { getWrappedDisplayName } from '~sonar-aligned/components/hoc/utils';
 
 export interface WithScrollToProps {
   selected?: boolean;
index f9a6771ba97d57243cb2ba08ed4d236b10e8fff2..f3e26bb78a28e3a166ff7430faad84ee4685cab3 100644 (file)
@@ -19,6 +19,7 @@
  */
 import { IssueMessageHighlighting, StandoutLink } from 'design-system';
 import * as React from 'react';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import { getBranchLikeQuery } from '~sonar-aligned/helpers/branch-like';
 import { getComponentIssuesUrl } from '~sonar-aligned/helpers/urls';
 import { ComponentContext } from '../../../app/components/componentContext/ComponentContext';
@@ -27,7 +28,6 @@ import { translate } from '../../../helpers/l10n';
 import { getIssuesUrl } from '../../../helpers/urls';
 import { BranchLike } from '../../../types/branch-like';
 import { Issue } from '../../../types/types';
-import { useLocation } from '../../hoc/withRouter';
 
 export interface IssueMessageProps {
   issue: Issue;
index e1e8dc53d1e00c61fb3aa129dabab302f21a6238..22d291acf670f46966720e787b19539c7b9709f4 100644 (file)
 import { Banner, Link } from 'design-system';
 import React, { useCallback, useEffect, useMemo, useState } from 'react';
 import { FormattedMessage, useIntl } from 'react-intl';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { MessageTypes, checkMessageDismissed, setMessageDismissed } from '../../api/messages';
 import { CurrentUserContextInterface } from '../../app/components/current-user/CurrentUserContext';
 import withCurrentUserContext from '../../app/components/current-user/withCurrentUserContext';
 import { NEW_CODE_PERIOD_CATEGORY } from '../../apps/settings/constants';
-import { queryToSearch } from '../../helpers/urls';
 import { useNewCodeDefinitionQuery } from '../../queries/newCodeDefinition';
 import { Component } from '../../types/types';
 import {
index 920de7f5f4aeade2c7b43e700d073ecd4eaf87fe..71e77125e2bc00acb5f5f9a9ecfdf2fd2f1acf45 100644 (file)
@@ -18,6 +18,8 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import * as React from 'react';
+import { withRouter } from '~sonar-aligned/components/hoc/withRouter';
+import { Location } from '~sonar-aligned/types/router';
 import { getAlmSettingsNoCatch } from '../../api/alm-settings';
 import { getScannableProjects } from '../../api/components';
 import { getValue } from '../../api/settings';
@@ -29,7 +31,6 @@ import { Permissions } from '../../types/permissions';
 import { SettingsKey } from '../../types/settings';
 import { Component } from '../../types/types';
 import { LoggedInUser } from '../../types/users';
-import { Location, withRouter } from '../hoc/withRouter';
 import TutorialSelectionRenderer from './TutorialSelectionRenderer';
 import { TutorialModes } from './types';
 
index ee5c09bdd054a1c4b0a05990775a5b0d2ad53089..9baea69ab1d5dccac8e72ffd36c6e403c64a558f 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
+import { searchParamsToQuery } from '~sonar-aligned/helpers/router';
 import {
   getComponentIssuesUrl,
   getComponentSecurityHotspotsUrl,
+  queryToSearch,
 } from '~sonar-aligned/helpers/urls';
 import { DEFAULT_ISSUES_QUERY } from '../../components/shared/utils';
 import { AlmKeys } from '../../types/alm-settings';
@@ -47,8 +49,6 @@ import {
   getQualityGatesUrl,
   getReturnUrl,
   isRelativeUrl,
-  queryToSearch,
-  searchParamsToQuery,
   stripTrailingSlash,
 } from '../urls';
 
index cea27a096025083072e3979d1f1faa4902385ea1..535bdbff08fa8f63245c7009cc8c0e1fa5224622 100644 (file)
@@ -18,7 +18,7 @@
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 import { isEqual, isNil, omitBy } from 'lodash';
-import { RawQuery } from '../types/types';
+import { RawQuery } from '~sonar-aligned/types/router';
 import { isValidDate, parseDate, toISO8601WithOffsetString, toShortISO8601String } from './dates';
 
 export function queriesEqual(a: RawQuery, b: RawQuery): boolean {
index 313cb7f03bd33e086a7308316b3f7462d9a54395..4e9f2400902894f0790b48960d84bb4d26f47eb5 100644 (file)
  */
 import { omit } from 'lodash';
 import { To } from 'react-router-dom';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { CompareResponse } from '../api/quality-profiles';
 import { RuleDescriptionSections } from '../apps/coding-rules/rule';
 import { REST_RULE_KEYS_TO_OLD_KEYS } from '../apps/coding-rules/utils';
 import { Exporter, Profile, ProfileChangelogEvent } from '../apps/quality-profiles/types';
 import { LogsLevels } from '../apps/system/utils';
-import { Location, Router } from '../components/hoc/withRouter';
 import { AppState } from '../types/appstate';
 import {
   CleanCodeAttribute,
@@ -592,9 +592,12 @@ export function mockRouter(
     goBack: jest.fn(),
     goForward: jest.fn(),
     isActive: jest.fn(),
+    navigate: jest.fn(),
     push: jest.fn(),
     replace: jest.fn(),
+    searchParams: new URLSearchParams(),
     setRouteLeaveHook: jest.fn(),
+    setSearchParams: jest.fn(),
     ...overrides,
   } as Router;
 }
index b8e7bcf983de471742a56b28a7fc535397f23d68..2faaba061ded3cbcf472966d0574ff4d36c2cd12 100644 (file)
@@ -36,6 +36,7 @@ import {
   createRoutesFromElements,
   parsePath,
 } from 'react-router-dom';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import AdminContext from '../app/components/AdminContext';
 import AppStateContextProvider from '../app/components/app-state/AppStateContextProvider';
 import { AvailableFeaturesContext } from '../app/components/available-features/AvailableFeaturesContext';
@@ -44,7 +45,6 @@ import CurrentUserContextProvider from '../app/components/current-user/CurrentUs
 import IndexationContextProvider from '../app/components/indexation/IndexationContextProvider';
 import { LanguagesContext } from '../app/components/languages/LanguagesContext';
 import { MetricsContext } from '../app/components/metrics/MetricsContext';
-import { useLocation } from '../components/hoc/withRouter';
 import { AppState } from '../types/appstate';
 import { ComponentContextShape } from '../types/component';
 import { Feature } from '../types/features';
index 05053a9f659148c5423317a7b96f6acb4f1e8269..ce1ce5d5710b3683ae44ba5b6851a304a9f540ec 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { isArray, mapValues, omitBy } from 'lodash';
 import { Path, To } from 'react-router-dom';
 import { getBranchLikeQuery, isBranch, isMainBranch } from '~sonar-aligned/helpers/branch-like';
+import { queryToSearch } from '~sonar-aligned/helpers/urls';
 import { getProfilePath } from '../apps/quality-profiles/utils';
 import { DEFAULT_ISSUES_QUERY } from '../components/shared/utils';
 import { BranchLike, BranchParameters } from '../types/branch-like';
 import { ComponentQualifier, isApplication, isPortfolioLike } from '../types/component';
 import { MeasurePageView } from '../types/measures';
 import { GraphType } from '../types/project-activity';
-import { Dict, RawQuery } from '../types/types';
+import { Dict } from '../types/types';
 import { HomePage } from '../types/users';
 import { isPullRequest } from './branch-like';
 import { serializeOptionalBoolean } from './query';
@@ -48,35 +48,6 @@ export type Query = Location['query'];
 
 const PROJECT_BASE_URL = '/dashboard';
 
-export function queryToSearch(query: RawQuery = {}) {
-  const arrayParams: Array<{ key: string; values: string[] }> = [];
-
-  const stringParams = mapValues(query, (value, key) => {
-    // array values are added afterwards
-    if (isArray(value)) {
-      arrayParams.push({ key, values: value });
-      return '';
-    }
-
-    return value != null ? `${value}` : '';
-  });
-  const filteredParams = omitBy(stringParams, (v: string) => v.length === 0);
-  const searchParams = new URLSearchParams(filteredParams);
-
-  /*
-   * Add each value separately
-   * e.g. author: ['a', 'b'] should be serialized as
-   * author=a&author=b
-   */
-  arrayParams.forEach(({ key, values }) => {
-    values.forEach((value) => {
-      searchParams.append(key, value);
-    });
-  });
-
-  return `?${searchParams.toString()}`;
-}
-
 export function getComponentOverviewUrl(
   componentKey: string,
   componentQualifier: ComponentQualifier | string,
@@ -422,23 +393,6 @@ export function isRelativeUrl(url?: string): boolean {
   return Boolean(url && regex.test(url));
 }
 
-export function searchParamsToQuery(searchParams: URLSearchParams, omitKey: string[] = []) {
-  const result: RawQuery = {};
-
-  searchParams.forEach((value, key) => {
-    if (omitKey.includes(key)) {
-      return;
-    }
-    if (result[key]) {
-      result[key] = ([] as string[]).concat(result[key], value);
-    } else {
-      result[key] = value;
-    }
-  });
-
-  return result;
-}
-
 export function convertToTo(link: string | Location) {
   if (linkIsLocation(link)) {
     return { pathname: link.pathname, search: queryToSearch(link.query) } as Partial<Path>;
index e8bd6e1b252dcc7b79432b7ff75aba27efb7a7e1..642f58db08f8d290aa39c465a8bca1baaf653e1e 100644 (file)
@@ -22,7 +22,9 @@ import { debounce, flatten } from 'lodash';
 import * as React from 'react';
 import { useCallback, useContext } from 'react';
 import { useSearchParams } from 'react-router-dom';
+import { useLocation } from '~sonar-aligned/components/hoc/withRouter';
 import { isBranch } from '~sonar-aligned/helpers/branch-like';
+import { searchParamsToQuery } from '~sonar-aligned/helpers/router';
 import {
   deleteBranch,
   deletePullRequest,
@@ -35,10 +37,8 @@ import {
 import { dismissAnalysisWarning, getAnalysisStatus } from '../api/ce';
 import { getQualityGateProjectStatus } from '../api/quality-gates';
 import { AvailableFeaturesContext } from '../app/components/available-features/AvailableFeaturesContext';
-import { useLocation } from '../components/hoc/withRouter';
 import { isPullRequest } from '../helpers/branch-like';
 import { extractStatusConditionsFromProjectStatus } from '../helpers/qualityGates';
-import { searchParamsToQuery } from '../helpers/urls';
 import { Branch, BranchLike } from '../types/branch-like';
 import { isApplication, isPortfolioLike, isProject } from '../types/component';
 import { Feature } from '../types/features';
diff --git a/server/sonar-web/src/main/js/sonar-aligned/components/hoc/__tests__/utils-test.ts b/server/sonar-web/src/main/js/sonar-aligned/components/hoc/__tests__/utils-test.ts
new file mode 100644 (file)
index 0000000..4e5fb00
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * 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 { getWrappedDisplayName } from '../utils';
+
+it('should compute the name correctly', () => {
+  expect(getWrappedDisplayName({} as any, 'myName')).toBe('myName(Component)');
+
+  class DummyWrapper extends React.Component {}
+
+  expect(getWrappedDisplayName(DummyWrapper, 'myName')).toBe('myName(DummyWrapper)');
+
+  class DummyWrapper2 extends React.Component {
+    static displayName = 'Foo';
+  }
+
+  expect(getWrappedDisplayName(DummyWrapper2, 'myName')).toBe('myName(Foo)');
+});
diff --git a/server/sonar-web/src/main/js/sonar-aligned/components/hoc/utils.ts b/server/sonar-web/src/main/js/sonar-aligned/components/hoc/utils.ts
new file mode 100644 (file)
index 0000000..48fa468
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * 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 React from 'react';
+
+export function getWrappedDisplayName<P>(
+  WrappedComponent: React.ComponentType<React.PropsWithChildren<P>>,
+  hocName: string,
+) {
+  const wrappedDisplayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component';
+  return `${hocName}(${wrappedDisplayName})`;
+}
diff --git a/server/sonar-web/src/main/js/sonar-aligned/components/hoc/withRouter.tsx b/server/sonar-web/src/main/js/sonar-aligned/components/hoc/withRouter.tsx
new file mode 100644 (file)
index 0000000..6fded28
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * 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 { useMemo } from 'react';
+import {
+  Params,
+  useLocation as useLocationRouter,
+  useNavigate,
+  useParams,
+  useSearchParams,
+} from 'react-router-dom';
+import { searchParamsToQuery } from '../../helpers/router';
+import { queryToSearch } from '../../helpers/urls';
+import { Location, Router } from '../../types/router';
+import { getWrappedDisplayName } from './utils';
+
+export interface WithRouterProps {
+  location: Location;
+  params: Params;
+  router: Router;
+}
+
+export function withRouter<P extends Partial<WithRouterProps>>(
+  WrappedComponent: React.ComponentType<React.PropsWithChildren<P>>,
+): React.ComponentType<React.PropsWithChildren<Omit<P, keyof WithRouterProps>>> {
+  function ComponentWithRouterProp(props: Readonly<P>) {
+    const router = useRouter();
+    const params = useParams();
+    const location = useLocation();
+
+    return <WrappedComponent {...props} location={location} params={params} router={router} />;
+  }
+
+  (ComponentWithRouterProp as React.FC<React.PropsWithChildren<P>>).displayName =
+    getWrappedDisplayName(WrappedComponent, 'withRouter');
+
+  return ComponentWithRouterProp;
+}
+
+export function useRouter() {
+  const navigate = useNavigate();
+  const [searchParams, setSearchParams] = useSearchParams();
+
+  return React.useMemo(
+    () => ({
+      replace: (path: string | Partial<Location>) => {
+        if ((path as Location).query) {
+          path.search = queryToSearch((path as Location).query);
+        }
+        navigate(path, { replace: true });
+      },
+      push: (path: string | Partial<Location>) => {
+        if ((path as Location).query) {
+          path.search = queryToSearch((path as Location).query);
+        }
+        navigate(path);
+      },
+      navigate,
+      searchParams,
+      setSearchParams,
+    }),
+    [navigate, searchParams, setSearchParams],
+  );
+}
+
+export function useLocation() {
+  const location = useLocationRouter();
+
+  return useMemo(
+    () => ({ ...location, query: searchParamsToQuery(new URLSearchParams(location.search)) }),
+    [location],
+  );
+}
diff --git a/server/sonar-web/src/main/js/sonar-aligned/helpers/__tests__/urls-test.ts b/server/sonar-web/src/main/js/sonar-aligned/helpers/__tests__/urls-test.ts
new file mode 100644 (file)
index 0000000..89b2961
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * 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 { queryToSearch } from '../urls';
+
+describe('queryToSearch', () => {
+  it('should return query by default', () => {
+    expect(queryToSearch()).toBe('?');
+  });
+
+  it('should return query with string values', () => {
+    expect(queryToSearch({ key: 'value' })).toBe('?key=value');
+  });
+
+  it('should remove empty values', () => {
+    expect(queryToSearch({ key: 'value', anotherKey: '' })).toBe('?key=value');
+  });
+
+  it('should return query with array values', () => {
+    expect(queryToSearch({ key: ['value1', 'value2'] })).toBe('?key=value1&key=value2');
+  });
+});
diff --git a/server/sonar-web/src/main/js/sonar-aligned/helpers/router.ts b/server/sonar-web/src/main/js/sonar-aligned/helpers/router.ts
new file mode 100644 (file)
index 0000000..9ac3547
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * 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 { RawQuery } from '../types/router';
+
+export function searchParamsToQuery(searchParams: URLSearchParams, omitKey: string[] = []) {
+  const result: RawQuery = {};
+
+  searchParams.forEach((value, key) => {
+    if (omitKey.includes(key)) {
+      return;
+    }
+    if (result[key]) {
+      result[key] = ([] as string[]).concat(result[key], value);
+    } else {
+      result[key] = value;
+    }
+  });
+
+  return result;
+}
index 363729eba2b633b4ef2a19da70698086aa4ca926..37ec03bef81e5fbef98a755d17a02145e1bdde0c 100644 (file)
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
-import { pick } from 'lodash';
-import { Query, queryToSearch } from '../../helpers/urls';
-
+import { isArray, mapValues, omitBy, pick } from 'lodash';
 import { Path } from 'react-router-dom';
+import { Query } from '../../helpers/urls';
 import { BranchLike } from '../../types/branch-like';
 import { SecurityStandard } from '../../types/security';
-import { getBranchLikeQuery } from './branch-like';
+import { getBranchLikeQuery } from '../helpers/branch-like';
+import { RawQuery } from '../types/router';
+
+export function queryToSearch(query: RawQuery = {}) {
+  const arrayParams: Array<{ key: string; values: string[] }> = [];
+
+  const stringParams = mapValues(query, (value, key) => {
+    // array values are added afterwards
+    if (isArray(value)) {
+      arrayParams.push({ key, values: value });
+      return '';
+    }
+
+    return value != null ? `${value}` : '';
+  });
+  const filteredParams = omitBy(stringParams, (v: string) => v.length === 0);
+  const searchParams = new URLSearchParams(filteredParams);
+
+  /*
+   * Add each value separately
+   * e.g. author: ['a', 'b'] should be serialized as
+   * author=a&author=b
+   */
+  arrayParams.forEach(({ key, values }) => {
+    values.forEach((value) => {
+      searchParams.append(key, value);
+    });
+  });
+
+  return `?${searchParams.toString()}`;
+}
 
 /**
  * Generate URL for a component's issues page
  */
-
 export function getComponentIssuesUrl(componentKey: string, query?: Query): Path {
   return {
     pathname: '/project/issues',
@@ -40,7 +68,6 @@ export function getComponentIssuesUrl(componentKey: string, query?: Query): Path
 /**
  * Generate URL for a component's security hotspot page
  */
-
 export function getComponentSecurityHotspotsUrl(
   componentKey: string,
   branchLike?: BranchLike,
diff --git a/server/sonar-web/src/main/js/sonar-aligned/types/router.ts b/server/sonar-web/src/main/js/sonar-aligned/types/router.ts
new file mode 100644 (file)
index 0000000..5043d5a
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * 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 {
+  Location as LocationRouter,
+  NavigateFunction,
+  URLSearchParamsInit,
+} from 'react-router-dom';
+
+export type RawQuery = Record<string, any>;
+
+export interface Location extends LocationRouter {
+  query: RawQuery;
+}
+
+export interface Router {
+  navigate: NavigateFunction;
+  replace: (location: string | Partial<Location>) => void;
+  push: (location: string | Partial<Location>) => void;
+  searchParams: URLSearchParams;
+  setSearchParams: (
+    nextInit: URLSearchParamsInit,
+    navigateOptions?: { replace?: boolean; state?: any },
+  ) => void;
+}
index b6f5d72de02d9604a6bf6003f695b764c2b62136..bf6ba7f7de1439385502592f86c7fae36cf351cb 100644 (file)
@@ -21,7 +21,7 @@
 import { Theme } from '@emotion/react';
 import { QueryClient } from '@tanstack/react-query';
 import { IntlShape } from 'react-intl';
-import { Location, Router } from '../components/hoc/withRouter';
+import { Location, Router } from '~sonar-aligned/types/router';
 import { AppState } from './appstate';
 import { BranchLike } from './branch-like';
 import { L10nBundle } from './l10nBundle';
index b4c6c827a3cc12b2e6bffb1441439f8ff026b74f..31874615a18104809186c4897b6aeba1c6ff373a 100644 (file)
@@ -538,8 +538,6 @@ export interface QualityGate extends QualityGatePreview {
   caycStatus?: CaycStatus;
 }
 
-export type RawQuery = Dict<any>;
-
 export interface Rule {
   cleanCodeAttributeCategory?: CleanCodeAttributeCategory;
   cleanCodeAttribute?: CleanCodeAttribute;