From 2ab6fc273ecbf405f7c126fab11ddc0b9bf516da Mon Sep 17 00:00:00 2001 From: Philippe Perrin Date: Wed, 2 Nov 2022 11:08:39 +0100 Subject: [PATCH] SONAR-13368 Bump to prettier@2.7.1 --- server/sonar-web/.prettierrc | 4 + server/sonar-web/package.json | 7 +- .../src/main/js/api/alm-integrations.ts | 24 +- .../sonar-web/src/main/js/api/alm-settings.ts | 2 +- .../sonar-web/src/main/js/api/application.ts | 4 +- server/sonar-web/src/main/js/api/auth.ts | 5 +- server/sonar-web/src/main/js/api/branches.ts | 9 +- server/sonar-web/src/main/js/api/ce.ts | 4 +- .../sonar-web/src/main/js/api/components.ts | 18 +- server/sonar-web/src/main/js/api/issues.ts | 20 +- server/sonar-web/src/main/js/api/languages.ts | 2 +- server/sonar-web/src/main/js/api/measures.ts | 14 +- server/sonar-web/src/main/js/api/metrics.ts | 2 +- .../js/api/mocks/AuthenticationServiceMock.ts | 10 +- .../main/js/api/mocks/BranchesServiceMock.ts | 2 +- .../src/main/js/api/mocks/CodeServiceMocks.ts | 30 +- .../src/main/js/api/mocks/CodingRulesMock.ts | 108 +++---- .../js/api/mocks/ComputeEngineServiceMock.ts | 28 +- .../main/js/api/mocks/IssuesServiceMock.ts | 196 ++++++------- .../main/js/api/mocks/NotificationsMock.ts | 10 +- .../mocks/PermissionTemplateServiceMock.ts | 10 +- .../js/api/mocks/QualityGatesServiceMock.ts | 88 +++--- .../api/mocks/SecurityHotspotServiceMock.ts | 30 +- .../main/js/api/mocks/SettingsServiceMock.ts | 10 +- .../js/api/mocks/SourceViewerServiceMock.ts | 72 +++-- .../src/main/js/api/mocks/UserTokensMock.ts | 16 +- .../sonar-web/src/main/js/api/permissions.ts | 6 +- server/sonar-web/src/main/js/api/plugins.ts | 14 +- .../src/main/js/api/projectActivity.ts | 12 +- .../sonar-web/src/main/js/api/projectLinks.ts | 7 +- .../src/main/js/api/quality-gates.ts | 6 +- .../src/main/js/api/quality-profiles.ts | 23 +- server/sonar-web/src/main/js/api/rules.ts | 10 +- .../src/main/js/api/security-hotspots.ts | 14 +- server/sonar-web/src/main/js/api/settings.ts | 12 +- server/sonar-web/src/main/js/api/static.ts | 2 +- .../sonar-web/src/main/js/api/time-machine.ts | 6 +- .../sonar-web/src/main/js/api/user-tokens.ts | 2 +- .../sonar-web/src/main/js/api/user_groups.ts | 2 +- server/sonar-web/src/main/js/api/users.ts | 2 +- server/sonar-web/src/main/js/api/web-api.ts | 2 +- .../main/js/app/components/AdminContainer.tsx | 11 +- .../main/js/app/components/AdminContext.tsx | 2 +- .../src/main/js/app/components/App.tsx | 2 +- .../js/app/components/ComponentContainer.tsx | 39 +-- .../main/js/app/components/GlobalFooter.tsx | 9 +- .../app/components/GlobalFooterBranding.tsx | 6 +- .../main/js/app/components/GlobalMessage.tsx | 3 +- .../components/GlobalMessagesContainer.tsx | 6 +- .../app/components/KeyboardShortcutsModal.tsx | 33 +-- .../js/app/components/MigrationContainer.tsx | 4 +- .../app/components/NonAdminPagesContainer.tsx | 3 +- .../main/js/app/components/PageTracker.tsx | 3 +- .../js/app/components/PluginRiskConsent.tsx | 2 +- .../main/js/app/components/RecentHistory.ts | 4 +- .../js/app/components/SonarLintConnection.tsx | 6 +- .../main/js/app/components/StartupModal.tsx | 2 +- .../js/app/components/SystemAnnouncement.tsx | 9 +- .../__tests__/AdminContainer-test.tsx | 9 +- .../js/app/components/__tests__/App-test.tsx | 10 +- .../__tests__/ComponentContainer-test.tsx | 73 ++--- .../__tests__/GlobalFooter-test.tsx | 6 +- .../__tests__/KeyboardShortcutsModal-test.tsx | 8 +- .../app/components/__tests__/Landing-test.tsx | 4 +- .../__tests__/MigrationContainer-test.tsx | 8 +- .../components/__tests__/PageTracker-test.tsx | 4 +- .../__tests__/PluginRiskConsent-test.tsx | 11 +- .../__tests__/RecentHistory-test.tsx | 2 +- .../__tests__/ResetPassword-test.tsx | 8 +- .../__tests__/SonarLintConnection-test.tsx | 12 +- .../__tests__/StartupModal-test.tsx | 15 +- .../__tests__/SystemAnnouncement-test.tsx | 26 +- .../components/app-state/AppStateContext.tsx | 2 +- .../app-state/AppStateContextProvider.tsx | 2 +- .../AppStateContextProvider-test.tsx | 2 +- .../__tests__/withAppStateContext-test.tsx | 4 +- .../app-state/withAppStateContext.tsx | 2 +- .../__tests__/withAvailableFeatures-test.tsx | 9 +- .../withAvailableFeatures.tsx | 4 +- .../branch-status/BranchStatusContext.tsx | 2 +- .../BranchStatusContextProvider.tsx | 17 +- .../BranchStatusContextProvider-test.tsx | 6 +- .../componentContext/ComponentContext.ts | 2 +- .../componentContext/withComponentContext.tsx | 2 +- .../CurrentUserContextProvider.tsx | 15 +- .../extensions/CreateApplicationForm.tsx | 15 +- .../app/components/extensions/Extension.tsx | 4 +- .../extensions/GlobalAdminPageExtension.tsx | 2 +- .../extensions/GlobalPageExtension.tsx | 4 +- .../extensions/ProjectAdminPageExtension.tsx | 4 +- .../extensions/ProjectPageExtension.tsx | 2 +- .../__tests__/CreateApplicationForm-test.tsx | 9 +- .../extensions/__tests__/Extension-test.tsx | 6 +- .../__tests__/GlobalPageExtension-test.tsx | 4 +- .../ProjectAdminPageExtension-test.tsx | 4 +- .../__tests__/ProjectPageExtension-test.tsx | 2 +- .../components/extensions/exposeLibraries.ts | 22 +- .../indexation/IndexationNotification.tsx | 10 +- .../IndexationNotificationHelper.ts | 2 +- .../IndexationNotificationRenderer.tsx | 18 +- .../PageUnavailableDueToIndexation.tsx | 6 +- .../IndexationContextProvider-test.tsx | 6 +- .../__tests__/IndexationNotification-test.tsx | 38 +-- .../IndexationNotificationHelper-test.tsx | 6 +- .../IndexationNotificationRenderer-test.tsx | 4 +- .../PageUnavailableDueToIndexation-test.tsx | 10 +- .../languages/LanguagesContextProvider.tsx | 2 +- .../LanguagesContextProvider-test.tsx | 2 +- .../__tests__/withLanguagesContext-test.tsx | 4 +- .../languages/withLanguagesContext.tsx | 2 +- .../metrics/MetricsContextProvider.tsx | 2 +- .../__tests__/MetricsContextProvider-test.tsx | 2 +- .../__tests__/withMetricsContext-test.tsx | 6 +- .../components/metrics/withMetricsContext.tsx | 2 +- .../components/nav/component/Breadcrumb.tsx | 5 +- .../components/nav/component/ComponentNav.tsx | 17 +- .../nav/component/ComponentNavWarnings.tsx | 4 +- .../components/nav/component/HeaderMeta.tsx | 10 +- .../js/app/components/nav/component/Menu.tsx | 98 ++++--- .../component/__tests__/Breadcrumb-test.tsx | 16 +- .../component/__tests__/ComponentNav-test.tsx | 4 +- .../ComponentNavBgTaskNotif-test.tsx | 56 ++-- .../ComponentNavLicenseNotif-test.tsx | 20 +- ...ponentNavProjectBindingErrorNotif-test.tsx | 2 +- .../component/__tests__/HeaderMeta-test.tsx | 16 +- .../nav/component/__tests__/Menu-test.tsx | 28 +- .../branch-like/BranchLikeNavigation.tsx | 15 +- .../branch-like/CurrentBranchLike.tsx | 26 +- .../CurrentBranchLikeMergeInformation.tsx | 2 +- .../nav/component/branch-like/Menu.tsx | 29 +- .../nav/component/branch-like/MenuItem.tsx | 10 +- .../component/branch-like/MenuItemList.tsx | 42 +-- .../__tests__/BranchLikeNavigation-test.tsx | 5 +- .../__tests__/CurrentBranchLike-test.tsx | 34 +-- ...CurrentBranchLikeMergeInformation-test.tsx | 2 +- .../branch-like/__tests__/Menu-test.tsx | 16 +- .../__tests__/MenuItemList-test.tsx | 4 +- .../projectInformation/DrawerLink.tsx | 3 +- .../projectInformation/InfoDrawer.tsx | 3 +- .../projectInformation/InfoDrawerPage.tsx | 8 +- .../projectInformation/ProjectInformation.tsx | 14 +- .../ProjectInformationPages.ts | 2 +- .../ProjectInformationRenderer.tsx | 5 +- .../__tests__/ProjectInformation-test.tsx | 6 +- .../ProjectInformationRenderer-test.tsx | 10 +- .../projectInformation/badges/BadgeParams.tsx | 31 +- .../badges/ProjectBadges.tsx | 19 +- .../badges/__tests__/BadgeParams-test.tsx | 12 +- .../badges/__tests__/ProjectBadges-test.tsx | 8 +- .../badges/__tests__/utils-test.ts | 4 +- .../projectInformation/badges/utils.ts | 2 +- .../projectInformation/meta/MetaLink.tsx | 3 +- .../projectInformation/meta/MetaLinks.tsx | 4 +- .../meta/MetaQualityProfiles.tsx | 15 +- .../projectInformation/meta/MetaSize.tsx | 7 +- .../projectInformation/meta/MetaTags.tsx | 13 +- .../meta/MetaTagsSelector.tsx | 2 +- .../meta/__tests__/MetaLink-test.tsx | 4 +- .../__tests__/MetaQualityProfiles-test.tsx | 8 +- .../meta/__tests__/MetaSize-test.tsx | 2 +- .../meta/__tests__/MetaTags-test.tsx | 12 +- .../meta/__tests__/MetaTagsSelector-test.tsx | 4 +- .../notifications/ProjectNotifications.tsx | 10 +- .../__tests__/ProjectNotifications-test.tsx | 14 +- .../RegulatoryReport.tsx | 25 +- .../components/nav/global/GlobalNavMenu.tsx | 27 +- .../components/nav/global/GlobalNavUser.tsx | 6 +- .../__tests__/GlobalNavBranding-test.tsx | 12 +- .../global/__tests__/GlobalNavMenu-test.tsx | 10 +- .../settings/PendingPluginsActionNotif.tsx | 2 +- .../components/nav/settings/SettingsNav.tsx | 33 ++- .../nav/settings/SystemRestartNotif.tsx | 2 +- .../PendingPluginsActionNotif-test.tsx | 14 +- .../settings/__tests__/SettingsNav-test.tsx | 10 +- .../PromotionNotification.tsx | 3 +- .../__tests__/PromotionNotification-test.tsx | 8 +- .../main/js/app/components/search/Search.tsx | 39 +-- .../js/app/components/search/SearchResult.tsx | 5 +- .../app/components/search/SearchResults.tsx | 4 +- .../app/components/search/SearchShowMore.tsx | 5 +- .../search/__tests__/Search-test.tsx | 20 +- .../search/__tests__/SearchResult-test.tsx | 6 +- .../search/__tests__/SearchResults-test.tsx | 8 +- .../search/__tests__/SearchShowMore-test.tsx | 4 +- .../main/js/app/components/search/utils.ts | 4 +- .../UpdateNotification.tsx | 19 +- .../__tests__/UpdateNotification-test.tsx | 38 +-- server/sonar-web/src/main/js/app/index.ts | 6 +- server/sonar-web/src/main/js/app/theme.js | 14 +- .../main/js/app/utils/NavigateWithParams.tsx | 2 +- .../handleRequiredAuthorization-test.ts | 6 +- .../js/app/utils/exportModulesAsGlobals.ts | 2 +- .../src/main/js/app/utils/isValidUri.ts | 2 +- .../src/main/js/app/utils/startReactApp.tsx | 4 +- .../js/apps/account/__tests__/Account-it.tsx | 120 ++++---- .../notifications/GlobalNotifications.tsx | 2 +- .../account/notifications/Notifications.tsx | 6 +- .../notifications/NotificationsList.tsx | 8 +- .../account/notifications/ProjectModal.tsx | 23 +- .../notifications/ProjectNotifications.tsx | 7 +- .../apps/account/notifications/Projects.tsx | 20 +- .../js/apps/account/profile/Preferences.tsx | 4 +- .../main/js/apps/account/profile/Profile.tsx | 4 +- .../account/profile/UserExternalIdentity.tsx | 13 +- .../js/apps/account/projects/ProjectCard.tsx | 6 +- .../js/apps/account/projects/Projects.tsx | 2 +- .../account/projects/ProjectsContainer.tsx | 4 +- .../apps/audit-logs/components/AuditApp.tsx | 6 +- .../components/AuditAppRenderer.tsx | 14 +- .../audit-logs/components/DownloadButton.tsx | 9 +- .../components/__tests__/AuditApp-it.tsx | 18 +- .../src/main/js/apps/audit-logs/utils.ts | 4 +- .../__tests__/BackgroundTasks-it.tsx | 6 +- .../__tests__/BackgroundTasks-test.tsx | 2 +- .../components/BackgroundTasksApp.tsx | 18 +- .../components/NoWorkersSupportPopup.tsx | 3 +- .../components/ScannerContext.tsx | 2 +- .../background-tasks/components/Search.tsx | 18 +- .../components/Stacktrace.tsx | 2 +- .../components/StatPendingCount.tsx | 3 +- .../components/StatusFilter.tsx | 6 +- .../components/TaskActions.tsx | 17 +- .../components/TaskComponent.tsx | 2 +- .../background-tasks/components/Tasks.tsx | 2 +- .../components/TypesFilter.tsx | 8 +- .../background-tasks/components/Workers.tsx | 6 +- .../components/WorkersForm.tsx | 7 +- .../__tests__/BackgroundTasksApp-test.tsx | 12 +- .../__tests__/ScannerContext-test.tsx | 4 +- .../components/__tests__/Stacktrace-test.tsx | 4 +- .../__tests__/StatPendingCount-test.tsx | 6 +- .../__tests__/StatPendingTime-test.tsx | 12 +- .../components/__tests__/TaskStatus-test.tsx | 2 +- .../components/__tests__/Workers-test.tsx | 6 +- .../components/__tests__/WorkersForm-test.tsx | 2 +- .../js/apps/background-tasks/constants.ts | 8 +- .../main/js/apps/background-tasks/utils.ts | 6 +- .../ChangeAdminPasswordApp.tsx | 8 +- .../ChangeAdminPasswordAppRenderer.tsx | 5 +- .../__tests__/ChangeAdminPasswordApp-it.tsx | 10 +- .../main/js/apps/code/__tests__/Code-it.ts | 2 +- .../js/apps/code/__tests__/buckets-test.tsx | 4 +- .../js/apps/code/__tests__/utils-test.tsx | 20 +- .../sonar-web/src/main/js/apps/code/bucket.ts | 4 +- .../main/js/apps/code/components/CodeApp.tsx | 20 +- .../js/apps/code/components/Component.tsx | 14 +- .../apps/code/components/ComponentMeasure.tsx | 2 +- .../js/apps/code/components/ComponentName.tsx | 15 +- .../js/apps/code/components/ComponentPin.tsx | 5 +- .../js/apps/code/components/Components.tsx | 10 +- .../apps/code/components/ComponentsHeader.tsx | 13 +- .../main/js/apps/code/components/Search.tsx | 18 +- .../components/__tests__/CodeApp-test.tsx | 58 ++-- .../__tests__/ComponentMeasure-test.tsx | 6 +- .../__tests__/ComponentName-test.tsx | 24 +- .../components/__tests__/Components-test.tsx | 2 +- .../code/components/__tests__/Search-test.tsx | 22 +- .../sonar-web/src/main/js/apps/code/utils.ts | 40 +-- .../coding-rules/__tests__/CodingRules-it.ts | 82 +++--- .../components/ActivationButton.tsx | 3 +- .../components/ActivationFormModal.tsx | 14 +- .../js/apps/coding-rules/components/App.tsx | 63 ++-- .../coding-rules/components/BulkChange.tsx | 5 +- .../components/BulkChangeModal.tsx | 22 +- .../components/CustomRuleFormModal.tsx | 31 +- .../js/apps/coding-rules/components/Facet.tsx | 10 +- .../coding-rules/components/LanguageFacet.tsx | 8 +- .../coding-rules/components/ProfileFacet.tsx | 27 +- .../components/RepositoryFacet.tsx | 6 +- .../coding-rules/components/RuleDetails.tsx | 24 +- .../components/RuleDetailsCustomRules.tsx | 15 +- .../components/RuleDetailsDescription.tsx | 22 +- .../components/RuleDetailsIssues.tsx | 12 +- .../components/RuleDetailsMeta.tsx | 6 +- .../components/RuleDetailsProfiles.tsx | 29 +- .../components/RuleDetailsTagsPopup.tsx | 4 +- .../components/RuleInheritanceIcon.tsx | 3 +- .../coding-rules/components/RuleListItem.tsx | 22 +- .../components/SeveritySelect.tsx | 6 +- .../components/SimilarRulesFilter.tsx | 20 +- .../apps/coding-rules/components/TagFacet.tsx | 8 +- .../coding-rules/components/TemplateFacet.tsx | 3 +- .../__tests__/ActivationFormModal-test.tsx | 22 +- .../components/__tests__/App-test.tsx | 16 +- .../components/__tests__/BulkChange-test.tsx | 6 +- .../__tests__/CustomRuleFormModal-test.tsx | 6 +- .../__tests__/LanguageFacet-test.tsx | 8 +- .../__tests__/RepositoryFacet-test.tsx | 8 +- .../components/__tests__/RuleDetails-test.tsx | 20 +- .../__tests__/RuleDetailsIssues-test.tsx | 12 +- .../__tests__/RuleDetailsMeta-test.tsx | 6 +- .../__tests__/RuleDetailsTagsPopup-test.tsx | 2 +- .../__tests__/RuleListItem-test.tsx | 34 +-- .../components/__tests__/TagFacet-test.tsx | 2 +- .../src/main/js/apps/coding-rules/query.ts | 8 +- .../src/main/js/apps/coding-rules/routes.tsx | 4 +- .../src/main/js/apps/coding-rules/rule.ts | 2 +- .../__tests__/utils-test.ts | 48 ++-- .../component-measures/components/App.tsx | 25 +- .../components/Breadcrumbs.tsx | 4 +- .../components/MeasureContent.tsx | 47 +-- .../components/MeasureHeader.tsx | 3 +- .../components/MeasureOverview.tsx | 12 +- .../components/MeasureOverviewContainer.tsx | 8 +- .../components/MeasureViewSelect.tsx | 10 +- .../components/__tests__/App-test.tsx | 38 ++- .../components/__tests__/Breadcrumb-test.tsx | 4 +- .../components/__tests__/Breadcrumbs-test.tsx | 8 +- .../__tests__/LeakPeriodLegend-test.tsx | 8 +- .../__tests__/MeasureContent-test.tsx | 36 +-- .../__tests__/MeasureHeader-test.tsx | 10 +- .../__tests__/MeasureOverview-test.tsx | 28 +- .../apps/component-measures/config/bubbles.ts | 14 +- .../config/complementary.ts | 2 +- .../apps/component-measures/config/domains.ts | 38 +-- .../drilldown/BubbleChart.tsx | 29 +- .../drilldown/ComponentCell.tsx | 17 +- .../drilldown/ComponentsList.tsx | 6 +- .../drilldown/ComponentsListRow.tsx | 8 +- .../drilldown/FilesView.tsx | 8 +- .../drilldown/TreeMapView.tsx | 31 +- .../drilldown/__tests__/BubbleChart-test.tsx | 18 +- .../__tests__/ComponentCell-test.tsx | 56 ++-- .../__tests__/ComponentList-test.tsx | 6 +- .../drilldown/__tests__/FilesView-test.tsx | 22 +- .../js/apps/component-measures/routes.tsx | 12 +- .../sidebar/DomainFacet.tsx | 12 +- .../sidebar/FacetMeasureValue.tsx | 3 +- .../component-measures/sidebar/Sidebar.tsx | 8 +- .../sidebar/__tests__/DomainFacet-test.tsx | 26 +- .../__tests__/FacetMeasureValue-test.tsx | 8 +- .../sidebar/__tests__/Sidebar-test.tsx | 14 +- .../main/js/apps/component-measures/utils.ts | 54 ++-- .../project/AzurePersonalAccessTokenForm.tsx | 12 +- .../create/project/AzureProjectAccordion.tsx | 27 +- .../create/project/AzureProjectCreate.tsx | 16 +- .../project/AzureProjectCreateRenderer.tsx | 7 +- .../apps/create/project/AzureProjectsList.tsx | 19 +- .../project/BitbucketCloudProjectCreate.tsx | 22 +- .../BitbucketCloudProjectCreateRender.tsx | 2 +- .../project/BitbucketCloudSearchForm.tsx | 20 +- .../project/BitbucketImportRepositoryForm.tsx | 11 +- .../project/BitbucketProjectAccordion.tsx | 26 +- .../create/project/BitbucketProjectCreate.tsx | 18 +- .../BitbucketProjectCreateRenderer.tsx | 7 +- .../create/project/BitbucketRepositories.tsx | 7 +- .../create/project/BitbucketSearchResults.tsx | 14 +- .../project/CreateProjectModeSelection.tsx | 10 +- .../apps/create/project/CreateProjectPage.tsx | 28 +- .../create/project/GitHubProjectCreate.tsx | 20 +- .../project/GitHubProjectCreateRenderer.tsx | 24 +- .../create/project/GitlabProjectCreate.tsx | 18 +- .../project/GitlabProjectCreateRenderer.tsx | 2 +- .../project/GitlabProjectSelectionForm.tsx | 17 +- .../create/project/ManualProjectCreate.tsx | 34 +-- .../project/PersonalAccessTokenForm.tsx | 50 ++-- .../create/project/WrongBindingCountAlert.tsx | 4 +- .../AzurePersonalAccessTokenForm-test.tsx | 8 +- .../__tests__/AzureProjectAccordion-test.tsx | 57 +--- .../__tests__/AzureProjectCreate-test.tsx | 16 +- .../AzureProjectCreateRenderer-test.tsx | 6 +- .../__tests__/AzureProjectsList-test.tsx | 6 +- .../BitbucketCloudProjectCreate-test.tsx | 26 +- ...BitbucketCloudProjectCreateRender-test.tsx | 4 +- .../BitbucketCloudSearchForm-test.tsx | 16 +- .../BitbucketImportRepositoryForm-test.tsx | 12 +- .../BitbucketProjectAccordion-test.tsx | 14 +- .../__tests__/BitbucketProjectCreate-test.tsx | 24 +- .../BitbucketProjectCreateRenderer-test.tsx | 4 +- .../__tests__/BitbucketRepositories-test.tsx | 10 +- .../__tests__/BitbucketSearchResults-test.tsx | 7 +- .../CreateProjectModeSelection-test.tsx | 6 +- .../__tests__/CreateProjectPage-test.tsx | 41 +-- .../__tests__/GitHubProjectCreate-test.tsx | 32 +-- .../GitHubProjectCreateRenderer-test.tsx | 22 +- .../__tests__/GitlabProjectCreate-test.tsx | 32 +-- .../GitlabProjectCreateRenderer-test.tsx | 2 +- .../GitlabProjectSelectionForm-test.tsx | 21 +- .../__tests__/ManualProjectCreate-test.tsx | 24 +- .../PersonalAccessTokenForm-test.tsx | 18 +- .../src/main/js/apps/create/project/types.ts | 2 +- .../main/js/apps/groups/components/App.tsx | 12 +- .../js/apps/groups/components/EditMembers.tsx | 3 +- .../groups/components/EditMembersModal.tsx | 26 +- .../main/js/apps/groups/components/Form.tsx | 5 +- .../main/js/apps/groups/components/List.tsx | 2 +- .../js/apps/groups/components/ListItem.tsx | 5 +- .../groups/components/__tests__/App-test.tsx | 16 +- .../__tests__/EditMembersModal-test.tsx | 29 +- .../groups/components/__tests__/List-test.tsx | 8 +- .../js/apps/issues/__tests__/IssueApp-it.tsx | 48 ++-- .../js/apps/issues/__tests__/actions-test.ts | 16 +- .../js/apps/issues/__tests__/utils-test.ts | 8 +- .../src/main/js/apps/issues/actions.ts | 12 +- .../apps/issues/components/AssigneeSelect.tsx | 12 +- .../issues/components/BulkChangeModal.tsx | 67 ++--- .../components/ComponentBreadcrumbs.tsx | 7 +- .../js/apps/issues/components/IssueHeader.tsx | 7 +- .../js/apps/issues/components/IssuesApp.tsx | 126 ++++---- .../js/apps/issues/components/IssuesList.tsx | 2 +- .../issues/components/IssuesSourceViewer.tsx | 11 +- .../js/apps/issues/components/ListItem.tsx | 2 +- .../__tests__/AssigneeSelect-test.tsx | 26 +- .../__tests__/BulkChangeModal-test.tsx | 17 +- .../__tests__/ComponentBreadcrumbs-test.tsx | 2 +- .../components/__tests__/IssuesApp-test.tsx | 77 +++-- .../__tests__/IssuesSourceViewer-test.tsx | 18 +- .../conciseIssuesList/ConciseIssueBox.tsx | 10 +- .../ConciseIssueLocationBadge.tsx | 3 +- .../ConciseIssueLocations.tsx | 3 +- .../__tests__/ConciseIssue-test.tsx | 2 +- .../__tests__/ConciseIssueLocations-test.tsx | 8 +- .../ComponentSourceSnippetGroupViewer.tsx | 47 ++- .../CrossComponentSourceViewer.tsx | 25 +- .../IssueSourceViewerHeader.tsx | 21 +- .../SnippetViewer.tsx | 34 ++- ...ComponentSourceSnippetGroupViewer-test.tsx | 103 +++---- .../CrossComponentSourceViewer-test.tsx | 13 +- .../IssueSourceViewerHeader-test.tsx | 4 +- .../__tests__/SnippetViewer-test.tsx | 34 +-- .../__tests__/utils-test.ts | 85 +++--- .../crossComponentSourceViewer/utils.ts | 28 +- .../src/main/js/apps/issues/routes.tsx | 4 +- .../js/apps/issues/sidebar/AssigneeFacet.tsx | 12 +- .../js/apps/issues/sidebar/AuthorFacet.tsx | 4 +- .../apps/issues/sidebar/CreationDateFacet.tsx | 25 +- .../js/apps/issues/sidebar/DirectoryFacet.tsx | 6 +- .../main/js/apps/issues/sidebar/FileFacet.tsx | 8 +- .../js/apps/issues/sidebar/LanguageFacet.tsx | 12 +- .../js/apps/issues/sidebar/PeriodFilter.tsx | 4 +- .../js/apps/issues/sidebar/ProjectFacet.tsx | 24 +- .../apps/issues/sidebar/ResolutionFacet.tsx | 6 +- .../main/js/apps/issues/sidebar/RuleFacet.tsx | 12 +- .../js/apps/issues/sidebar/ScopeFacet.tsx | 6 +- .../js/apps/issues/sidebar/SeverityFacet.tsx | 6 +- .../main/js/apps/issues/sidebar/Sidebar.tsx | 8 +- .../js/apps/issues/sidebar/StandardFacet.tsx | 64 ++--- .../js/apps/issues/sidebar/StatusFacet.tsx | 4 +- .../main/js/apps/issues/sidebar/TagFacet.tsx | 8 +- .../main/js/apps/issues/sidebar/TypeFacet.tsx | 8 +- .../sidebar/__tests__/AssigneeFacet-test.tsx | 10 +- .../__tests__/CreationDateFacet-test.tsx | 8 +- .../sidebar/__tests__/DirectoryFacet-test.tsx | 9 +- .../sidebar/__tests__/FileFacet-test.tsx | 9 +- .../sidebar/__tests__/PeriodFilter-test.tsx | 2 +- .../sidebar/__tests__/ProjectFacet-test.tsx | 12 +- .../sidebar/__tests__/RuleFacet-test.tsx | 2 +- .../sidebar/__tests__/ScopeFacet-test.tsx | 4 +- .../issues/sidebar/__tests__/Sidebar-test.tsx | 14 +- .../sidebar/__tests__/StandardFacet-test.tsx | 57 ++-- .../sidebar/__tests__/StatusFacet-test.tsx | 10 +- .../sidebar/__tests__/TypeFacet-test.tsx | 8 +- .../src/main/js/apps/issues/utils.ts | 20 +- .../js/apps/maintenance/components/App.tsx | 17 +- .../components/__tests__/App-test.tsx | 36 +-- .../src/main/js/apps/marketplace/App.tsx | 8 +- .../main/js/apps/marketplace/EditionBoxes.tsx | 4 +- .../marketplace/MarketplaceAppContainer.tsx | 2 +- .../main/js/apps/marketplace/PluginsList.tsx | 8 +- .../src/main/js/apps/marketplace/Search.tsx | 4 +- .../apps/marketplace/__tests__/App-test.tsx | 8 +- .../__tests__/EditionBoxes-test.tsx | 2 +- .../MarketplaceAppContainer-test.tsx | 6 +- .../__tests__/PluginUpdates-test.tsx | 10 +- .../__tests__/PluginsList-test.tsx | 6 +- .../marketplace/components/EditionBox.tsx | 3 +- .../components/LicensePromptModal.tsx | 2 +- .../marketplace/components/PluginActions.tsx | 12 +- .../components/PluginAvailable.tsx | 2 +- .../components/PluginChangeLog.tsx | 20 +- .../components/PluginChangeLogButton.tsx | 3 +- .../components/PluginChangeLogItem.tsx | 3 +- .../marketplace/components/PluginLicense.tsx | 2 +- .../components/PluginOrganization.tsx | 5 +- .../components/PluginRiskConsentBox.tsx | 3 +- .../components/PluginUpdateButton.tsx | 3 +- .../components/PluginUpdateItem.tsx | 2 +- .../marketplace/components/PluginUpdates.tsx | 2 +- .../marketplace/components/PluginUrls.tsx | 6 +- .../__tests__/PluginActions-test.tsx | 4 +- .../__tests__/PluginAvailable-test.tsx | 12 +- .../__tests__/PluginChangeLog-test.tsx | 14 +- .../__tests__/PluginDescription-test.tsx | 2 +- .../__tests__/PluginOrganization-test.tsx | 2 +- .../components/__tests__/PluginUrls-test.tsx | 2 +- .../src/main/js/apps/marketplace/utils.ts | 8 +- .../apps/overview/branches/ActivityPanel.tsx | 15 +- .../js/apps/overview/branches/Analysis.tsx | 4 +- .../branches/ApplicationLeakPeriodInfo.tsx | 2 +- .../apps/overview/branches/BranchOverview.tsx | 87 +++--- .../branches/BranchOverviewRenderer.tsx | 2 +- .../js/apps/overview/branches/DebtValue.tsx | 3 +- .../branches/DrilldownMeasureValue.tsx | 3 +- .../main/js/apps/overview/branches/Event.tsx | 3 +- .../branches/FirstAnalysisNextStepsNotif.tsx | 27 +- .../apps/overview/branches/MeasuresPanel.tsx | 20 +- .../branches/MeasuresPanelIssueMeasureRow.tsx | 3 +- .../branches/MeasuresPanelNoNewCode.tsx | 9 +- .../apps/overview/branches/NoCodeWarning.tsx | 2 +- .../branches/ProjectLeakPeriodInfo.tsx | 4 +- .../overview/branches/QualityGatePanel.tsx | 13 +- .../branches/QualityGatePanelSection.tsx | 4 +- .../branches/__tests__/ActivityPanel-test.tsx | 6 +- .../branches/__tests__/Analysis-test.tsx | 4 +- .../ApplicationLeakPeriodInfo-test.tsx | 2 +- .../__tests__/BranchOverview-test.tsx | 90 +++--- .../branches/__tests__/DebtValue-test.tsx | 2 +- .../branches/__tests__/Event-test.tsx | 4 +- .../FirstAnalysisNextStepsNotif-test.tsx | 12 +- .../branches/__tests__/MeasuresPanel-test.tsx | 24 +- .../MeasuresPanelIssueMeasureRow-test.tsx | 4 +- .../__tests__/MeasuresPanelNoNewCode-test.tsx | 4 +- .../branches/__tests__/NoCodeWarning-test.tsx | 2 +- .../__tests__/ProjectLeakPeriodInfo-test.tsx | 2 +- .../__tests__/QualityGatePanel-test.tsx | 22 +- .../QualityGatePanelSection-test.tsx | 10 +- .../SecurityHotspotsReviewed-test.tsx | 6 +- .../main/js/apps/overview/components/App.tsx | 2 +- .../overview/components/EmptyOverview.tsx | 6 +- .../apps/overview/components/IssueLabel.tsx | 5 +- .../apps/overview/components/IssueRating.tsx | 3 +- .../overview/components/LeakPeriodLegend.tsx | 4 +- .../overview/components/MeasurementLabel.tsx | 12 +- .../components/QualityGateCondition.tsx | 13 +- .../components/QualityGateConditions.tsx | 10 +- .../components/SonarLintPromotion.tsx | 9 +- .../components/__tests__/App-test.tsx | 8 +- .../__tests__/EmptyOverview-test.tsx | 2 +- .../components/__tests__/IssueLabel-test.tsx | 12 +- .../components/__tests__/IssueRating-test.tsx | 4 +- .../__tests__/LeakPeriodLegend-test.tsx | 4 +- .../__tests__/MeasurementLabel-test.tsx | 22 +- .../__tests__/QualityGateCondition-test.tsx | 10 +- .../__tests__/SonarLintPromition-test.tsx | 10 +- .../pullRequests/LargeQualityGateBadge.tsx | 10 +- .../pullRequests/PullRequestOverview.tsx | 27 +- .../__tests__/AfterMergeEstimate-test.tsx | 4 +- .../__tests__/PullRequestOverview-test.tsx | 24 +- .../src/main/js/apps/overview/utils.ts | 18 +- .../components/ActionsCell.tsx | 15 +- .../permission-templates/components/App.tsx | 6 +- .../components/Defaults.tsx | 2 +- .../permission-templates/components/Form.tsx | 10 +- .../components/Header.tsx | 4 +- .../permission-templates/components/List.tsx | 2 +- .../components/ListHeader.tsx | 2 +- .../components/ListItem.tsx | 2 +- .../components/Template.tsx | 19 +- .../components/__tests__/ActionsCell-test.tsx | 2 +- .../components/__tests__/App-test.tsx | 12 +- .../components/__tests__/Defaults-test.tsx | 2 +- .../components/__tests__/ListItem-test.tsx | 2 +- .../components/__tests__/NameCell-test.tsx | 2 +- .../components/__tests__/Template-test.tsx | 30 +- .../js/apps/permission-templates/utils.ts | 14 +- .../apps/permissions/__tests__/utils-test.ts | 6 +- .../global/components/AllHoldersList.tsx | 17 +- .../permissions/global/components/App.tsx | 42 +-- .../__tests__/AllHoldersList-test.tsx | 8 +- .../global/components/__tests__/App-test.tsx | 18 +- .../project/components/AllHoldersList.tsx | 5 +- .../permissions/project/components/App.tsx | 48 ++-- .../project/components/ApplyTemplate.tsx | 11 +- .../components/PublicProjectDisclaimer.tsx | 3 +- .../project/components/__tests__/App-test.tsx | 22 +- .../__tests__/ApplyTemplate-test.tsx | 12 +- .../shared/components/GroupHolder.tsx | 6 +- .../shared/components/HoldersList.tsx | 24 +- .../shared/components/PermissionCell.tsx | 12 +- .../shared/components/PermissionHeader.tsx | 10 +- .../shared/components/SearchForm.tsx | 2 +- .../shared/components/UserHolder.tsx | 6 +- .../components/__tests__/GroupHolder-test.tsx | 6 +- .../components/__tests__/HoldersList-test.tsx | 10 +- .../__tests__/PermissionCell-test.tsx | 6 +- .../components/__tests__/UserHolder-test.tsx | 6 +- .../src/main/js/apps/permissions/utils.ts | 20 +- .../projectActivity/__tests__/actions-test.ts | 22 +- .../projectActivity/__tests__/utils-test.ts | 54 ++-- .../main/js/apps/projectActivity/actions.ts | 20 +- .../projectActivity/components/Events.tsx | 4 +- .../ProjectActivityAnalysesList.tsx | 17 +- .../components/ProjectActivityAnalysis.tsx | 27 +- .../components/ProjectActivityApp.tsx | 52 ++-- .../components/ProjectActivityDateInput.tsx | 3 +- .../components/ProjectActivityGraphs.tsx | 22 +- .../components/ProjectActivityPageFilters.tsx | 6 +- .../components/__tests__/Event-test.tsx | 28 +- .../components/__tests__/Events-test.tsx | 2 +- .../ProjectActivityAnalysesList-test.tsx | 18 +- .../ProjectActivityAnalysis-test.tsx | 16 +- .../__tests__/ProjectActivityApp-it.tsx | 31 +- .../__tests__/ProjectActivityApp-test.tsx | 22 +- .../ProjectActivityAppRenderer-test.tsx | 30 +- .../__tests__/ProjectActivityGraphs-test.tsx | 20 +- .../components/forms/AddEventForm.tsx | 3 +- .../components/forms/ChangeEventForm.tsx | 3 +- .../components/forms/RemoveAnalysisForm.tsx | 3 +- .../components/forms/RemoveEventForm.tsx | 3 +- .../forms/__tests__/AddEventForm-test.tsx | 2 +- .../src/main/js/apps/projectActivity/utils.ts | 17 +- .../apps/projectBaseline/components/App.tsx | 24 +- .../projectBaseline/components/AppHeader.tsx | 4 +- .../components/BaselineSettingAnalysis.tsx | 3 +- .../components/BaselineSettingDays.tsx | 12 +- .../BaselineSettingPreviousVersion.tsx | 3 +- .../BaselineSettingReferenceBranch.tsx | 15 +- .../components/BranchAnalysisList.tsx | 14 +- .../components/BranchAnalysisListRenderer.tsx | 37 +-- .../components/BranchBaselineSettingModal.tsx | 16 +- .../projectBaseline/components/BranchList.tsx | 22 +- .../components/ProjectBaselineSelector.tsx | 10 +- .../components/__tests__/App-test.tsx | 8 +- .../BaselineSettingAnalysis-test.tsx | 5 +- .../__tests__/BaselineSettingDays-test.tsx | 5 +- .../BaselineSettingPreviousVersion-test.tsx | 5 +- .../BaselineSettingReferenceBranch-test.tsx | 34 +-- .../__tests__/BranchAnalysisList-test.tsx | 24 +- .../BranchAnalysisListRenderer-test.tsx | 14 +- .../BranchBaselineSettingModal-test.tsx | 20 +- .../components/__tests__/BranchList-test.tsx | 16 +- .../__tests__/BranchListRow-test.tsx | 26 +- .../ProjectBaselineSelector-test.tsx | 33 +-- .../components/__tests__/utils-test.ts | 26 +- .../src/main/js/apps/projectBaseline/utils.ts | 4 +- .../components/BranchLikeRow.tsx | 2 +- .../components/BranchLikeTable.tsx | 2 +- .../components/BranchLikeTabs.tsx | 10 +- .../components/BranchPurgeSetting.tsx | 2 +- .../components/DeleteBranchModal.tsx | 4 +- .../components/LifetimeInformation.tsx | 6 +- .../LifetimeInformationRenderer.tsx | 2 +- .../__tests__/BranchLikeTable-test.tsx | 12 +- .../__tests__/BranchLikeTabs-test.tsx | 52 +--- .../__tests__/BranchPurgeSetting-test.tsx | 2 +- .../__tests__/DeleteBranchModal-test.tsx | 2 +- .../__tests__/LifetimeInformation-test.tsx | 4 +- .../LifetimeInformationRenderer-test.tsx | 2 +- .../__tests__/ProjectBranchesApp-test.tsx | 5 +- .../src/main/js/apps/projectDeletion/Form.tsx | 3 +- .../projectDeletion/__tests__/Form-test.tsx | 4 +- .../js/apps/projectDump/ProjectDumpApp.tsx | 16 +- .../__tests__/ProjectDumpApp-test.tsx | 4 +- .../js/apps/projectDump/components/Export.tsx | 6 +- .../js/apps/projectDump/components/Import.tsx | 11 +- .../components/__tests__/Export-test.tsx | 4 +- .../components/__tests__/Import-test.tsx | 4 +- .../main/js/apps/projectKey/UpdateForm.tsx | 6 +- .../js/apps/projectKey/__tests__/Key-test.tsx | 4 +- .../projectKey/__tests__/UpdateForm-test.tsx | 12 +- .../src/main/js/apps/projectLinks/App.tsx | 8 +- .../js/apps/projectLinks/CreationModal.tsx | 3 +- .../src/main/js/apps/projectLinks/LinkRow.tsx | 3 +- .../src/main/js/apps/projectLinks/Table.tsx | 2 +- .../apps/projectLinks/__tests__/App-test.tsx | 6 +- .../projectLinks/__tests__/Table-test.tsx | 2 +- .../ProjectQualityGateApp.tsx | 31 +- .../ProjectQualityGateAppRenderer.tsx | 31 +- .../__tests__/ProjectQualityGateApp-test.tsx | 18 +- .../ProjectQualityGateAppRenderer-test.tsx | 26 +- .../ProjectQualityProfilesApp.tsx | 46 +-- .../ProjectQualityProfilesAppRenderer.tsx | 11 +- .../ProjectQualityProfilesApp-test.tsx | 46 +-- ...ProjectQualityProfilesAppRenderer-test.tsx | 22 +- .../components/AddLanguageModal.tsx | 15 +- .../components/SetQualityProfileModal.tsx | 23 +- .../__tests__/AddLanguageModal-test.tsx | 24 +- .../LanguageProfileSelectOption-test.tsx | 2 +- .../__tests__/SetQualityProfileModal-test.tsx | 33 +-- .../js/apps/projects/__tests__/utils-test.ts | 26 +- .../apps/projects/components/AllProjects.tsx | 17 +- .../components/ApplicationCreation.tsx | 2 +- .../components/EmptyFavoriteSearch.tsx | 7 +- .../projects/components/EmptyInstance.tsx | 3 +- .../projects/components/FavoriteFilter.tsx | 4 +- .../apps/projects/components/PageHeader.tsx | 5 +- .../apps/projects/components/PageSidebar.tsx | 2 +- .../projects/components/PerspectiveSelect.tsx | 13 +- .../components/ProjectCreationMenu.tsx | 15 +- .../components/ProjectCreationMenuItem.tsx | 3 +- .../components/ProjectsSortingSelect.tsx | 21 +- .../components/__tests__/AllProjects-test.tsx | 20 +- .../__tests__/ApplicationCreation-test.tsx | 14 +- .../__tests__/DefaultPageSelector-test.tsx | 8 +- .../__tests__/EmptyInstance-test.tsx | 2 +- .../__tests__/FavoriteFilter-test.tsx | 8 +- .../components/__tests__/PageHeader-test.tsx | 10 +- .../components/__tests__/PageSidebar-test.tsx | 13 +- .../__tests__/ProjectCreationMenu-test.tsx | 16 +- .../__tests__/ProjectsList-test.tsx | 12 +- .../__tests__/ProjectsSortingSelect-test.tsx | 6 +- .../components/project-card/ProjectCard.tsx | 25 +- .../project-card/ProjectCardLanguages.tsx | 4 +- .../project-card/ProjectCardMeasure.tsx | 3 +- .../project-card/ProjectCardMeasures.tsx | 22 +- .../__tests__/ProjectCard-test.tsx | 24 +- .../__tests__/ProjectCardLanguages-test.tsx | 2 +- .../__tests__/ProjectCardMeasures-test.tsx | 4 +- .../projects/filters/DuplicationsFilter.tsx | 2 +- .../main/js/apps/projects/filters/Filter.tsx | 21 +- .../apps/projects/filters/LanguagesFilter.tsx | 2 +- .../projects/filters/SecurityReviewFilter.tsx | 2 +- .../js/apps/projects/filters/TagsFilter.tsx | 8 +- .../filters/__tests__/Filter-test.tsx | 6 +- .../__tests__/LanguagesFilter-test.tsx | 2 +- .../filters/__tests__/NewLinesFilter-test.tsx | 2 +- .../__tests__/SearchableFilterFooter-test.tsx | 2 +- .../filters/__tests__/SizeFilter-test.tsx | 2 +- .../src/main/js/apps/projects/query.ts | 24 +- .../src/main/js/apps/projects/utils.ts | 38 +-- .../BulkApplyTemplateModal.tsx | 12 +- .../ChangeDefaultVisibilityForm.tsx | 5 +- .../projectsManagement/CreateProjectForm.tsx | 13 +- .../apps/projectsManagement/DeleteModal.tsx | 7 +- .../ProjectManagementApp.tsx | 12 +- .../js/apps/projectsManagement/ProjectRow.tsx | 3 +- .../projectsManagement/ProjectRowActions.tsx | 9 +- .../js/apps/projectsManagement/Projects.tsx | 5 +- .../projectsManagement/RestoreAccessModal.tsx | 4 +- .../js/apps/projectsManagement/Search.tsx | 23 +- .../__tests__/BulkApplyTemplateModal-test.tsx | 14 +- .../ChangeDefaultVisibilityForm-test.tsx | 6 +- .../__tests__/CreateProjectForm-test.tsx | 14 +- .../__tests__/DeleteModal-test.tsx | 4 +- .../__tests__/Header-test.tsx | 2 +- .../__tests__/ProjectManagementApp-it.tsx | 14 +- .../__tests__/ProjectManagementApp-test.tsx | 21 +- .../__tests__/ProjectRow-test.tsx | 2 +- .../__tests__/ProjectRowActions-test.tsx | 14 +- .../__tests__/Projects-test.tsx | 12 +- .../__tests__/Search-test.tsx | 6 +- .../quality-gates/__tests__/utils-test.ts | 2 +- .../js/apps/quality-gates/components/App.tsx | 8 +- .../quality-gates/components/Condition.tsx | 5 +- .../components/ConditionModal.tsx | 14 +- .../components/ConditionOperator.tsx | 4 +- .../quality-gates/components/Conditions.tsx | 41 +-- .../components/CopyQualityGateForm.tsx | 5 +- .../components/CreateQualityGateForm.tsx | 3 +- .../components/DeleteQualityGateForm.tsx | 6 +- .../apps/quality-gates/components/Details.tsx | 10 +- .../components/DetailsHeader.tsx | 12 +- .../js/apps/quality-gates/components/List.tsx | 5 +- .../quality-gates/components/ListHeader.tsx | 7 +- .../quality-gates/components/MetricSelect.tsx | 10 +- .../quality-gates/components/Projects.tsx | 32 +-- .../components/QualityGatePermissions.tsx | 18 +- .../QualityGatePermissionsAddModal.tsx | 2 +- ...QualityGatePermissionsAddModalRenderer.tsx | 4 +- .../QualityGatePermissionsRenderer.tsx | 20 +- .../components/RenameQualityGateForm.tsx | 3 +- .../components/ThresholdInput.tsx | 4 +- .../components/__tests__/App-it.tsx | 26 +- .../src/main/js/apps/quality-gates/utils.ts | 6 +- .../quality-profiles/changelog/Changelog.tsx | 4 +- .../changelog/ChangelogContainer.tsx | 12 +- .../changelog/ChangesList.tsx | 2 +- .../changelog/__tests__/Changelog-test.tsx | 11 +- .../__tests__/ChangelogContainer-test.tsx | 6 +- .../__tests__/ChangelogSearch-test.tsx | 4 +- .../compare/ComparisonContainer.tsx | 2 +- .../compare/ComparisonForm.tsx | 10 +- .../compare/ComparisonResults.tsx | 14 +- .../compare/__tests__/ComparisonForm-test.tsx | 14 +- .../ComparisonResultActivation-test.tsx | 2 +- .../__tests__/ComparisonResults-test.tsx | 51 ++-- .../components/DeleteProfileForm.tsx | 3 +- .../components/ProfileActions.tsx | 37 ++- .../components/ProfileContainer.tsx | 6 +- .../components/ProfileLink.tsx | 3 +- .../components/ProfileModalForm.tsx | 3 +- .../components/QualityProfilesApp.tsx | 6 +- .../__tests__/ProfileActions-test.tsx | 60 ++-- .../__tests__/ProfileContainer-test.tsx | 13 +- .../__tests__/QualityProfilesApp-test.tsx | 8 +- .../details/ChangeParentForm.tsx | 15 +- .../details/ChangeProjectsForm.tsx | 24 +- .../details/ProfileExporters.tsx | 5 +- .../details/ProfileInheritance.tsx | 14 +- .../details/ProfileInheritanceBox.tsx | 2 +- .../details/ProfilePermissions.tsx | 18 +- .../details/ProfilePermissionsForm.tsx | 8 +- .../details/ProfilePermissionsFormSelect.tsx | 8 +- .../details/ProfilePermissionsGroup.tsx | 7 +- .../details/ProfilePermissionsUser.tsx | 10 +- .../details/ProfileProjects.tsx | 16 +- .../quality-profiles/details/ProfileRules.tsx | 18 +- .../details/ProfileRulesRowOfType.tsx | 4 +- .../ProfileRulesSonarWayComparison.tsx | 2 +- .../__tests__/ChangeParentForm-test.tsx | 4 +- .../__tests__/ChangeProjectsForm-test.tsx | 25 +- .../details/__tests__/ProfileDetails-test.tsx | 4 +- .../__tests__/ProfileInheritance-test.tsx | 4 +- .../__tests__/ProfileInheritanceBox-test.tsx | 2 +- .../__tests__/ProfilePermissions-test.tsx | 20 +- .../__tests__/ProfilePermissionsForm-test.tsx | 6 +- .../ProfilePermissionsFormSelect-test.tsx | 11 +- .../ProfilePermissionsGroup-test.tsx | 4 +- .../__tests__/ProfilePermissionsUser-test.tsx | 4 +- .../__tests__/ProfileProjects-test.tsx | 16 +- .../details/__tests__/ProfileRules-test.tsx | 30 +- .../home/CreateProfileForm.tsx | 29 +- .../home/EvolutionDeprecated.tsx | 15 +- .../quality-profiles/home/EvolutionRules.tsx | 8 +- .../home/EvolutionStagnant.tsx | 9 +- .../apps/quality-profiles/home/PageHeader.tsx | 8 +- .../quality-profiles/home/ProfilesList.tsx | 11 +- .../home/ProfilesListHeader.tsx | 6 +- .../quality-profiles/home/ProfilesListRow.tsx | 7 +- .../home/RestoreProfileForm.tsx | 2 +- .../home/__tests__/CreateProfileForm-test.tsx | 8 +- .../__tests__/EvolutionDeprecated-test.tsx | 12 +- .../home/__tests__/PageHeader-test.tsx | 2 +- .../home/__tests__/ProfilesList-test.tsx | 2 +- .../__tests__/ProfilesListHeader-test.tsx | 2 +- .../main/js/apps/quality-profiles/types.ts | 2 +- .../main/js/apps/quality-profiles/utils.ts | 18 +- .../security-hotspots/SecurityHotspotsApp.tsx | 58 ++-- .../SecurityHotspotsAppRenderer.tsx | 2 +- .../__tests__/SecurityHotspotsApp-it.tsx | 12 +- .../__tests__/SecurityHotspotsApp-test.tsx | 89 +++--- .../SecurityHotspotsAppRenderer-test.tsx | 23 +- .../security-hotspots/__tests__/utils-test.ts | 92 +++--- .../components/FilterBar.tsx | 19 +- .../components/HotspotCategory.tsx | 7 +- .../components/HotspotCommentPopup.tsx | 8 +- .../components/HotspotHeader.tsx | 2 +- .../components/HotspotList.tsx | 14 +- .../components/HotspotListItem.tsx | 6 +- .../components/HotspotOpenInIdeButton.tsx | 5 +- .../components/HotspotOpenInIdeOverlay.tsx | 4 +- .../components/HotspotPrimaryLocationBox.tsx | 6 +- .../components/HotspotReviewHistory.tsx | 16 +- .../HotspotReviewHistoryAndComments.tsx | 9 +- .../components/HotspotSimpleList.tsx | 4 +- .../components/HotspotSnippetContainer.tsx | 30 +- .../HotspotSnippetContainerRenderer.tsx | 6 +- .../components/HotspotSnippetHeader.tsx | 4 +- .../components/HotspotViewer.tsx | 10 +- .../components/HotspotViewerRenderer.tsx | 2 +- .../components/HotspotViewerTabs.tsx | 31 +- .../components/StatusUpdateSuccessModal.tsx | 6 +- .../components/__tests__/FilterBar-test.tsx | 16 +- .../__tests__/HotspotCategory-test.tsx | 4 +- .../__tests__/HotspotCommentPopup-test.tsx | 4 +- .../__tests__/HotspotHeader-test.tsx | 5 +- .../components/__tests__/HotspotList-test.tsx | 10 +- .../__tests__/HotspotOpenInIdeButton-test.tsx | 4 +- .../HotspotOpenInIdeOverlay-test.tsx | 5 +- .../HotspotPrimaryLocationBox-test.tsx | 14 +- .../__tests__/HotspotReviewHistory-test.tsx | 64 ++--- .../HotspotReviewHistoryAndComments-test.tsx | 11 +- .../__tests__/HotspotSimpleList-test.tsx | 8 +- .../HotspotSnippetContainer-test.tsx | 58 ++-- .../HotspotSnippetContainerRenderer-test.tsx | 16 +- .../__tests__/HotspotSnippetHeader-test.tsx | 2 +- .../__tests__/HotspotViewer-test.tsx | 47 ++- .../__tests__/HotspotViewerRenderer-test.tsx | 4 +- .../__tests__/HotspotViewerTabs-test.tsx | 42 +-- .../StatusUpdateSuccessModal-test.tsx | 2 +- .../components/assignee/Assignee.tsx | 6 +- .../components/assignee/AssigneeSelection.tsx | 10 +- .../assignee/AssigneeSelectionRenderer.tsx | 7 +- .../assignee/__tests__/Assignee-test.tsx | 25 +- .../__tests__/AssigneeRenderer-test.tsx | 10 +- .../__tests__/AssigneeSelection-test.tsx | 4 +- .../AssigneeSelectionRenderer-test.tsx | 11 +- .../components/status/Status.tsx | 11 +- .../components/status/StatusSelection.tsx | 6 +- .../status/StatusSelectionRenderer.tsx | 3 +- .../status/__tests__/Status-test.tsx | 6 +- .../main/js/apps/security-hotspots/utils.ts | 74 ++--- .../sessions/components/LoginContainer.tsx | 2 +- .../js/apps/sessions/components/LoginForm.tsx | 5 +- .../sessions/components/OAuthProviders.tsx | 5 +- .../components/__tests__/Login-it.tsx | 16 +- .../components/__tests__/Logout-it.tsx | 16 +- .../components/__tests__/Unauthorized-it.tsx | 2 +- .../js/apps/settings/__tests__/utils-test.ts | 48 ++-- .../components/AdditionalCategories.tsx | 16 +- .../settings/components/AllCategoriesList.tsx | 25 +- .../components/CategoryDefinitionsList.tsx | 12 +- .../apps/settings/components/Definition.tsx | 10 +- .../settings/components/DefinitionActions.tsx | 3 +- .../components/DefinitionRenderer.tsx | 7 +- .../settings/components/DefinitionsList.tsx | 5 +- .../js/apps/settings/components/EmailForm.tsx | 4 +- .../js/apps/settings/components/Languages.tsx | 14 +- .../settings/components/NewCodePeriod.tsx | 28 +- .../apps/settings/components/SettingsApp.tsx | 8 +- .../components/SettingsAppRenderer.tsx | 8 +- .../settings/components/SettingsSearch.tsx | 16 +- .../components/SettingsSearchRenderer.tsx | 10 +- .../components/SubCategoryDefinitionsList.tsx | 21 +- .../__tests__/AdditionalCategories-test.tsx | 8 +- .../__tests__/AllCategoriesList-test.tsx | 12 +- .../CategoryDefinitionsList-test.tsx | 10 +- .../components/__tests__/Definition-test.tsx | 12 +- .../__tests__/DefinitionActions-test.tsx | 4 +- .../__tests__/DefinitionRenderer-test.tsx | 2 +- .../components/__tests__/EmailForm-test.tsx | 4 +- .../__tests__/NewCodePeriod-test.tsx | 16 +- .../components/__tests__/SettingsApp-test.tsx | 6 +- .../__tests__/SettingsAppRenderer-test.tsx | 8 +- .../__tests__/SettingsSearch-test.tsx | 10 +- .../__tests__/SettingsSearchRenderer-test.tsx | 8 +- .../SubCategoryDefinitionsList-test.tsx | 12 +- .../AlmBindingDefinitionBox.tsx | 18 +- .../AlmBindingDefinitionForm.tsx | 34 +-- .../AlmBindingDefinitionFormField.tsx | 16 +- .../AlmBindingDefinitionFormRenderer.tsx | 18 +- .../almIntegration/AlmIntegration.tsx | 30 +- .../almIntegration/AlmIntegrationRenderer.tsx | 16 +- .../components/almIntegration/AlmTab.tsx | 8 +- .../almIntegration/AlmTabRenderer.tsx | 21 +- .../components/almIntegration/AzureForm.tsx | 5 +- .../almIntegration/BitbucketCloudForm.tsx | 7 +- .../almIntegration/BitbucketForm.tsx | 6 +- .../almIntegration/BitbucketServerForm.tsx | 5 +- .../almIntegration/CreationTooltip.tsx | 12 +- .../components/almIntegration/DeleteModal.tsx | 3 +- .../components/almIntegration/GithubForm.tsx | 2 +- .../components/almIntegration/GitlabForm.tsx | 5 +- .../AlmBindingDefinitionBox-test.tsx | 30 +- .../AlmBindingDefinitionForm-test.tsx | 23 +- .../AlmBindingDefinitionFormField-test.tsx | 2 +- .../AlmBindingDefinitionFormRenderer-test.tsx | 9 +- .../__tests__/AlmIntegration-test.tsx | 24 +- .../almIntegration/__tests__/AlmTab-test.tsx | 2 +- .../__tests__/AlmTabRenderer-test.tsx | 12 +- .../__tests__/BitbucketForm-test.tsx | 15 +- .../__tests__/CreationTooltip-test.tsx | 3 +- .../__tests__/GithubForm-test.tsx | 2 +- .../authentication/Authentication.tsx | 28 +- .../authentication/SamlAuthentication.tsx | 83 +++--- .../authentication/SamlFormField.tsx | 9 +- .../authentication/SamlSecuredField.tsx | 5 +- .../__tests__/Authentication-test.tsx | 16 +- .../apps/settings/components/inputs/Input.tsx | 2 +- .../inputs/InputForFormattedText.tsx | 2 +- .../components/inputs/InputForSecured.tsx | 4 +- .../inputs/InputForSingleSelectList.tsx | 6 +- .../components/inputs/MultiValueInput.tsx | 2 +- .../components/inputs/PrimitiveInput.tsx | 2 +- .../components/inputs/PropertySetInput.tsx | 13 +- .../inputs/__tests__/Input-test.tsx | 6 +- .../__tests__/InputForFormattedText-test.tsx | 2 +- .../InputForSingleSelectList-test.tsx | 2 +- .../inputs/__tests__/MultiValueInput-test.tsx | 14 +- .../AlmSpecificForm.tsx | 34 +-- .../PRDecorationBinding.tsx | 42 +-- .../PRDecorationBindingRenderer.tsx | 17 +- .../__tests__/AlmSpecificForm-test.tsx | 10 +- .../__tests__/PRDecorationBinding-test.tsx | 63 ++-- .../PRDecorationBindingRenderer-test.tsx | 42 +-- .../src/main/js/apps/settings/constants.ts | 2 +- .../settings/encryption/EncryptionForm.tsx | 5 +- .../encryption/GenerateSecretKeyForm.tsx | 6 +- .../__tests__/EncryptionApp-test.tsx | 2 +- .../src/main/js/apps/settings/utils.ts | 34 +-- .../js/apps/system/__tests__/utils-test.ts | 20 +- .../main/js/apps/system/components/App.tsx | 6 +- .../system/components/ChangeLogLevelForm.tsx | 2 +- .../system/components/ClusterSysInfos.tsx | 2 +- .../js/apps/system/components/PageActions.tsx | 23 +- .../js/apps/system/components/PageHeader.tsx | 3 +- .../system/components/StandaloneSysInfos.tsx | 2 +- .../system/components/__tests__/App-test.tsx | 8 +- .../__tests__/ClusterSysInfos-test.tsx | 22 +- .../components/__tests__/PageActions-test.tsx | 2 +- .../components/__tests__/PageHeader-test.tsx | 4 +- .../components/info-items/HealthCard.tsx | 8 +- .../components/info-items/HealthCauseItem.tsx | 3 +- .../info-items/__tests__/HealthCard-test.tsx | 2 +- .../info-items/__tests__/SysInfoItem-test.tsx | 6 +- .../src/main/js/apps/system/utils.ts | 22 +- .../src/main/js/apps/users/UsersApp.tsx | 8 +- .../src/main/js/apps/users/UsersList.tsx | 6 +- .../js/apps/users/__tests__/UsersApp-test.tsx | 16 +- .../apps/users/__tests__/UsersList-test.tsx | 10 +- .../apps/users/components/DeactivateForm.tsx | 5 +- .../js/apps/users/components/GroupsForm.tsx | 24 +- .../js/apps/users/components/PasswordForm.tsx | 6 +- .../js/apps/users/components/TokensForm.tsx | 49 ++-- .../apps/users/components/TokensFormItem.tsx | 9 +- .../js/apps/users/components/UserActions.tsx | 8 +- .../js/apps/users/components/UserForm.tsx | 15 +- .../js/apps/users/components/UserGroups.tsx | 9 +- .../js/apps/users/components/UserListItem.tsx | 3 +- .../users/components/UserListItemIdentity.tsx | 5 +- .../apps/users/components/UserScmAccounts.tsx | 2 +- .../__tests__/DeactivateForm-test.tsx | 2 +- .../components/__tests__/GroupsForm-test.tsx | 35 ++- .../__tests__/PasswordForm-test.tsx | 2 +- .../__tests__/TokensFormItem-test.tsx | 4 +- .../components/__tests__/UserActions-test.tsx | 23 +- .../components/__tests__/UserForm-test.tsx | 25 +- .../components/__tests__/UserGroups-test.tsx | 2 +- .../__tests__/UserListItem-test.tsx | 2 +- .../__tests__/UserListItemIdentity-test.tsx | 8 +- .../sonar-web/src/main/js/apps/users/utils.ts | 4 +- .../js/apps/web-api/components/Action.tsx | 30 +- .../js/apps/web-api/components/Domain.tsx | 4 +- .../main/js/apps/web-api/components/Menu.tsx | 15 +- .../js/apps/web-api/components/Params.tsx | 8 +- .../web-api/components/ResponseExample.tsx | 2 +- .../js/apps/web-api/components/WebApiApp.tsx | 20 +- .../components/__tests__/Action-test.tsx | 10 +- .../__tests__/ActionChangelog-test.tsx | 2 +- .../components/__tests__/Domain-test.tsx | 8 +- .../components/__tests__/Menu-test.tsx | 20 +- .../components/__tests__/Params-test.tsx | 8 +- .../__tests__/ResponseExample-test.tsx | 6 +- .../components/__tests__/Search-test.tsx | 2 +- .../components/__tests__/WebApiApp-test.tsx | 8 +- .../src/main/js/apps/web-api/utils.ts | 6 +- .../main/js/apps/webhooks/components/App.tsx | 12 +- .../webhooks/components/CreateWebhookForm.tsx | 5 +- .../webhooks/components/DeliveriesForm.tsx | 4 +- .../webhooks/components/DeliveryAccordion.tsx | 3 +- .../apps/webhooks/components/PageHeader.tsx | 2 +- .../webhooks/components/WebhookActions.tsx | 8 +- .../apps/webhooks/components/WebhooksList.tsx | 2 +- .../components/__tests__/App-test.tsx | 16 +- .../__tests__/DeliveriesForm-test.tsx | 14 +- .../__tests__/DeliveryAccordion-test.tsx | 8 +- .../__tests__/LatestDeliveryForm-test.tsx | 6 +- .../components/__tests__/PageActions-test.tsx | 2 +- .../__tests__/WebhookActions-test.tsx | 8 +- .../components/__tests__/WebhookItem-test.tsx | 2 +- .../WebhookItemLatestDelivery-test.tsx | 6 +- .../__tests__/WebhooksList-test.tsx | 2 +- .../components/SourceViewer/SourceViewer.tsx | 64 +++-- .../SourceViewer/SourceViewerCode.tsx | 25 +- .../SourceViewer/SourceViewerContext.tsx | 2 +- .../SourceViewer/SourceViewerHeader.tsx | 18 +- .../__tests__/SourceViewer-it.tsx | 62 ++-- .../__tests__/SourceViewer-test.tsx | 12 +- .../__tests__/SourceViewerCode-test.tsx | 32 +-- .../__tests__/SourceViewerHeader-test.tsx | 10 +- .../components/DuplicationPopup.tsx | 15 +- .../SourceViewer/components/Line.tsx | 9 +- .../SourceViewer/components/LineCode.tsx | 20 +- .../SourceViewer/components/LineCoverage.tsx | 2 +- .../components/LineDuplicationBlock.tsx | 5 +- .../components/LineIssuesIndicator.tsx | 4 +- .../components/LineIssuesList.tsx | 6 +- .../SourceViewer/components/LineNumber.tsx | 6 +- .../components/LineOptionsPopup.tsx | 6 +- .../components/MeasuresOverlay.tsx | 60 ++-- .../components/MeasuresOverlayMeasure.tsx | 3 +- .../components/__tests__/Line-test.tsx | 4 +- .../components/__tests__/LineCode-test.tsx | 4 +- .../__tests__/LineCoverage-test.tsx | 4 +- .../__tests__/LineIssueList-test.tsx | 2 +- .../__tests__/LineIssuesIndicator-test.tsx | 6 +- .../__tests__/MeasuresOverlay-test.tsx | 30 +- .../__tests__/MeasuresOverlayMeasure-test.tsx | 4 +- .../helpers/__tests__/duplications-test.ts | 6 +- .../helpers/__tests__/highlight-test.ts | 8 +- .../helpers/__tests__/indexing-test.ts | 8 +- .../helpers/__tests__/issueLocations-test.ts | 10 +- .../helpers/__tests__/loadIssues-test.ts | 18 +- .../SourceViewer/helpers/duplications.ts | 4 +- .../SourceViewer/helpers/highlight.ts | 8 +- .../SourceViewer/helpers/indexing.ts | 20 +- .../SourceViewer/helpers/issueLocations.ts | 6 +- .../components/SourceViewer/helpers/lines.ts | 2 +- .../SourceViewer/helpers/loadIssues.ts | 8 +- .../main/js/components/a11y/A11yContext.tsx | 2 +- .../main/js/components/a11y/A11yProvider.tsx | 11 +- .../main/js/components/a11y/A11ySkipLinks.tsx | 2 +- .../a11y/__tests__/A11ySkipLinks-test.tsx | 8 +- .../activity-graph/AddGraphMetric.tsx | 31 +- .../activity-graph/DataTableModal.tsx | 6 +- .../DefinitionChangeEventInner.tsx | 16 +- .../activity-graph/GraphHistory.tsx | 5 +- .../activity-graph/GraphsHeader.tsx | 8 +- .../activity-graph/GraphsHistory.tsx | 2 +- .../activity-graph/GraphsLegendCustom.tsx | 3 +- .../activity-graph/GraphsLegendNewCode.tsx | 3 +- .../activity-graph/GraphsTooltips.tsx | 3 +- .../GraphsTooltipsContentCoverage.tsx | 6 +- .../GraphsTooltipsContentDuplication.tsx | 4 +- .../GraphsTooltipsContentEvents.tsx | 2 +- .../GraphsTooltipsContentIssues.tsx | 4 +- .../RichQualityGateEventInner.tsx | 10 +- .../__tests__/ActivityGraph-it.tsx | 36 +-- .../__tests__/DataTableModal-test.tsx | 16 +- .../DefinitionChangeEventInner-test.tsx | 20 +- .../__tests__/GraphsLegendCustom-test.tsx | 8 +- .../__tests__/GraphsLegendItem-test.tsx | 2 +- .../__tests__/GraphsLegendStatic-test.tsx | 2 +- .../__tests__/GraphsTooltips-test.tsx | 30 +- .../__tests__/GraphsTooltipsContent-test.tsx | 2 +- .../GraphsTooltipsContentCoverage-test.tsx | 16 +- .../GraphsTooltipsContentDuplication-test.tsx | 8 +- .../GraphsTooltipsContentEvents-test.tsx | 2 +- .../GraphsTooltipsContentIssues-test.tsx | 12 +- .../RichQualityGateEventInner-test.tsx | 6 +- .../activity-graph/__tests__/utils-test.ts | 48 ++-- .../js/components/activity-graph/utils.ts | 44 +-- .../js/components/charts/AdvancedTimeline.tsx | 62 ++-- .../main/js/components/charts/BarChart.tsx | 14 +- .../main/js/components/charts/BubbleChart.tsx | 38 +-- .../components/charts/ColorGradientLegend.tsx | 13 +- .../components/charts/ColorRatingsLegend.tsx | 13 +- .../main/js/components/charts/DonutChart.tsx | 2 +- .../main/js/components/charts/Histogram.tsx | 3 +- .../charts/LanguageDistribution.tsx | 12 +- .../main/js/components/charts/LineChart.tsx | 22 +- .../src/main/js/components/charts/TreeMap.tsx | 10 +- .../main/js/components/charts/TreeMapRect.tsx | 10 +- .../js/components/charts/ZoomTimeLine.tsx | 102 +++---- .../__tests__/AdvancedTimeline-test.tsx | 56 ++-- .../charts/__tests__/BarChart-test.tsx | 8 +- .../charts/__tests__/BubbleChart-test.tsx | 31 +- .../__tests__/ColorGradientLegend-test.tsx | 4 +- .../charts/__tests__/DonutChart-test.tsx | 9 +- .../charts/__tests__/Histogram-test.tsx | 6 +- .../charts/__tests__/LineChart-test.tsx | 6 +- .../charts/__tests__/TreeMap-test.tsx | 10 +- .../charts/__tests__/ZoomTimeLine-test.tsx | 40 +-- .../js/components/common/ActivityLink.tsx | 3 +- .../common/AnalysisWarningsModal.tsx | 9 +- .../main/js/components/common/CodeSnippet.tsx | 2 +- .../src/main/js/components/common/DocLink.tsx | 2 +- .../common/DocumentationTooltip.tsx | 6 +- .../src/main/js/components/common/Link.tsx | 6 +- .../js/components/common/LocationIndex.tsx | 5 +- .../js/components/common/MeasuresLink.tsx | 3 +- .../main/js/components/common/MultiSelect.tsx | 28 +- .../components/common/MultiSelectOption.tsx | 9 +- .../common/PrivacyBadgeContainer.tsx | 2 +- .../js/components/common/ProjectKeyInput.tsx | 7 +- .../components/common/ResetPasswordForm.tsx | 8 +- .../js/components/common/RestartButton.tsx | 6 +- .../common/ScreenPositionHelper.tsx | 5 +- .../main/js/components/common/SelectList.tsx | 6 +- .../js/components/common/SelectListItem.tsx | 5 +- .../js/components/common/StatusIndicator.tsx | 2 +- .../components/common/VisibilitySelector.tsx | 5 +- .../__tests__/AnalysisWarningsModal-test.tsx | 15 +- .../common/__tests__/BranchStatus-test.tsx | 4 +- .../DisableableSelectOption-test.tsx | 2 +- .../__tests__/DocumentationTooltip-test.tsx | 4 +- .../common/__tests__/FormattingTips-test.tsx | 4 +- .../__tests__/FormattingTipsWithLink-test.tsx | 4 +- .../common/__tests__/MultiSelect-test.tsx | 14 +- .../__tests__/ResetPasswordForm-test.tsx | 4 +- .../common/__tests__/SelectList-test.tsx | 7 +- .../__tests__/VisibilitySelector-test.tsx | 12 +- .../components/controls/ActionsDropdown.tsx | 11 +- .../js/components/controls/BackButton.tsx | 3 +- .../controls/BoxedGroupAccordion.tsx | 8 +- .../main/js/components/controls/BoxedTabs.tsx | 11 +- .../js/components/controls/ButtonToggle.tsx | 5 +- .../main/js/components/controls/Checkbox.tsx | 22 +- .../controls/ClickEventBoundary.tsx | 2 +- .../controls/ComponentReportActions.tsx | 2 +- .../ComponentReportActionsRenderer.tsx | 8 +- .../js/components/controls/ConfirmButton.tsx | 12 +- .../js/components/controls/ConfirmModal.tsx | 5 +- .../main/js/components/controls/DateInput.tsx | 24 +- .../js/components/controls/DateRangeInput.tsx | 2 +- .../main/js/components/controls/Dropdown.tsx | 15 +- .../main/js/components/controls/Favorite.tsx | 7 +- .../js/components/controls/HelpTooltip.tsx | 6 +- .../js/components/controls/HomePageSelect.tsx | 6 +- .../controls/IdentityProviderLink.tsx | 5 +- .../js/components/controls/ListFooter.tsx | 8 +- .../src/main/js/components/controls/Modal.tsx | 2 +- .../js/components/controls/ModalButton.tsx | 2 +- .../src/main/js/components/controls/Radio.tsx | 3 +- .../main/js/components/controls/RadioCard.tsx | 7 +- .../js/components/controls/ReloadButton.tsx | 3 +- .../main/js/components/controls/SearchBox.tsx | 5 +- .../main/js/components/controls/Select.tsx | 44 +-- .../js/components/controls/SelectList.tsx | 18 +- .../controls/SelectListListContainer.tsx | 9 +- .../controls/SelectListListElement.tsx | 10 +- .../js/components/controls/SimpleModal.tsx | 2 +- .../main/js/components/controls/Toggle.tsx | 3 +- .../main/js/components/controls/Toggler.tsx | 2 +- .../main/js/components/controls/Tooltip.tsx | 19 +- .../js/components/controls/ValidationForm.tsx | 3 +- .../components/controls/ValidationInput.tsx | 4 +- .../components/controls/ValidationModal.tsx | 11 +- .../__tests__/ActionsDropdown-test.tsx | 5 +- .../__tests__/BoxedGroupAccordion-test.tsx | 3 +- .../controls/__tests__/BoxedTabs-test.tsx | 9 +- .../controls/__tests__/ButtonToggle-test.tsx | 2 +- .../controls/__tests__/Checkbox-test.tsx | 6 +- .../__tests__/ComponentReportActions-test.tsx | 8 +- .../ComponentReportActionsRenderer-test.tsx | 2 +- .../controls/__tests__/ConfirmButton-test.tsx | 7 +- .../controls/__tests__/ConfirmModal-test.tsx | 6 +- .../controls/__tests__/Favorite-test.tsx | 2 +- .../__tests__/HomePageSelect-test.tsx | 2 +- .../__tests__/IdentityProviderLink-test.tsx | 5 +- .../controls/__tests__/ListFooter-test.tsx | 2 +- .../__tests__/ModalValidationField-test.tsx | 3 +- .../controls/__tests__/RadioCard-test.tsx | 3 +- .../__tests__/ScreenPositionFixer-test.tsx | 2 +- .../controls/__tests__/Select-test.tsx | 10 +- .../controls/__tests__/SelectList-test.tsx | 14 +- .../__tests__/SelectListListElement-test.tsx | 2 +- .../controls/__tests__/Toggler-test.tsx | 15 +- .../controls/__tests__/Tooltip-test.tsx | 12 +- .../__tests__/ValidationInput-test.tsx | 9 +- .../__tests__/ValidationModal-test.tsx | 12 +- .../controls/__tests__/clipboard-test.tsx | 2 +- .../main/js/components/controls/clipboard.tsx | 10 +- .../embed-docs-modal/EmbedDocsPopup.tsx | 6 +- .../embed-docs-modal/EmbedDocsPopupHelper.tsx | 8 +- .../embed-docs-modal/SuggestionsContext.ts | 2 +- .../embed-docs-modal/SuggestionsProvider.tsx | 9 +- .../__tests__/EmbedDocsPopup-test.tsx | 5 +- .../__tests__/SuggestionsProvider-test.tsx | 4 +- .../src/main/js/components/facet/FacetBox.tsx | 3 +- .../main/js/components/facet/FacetHeader.tsx | 6 +- .../main/js/components/facet/FacetItem.tsx | 7 +- .../js/components/facet/ListStyleFacet.tsx | 39 +-- .../facet/__tests__/ListStyleFacet-test.tsx | 8 +- .../__tests__/MultipleSelectionHint-test.tsx | 4 +- .../hoc/__tests__/whenLoggedIn-test.tsx | 11 +- .../__tests__/withCLanguageFeature-test.tsx | 4 +- .../__tests__/withIndexationContext-test.tsx | 7 +- .../__tests__/withIndexationGuard-test.tsx | 9 +- .../__tests__/withKeyboardNavigation-test.tsx | 12 +- .../hoc/__tests__/withNotifications-test.tsx | 14 +- .../components/hoc/withCLanguageFeature.tsx | 2 +- .../components/hoc/withIndexationContext.tsx | 2 +- .../js/components/hoc/withIndexationGuard.tsx | 4 +- .../components/hoc/withKeyboardNavigation.tsx | 2 +- .../js/components/hoc/withNotifications.tsx | 12 +- .../src/main/js/components/hoc/withRouter.tsx | 6 +- .../main/js/components/hoc/withScrollTo.tsx | 2 +- .../main/js/components/icons/DropdownIcon.tsx | 3 +- .../main/js/components/icons/FavoriteIcon.tsx | 3 +- .../src/main/js/components/icons/HomeIcon.tsx | 3 +- .../src/main/js/components/icons/Icon.tsx | 5 +- .../js/components/icons/QualifierIcon.tsx | 2 +- .../main/js/components/icons/SeverityIcon.tsx | 2 +- .../main/js/components/icons/StatusIcon.tsx | 2 +- .../js/components/icons/TestStatusIcon.tsx | 2 +- .../main/js/components/intl/DateFormatter.tsx | 4 +- .../main/js/components/intl/DateFromNow.tsx | 2 +- .../js/components/intl/DateTimeFormatter.tsx | 2 +- .../main/js/components/intl/TimeFormatter.tsx | 2 +- .../intl/__tests__/DateFormatter-test.tsx | 2 +- .../intl/__tests__/DateFromNow-test.tsx | 6 +- .../intl/__tests__/DateTimeFormatter-test.tsx | 2 +- .../intl/__tests__/TimeFormatter-test.tsx | 2 +- .../__tests__/__snapshots__/dateUtils-test.ts | 4 +- .../src/main/js/components/intl/dateUtils.ts | 4 +- .../src/main/js/components/issue/Issue.tsx | 2 +- .../js/components/issue/IssueMessageBox.tsx | 5 +- .../main/js/components/issue/IssueView.tsx | 9 +- .../issue/__tests__/IssueView-test.tsx | 6 +- .../issue/__tests__/actions-test.ts | 4 +- .../components/issue/__tests__/issue-test.tsx | 12 +- .../src/main/js/components/issue/actions.ts | 4 +- .../issue/components/IssueActionsBar.tsx | 4 +- .../issue/components/IssueAssign.tsx | 6 +- .../issue/components/IssueChangelog.tsx | 6 +- .../issue/components/IssueCommentAction.tsx | 6 +- .../issue/components/IssueCommentLine.tsx | 10 +- .../issue/components/IssueMessage.tsx | 15 +- .../issue/components/IssueMessageTags.tsx | 15 +- .../issue/components/IssueSeverity.tsx | 6 +- .../components/issue/components/IssueTags.tsx | 6 +- .../issue/components/IssueTitleBar.tsx | 8 +- .../issue/components/IssueTransition.tsx | 6 +- .../components/issue/components/IssueType.tsx | 6 +- .../issue/components/SimilarIssuesFilter.tsx | 6 +- .../components/__tests__/IssueAssign-test.tsx | 2 +- .../__tests__/IssueChangelog-test.tsx | 2 +- .../__tests__/IssueChangelogDiff-test.tsx | 12 +- .../__tests__/IssueCommentLine-test.tsx | 4 +- .../__tests__/IssueMessage-test.tsx | 4 +- .../__tests__/IssueTitleBar-test.tsx | 2 +- .../__tests__/IssueTransition-test.tsx | 4 +- .../issue/popups/ChangelogPopup.tsx | 2 +- .../components/issue/popups/CommentForm.tsx | 6 +- .../components/issue/popups/CommentList.tsx | 2 +- .../components/issue/popups/CommentTile.tsx | 2 +- .../issue/popups/SetAssigneePopup.tsx | 11 +- .../issue/popups/SetIssueTagsPopup.tsx | 2 +- .../issue/popups/SetSeverityPopup.tsx | 2 +- .../issue/popups/SetTransitionPopup.tsx | 6 +- .../components/issue/popups/SetTypePopup.tsx | 2 +- .../issue/popups/SimilarIssuesPopup.tsx | 11 +- .../popups/__tests__/ChangelogPopup-test.tsx | 34 +-- .../__tests__/SimilarIssuesPopup-test.tsx | 2 +- .../locations/CrossFileLocationNavigator.tsx | 4 +- .../js/components/locations/FlowsList.tsx | 5 +- .../js/components/locations/LocationsList.tsx | 4 +- .../locations/SingleFileLocationNavigator.tsx | 9 +- .../CrossFileLocationsNavigator-test.tsx | 6 +- .../__tests__/LocationsList-test.tsx | 4 +- .../main/js/components/measure/Measure.tsx | 4 +- .../measure/RatingTooltipContent.tsx | 6 +- .../__tests__/RatingTooltipContent-test.tsx | 2 +- .../src/main/js/components/measure/utils.ts | 4 +- .../rules/MoreInfoRuleDescription.tsx | 9 +- .../components/rules/OtherContextOption.tsx | 3 +- .../js/components/rules/RuleDescription.tsx | 29 +- .../js/components/rules/RuleTabViewer.tsx | 49 ++-- .../js/components/shared/DrilldownLink.tsx | 10 +- .../shared/__tests__/DrilldownLink-test.tsx | 2 +- .../src/main/js/components/tags/TagsList.tsx | 3 +- .../tags/__tests__/TagsSelector-test.tsx | 2 +- .../tutorials/TutorialSelection.tsx | 21 +- .../tutorials/TutorialSelectionRenderer.tsx | 7 +- .../__tests__/TutorialSelection-it.tsx | 24 +- .../tutorials/__tests__/utils-test.ts | 4 +- .../AzurePipelinesTutorial.tsx | 13 +- .../BranchAnalysisStepContent.tsx | 6 +- .../ExtensionInstallationStepContent.tsx | 5 +- .../azure-pipelines/JavaToolInstallation.tsx | 8 +- .../ServiceEndpointStepContent.tsx | 2 +- .../__tests__/AzurePipelinesTutorial-it.tsx | 20 +- .../commands/AlertClassicEditor.tsx | 2 +- .../azure-pipelines/commands/ClangGCC.tsx | 8 +- .../commands/PrepareAnalysisCommand.tsx | 10 +- .../azure-pipelines/commands/PublishSteps.tsx | 4 +- .../bitbucket-pipelines/AnalysisCommand.tsx | 12 +- .../BitbucketPipelinesTutorial.tsx | 8 +- .../bitbucket-pipelines/PreambuleYaml.tsx | 2 +- .../RepositoryVariables.tsx | 7 +- .../__tests__/AnalysisCommand-test.tsx | 4 +- .../BitbucketPipelinesTutorial-test.tsx | 37 +-- .../__tests__/PreambuleYaml-test.tsx | 2 +- .../__tests__/RepositoryVariables-test.tsx | 2 +- .../tutorials/components/AllSet.tsx | 2 +- .../tutorials/components/CompilationInfo.tsx | 4 +- .../tutorials/components/CreateYmlFile.tsx | 2 +- .../tutorials/components/EditTokenModal.tsx | 28 +- .../GithubCFamilyExampleRepositories.tsx | 9 +- .../components/ProjectTokenScopeInfo.tsx | 2 +- .../tutorials/components/RenderOptions.tsx | 6 +- .../components/SentenceWithFilename.tsx | 4 +- .../components/SentenceWithHighlights.tsx | 4 +- .../components/tutorials/components/Step.tsx | 5 +- .../components/TokenStepGenerator.tsx | 4 +- .../tutorials/components/YamlFileStep.tsx | 2 +- .../__tests__/EditTokenModal-test.tsx | 8 +- .../GithubCFamilyExampleRepositories-test.tsx | 2 +- .../github-action/AnalysisCommand.tsx | 2 +- .../github-action/GitHubActionTutorial.tsx | 8 +- .../tutorials/github-action/SecretStep.tsx | 7 +- .../__tests__/AnalysisCommand-test.tsx | 4 +- .../__tests__/GitHubActionTutorial-test.tsx | 35 +-- .../__tests__/SecretStep-test.tsx | 4 +- .../github-action/commands/CFamily.tsx | 2 +- .../github-action/commands/Gradle.tsx | 2 +- .../commands/__tests__/CFamily-test.tsx | 7 +- .../gitlabci/EnvironmentVariablesStep.tsx | 10 +- .../tutorials/gitlabci/GitLabCITutorial.tsx | 2 +- .../tutorials/gitlabci/ProjectKeyStep.tsx | 6 +- .../tutorials/gitlabci/YmlFileStep.tsx | 4 +- .../EnvironmentVariablesStep-test.tsx | 2 +- .../__tests__/ProjectKeyStep-test.tsx | 9 +- .../gitlabci/__tests__/YmlFileStep-test.tsx | 4 +- .../gitlabci/commands/PipeCommand.tsx | 8 +- .../commands/__tests__/PipeCommand-test.tsx | 4 +- .../tutorials/jenkins/JenkinsTutorial.tsx | 8 +- .../tutorials/jenkins/JenkinsfileStep.tsx | 6 +- .../jenkins/MultiBranchPipelineStep.tsx | 2 +- .../tutorials/jenkins/PreRequisitesStep.tsx | 2 +- .../tutorials/jenkins/SelectAlmStep.tsx | 6 +- .../tutorials/jenkins/WebhookStep.tsx | 4 +- .../jenkins/WebhookStepBitbucket.tsx | 4 +- .../tutorials/jenkins/WebhookStepGitLab.tsx | 2 +- .../tutorials/jenkins/WebhookStepGithub.tsx | 2 +- .../__tests__/JenkinsTutorial-test.tsx | 35 +-- .../__tests__/JenkinsfileStep-test.tsx | 7 +- .../MultiBranchPipelineStep-test.tsx | 10 +- .../jenkins/__tests__/SelectAlmStep-test.tsx | 28 +- .../jenkins/__tests__/WebhookStep-test.tsx | 4 +- .../__tests__/WebhookStepBitbucket-test.tsx | 8 +- .../__tests__/WebhookStepGithub-test.tsx | 2 +- .../jenkins/buildtool-steps/CFamilly.tsx | 13 +- .../jenkins/buildtool-steps/DotNet.tsx | 4 +- .../jenkins/buildtool-steps/DotNetCore.tsx | 2 +- .../__tests__/CFamilly-test.tsx | 2 +- .../CreateJenkinsfileBulletPoint-test.tsx | 2 +- .../tutorials/other/BuildToolForm.tsx | 6 +- .../tutorials/other/DoneNextSteps.tsx | 2 +- .../tutorials/other/OtherTutorial.tsx | 2 +- .../components/tutorials/other/TokenStep.tsx | 38 ++- .../other/__tests__/TokenStep-test.tsx | 20 +- .../tutorials/other/commands/DotNet.tsx | 4 +- .../tutorials/other/commands/DotNetCore.tsx | 2 +- .../other/commands/DotNetExecute.tsx | 4 +- .../other/commands/DotNetFramework.tsx | 7 +- .../other/commands/DownloadBuildWrapper.tsx | 7 +- .../other/commands/DownloadScanner.tsx | 5 +- .../other/commands/ExecBuildWrapper.tsx | 4 +- .../tutorials/other/commands/ExecScanner.tsx | 6 +- .../tutorials/other/commands/JavaGradle.tsx | 10 +- .../tutorials/other/commands/JavaMaven.tsx | 4 +- .../__tests__/AnalysisCommand-test.tsx | 2 +- .../__tests__/DownloadBuildWrapper-test.tsx | 2 +- .../__tests__/DownloadScanner-test.tsx | 2 +- .../__tests__/ExecBuildWrapper-test.tsx | 2 +- .../commands/__tests__/ExecScanner-test.tsx | 2 +- .../js/components/tutorials/test-utils.ts | 6 +- .../src/main/js/components/tutorials/types.ts | 6 +- .../src/main/js/components/tutorials/utils.ts | 2 +- .../src/main/js/components/ui/Alert.tsx | 15 +- .../main/js/components/ui/AutoEllipsis.tsx | 2 +- .../src/main/js/components/ui/Avatar.tsx | 2 +- .../main/js/components/ui/CoverageRating.tsx | 4 +- .../js/components/ui/DismissableAlert.tsx | 3 +- .../js/components/ui/DuplicationsRating.tsx | 2 +- .../main/js/components/ui/GenericAvatar.tsx | 7 +- .../src/main/js/components/ui/Level.tsx | 5 +- .../js/components/ui/MandatoryFieldMarker.tsx | 3 +- .../src/main/js/components/ui/NavBar.tsx | 3 +- .../js/components/ui/PageShortcutsTooltip.tsx | 6 +- .../src/main/js/components/ui/Rating.tsx | 6 +- .../src/main/js/components/ui/SizeRating.tsx | 2 +- .../js/components/ui/__tests__/Alert-test.tsx | 18 +- .../components/ui/__tests__/Avatar-test.tsx | 4 +- .../ui/__tests__/CoverageRating-test.tsx | 19 +- .../ui/__tests__/DismissableAlert-test.tsx | 8 +- .../MandatoryFieldsExplanation-test.tsx | 2 +- .../components/ui/__tests__/popups-test.tsx | 6 +- .../src/main/js/components/ui/popups.tsx | 12 +- .../components/ui/update-center/MetaData.tsx | 2 +- .../ui/update-center/MetaDataVersion.tsx | 11 +- .../ui/update-center/MetaDataVersions.tsx | 13 +- .../update-center/__tests__/MetaData-test.tsx | 2 +- .../__tests__/MetaDataVersion-test.tsx | 6 +- .../__tests__/MetaDataVersions-test.tsx | 2 +- .../mocks/update-center-metadata.ts | 8 +- .../components/upgrade/SystemUpgradeForm.tsx | 19 +- .../upgrade/SystemUpgradeIntermediate.tsx | 9 +- .../components/upgrade/SystemUpgradeItem.tsx | 13 +- .../__tests__/SystemUpgradeForm-test.tsx | 18 +- .../SystemUpgradeIntermediate-test.tsx | 6 +- .../__tests__/SystemUpgradeItem-test.tsx | 14 +- .../upgrade/__tests__/utils-test.ts | 12 +- .../src/main/js/components/upgrade/utils.ts | 10 +- .../js/components/workspace/Workspace.tsx | 47 +-- .../workspace/WorkspaceComponentViewer.tsx | 12 +- .../components/workspace/WorkspaceHeader.tsx | 3 +- .../js/components/workspace/WorkspaceNav.tsx | 8 +- .../workspace/WorkspaceRuleDetails.tsx | 2 +- .../workspace/WorkspaceRuleViewer.tsx | 6 +- .../workspace/__tests__/Workspace-test.tsx | 32 +-- .../WorkspaceComponentViewer-test.tsx | 6 +- .../__tests__/WorkspaceHeader-test.tsx | 3 +- .../workspace/__tests__/WorkspaceNav-test.tsx | 2 +- .../__tests__/WorkspaceRuleDetails-test.tsx | 2 +- .../__tests__/WorkspaceRuleViewer-test.tsx | 2 +- .../main/js/components/workspace/context.ts | 2 +- .../js/helpers/__tests__/branch-like-test.ts | 8 +- .../__tests__/code-difference-test.tsx | 2 +- .../main/js/helpers/__tests__/error-test.ts | 2 +- .../js/helpers/__tests__/extensions-test.ts | 11 +- .../__tests__/extensionsHandler-test.ts | 2 +- .../helpers/__tests__/globalMessages-test.ts | 2 +- .../handleRequiredAuthentication-test.ts | 6 +- .../main/js/helpers/__tests__/issues-test.ts | 54 ++-- .../main/js/helpers/__tests__/l10n-test.ts | 12 +- .../js/helpers/__tests__/l10nBundle-test.ts | 10 +- .../js/helpers/__tests__/measures-test.ts | 16 +- .../main/js/helpers/__tests__/pages-test.ts | 6 +- .../main/js/helpers/__tests__/path-test.ts | 4 +- .../main/js/helpers/__tests__/periods-test.ts | 2 +- .../js/helpers/__tests__/qualityGates-test.ts | 14 +- .../main/js/helpers/__tests__/query-test.ts | 2 +- .../main/js/helpers/__tests__/ratings-test.ts | 14 +- .../main/js/helpers/__tests__/request-test.ts | 6 +- .../js/helpers/__tests__/scrolling-test.ts | 2 +- .../__tests__/security-standard-test.ts | 56 ++-- .../js/helpers/__tests__/sonarlint-test.ts | 8 +- .../__tests__/stringify-queryparams-test.ts | 2 +- .../main/js/helpers/__tests__/strings-test.ts | 2 +- .../main/js/helpers/__tests__/tokens-test.ts | 30 +- .../main/js/helpers/__tests__/urls-test.ts | 92 +++--- .../main/js/helpers/__tests__/users-test.ts | 16 +- .../src/main/js/helpers/branch-like.ts | 28 +- .../sonar-web/src/main/js/helpers/browser.ts | 2 +- .../src/main/js/helpers/code-difference.ts | 11 +- .../src/main/js/helpers/component.ts | 2 +- .../src/main/js/helpers/constants.ts | 16 +- .../sonar-web/src/main/js/helpers/cookies.ts | 20 +- .../sonar-web/src/main/js/helpers/editions.ts | 12 +- .../src/main/js/helpers/extensions.ts | 4 +- .../src/main/js/helpers/globalMessages.ts | 4 +- .../sonar-web/src/main/js/helpers/issues.ts | 50 ++-- .../sonar-web/src/main/js/helpers/keycodes.ts | 2 +- server/sonar-web/src/main/js/helpers/l10n.ts | 4 +- .../src/main/js/helpers/l10nBundle.ts | 12 +- .../sonar-web/src/main/js/helpers/measures.ts | 18 +- .../main/js/helpers/mocks/alm-integrations.ts | 16 +- .../src/main/js/helpers/mocks/alm-settings.ts | 32 +-- .../src/main/js/helpers/mocks/application.ts | 2 +- .../src/main/js/helpers/mocks/branch-like.ts | 8 +- .../main/js/helpers/mocks/component-report.ts | 2 +- .../src/main/js/helpers/mocks/component.ts | 14 +- .../src/main/js/helpers/mocks/dom.ts | 4 +- .../src/main/js/helpers/mocks/editions.ts | 2 +- .../src/main/js/helpers/mocks/issues.ts | 8 +- .../src/main/js/helpers/mocks/metrics.ts | 270 +++++++++--------- .../src/main/js/helpers/mocks/permissions.ts | 4 +- .../src/main/js/helpers/mocks/plugins.ts | 14 +- .../main/js/helpers/mocks/project-activity.ts | 22 +- .../src/main/js/helpers/mocks/projects.ts | 2 +- .../main/js/helpers/mocks/quality-gates.ts | 34 +-- .../main/js/helpers/mocks/quality-profiles.ts | 2 +- .../src/main/js/helpers/mocks/react-select.ts | 4 +- .../js/helpers/mocks/security-hotspots.ts | 68 ++--- .../src/main/js/helpers/mocks/settings.ts | 14 +- .../src/main/js/helpers/mocks/sources.ts | 8 +- .../main/js/helpers/mocks/system-upgrades.ts | 2 +- .../src/main/js/helpers/mocks/tasks.ts | 4 +- .../src/main/js/helpers/mocks/token.ts | 2 +- .../src/main/js/helpers/mocks/users.ts | 2 +- .../src/main/js/helpers/mocks/webhook.ts | 2 +- server/sonar-web/src/main/js/helpers/path.ts | 4 +- .../src/main/js/helpers/projectLinks.ts | 4 +- .../src/main/js/helpers/qualityGates.ts | 10 +- server/sonar-web/src/main/js/helpers/query.ts | 2 +- .../sonar-web/src/main/js/helpers/request.ts | 28 +- .../sonar-web/src/main/js/helpers/sanitize.ts | 2 +- .../src/main/js/helpers/scrolling.ts | 10 +- .../src/main/js/helpers/security-standard.ts | 2 +- .../src/main/js/helpers/sonarlint.ts | 12 +- .../main/js/helpers/stringify-queryparams.ts | 2 +- .../sonar-web/src/main/js/helpers/strings.ts | 180 ++++++------ .../src/main/js/helpers/testMocks.ts | 192 ++++++------- .../main/js/helpers/testReactTestingUtils.tsx | 14 +- .../src/main/js/helpers/testUtils.ts | 20 +- .../sonar-web/src/main/js/helpers/tokens.ts | 12 +- server/sonar-web/src/main/js/helpers/urls.ts | 44 +-- .../js/types/__tests__/alm-settings-test.ts | 2 +- .../main/js/types/__tests__/component-test.ts | 2 +- .../src/main/js/types/alm-settings.ts | 6 +- .../sonar-web/src/main/js/types/component.ts | 10 +- .../sonar-web/src/main/js/types/editions.ts | 2 +- .../sonar-web/src/main/js/types/extension.ts | 2 +- .../sonar-web/src/main/js/types/features.ts | 2 +- .../src/main/js/types/globalMessages.ts | 2 +- .../sonar-web/src/main/js/types/indexation.ts | 2 +- server/sonar-web/src/main/js/types/issues.ts | 4 +- server/sonar-web/src/main/js/types/metrics.ts | 4 +- .../src/main/js/types/permissions.ts | 2 +- server/sonar-web/src/main/js/types/plugins.ts | 4 +- .../src/main/js/types/project-activity.ts | 2 +- server/sonar-web/src/main/js/types/rules.ts | 2 +- .../src/main/js/types/security-hotspots.ts | 12 +- .../sonar-web/src/main/js/types/security.ts | 2 +- .../sonar-web/src/main/js/types/settings.ts | 6 +- server/sonar-web/src/main/js/types/system.ts | 2 +- server/sonar-web/src/main/js/types/tasks.ts | 4 +- server/sonar-web/src/main/js/types/token.ts | 4 +- server/sonar-web/src/main/js/types/types.ts | 2 +- server/sonar-web/src/main/js/types/users.ts | 2 +- server/sonar-web/yarn.lock | 12 +- 1564 files changed, 9521 insertions(+), 9642 deletions(-) create mode 100644 server/sonar-web/.prettierrc diff --git a/server/sonar-web/.prettierrc b/server/sonar-web/.prettierrc new file mode 100644 index 00000000000..5ac85e271d5 --- /dev/null +++ b/server/sonar-web/.prettierrc @@ -0,0 +1,4 @@ +{ + "printWidth": 100, + "singleQuote": true +} diff --git a/server/sonar-web/package.json b/server/sonar-web/package.json index b7eaf64fc63..ec9de3a203e 100644 --- a/server/sonar-web/package.json +++ b/server/sonar-web/package.json @@ -93,7 +93,7 @@ "path-browserify": "1.0.1", "postcss-calc": "7.0.2", "postcss-custom-properties": "9.1.1", - "prettier": "1.19.1", + "prettier": "2.7.1", "react-select-event": "5.5.1", "testing-library-selector": "0.2.1", "typescript": "4.8.4", @@ -133,10 +133,5 @@ "last 3 Edge versions", "IE 11" ], - "prettier": { - "jsxBracketSameLine": true, - "printWidth": 100, - "singleQuote": true - }, "packageManager": "yarn@3.2.4" } diff --git a/server/sonar-web/src/main/js/api/alm-integrations.ts b/server/sonar-web/src/main/js/api/alm-integrations.ts index 1cd48a9e80a..2a023a6b103 100644 --- a/server/sonar-web/src/main/js/api/alm-integrations.ts +++ b/server/sonar-web/src/main/js/api/alm-integrations.ts @@ -27,7 +27,7 @@ import { BitbucketRepository, GithubOrganization, GithubRepository, - GitlabProject + GitlabProject, } from '../types/alm-integration'; import { Paging } from '../types/types'; import { ProjectBase } from './components'; @@ -88,7 +88,7 @@ export function importAzureRepository( return postJSON('/api/alm_integrations/import_azure_project', { almSetting, projectName, - repositoryName + repositoryName, }).catch(throwGlobalError); } @@ -107,7 +107,7 @@ export function getBitbucketServerRepositories( }> { return getJSON('/api/alm_integrations/search_bitbucketserver_repos', { almSetting, - projectName + projectName, }); } @@ -119,7 +119,7 @@ export function importBitbucketServerProject( return postJSON('/api/alm_integrations/import_bitbucketserver_project', { almSetting, projectKey, - repositorySlug + repositorySlug, }).catch(throwGlobalError); } @@ -132,7 +132,7 @@ export function searchForBitbucketServerRepositories( }> { return getJSON('/api/alm_integrations/search_bitbucketserver_repos', { almSetting, - repositoryName + repositoryName, }); } @@ -149,7 +149,7 @@ export function searchForBitbucketCloudRepositories( almSetting, repositoryName, p: page, - ps: pageSize + ps: pageSize, }); } @@ -163,7 +163,7 @@ export function importBitbucketCloudRepository( ): Promise<{ project: ProjectBase }> { return postJSON('/api/alm_integrations/import_bitbucketcloud_repo', { almSetting, - repositorySlug + repositorySlug, }).catch(throwGlobalError); } @@ -175,7 +175,7 @@ export function importGithubRepository( return postJSON('/api/alm_integrations/import_github_project', { almSetting, organization, - repositoryKey + repositoryKey, }).catch(throwGlobalError); } @@ -185,7 +185,7 @@ export function getGithubOrganizations( ): Promise<{ organizations: GithubOrganization[] }> { return getJSON('/api/alm_integrations/list_github_organizations', { almSetting, - token + token, }).catch((response?: Response) => { if (response && response.status !== 400) { throwGlobalError(response); @@ -206,7 +206,7 @@ export function getGithubRepositories(data: { organization, p: page, ps: pageSize, - q: query || undefined + q: query || undefined, }).catch(throwGlobalError); } @@ -221,7 +221,7 @@ export function getGitlabProjects(data: { almSetting, projectName: query || undefined, p: page, - ps: pageSize + ps: pageSize, }) .then(({ repositories, paging }) => ({ projects: repositories, projectsPaging: paging })) .catch(throwGlobalError); @@ -234,6 +234,6 @@ export function importGitlabProject(data: { const { almSetting, gitlabProjectId } = data; return postJSON('/api/alm_integrations/import_gitlab_project', { almSetting, - gitlabProjectId + gitlabProjectId, }).catch(throwGlobalError); } diff --git a/server/sonar-web/src/main/js/api/alm-settings.ts b/server/sonar-web/src/main/js/api/alm-settings.ts index d4d4e3f4c38..13030310a52 100644 --- a/server/sonar-web/src/main/js/api/alm-settings.ts +++ b/server/sonar-web/src/main/js/api/alm-settings.ts @@ -33,7 +33,7 @@ import { GitlabBindingDefinition, GitlabProjectAlmBindingParams, ProjectAlmBindingConfigurationErrors, - ProjectAlmBindingResponse + ProjectAlmBindingResponse, } from '../types/alm-settings'; export function getAlmDefinitions(): Promise { diff --git a/server/sonar-web/src/main/js/api/application.ts b/server/sonar-web/src/main/js/api/application.ts index 99bd71ef4a9..92fca30b9e4 100644 --- a/server/sonar-web/src/main/js/api/application.ts +++ b/server/sonar-web/src/main/js/api/application.ts @@ -27,14 +27,14 @@ export function getApplicationLeak( branch?: string ): Promise { return getJSON('/api/applications/show_leak', { application, branch }).then( - r => r.leaks, + (r) => r.leaks, throwGlobalError ); } export function getApplicationDetails(application: string, branch?: string): Promise { return getJSON('/api/applications/show', { application, branch }).then( - r => r.application, + (r) => r.application, throwGlobalError ); } diff --git a/server/sonar-web/src/main/js/api/auth.ts b/server/sonar-web/src/main/js/api/auth.ts index 958dc9f4175..bf383f338b3 100644 --- a/server/sonar-web/src/main/js/api/auth.ts +++ b/server/sonar-web/src/main/js/api/auth.ts @@ -28,10 +28,7 @@ export function logIn(login: string, password: string): Promise { } export function logOut(): Promise { - return request('/api/authentication/logout') - .setMethod('POST') - .submit() - .then(basicCheckStatus); + return request('/api/authentication/logout').setMethod('POST').submit().then(basicCheckStatus); } function basicCheckStatus(response: Response): Promise { diff --git a/server/sonar-web/src/main/js/api/branches.ts b/server/sonar-web/src/main/js/api/branches.ts index baf8f9d9d72..9f3fdf03e77 100644 --- a/server/sonar-web/src/main/js/api/branches.ts +++ b/server/sonar-web/src/main/js/api/branches.ts @@ -22,12 +22,15 @@ import { getJSON, post } from '../helpers/request'; import { Branch, PullRequest } from '../types/branch-like'; export function getBranches(project: string): Promise { - return getJSON('/api/project_branches/list', { project }).then(r => r.branches, throwGlobalError); + return getJSON('/api/project_branches/list', { project }).then( + (r) => r.branches, + throwGlobalError + ); } export function getPullRequests(project: string): Promise { return getJSON('/api/project_pull_requests/list', { project }).then( - r => r.pullRequests, + (r) => r.pullRequests, throwGlobalError ); } @@ -48,6 +51,6 @@ export function excludeBranchFromPurge(projectKey: string, branchName: string, e return post('/api/project_branches/set_automatic_deletion_protection', { project: projectKey, branch: branchName, - value: excluded + value: excluded, }).catch(throwGlobalError); } diff --git a/server/sonar-web/src/main/js/api/ce.ts b/server/sonar-web/src/main/js/api/ce.ts index 1d6ad5b3395..517dad4b140 100644 --- a/server/sonar-web/src/main/js/api/ce.ts +++ b/server/sonar-web/src/main/js/api/ce.ts @@ -52,7 +52,7 @@ export function getStatus( } export function getTask(id: string, additionalFields?: string[]): Promise { - return getJSON('/api/ce/task', { id, additionalFields }).then(r => r.task); + return getJSON('/api/ce/task', { id, additionalFields }).then((r) => r.task); } export function cancelTask(id: string): Promise { @@ -71,7 +71,7 @@ export function getTasksForComponent(component: string): Promise<{ queue: Task[] } export function getTypes(): Promise { - return getJSON('/api/ce/task_types').then(r => r.taskTypes); + return getJSON('/api/ce/task_types').then((r) => r.taskTypes); } export function getWorkers(): Promise<{ canSetWorkerCount: boolean; value: number }> { diff --git a/server/sonar-web/src/main/js/api/components.ts b/server/sonar-web/src/main/js/api/components.ts index d05d132b1f7..5ed1fc90d08 100644 --- a/server/sonar-web/src/main/js/api/components.ts +++ b/server/sonar-web/src/main/js/api/components.ts @@ -31,7 +31,7 @@ import { Paging, SourceLine, SourceViewerFile, - Visibility + Visibility, } from '../types/types'; export interface BaseSearchProjectsParameters { @@ -60,9 +60,7 @@ export interface SearchProjectsParameters extends BaseSearchProjectsParameters { ps?: number; } -export function getComponents( - parameters: SearchProjectsParameters -): Promise<{ +export function getComponents(parameters: SearchProjectsParameters): Promise<{ components: Project[]; paging: Paging; }> { @@ -184,11 +182,11 @@ export function getComponentShow(data: { component: string } & BranchParameters) } export function getParents(component: string): Promise { - return getComponentShow({ component }).then(r => r.ancestors); + return getComponentShow({ component }).then((r) => r.ancestors); } export function getBreadcrumbs(data: { component: string } & BranchParameters): Promise { - return getComponentShow(data).then(r => { + return getComponentShow(data).then((r) => { const reversedAncestors = [...r.ancestors].reverse(); return [...reversedAncestors, r.component]; }); @@ -219,9 +217,7 @@ export interface Facet { values: Array<{ val: string; count: number }>; } -export function searchProjects( - data: RequestData -): Promise<{ +export function searchProjects(data: RequestData): Promise<{ components: Component[]; facets: Facet[]; paging: Paging; @@ -286,7 +282,7 @@ export function getComponentForSourceViewer( export function getSources( data: { key: string; from?: number; to?: number } & BranchParameters ): Promise { - return getJSON('/api/sources/lines', data).then(r => r.sources); + return getJSON('/api/sources/lines', data).then((r) => r.sources); } export function getDuplications( @@ -298,7 +294,7 @@ export function getDuplications( export function getTests( data: { sourceFileKey: string; sourceFileLineNumber: number | string } & BranchParameters ): Promise { - return getJSON('/api/tests/list', data).then(r => r.tests); + return getJSON('/api/tests/list', data).then((r) => r.tests); } interface ProjectResponse { diff --git a/server/sonar-web/src/main/js/api/issues.ts b/server/sonar-web/src/main/js/api/issues.ts index 6518a532e41..b0c845ca982 100644 --- a/server/sonar-web/src/main/js/api/issues.ts +++ b/server/sonar-web/src/main/js/api/issues.ts @@ -26,7 +26,7 @@ import { parseJSON, post, postJSON, - RequestData + RequestData, } from '../helpers/request'; import { IssueResponse, RawIssuesResponse } from '../types/issues'; import { Dict, FacetValue, IssueChangelog, SnippetsByComponent, SourceLine } from '../types/types'; @@ -66,9 +66,9 @@ export function getFacets( ...query, facets: facets.join(), ps: 1, - additionalFields: '_all' + additionalFields: '_all', }; - return searchIssues(data).then(r => { + return searchIssues(data).then((r) => { return { facets: r.facets, response: r }; }); } @@ -77,7 +77,7 @@ export function getFacet( query: RequestData, facet: FacetName ): Promise<{ facet: { count: number; val: string }[]; response: RawIssuesResponse }> { - return getFacets(query, [facet]).then(r => { + return getFacets(query, [facet]).then((r) => { return { facet: r.facets[0].values, response: r.response }; }); } @@ -90,7 +90,7 @@ export function searchIssueTags(data: { q?: string; }): Promise { return getJSON('/api/issues/tags', data) - .then(r => r.tags) + .then((r) => r.tags) .catch(throwGlobalError); } @@ -99,7 +99,7 @@ export function getIssueChangelog(issue: string): Promise<{ changelog: IssueChan } export function getIssueFilters() { - return getJSON('/api/issue_filters/search').then(r => r.issueFilters); + return getJSON('/api/issue_filters/search').then((r) => r.issueFilters); } export function addIssueComment(data: { issue: string; text: string }): Promise { @@ -149,19 +149,19 @@ export function searchIssueAuthors(data: { ps?: number; q?: string; }): Promise { - return getJSON('/api/issues/authors', data).then(r => r.authors, throwGlobalError); + return getJSON('/api/issues/authors', data).then((r) => r.authors, throwGlobalError); } export function getIssueFlowSnippets(issueKey: string): Promise> { return get('/api/sources/issue_snippets', { issueKey }) - .then(r => { + .then((r) => { if (r.status === HttpStatus.NoContent) { return {} as any; } return parseJSON(r); }) - .then(result => { - Object.keys(result).forEach(k => { + .then((result) => { + Object.keys(result).forEach((k) => { if (result[k].sources) { result[k].sources = result[k].sources.reduce( (lineMap: Dict, line: SourceLine) => { diff --git a/server/sonar-web/src/main/js/api/languages.ts b/server/sonar-web/src/main/js/api/languages.ts index 45d891d9486..99e20716db7 100644 --- a/server/sonar-web/src/main/js/api/languages.ts +++ b/server/sonar-web/src/main/js/api/languages.ts @@ -22,5 +22,5 @@ import { getJSON } from '../helpers/request'; import { Language } from '../types/languages'; export function getLanguages(): Promise { - return getJSON('/api/languages/list').then(r => r.languages, throwGlobalError); + return getJSON('/api/languages/list').then((r) => r.languages, throwGlobalError); } diff --git a/server/sonar-web/src/main/js/api/measures.ts b/server/sonar-web/src/main/js/api/measures.ts index de681a61a49..5895e5eafbc 100644 --- a/server/sonar-web/src/main/js/api/measures.ts +++ b/server/sonar-web/src/main/js/api/measures.ts @@ -23,7 +23,7 @@ import { BranchParameters } from '../types/branch-like'; import { MeasuresAndMetaWithMetrics, MeasuresAndMetaWithPeriod, - MeasuresForProjects + MeasuresForProjects, } from '../types/measures'; import { Measure } from '../types/types'; @@ -32,7 +32,7 @@ const COMPONENT_URL = '/api/measures/component'; export function getMeasures( data: { component: string; metricKeys: string } & BranchParameters ): Promise { - return getJSON(COMPONENT_URL, data).then(r => r.component.measures, throwGlobalError); + return getJSON(COMPONENT_URL, data).then((r) => r.component.measures, throwGlobalError); } export function getMeasuresWithMetrics( @@ -44,7 +44,7 @@ export function getMeasuresWithMetrics( additionalFields: 'metrics', component, metricKeys: metrics.join(','), - ...branchParameters + ...branchParameters, }).catch(throwGlobalError); } @@ -57,7 +57,7 @@ export function getMeasuresWithPeriod( additionalFields: 'period', component, metricKeys: metrics.join(','), - ...branchParameters + ...branchParameters, }).catch(throwGlobalError); } @@ -70,7 +70,7 @@ export function getMeasuresWithPeriodAndMetrics( additionalFields: 'period,metrics', component, metricKeys: metrics.join(','), - ...branchParameters + ...branchParameters, }).catch(throwGlobalError); } @@ -80,6 +80,6 @@ export function getMeasuresForProjects( ): Promise { return getJSON('/api/measures/search', { projectKeys: projectKeys.join(), - metricKeys: metricKeys.join() - }).then(r => r.measures); + metricKeys: metricKeys.join(), + }).then((r) => r.measures); } diff --git a/server/sonar-web/src/main/js/api/metrics.ts b/server/sonar-web/src/main/js/api/metrics.ts index c3d684d774a..498cd1d0371 100644 --- a/server/sonar-web/src/main/js/api/metrics.ts +++ b/server/sonar-web/src/main/js/api/metrics.ts @@ -47,7 +47,7 @@ export function getAllMetrics(data?: { data: { p?: number; ps?: number } = { ps: 500 }, prev?: MetricsResponse ): Promise { - return getMetrics(data).then(r => { + return getMetrics(data).then((r) => { const result = prev ? prev.metrics.concat(r.metrics) : r.metrics; if (r.p * r.ps >= r.total) { return result; diff --git a/server/sonar-web/src/main/js/api/mocks/AuthenticationServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/AuthenticationServiceMock.ts index c5a5287e6c2..bae674d25c7 100644 --- a/server/sonar-web/src/main/js/api/mocks/AuthenticationServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/AuthenticationServiceMock.ts @@ -29,7 +29,7 @@ export default class AuthenticationServiceMock { mockSettingValue({ key: 'test1', value: '' }), mockSettingValue({ key: 'test2', value: 'test2' }), mockSettingValue({ key: 'sonar.auth.saml.certificate.secured' }), - mockSettingValue({ key: 'sonar.auth.saml.enabled', value: 'false' }) + mockSettingValue({ key: 'sonar.auth.saml.enabled', value: 'false' }), ]; constructor() { @@ -41,7 +41,7 @@ export default class AuthenticationServiceMock { getValuesHandler = (data: { keys: string; component?: string } & BranchParameters) => { if (data.keys) { - return Promise.resolve(this.settingValues.filter(set => data.keys.includes(set.key))); + return Promise.resolve(this.settingValues.filter((set) => data.keys.includes(set.key))); } return Promise.resolve(this.settingValues); }; @@ -50,12 +50,12 @@ export default class AuthenticationServiceMock { if (value === 'error') { const res = new Response('', { status: 400, - statusText: 'fail' + statusText: 'fail', }); return Promise.reject(res); } - const updatedSettingValue = this.settingValues.find(set => set.key === definition.key); + const updatedSettingValue = this.settingValues.find((set) => set.key === definition.key); if (updatedSettingValue) { updatedSettingValue.value = value; } @@ -64,7 +64,7 @@ export default class AuthenticationServiceMock { resetValueHandler = (data: { keys: string; component?: string } & BranchParameters) => { if (data.keys) { - this.settingValues.forEach(set => { + this.settingValues.forEach((set) => { if (data.keys.includes(set.key)) { set.value = ''; } diff --git a/server/sonar-web/src/main/js/api/mocks/BranchesServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/BranchesServiceMock.ts index d833cb22e70..6d9e4b4936f 100644 --- a/server/sonar-web/src/main/js/api/mocks/BranchesServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/BranchesServiceMock.ts @@ -27,7 +27,7 @@ export default class BranchesServiceMock { defaultBranchLikes: BranchLike[] = [ mockBranch({ isMain: true, name: 'master' }), mockBranch({ excludedFromPurge: false, name: 'delete-branch' }), - mockBranch({ name: 'normal-branch' }) + mockBranch({ name: 'normal-branch' }), ]; constructor() { diff --git a/server/sonar-web/src/main/js/api/mocks/CodeServiceMocks.ts b/server/sonar-web/src/main/js/api/mocks/CodeServiceMocks.ts index 7a4271cc6a0..2c9a8021110 100644 --- a/server/sonar-web/src/main/js/api/mocks/CodeServiceMocks.ts +++ b/server/sonar-web/src/main/js/api/mocks/CodeServiceMocks.ts @@ -35,7 +35,7 @@ function isLeaf(node: ComponentTree) { } function listChildComponent(node: ComponentTree): ComponentMeasure[] { - return map(node.child, n => n.component); + return map(node.child, (n) => n.component); } function listAllComponent(node: ComponentTree): ComponentMeasure[] { @@ -65,28 +65,28 @@ export default class CodeServiceMock { key: 'foo:folerA', name: 'folderA', path: 'folderA', - qualifier: ComponentQualifier.Directory + qualifier: ComponentQualifier.Directory, }), child: [ { component: mockComponentMeasure(true, { key: 'foo:folderA/out.tsx', name: 'out.tsx', - path: 'folderA/out.tsx' + path: 'folderA/out.tsx', }), - child: [] - } - ] + child: [], + }, + ], }, { component: mockComponentMeasure(true, { key: 'foo:index.tsx', name: 'index.tsx', - path: 'index.tsx' + path: 'index.tsx', }), - child: [] - } - ] + child: [], + }, + ], }; (getComponentTree as jest.Mock).mockImplementation(this.handleGetComponentTree); (getChildren as jest.Mock).mockImplementation(this.handleGetChildren); @@ -97,7 +97,7 @@ export default class CodeServiceMock { if (from.component.key === key) { return from; } - return from.child.find(node => this.findBaseComponent(key, node)); + return from.child.find((node) => this.findBaseComponent(key, node)); } handleGetChildren = ( @@ -124,7 +124,7 @@ export default class CodeServiceMock { let components: ComponentMeasure[] = []; if (base === undefined) { return Promise.reject({ - errors: [{ msg: `No component has been found for id ${component}` }] + errors: [{ msg: `No component has been found for id ${component}` }], }); } if (strategy === 'all' || strategy === '') { @@ -142,8 +142,8 @@ export default class CodeServiceMock { paging: { pageIndex: 1, pageSize: 100, - total: components.length - } + total: components.length, + }, }); }; @@ -154,7 +154,7 @@ export default class CodeServiceMock { facets: [], issues: [], languages: [], - paging: { total: 0, pageIndex: 1, pageSize: 100 } + paging: { total: 0, pageIndex: 1, pageSize: 100 }, }); }; diff --git a/server/sonar-web/src/main/js/api/mocks/CodingRulesMock.ts b/server/sonar-web/src/main/js/api/mocks/CodingRulesMock.ts index 8756329b36d..fd98ea3216e 100644 --- a/server/sonar-web/src/main/js/api/mocks/CodingRulesMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/CodingRulesMock.ts @@ -23,7 +23,7 @@ import { mockCurrentUser, mockQualityProfile, mockRuleDetails, - mockRuleRepository + mockRuleRepository, } from '../../helpers/testMocks'; import { RuleRepository } from '../../types/coding-rules'; import { RawIssuesResponse } from '../../types/issues'; @@ -37,7 +37,7 @@ import { Profile, searchQualityProfiles, SearchQualityProfilesParameters, - SearchQualityProfilesResponse + SearchQualityProfilesResponse, } from '../quality-profiles'; import { getRuleDetails, getRulesApp, searchRules, updateRule } from '../rules'; import { dismissNotice, getCurrentUser } from '../users'; @@ -48,7 +48,7 @@ interface FacetFilter { const FACET_RULE_MAP: { [key: string]: keyof Rule } = { languages: 'lang', - types: 'type' + types: 'type', }; export default class CodingRulesMock { defaultRules: RuleDetails[] = []; @@ -62,12 +62,12 @@ export default class CodingRulesMock { constructor() { this.repositories = [ mockRuleRepository({ key: 'repo1' }), - mockRuleRepository({ key: 'repo2' }) + mockRuleRepository({ key: 'repo2' }), ]; this.qualityProfile = [ mockQualityProfile({ key: 'p1', name: 'QP Foo', language: 'java', languageName: 'Java' }), mockQualityProfile({ key: 'p2', name: 'QP Bar', language: 'js' }), - mockQualityProfile({ key: 'p3', name: 'QP FooBar', language: 'java', languageName: 'Java' }) + mockQualityProfile({ key: 'p3', name: 'QP FooBar', language: 'java', languageName: 'Java' }), ]; const resourceContent = 'Some link Awsome Reading'; @@ -80,7 +80,7 @@ export default class CodingRulesMock { type: 'BUG', lang: 'java', langName: 'Java', - name: 'Awsome java rule' + name: 'Awsome java rule', }), mockRuleDetails({ key: 'rule2', @@ -93,10 +93,10 @@ export default class CodingRulesMock { { key: RuleDescriptionSections.ASSESS_THE_PROBLEM, content: 'Assess' }, { key: RuleDescriptionSections.RESOURCES, - content: resourceContent - } + content: resourceContent, + }, ], - langName: 'JavaScript' + langName: 'JavaScript', }), mockRuleDetails({ key: 'rule3', name: 'Unknown rule', lang: 'js', langName: 'JavaScript' }), mockRuleDetails({ @@ -104,7 +104,7 @@ export default class CodingRulesMock { type: 'BUG', lang: 'c', langName: 'C', - name: 'Awsome C rule' + name: 'Awsome C rule', }), mockRuleDetails({ key: 'rule5', @@ -117,9 +117,9 @@ export default class CodingRulesMock { { key: RuleDescriptionSections.HOW_TO_FIX, content: rootCauseContent }, { key: RuleDescriptionSections.RESOURCES, - content: resourceContent - } - ] + content: resourceContent, + }, + ], }), mockRuleDetails({ key: 'rule6', @@ -128,7 +128,7 @@ export default class CodingRulesMock { langName: 'Python', name: 'Bad Python rule', isExternal: true, - descriptionSections: undefined + descriptionSections: undefined, }), mockRuleDetails({ key: 'rule7', @@ -139,23 +139,23 @@ export default class CodingRulesMock { descriptionSections: [ { key: RuleDescriptionSections.INTRODUCTION, - content: 'Introduction to this rule with context' + content: 'Introduction to this rule with context', }, { key: RuleDescriptionSections.HOW_TO_FIX, content: 'This is how to fix for spring', - context: { key: 'spring', displayName: 'Spring' } + context: { key: 'spring', displayName: 'Spring' }, }, { key: RuleDescriptionSections.HOW_TO_FIX, content: 'This is how to fix for spring boot', - context: { key: 'spring_boot', displayName: 'Spring boot' } + context: { key: 'spring_boot', displayName: 'Spring boot' }, }, { key: RuleDescriptionSections.RESOURCES, - content: resourceContent - } - ] + content: resourceContent, + }, + ], }), mockRuleDetails({ key: 'rule8', @@ -168,11 +168,11 @@ export default class CodingRulesMock { { key: RuleDescriptionSections.HOW_TO_FIX, content: rootCauseContent }, { key: RuleDescriptionSections.RESOURCES, - content: resourceContent - } + content: resourceContent, + }, ], - educationPrinciples: ['defense_in_depth', 'never_trust_user_input'] - }) + educationPrinciples: ['defense_in_depth', 'never_trust_user_input'], + }), ]; (updateRule as jest.Mock).mockImplementation(this.handleUpdateRule); @@ -189,7 +189,7 @@ export default class CodingRulesMock { } getRuleWithoutDetails() { - return this.rules.map(r => + return this.rules.map((r) => pick(r, [ 'isTemplate', 'key', @@ -201,7 +201,7 @@ export default class CodingRulesMock { 'status', 'sysTags', 'tags', - 'type' + 'type', ]) ); } @@ -209,7 +209,7 @@ export default class CodingRulesMock { filterFacet({ languages }: FacetFilter) { let filteredRules = this.getRuleWithoutDetails(); if (languages) { - filteredRules = filteredRules.filter(r => r.lang && languages.includes(r.lang)); + filteredRules = filteredRules.filter((r) => r.lang && languages.includes(r.lang)); } return filteredRules; } @@ -234,11 +234,11 @@ export default class CodingRulesMock { } allRulesName() { - return this.rules.map(r => r.name); + return this.rules.map((r) => r.name); } allQualityProfile(language: string) { - return this.qualityProfile.filter(qp => qp.language === language); + return this.qualityProfile.filter((qp) => qp.language === language); } handleGetGacet = (): Promise<{ @@ -253,8 +253,8 @@ export default class CodingRulesMock { facets: [], issues: [], languages: [], - paging: { total: 0, pageIndex: 1, pageSize: 1 } - } + paging: { total: 0, pageIndex: 1, pageSize: 1 }, + }, }); }; @@ -262,23 +262,23 @@ export default class CodingRulesMock { actives?: boolean; key: string; }): Promise<{ actives?: RuleActivation[]; rule: RuleDetails }> => { - const rule = this.rules.find(r => r.key === parameters.key); + const rule = this.rules.find((r) => r.key === parameters.key); if (!rule) { return Promise.reject({ - errors: [{ msg: `No rule has been found for id ${parameters.key}` }] + errors: [{ msg: `No rule has been found for id ${parameters.key}` }], }); } return this.reply({ actives: parameters.actives ? [] : undefined, rule }); }; handleUpdateRule = (data: RulesUpdateRequest): Promise => { - const rule = this.rules.find(r => r.key === data.key); + const rule = this.rules.find((r) => r.key === data.key); if (rule === undefined) { return Promise.reject({ - errors: [{ msg: `No rule has been found for id ${data.key}` }] + errors: [{ msg: `No rule has been found for id ${data.key}` }], }); } - const template = this.rules.find(r => r.key === rule.templateKey); + const template = this.rules.find((r) => r.key === rule.templateKey); // Lets not convert the md to html in test. rule.mdDesc = data.markdown_description !== undefined ? data.markdown_description : rule.mdDesc; @@ -289,14 +289,14 @@ export default class CodingRulesMock { rule.name = data.name !== undefined ? data.name : rule.name; if (template && data.params) { rule.params = []; - data.params.split(';').forEach(param => { + data.params.split(';').forEach((param) => { const parts = param.split('='); - const paramsDef = template.params?.find(p => p.key === parts[0]); + const paramsDef = template.params?.find((p) => p.key === parts[0]); rule.params?.push({ key: parts[0], type: paramsDef?.type || 'STRING', defaultValue: trim(parts[1], '" '), - htmlDesc: paramsDef?.htmlDesc + htmlDesc: paramsDef?.htmlDesc, }); }); } @@ -316,17 +316,19 @@ export default class CodingRulesMock { handleSearchRules = ({ facets, languages, p, ps, rule_key }: SearchRulesQuery) => { const countFacet = (facets || '').split(',').map((facet: keyof Rule) => { - const facetCount = countBy(this.rules.map(r => r[FACET_RULE_MAP[facet] || facet] as string)); + const facetCount = countBy( + this.rules.map((r) => r[FACET_RULE_MAP[facet] || facet] as string) + ); return { property: facet, - values: Object.keys(facetCount).map(val => ({ val, count: facetCount[val] })) + values: Object.keys(facetCount).map((val) => ({ val, count: facetCount[val] })), }; }); const currentPs = ps || 10; const currentP = p || 1; let filteredRules: Rule[] = []; if (rule_key) { - filteredRules = this.getRuleWithoutDetails().filter(r => r.key === rule_key); + filteredRules = this.getRuleWithoutDetails().filter((r) => r.key === rule_key); } else { filteredRules = this.filterFacet({ languages }); } @@ -336,7 +338,7 @@ export default class CodingRulesMock { p: currentP, ps: currentPs, rules: responseRules, - facets: countFacet + facets: countFacet, }); }; @@ -345,31 +347,31 @@ export default class CodingRulesMock { return this.reply({ succeeded: this.rules.length - 1, failed: 1, - errors: [{ msg: 'c rule c:S6069 cannot be activated on cpp profile SonarSource' }] + errors: [{ msg: 'c rule c:S6069 cannot be activated on cpp profile SonarSource' }], }); } return this.reply({ succeeded: this.rules.length, failed: 0, - errors: [] + errors: [], }); }; handleBulkDeactivateRules = () => { return this.reply({ succeeded: this.rules.length, - failed: 0 + failed: 0, }); }; - handleSearchQualityProfiles = ({ language }: SearchQualityProfilesParameters = {}): Promise< - SearchQualityProfilesResponse - > => { + handleSearchQualityProfiles = ({ + language, + }: SearchQualityProfilesParameters = {}): Promise => { let profiles: Profile[] = this.isAdmin - ? this.qualityProfile.map(p => ({ ...p, actions: { edit: true } })) + ? this.qualityProfile.map((p) => ({ ...p, actions: { edit: true } })) : this.qualityProfile; if (language) { - profiles = profiles.filter(p => p.language === language); + profiles = profiles.filter((p) => p.language === language); } return this.reply({ profiles }); }; @@ -382,8 +384,8 @@ export default class CodingRulesMock { return this.reply( mockCurrentUser({ dismissedNotices: { - educationPrinciples: this.dismissedNoticesEP - } + educationPrinciples: this.dismissedNoticesEP, + }, }) ); }; diff --git a/server/sonar-web/src/main/js/api/mocks/ComputeEngineServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/ComputeEngineServiceMock.ts index e718aaa7bdc..f6557aee6c1 100644 --- a/server/sonar-web/src/main/js/api/mocks/ComputeEngineServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/ComputeEngineServiceMock.ts @@ -29,7 +29,7 @@ import { getStatus, getTypes, getWorkers, - setWorkerCount + setWorkerCount, } from '../ce'; const RANDOM_RADIX = 36; @@ -45,13 +45,13 @@ const TASK_TYPES = [ TaskTypes.AppRefresh, TaskTypes.ProjectImport, TaskTypes.ViewRefresh, - TaskTypes.ReportSubmit + TaskTypes.ReportSubmit, ]; const DEFAULT_TASKS: Task[] = [mockTask()]; const DEFAULT_WORKERS = { canSetWorkerCount: true, - value: 2 + value: 2, }; const CANCELABLE_TASK_STATUSES = [TaskStatuses.Pending]; @@ -73,7 +73,7 @@ export default class ComputeEngineServiceMock { } handleCancelAllTasks = () => { - this.tasks.forEach(t => { + this.tasks.forEach((t) => { if (CANCELABLE_TASK_STATUSES.includes(t.status)) { t.status = TaskStatuses.Canceled; } @@ -83,7 +83,7 @@ export default class ComputeEngineServiceMock { }; handleCancelTask = (id: string) => { - const task = this.tasks.find(t => t.id === id); + const task = this.tasks.find((t) => t.id === id); if (task && CANCELABLE_TASK_STATUSES.includes(task.status)) { task.status = TaskStatuses.Canceled; @@ -96,7 +96,7 @@ export default class ComputeEngineServiceMock { handleGetActivity = (data: ActivityRequestParameters) => { let results = cloneDeep(this.tasks); - results = results.filter(task => { + results = results.filter((task) => { return !( (data.component && task.componentKey !== data.component) || (data.status && !data.status.split(',').includes(task.status)) || @@ -117,8 +117,8 @@ export default class ComputeEngineServiceMock { /* * This is more complex in real life, but it's a good enough approximation to suit tests */ - results = Object.values(groupBy(results, t => t.componentKey)).map( - tasks => sortBy(tasks, t => t.executedAt).pop()! + results = Object.values(groupBy(results, (t) => t.componentKey)).map( + (tasks) => sortBy(tasks, (t) => t.executedAt).pop()! ); } @@ -130,15 +130,15 @@ export default class ComputeEngineServiceMock { paging: { pageIndex: page, pageSize: PAGE_SIZE, - total: results.length - } + total: results.length, + }, }); }; handleGetStatus = (component?: string) => { return Promise.resolve( this.tasks - .filter(task => !component || task.componentKey === component) + .filter((task) => !component || task.componentKey === component) .reduce( (stats, task) => { switch (task.status) { @@ -187,14 +187,12 @@ export default class ComputeEngineServiceMock { }; addTask = (overrides: Partial = {}) => { - const id = Math.random() - .toString(RANDOM_RADIX) - .slice(RANDOM_PREFIX); + const id = Math.random().toString(RANDOM_RADIX).slice(RANDOM_PREFIX); this.tasks.push( mockTask({ id, - ...overrides + ...overrides, }) ); }; diff --git a/server/sonar-web/src/main/js/api/mocks/IssuesServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/IssuesServiceMock.ts index 243c522293a..2d7b4b48f3f 100644 --- a/server/sonar-web/src/main/js/api/mocks/IssuesServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/IssuesServiceMock.ts @@ -22,7 +22,7 @@ import { RuleDescriptionSections } from '../../apps/coding-rules/rule'; import { mockSnippetsByComponent, mockSourceLine, - mockSourceViewerFile + mockSourceViewerFile, } from '../../helpers/mocks/sources'; import { RequestData } from '../../helpers/request'; import { getStandards } from '../../helpers/security-standard'; @@ -31,7 +31,7 @@ import { mockLoggedInUser, mockPaging, mockRawIssue, - mockRuleDetails + mockRuleDetails, } from '../../helpers/testMocks'; import { BranchParameters } from '../../types/branch-like'; import { @@ -39,7 +39,7 @@ import { RawFacet, RawIssue, RawIssuesResponse, - ReferencedComponent + ReferencedComponent, } from '../../types/issues'; import { Standards } from '../../types/security'; import { @@ -48,7 +48,7 @@ import { RuleActivation, RuleDetails, SnippetsByComponent, - SourceViewerFile + SourceViewerFile, } from '../../types/types'; import { NoticeType } from '../../types/users'; import { getComponentForSourceViewer, getSources } from '../components'; @@ -64,7 +64,7 @@ import { setIssueSeverity, setIssueTags, setIssueTransition, - setIssueType + setIssueType, } from '../issues'; import { getRuleDetails } from '../rules'; import { dismissNotice, getCurrentUser, searchUsers } from '../users'; @@ -74,7 +74,7 @@ function mockReferenceComponent(override?: Partial) { key: 'component1', name: 'Component1', uuid: 'id1', - ...override + ...override, }; } @@ -93,7 +93,7 @@ export default class IssuesServiceMock { // Comment should have their own store as we can test better CRUD operation this.sourceViewerFiles = [ mockSourceViewerFile('file.foo', 'project'), - mockSourceViewerFile('file.bar', 'project') + mockSourceViewerFile('file.bar', 'project'), ]; this.list = [ { @@ -106,7 +106,7 @@ export default class IssuesServiceMock { startLine: 10, endLine: 10, startOffset: 0, - endOffset: 2 + endOffset: 2, }, flows: [ { @@ -120,8 +120,8 @@ export default class IssuesServiceMock { startLine: 20, endLine: 20, startOffset: 0, - endOffset: 1 - } + endOffset: 1, + }, }, { component: 'project:file.foo', @@ -130,10 +130,10 @@ export default class IssuesServiceMock { startLine: 21, endLine: 21, startOffset: 0, - endOffset: 1 - } - } - ] + endOffset: 1, + }, + }, + ], }, { type: FlowType.EXECUTION, @@ -145,8 +145,8 @@ export default class IssuesServiceMock { startLine: 20, endLine: 20, startOffset: 0, - endOffset: 1 - } + endOffset: 1, + }, }, { component: 'project:file.bar', @@ -155,8 +155,8 @@ export default class IssuesServiceMock { startLine: 22, endLine: 22, startOffset: 0, - endOffset: 1 - } + endOffset: 1, + }, }, { component: 'project:file.bar', @@ -165,28 +165,28 @@ export default class IssuesServiceMock { startLine: 5, endLine: 5, startOffset: 0, - endOffset: 1 - } - } - ] - } - ] + endOffset: 1, + }, + }, + ], + }, + ], }), snippets: keyBy( [ mockSnippetsByComponent( 'file.foo', 'project', - times(40, i => i + 1) + times(40, (i) => i + 1) ), mockSnippetsByComponent( 'file.bar', 'project', - times(40, i => i + 1) - ) + times(40, (i) => i + 1) + ), ], 'component.key' - ) + ), }, { issue: mockRawIssue(false, { @@ -195,9 +195,9 @@ export default class IssuesServiceMock { message: 'Issue on file', rule: 'simpleRuleId', textRange: undefined, - line: undefined + line: undefined, }), - snippets: {} + snippets: {}, }, { issue: mockRawIssue(false, { @@ -209,7 +209,7 @@ export default class IssuesServiceMock { startLine: 10, endLine: 10, startOffset: 0, - endOffset: 2 + endOffset: 2, }, flows: [ { @@ -221,10 +221,10 @@ export default class IssuesServiceMock { startLine: 1, endLine: 1, startOffset: 0, - endOffset: 1 - } - } - ] + endOffset: 1, + }, + }, + ], }, { locations: [ @@ -235,28 +235,28 @@ export default class IssuesServiceMock { startLine: 20, endLine: 20, startOffset: 0, - endOffset: 1 - } - } - ] - } - ] + endOffset: 1, + }, + }, + ], + }, + ], }), snippets: keyBy( [ mockSnippetsByComponent( 'file.foo', 'project', - times(40, i => i + 1) + times(40, (i) => i + 1) ), mockSnippetsByComponent( 'file.bar', 'project', - times(40, i => i + 1) - ) + times(40, (i) => i + 1) + ), ], 'component.key' - ) + ), }, { issue: mockRawIssue(false, { @@ -270,20 +270,20 @@ export default class IssuesServiceMock { startLine: 25, endLine: 25, startOffset: 0, - endOffset: 1 + endOffset: 1, }, - ruleDescriptionContextKey: 'spring' + ruleDescriptionContextKey: 'spring', }), snippets: keyBy( [ mockSnippetsByComponent( 'file.bar', 'project', - times(40, i => i + 20) - ) + times(40, (i) => i + 20) + ), ], 'component.key' - ) + ), }, { issue: mockRawIssue(false, { @@ -295,19 +295,19 @@ export default class IssuesServiceMock { startLine: 28, endLine: 28, startOffset: 0, - endOffset: 1 - } + endOffset: 1, + }, }), snippets: keyBy( [ mockSnippetsByComponent( 'file.bar', 'project', - times(40, i => i + 20) - ) + times(40, (i) => i + 20) + ), ], 'component.key' - ) + ), }, { issue: mockRawIssue(false, { @@ -321,23 +321,23 @@ export default class IssuesServiceMock { startLine: 25, endLine: 25, startOffset: 0, - endOffset: 1 + endOffset: 1, }, ruleDescriptionContextKey: 'spring', ruleStatus: 'DEPRECATED', - quickFixAvailable: true + quickFixAvailable: true, }), snippets: keyBy( [ mockSnippetsByComponent( 'file.bar', 'project', - times(40, i => i + 20) - ) + times(40, (i) => i + 20) + ), ], 'component.key' - ) - } + ), + }, ]; (searchIssues as jest.Mock).mockImplementation(this.handleSearchIssues); (getRuleDetails as jest.Mock).mockImplementation(this.handleGetRuleDetails); @@ -372,7 +372,7 @@ export default class IssuesServiceMock { owasp2021FacetList(): RawFacet { return { property: 'owaspTop10-2021', - values: [{ val: 'a1', count: 0 }] + values: [{ val: 'a1', count: 0 }], }; } @@ -383,22 +383,22 @@ export default class IssuesServiceMock { handleBulkChangeIssues = (issueKeys: string[], query: RequestData) => { //For now we only check for issue type change. this.list - .filter(i => issueKeys.includes(i.issue.key)) - .forEach(data => { + .filter((i) => issueKeys.includes(i.issue.key)) + .forEach((data) => { data.issue.type = query.set_type; }); return this.reply({}); }; handleGetSources = (data: { key: string; from?: number; to?: number } & BranchParameters) => { - return this.reply(range(data.from || 1, data.to || 10).map(line => mockSourceLine({ line }))); + return this.reply(range(data.from || 1, data.to || 10).map((line) => mockSourceLine({ line }))); }; handleGetComponentForSourceViewer = (data: { component: string } & BranchParameters) => { - const file = this.sourceViewerFiles.find(f => f.key === data.component); + const file = this.sourceViewerFiles.find((f) => f.key === data.component); if (file === undefined) { return Promise.reject({ - errors: [{ msg: `No source file has been found for id ${data.component}` }] + errors: [{ msg: `No source file has been found for id ${data.component}` }], }); } @@ -406,7 +406,7 @@ export default class IssuesServiceMock { }; handleGetIssueFlowSnippets = (issueKey: string): Promise> => { - const issue = this.list.find(i => i.issue.key === issueKey); + const issue = this.list.find((i) => i.issue.key === issueKey); if (issue === undefined) { return Promise.reject({ errors: [{ msg: `No issue has been found for id ${issueKey}` }] }); } @@ -433,28 +433,28 @@ export default class IssuesServiceMock { key: RuleDescriptionSections.HOW_TO_FIX, context: { key: 'spring', - displayName: 'Spring' - } + displayName: 'Spring', + }, }, { content: '

Context 2 content

', key: RuleDescriptionSections.HOW_TO_FIX, context: { key: 'context_2', - displayName: 'Context 2' - } + displayName: 'Context 2', + }, }, { content: '

Context 3 content

', key: RuleDescriptionSections.HOW_TO_FIX, context: { key: 'context_3', - displayName: 'Context 3' - } + displayName: 'Context 3', + }, }, - { key: RuleDescriptionSections.RESOURCES, content: '

Link

' } - ] - }) + { key: RuleDescriptionSections.RESOURCES, content: '

Link

' }, + ], + }), }); } return this.reply({ @@ -465,10 +465,10 @@ export default class IssuesServiceMock { descriptionSections: [ { key: RuleDescriptionSections.DEFAULT, - content: '

Default

Default description' - } - ] - }) + content: '

Default

Default description', + }, + ], + }), }); }; @@ -479,16 +479,16 @@ export default class IssuesServiceMock { } return { property: name, - values: [] + values: [], }; }); return this.reply({ components: [mockReferenceComponent()], effortTotal: 199629, facets, - issues: this.list.map(line => line.issue), + issues: this.list.map((line) => line.issue), languages: [], - paging: mockPaging() + paging: mockPaging(), }); }; @@ -522,25 +522,25 @@ export default class IssuesServiceMock { unconfirm: 'REOPENED', resolve: 'RESOLVED', wontfix: 'RESOLVED', - falsepositive: 'RESOLVED' + falsepositive: 'RESOLVED', }; const transitionMap: Dict = { REOPENED: ['confirm', 'resolve', 'falsepositive', 'wontfix'], OPEN: ['confirm', 'resolve', 'falsepositive', 'wontfix'], CONFIRMED: ['resolve', 'unconfirm', 'falsepositive', 'wontfix'], - RESOLVED: ['reopen'] + RESOLVED: ['reopen'], }; const resolutionMap: Dict = { wontfix: 'WONTFIX', - falsepositive: 'FALSE-POSITIVE' + falsepositive: 'FALSE-POSITIVE', }; return this.getActionsResponse( { status: statusMap[data.transition], transitions: transitionMap[statusMap[data.transition]], - resolution: resolutionMap[data.transition] + resolution: resolutionMap[data.transition], }, data.issue ); @@ -562,9 +562,9 @@ export default class IssuesServiceMock { key: '1234', login: 'admin', markdown: data.text, - updatable: true - } - ] + updatable: true, + }, + ], }, data.issue ); @@ -581,9 +581,9 @@ export default class IssuesServiceMock { key: '1234', login: 'admin', markdown: data.text, - updatable: true - } - ] + updatable: true, + }, + ], }, 'issue2' ); @@ -593,7 +593,7 @@ export default class IssuesServiceMock { // For comment its little more complex to get comment Id return this.getActionsResponse( { - comments: [] + comments: [], }, 'issue2' ); @@ -608,15 +608,15 @@ export default class IssuesServiceMock { }; getActionsResponse = (overrides: Partial, issueKey: string) => { - const issueDataSelected = this.list.find(l => l.issue.key === issueKey)!; + const issueDataSelected = this.list.find((l) => l.issue.key === issueKey)!; issueDataSelected.issue = { ...issueDataSelected?.issue, - ...overrides + ...overrides, }; return this.reply({ - issue: issueDataSelected.issue + issue: issueDataSelected.issue, }); }; diff --git a/server/sonar-web/src/main/js/api/mocks/NotificationsMock.ts b/server/sonar-web/src/main/js/api/mocks/NotificationsMock.ts index b539ea0ed08..7e50a368fef 100644 --- a/server/sonar-web/src/main/js/api/mocks/NotificationsMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/NotificationsMock.ts @@ -22,7 +22,7 @@ import { cloneDeep } from 'lodash'; import { AddRemoveNotificationParameters, Notification, - NotificationsResponse + NotificationsResponse, } from '../../types/notifications'; import { addNotification, getNotifications, removeNotification } from '../notifications'; @@ -35,11 +35,11 @@ const perProjectTypes = [ 'NewAlerts', 'NewFalsePositiveIssue', 'NewIssues', - 'SQ-MyNewIssues' + 'SQ-MyNewIssues', ]; const defaultNotifications: Notification[] = [ - { channel: 'EmailNotificationChannel', type: 'ChangesOnMyIssue' } + { channel: 'EmailNotificationChannel', type: 'ChangesOnMyIssue' }, ]; export default class NotificationsMock { @@ -58,7 +58,7 @@ export default class NotificationsMock { channels: [...channels], globalTypes: [...globalTypes], notifications: cloneDeep(this.notifications), - perProjectTypes: [...perProjectTypes] + perProjectTypes: [...perProjectTypes], }); }; @@ -70,7 +70,7 @@ export default class NotificationsMock { handleRemoveNotification = (params: AddRemoveNotificationParameters) => { const index = this.notifications.findIndex( - n => n.project === params.project && n.type === params.type && n.channel === params.channel + (n) => n.project === params.project && n.type === params.type && n.channel === params.channel ); if (index < 0) { diff --git a/server/sonar-web/src/main/js/api/mocks/PermissionTemplateServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/PermissionTemplateServiceMock.ts index 96bea6d9599..93e13d7126d 100644 --- a/server/sonar-web/src/main/js/api/mocks/PermissionTemplateServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/PermissionTemplateServiceMock.ts @@ -30,9 +30,15 @@ const defaultPermissionTemplates: PermissionTemplate[] = [ name: 'Permission Template 1', createdAt: '', defaultFor: [], - permissions: [] + permissions: [], + }, + { + id: 'template2', + name: 'Permission Template 2', + createdAt: '', + defaultFor: [], + permissions: [], }, - { id: 'template2', name: 'Permission Template 2', createdAt: '', defaultFor: [], permissions: [] } ]; export default class PermissionTemplateServiceMock { diff --git a/server/sonar-web/src/main/js/api/mocks/QualityGatesServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/QualityGatesServiceMock.ts index e087d046dc1..530f6980ccf 100644 --- a/server/sonar-web/src/main/js/api/mocks/QualityGatesServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/QualityGatesServiceMock.ts @@ -40,7 +40,7 @@ import { searchProjects, searchUsers, setQualityGateAsDefault, - updateCondition + updateCondition, } from '../quality-gates'; export class QualityGatesServiceMock { @@ -62,7 +62,7 @@ export class QualityGatesServiceMock { id: 'AXJMbIUGPAOIsUIE3eNT', metric: 'new_maintainability_rating', op: 'GT', - error: '1' + error: '1', }, { id: 'AXJMbIUGPAOIsUIE3eNU', metric: 'new_reliability_rating', op: 'GT', error: '1' }, { id: 'AXJMbIUGPAOIsUIE3eNV', metric: 'new_security_rating', op: 'GT', error: '1' }, @@ -70,17 +70,17 @@ export class QualityGatesServiceMock { id: 'AXJMbIUHPAOIsUIE3eNc', metric: 'new_duplicated_lines_density', op: 'GT', - error: '3' + error: '3', }, { id: 'AXJMbIUHPAOIsUIE3eOi', metric: 'new_security_hotspots_reviewed', op: 'LT', - error: '100' - } + error: '100', + }, ], isDefault: true, - isBuiltIn: false + isBuiltIn: false, }), mockQualityGate({ id: 'AXGYZrDqC-YjVCvvbRDY', @@ -88,10 +88,10 @@ export class QualityGatesServiceMock { conditions: [ { id: 'AXJMbIUHPAOIsUIE3eOu', metric: 'new_coverage', op: 'LT', error: '0' }, { id: 'AXJMbIUHPAOIsUIE3eOubis', metric: 'new_coverage', op: 'LT', error: '1' }, - { id: 'deprecated', metric: 'function_complexity', op: 'LT', error: '1' } + { id: 'deprecated', metric: 'function_complexity', op: 'LT', error: '1' }, ], isDefault: false, - isBuiltIn: false + isBuiltIn: false, }), mockQualityGate({ id: 'AWBWEMe4qGAMGEYPjJlr', @@ -103,25 +103,25 @@ export class QualityGatesServiceMock { id: 'AXJMbIUHPAOIsUIE3eOE', metric: 'new_maintainability_rating', op: 'GT', - error: '1' + error: '1', }, { id: 'AXJMbIUHPAOIsUIE3eOF', metric: 'new_coverage', op: 'LT', error: '80' }, { id: 'AXJMbIUHPAOIsUIE3eOG', metric: 'new_duplicated_lines_density', op: 'GT', - error: '3' + error: '3', }, { id: 'AXJMbIUHPAOIsUIE3eOk', metric: 'new_security_hotspots_reviewed', op: 'LT', - error: '100' - } + error: '100', + }, ], isDefault: false, - isBuiltIn: true - }) + isBuiltIn: true, + }), ]; this.list = cloneDeep(this.readOnlyList); @@ -130,7 +130,7 @@ export class QualityGatesServiceMock { { key: 'test1', name: 'test1', selected: false }, { key: 'test2', name: 'test2', selected: false }, { key: 'test3', name: 'test3', selected: true }, - { key: 'test4', name: 'test4', selected: true } + { key: 'test4', name: 'test4', selected: true }, ]; (fetchQualityGate as jest.Mock).mockImplementation(this.showHandler); @@ -164,11 +164,11 @@ export class QualityGatesServiceMock { } getDefaultQualityGate() { - return this.list.find(q => q.isDefault) || mockQualityGate({ isDefault: true }); + return this.list.find((q) => q.isDefault) || mockQualityGate({ isDefault: true }); } getBuiltInQualityGate() { - return this.list.find(q => q.isBuiltIn) || mockQualityGate({ isBuiltIn: true }); + return this.list.find((q) => q.isBuiltIn) || mockQualityGate({ isBuiltIn: true }); } setIsAdmin(isAdmin: boolean) { @@ -183,26 +183,26 @@ export class QualityGatesServiceMock { associateProjects: this.isAdmin, delete: q.isBuiltIn ? false : this.isAdmin, manageConditions: this.isAdmin, - delegate: this.isAdmin + delegate: this.isAdmin, }; } listHandler = () => { return this.reply({ qualitygates: this.list - .map(q => omit(q, 'conditions')) - .map(q => ({ + .map((q) => omit(q, 'conditions')) + .map((q) => ({ ...q, - actions: this.computeActions(q) + actions: this.computeActions(q), })), default: this.getDefaultQualityGate().id, - actions: { create: this.isAdmin } + actions: { create: this.isAdmin }, }); }; showHandler = ({ id }: { id: string }) => { const qualityGate = omit( - this.list.find(q => q.id === id), + this.list.find((q) => q.id === id), 'isDefault' ); return this.reply({ ...qualityGate, actions: this.computeActions(qualityGate) }); @@ -216,22 +216,22 @@ export class QualityGatesServiceMock { name, conditions: [], isDefault: false, - isBuiltIn: false + isBuiltIn: false, }) ); return this.reply({ id: newId, - name + name, }); }; destroyHandler = ({ id }: { id: string }) => { - this.list = this.list.filter(q => q.id !== id); + this.list = this.list.filter((q) => q.id !== id); return Promise.resolve(); }; copyHandler = ({ id, name }: { id: string; name: string }) => { - const newQG = cloneDeep(this.list.find(q => q.id === id)); + const newQG = cloneDeep(this.list.find((q) => q.id === id)); if (newQG === undefined) { return Promise.reject({ errors: [{ msg: `No quality gate has been found for id ${id}` }] }); } @@ -245,27 +245,27 @@ export class QualityGatesServiceMock { return this.reply({ id: newQG.id, - name + name, }); }; renameHandler = ({ id, name }: { id: string; name: string }) => { - const renameQG = this.list.find(q => q.id === id); + const renameQG = this.list.find((q) => q.id === id); if (renameQG === undefined) { return Promise.reject({ errors: [{ msg: `No quality gate has been found for id ${id}` }] }); } renameQG.name = name; return this.reply({ id: renameQG.id, - name + name, }); }; setDefaultHandler = ({ id }: { id: string }) => { - this.list.forEach(q => { + this.list.forEach((q) => { q.isDefault = false; }); - const selectedQG = this.list.find(q => q.id === id); + const selectedQG = this.list.find((q) => q.id === id); if (selectedQG === undefined) { return Promise.reject({ errors: [{ msg: `No quality gate has been found for id ${id}` }] }); } @@ -279,10 +279,10 @@ export class QualityGatesServiceMock { } & Omit ) => { const { metric, gateId, op, error } = data; - const qg = this.list.find(q => q.id === gateId); + const qg = this.list.find((q) => q.id === gateId); if (qg === undefined) { return Promise.reject({ - errors: [{ msg: `No quality gate has been found for id ${gateId}` }] + errors: [{ msg: `No quality gate has been found for id ${gateId}` }], }); } @@ -295,7 +295,7 @@ export class QualityGatesServiceMock { }; updateConditionHandler = ({ id, metric, op, error }: Condition) => { - const condition = flatten(this.list.map(q => q.conditions || [])).find(q => q.id === id); + const condition = flatten(this.list.map((q) => q.conditions || [])).find((q) => q.id === id); if (condition === undefined) { return Promise.reject({ errors: [{ msg: `No condition has been found for id ${id}` }] }); } @@ -308,33 +308,33 @@ export class QualityGatesServiceMock { }; deleteConditionHandler = ({ id }: { id: string }) => { - this.list.forEach(q => { - remove(q.conditions || [], c => c.id === id); + this.list.forEach((q) => { + remove(q.conditions || [], (c) => c.id === id); }); return Promise.resolve(); }; searchProjectsHandler = ({ selected, - query + query, }: { selected: string; query: string | undefined; }) => { let filteredProjects = this.projects; if (selected === 'selected') { - filteredProjects = this.projects.filter(p => p.selected); + filteredProjects = this.projects.filter((p) => p.selected); } else if (selected === 'deselected') { - filteredProjects = this.projects.filter(p => !p.selected); + filteredProjects = this.projects.filter((p) => !p.selected); } if (query !== '' && query !== undefined) { - filteredProjects = filteredProjects.filter(p => p.name.includes(query)); + filteredProjects = filteredProjects.filter((p) => p.name.includes(query)); } const response = { paging: { pageIndex: 1, pageSize: 3, total: 55 }, - results: filteredProjects + results: filteredProjects, }; return this.reply(response); }; @@ -356,7 +356,7 @@ export class QualityGatesServiceMock { }; selectHandler = ({ projectKey }: { projectKey: string }) => { - const changedProject = this.projects.find(p => p.key === projectKey); + const changedProject = this.projects.find((p) => p.key === projectKey); if (changedProject) { changedProject.selected = true; } @@ -364,7 +364,7 @@ export class QualityGatesServiceMock { }; deSelectHandler = ({ projectKey }: { projectKey: string }) => { - const changedProject = this.projects.find(p => p.key === projectKey); + const changedProject = this.projects.find((p) => p.key === projectKey); if (changedProject) { changedProject.selected = false; } diff --git a/server/sonar-web/src/main/js/api/mocks/SecurityHotspotServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/SecurityHotspotServiceMock.ts index 0cc19002c46..3a28a222ae7 100644 --- a/server/sonar-web/src/main/js/api/mocks/SecurityHotspotServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/SecurityHotspotServiceMock.ts @@ -39,7 +39,7 @@ export default class SecurityHotspotServiceMock { this.rawHotspotKey = Object.keys(mockRawHotspot()); this.hotspots = [ mockHotspot({ key: '1', status: HotspotStatus.TO_REVIEW }), - mockHotspot({ key: '2', status: HotspotStatus.TO_REVIEW }) + mockHotspot({ key: '2', status: HotspotStatus.TO_REVIEW }), ]; (getMeasures as jest.Mock).mockImplementation(this.handleGetMeasures); @@ -49,10 +49,10 @@ export default class SecurityHotspotServiceMock { ); (getRuleDetails as jest.Mock).mockResolvedValue({ rule: mockRuleDetails() }); (getSources as jest.Mock).mockResolvedValue( - times(NUMBER_OF_LINES, n => + times(NUMBER_OF_LINES, (n) => mockSourceLine({ line: n, - code: ' symbole' + code: ' symbole', }) ) ); @@ -60,7 +60,7 @@ export default class SecurityHotspotServiceMock { handleGetSources = (data: { key: string; from?: number; to?: number } & BranchParameters) => { return this.reply( - range(data.from || 1, data.to || MAX_END_RANGE).map(line => mockSourceLine({ line })) + range(data.from || 1, data.to || MAX_END_RANGE).map((line) => mockSourceLine({ line })) ); }; @@ -77,31 +77,31 @@ export default class SecurityHotspotServiceMock { ) => { return this.reply({ paging: { pageIndex: 1, pageSize: data.ps, total: this.hotspots.length }, - hotspots: this.hotspots.map(hotspot => pick(hotspot, this.rawHotspotKey)), + hotspots: this.hotspots.map((hotspot) => pick(hotspot, this.rawHotspotKey)), components: [ { key: 'guillaume-peoch-sonarsource_benflix_AYGpXq2bd8qy4i0eO9ed:index.php', qualifier: 'FIL', name: 'index.php', longName: 'index.php', - path: 'index.php' + path: 'index.php', }, { key: 'guillaume-peoch-sonarsource_benflix_AYGpXq2bd8qy4i0eO9ed', qualifier: 'TRK', name: 'benflix', - longName: 'benflix' - } - ] + longName: 'benflix', + }, + ], }); }; handleGetSecurityHotspotDetails = (securityHotspotKey: string) => { - const hotspot = this.hotspots.find(h => h.key === securityHotspotKey); + const hotspot = this.hotspots.find((h) => h.key === securityHotspotKey); if (hotspot === undefined) { return Promise.reject({ - errors: [{ msg: `No security hotspot for key ${securityHotspotKey}` }] + errors: [{ msg: `No security hotspot for key ${securityHotspotKey}` }], }); } @@ -115,9 +115,9 @@ export default class SecurityHotspotServiceMock { key: 'guillaume-peoch-sonarsource_benflix_AYGpXq2bd8qy4i0eO9ed', name: 'benflix', qualifier: 'TRK', - measures: [{ metric: 'security_hotspots_reviewed', value: '0.0', bestValue: false }] - } - } + measures: [{ metric: 'security_hotspots_reviewed', value: '0.0', bestValue: false }], + }, + }, ]); }; @@ -129,7 +129,7 @@ export default class SecurityHotspotServiceMock { this.rawHotspotKey = Object.keys(mockRawHotspot()); this.hotspots = [ mockHotspot({ key: '1', status: HotspotStatus.TO_REVIEW }), - mockHotspot({ key: '2', status: HotspotStatus.TO_REVIEW }) + mockHotspot({ key: '2', status: HotspotStatus.TO_REVIEW }), ]; }; } diff --git a/server/sonar-web/src/main/js/api/mocks/SettingsServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/SettingsServiceMock.ts index 7d22006a564..89727adaa72 100644 --- a/server/sonar-web/src/main/js/api/mocks/SettingsServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/SettingsServiceMock.ts @@ -28,8 +28,8 @@ export default class SettingsServiceMock { defaultValues: SettingValue[] = [ { key: SettingsKey.AuditHouseKeeping, - value: HousekeepingPolicy.Weekly - } + value: HousekeepingPolicy.Weekly, + }, ]; constructor() { @@ -40,12 +40,12 @@ export default class SettingsServiceMock { } handleGetValue = (data: { key: string; component?: string } & BranchParameters) => { - const setting = this.settingValues.find(s => s.key === data.key); + const setting = this.settingValues.find((s) => s.key === data.key); return this.reply(setting); }; handleGetValues = (data: { keys: string[]; component?: string } & BranchParameters) => { - const settings = this.settingValues.filter(s => data.keys.includes(s.key)); + const settings = this.settingValues.filter((s) => data.keys.includes(s.key)); return this.reply(settings); }; @@ -59,7 +59,7 @@ export default class SettingsServiceMock { }; set = (key: SettingsKey, value: string) => { - const setting = this.settingValues.find(s => s.key === key); + const setting = this.settingValues.find((s) => s.key === key); if (setting) { setting.value = value; } else { diff --git a/server/sonar-web/src/main/js/api/mocks/SourceViewerServiceMock.ts b/server/sonar-web/src/main/js/api/mocks/SourceViewerServiceMock.ts index 7205b908eb1..90ff8c7098d 100644 --- a/server/sonar-web/src/main/js/api/mocks/SourceViewerServiceMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/SourceViewerServiceMock.ts @@ -24,7 +24,7 @@ import { getComponentData, getComponentForSourceViewer, getDuplications, - getSources + getSources, } from '../../api/components'; import { mockSourceLine } from '../../helpers/mocks/sources'; import { HttpStatus } from '../../helpers/request'; @@ -43,7 +43,7 @@ function mockSourceFileView(name: string, project = 'project') { analysisDate: '2019-08-08T12:15:12+0200', leakPeriodDate: '2018-08-07T11:22:22+0200', version: '1.2-SNAPSHOT', - needIssueSync: false + needIssueSync: false, }, sourceFileView: { key: `${project}:${name}`, @@ -56,8 +56,8 @@ function mockSourceFileView(name: string, project = 'project') { projectName: 'Test project', fav: false, canMarkAsFavorite: true, - measures: { lines: '0', issues: '0' } - } + measures: { lines: '0', issues: '0' }, + }, }; } @@ -72,44 +72,44 @@ const ANCESTORS = [ visibility: 'public', leakPeriodDate: '2018-08-07T11:22:22+0200', version: '1.2-SNAPSHOT', - needIssueSync: false - } + needIssueSync: false, + }, ]; const FILES: Dict = { 'project:test3.js': { ...mockSourceFileView('test3.js'), sources: [], - ancestors: ANCESTORS + ancestors: ANCESTORS, }, 'project:test2.js': { ...mockSourceFileView('test2.js'), - sources: times(200, n => + sources: times(200, (n) => mockSourceLine({ line: n, - code: `\u003cspan class\u003d"cd"\u003eLine ${n}\u003c/span\u003e` + code: `\u003cspan class\u003d"cd"\u003eLine ${n}\u003c/span\u003e`, }) ), - ancestors: ANCESTORS + ancestors: ANCESTORS, }, 'foo:index.tsx': { ...mockSourceFileView('index.tsx', 'foo'), - sources: times(200, n => + sources: times(200, (n) => mockSourceLine({ line: n, - code: 'function Test() {}' + code: 'function Test() {}', }) ), - ancestors: ANCESTORS + ancestors: ANCESTORS, }, 'project:testSymb.tsx': { ...mockSourceFileView('testSymb.tsx'), - sources: times(20, n => + sources: times(20, (n) => mockSourceLine({ line: n, - code: ' symbole' + code: ' symbole', }) ), - ancestors: ANCESTORS + ancestors: ANCESTORS, }, 'project:test.js': { ...mockSourceFileView('test.js'), @@ -123,7 +123,7 @@ const FILES: Dict = { duplicated: false, isNew: false, lineHits: 1, - coveredConditions: 1 + coveredConditions: 1, }, { line: 2, @@ -134,7 +134,7 @@ const FILES: Dict = { duplicated: false, isNew: false, lineHits: 0, - conditions: 1 + conditions: 1, }, { line: 3, @@ -144,19 +144,18 @@ const FILES: Dict = { scmDate: '2022-01-28T21:03:07+0100', duplicated: false, isNew: false, - lineHits: 1 + lineHits: 1, }, { line: 4, - code: - '\u003cspan class\u003d"cd"\u003e * mailto:info AT sonarsource DOT com\u003c/span\u003e', + code: '\u003cspan class\u003d"cd"\u003e * mailto:info AT sonarsource DOT com\u003c/span\u003e', scmRevision: 'f09ee6b610528aa37b7b51be395c93524cebae8f', scmAuthor: 'stas.vilchik@sonarsource.com', duplicated: false, isNew: false, lineHits: 1, conditions: 1, - coveredConditions: 1 + coveredConditions: 1, }, { line: 5, @@ -166,7 +165,7 @@ const FILES: Dict = { isNew: false, lineHits: 2, conditions: 2, - coveredConditions: 1 + coveredConditions: 1, }, { line: 6, @@ -174,33 +173,32 @@ const FILES: Dict = { scmRevision: 'f04ee6b610528aa37b7b51be395c93524cebae8f', duplicated: false, isNew: false, - lineHits: 0 + lineHits: 0, }, { line: 7, code: '\u003cspan class\u003d"cd"\u003e * 7\u003c/span\u003e', scmRevision: 'f04ee6b610528aa37b7b51be395c93524cebae8f', duplicated: true, - isNew: true + isNew: true, }, { - code: - '\u003cspan class\u003d"cd"\u003e * This program is free software; you can redistribute it and/or\u003c/span\u003e', + code: '\u003cspan class\u003d"cd"\u003e * This program is free software; you can redistribute it and/or\u003c/span\u003e', scmRevision: 'f09ee6b610528aa37b7b51be395c93524cebae8f', scmAuthor: 'stas.vilchik@sonarsource.com', scmDate: '2018-07-10T20:21:20+0200', duplicated: false, - isNew: false - } + isNew: false, + }, ], ancestors: ANCESTORS, duplications: [ { blocks: [ { from: 7, size: 1, _ref: '1' }, - { from: 1, size: 1, _ref: '2' } - ] - } + { from: 1, size: 1, _ref: '2' }, + ], + }, ], files: { '1': { @@ -209,7 +207,7 @@ const FILES: Dict = { uuid: 'AX8NSmj8EGYw5-dyy63J', project: 'project', projectUuid: 'AX7juKJqVeQLJMPyb_b-', - projectName: 'project' + projectName: 'project', }, '2': { key: 'project:test2.js', @@ -217,10 +215,10 @@ const FILES: Dict = { uuid: 'BX8NSmj8EGYw5-dyy63J', project: 'project', projectUuid: 'AX7juKJqVeQLJMPyb_b-', - projectName: 'project' - } - } - } + projectName: 'project', + }, + }, + }, }; export class SourceViewerServiceMock { diff --git a/server/sonar-web/src/main/js/api/mocks/UserTokensMock.ts b/server/sonar-web/src/main/js/api/mocks/UserTokensMock.ts index cd21d0fc443..2fef8eb17f0 100644 --- a/server/sonar-web/src/main/js/api/mocks/UserTokensMock.ts +++ b/server/sonar-web/src/main/js/api/mocks/UserTokensMock.ts @@ -30,12 +30,12 @@ const defaultTokens = [ mockUserToken({ name: 'local-scanner', createdAt: '2022-03-07T09:02:59+0000', - lastConnectionDate: '2022-04-07T09:51:48+0000' + lastConnectionDate: '2022-04-07T09:51:48+0000', }), mockUserToken({ name: 'test', - createdAt: '2020-01-23T19:25:19+0000' - }) + createdAt: '2020-01-23T19:25:19+0000', + }), ]; export default class UserTokensMock { @@ -59,7 +59,7 @@ export default class UserTokensMock { login, type, projectKey, - expirationDate + expirationDate, }: { name: string; login?: string; @@ -78,11 +78,9 @@ export default class UserTokensMock { type, projectKey, isExpired: false, - token: Math.random() - .toString(RANDOM_RADIX) - .slice(RANDOM_PREFIX), + token: Math.random().toString(RANDOM_RADIX).slice(RANDOM_PREFIX), createdAt: '2022-04-04T04:04:04+0000', - expirationDate + expirationDate, }; this.tokens.push(token); @@ -91,7 +89,7 @@ export default class UserTokensMock { }; handleRevokeToken = ({ name }: { name: string; login?: string }) => { - const index = this.tokens.findIndex(t => t.name === name); + const index = this.tokens.findIndex((t) => t.name === name); if (index < 0) { return Promise.resolve(); diff --git a/server/sonar-web/src/main/js/api/permissions.ts b/server/sonar-web/src/main/js/api/permissions.ts index 295ccc7f274..15e7e99fe6e 100644 --- a/server/sonar-web/src/main/js/api/permissions.ts +++ b/server/sonar-web/src/main/js/api/permissions.ts @@ -24,7 +24,7 @@ import { PermissionGroup, PermissionTemplate, PermissionUser, - Visibility + Visibility, } from '../types/types'; import { BaseSearchProjectsParameters } from './components'; @@ -197,7 +197,7 @@ export function getPermissionTemplateUsers( if (permission) { data.permission = permission; } - return getJSON('/api/permissions/template_users', data).then(r => r.users); + return getJSON('/api/permissions/template_users', data).then((r) => r.users); } export function getPermissionTemplateGroups( @@ -212,7 +212,7 @@ export function getPermissionTemplateGroups( if (permission) { data.permission = permission; } - return getJSON('/api/permissions/template_groups', data).then(r => r.groups); + return getJSON('/api/permissions/template_groups', data).then((r) => r.groups); } export function changeProjectVisibility( diff --git a/server/sonar-web/src/main/js/api/plugins.ts b/server/sonar-web/src/main/js/api/plugins.ts index 64510fd49e9..871a2a8d89b 100644 --- a/server/sonar-web/src/main/js/api/plugins.ts +++ b/server/sonar-web/src/main/js/api/plugins.ts @@ -26,7 +26,7 @@ import { InstalledPlugin, PendingPluginResult, PluginType, - Update + Update, } from '../types/plugins'; export function getAvailablePlugins(): Promise<{ @@ -45,8 +45,8 @@ function getLastUpdates(updates: undefined | Update[]): Update[] { return []; } const lastUpdate = ['COMPATIBLE', 'REQUIRES_SYSTEM_UPGRADE', 'DEPS_REQUIRE_SYSTEM_UPGRADE'].map( - status => { - const index = findLastIndex(updates, update => update.status === status); + (status) => { + const index = findLastIndex(updates, (update) => update.status === status); return index > -1 ? updates[index] : undefined; } ); @@ -87,9 +87,9 @@ export function getInstalledPluginsWithUpdates(): Promise { return { ...updatePlugin, ...plugin, - updates: getLastUpdates(updatePlugin.updates).map(update => + updates: getLastUpdates(updatePlugin.updates).map((update) => addChangelog(update, updatePlugin.updates) - ) + ), }; } return plugin; @@ -102,7 +102,7 @@ export function getPluginUpdates(): Promise { return Promise.all([getUpdatesPluginApi(), getInstalledPluginApi()]) .then(([updates, installed]) => updates.plugins.map((updatePlugin: InstalledPlugin) => { - const updates = getLastUpdates(updatePlugin.updates).map(update => + const updates = getLastUpdates(updatePlugin.updates).map((update) => addChangelog(update, updatePlugin.updates) ); const plugin = installed.plugins.find((p: InstalledPlugin) => p.key === updatePlugin.key); @@ -110,7 +110,7 @@ export function getPluginUpdates(): Promise { return { ...plugin, ...updatePlugin, - updates + updates, }; } return { ...updatePlugin, updates }; diff --git a/server/sonar-web/src/main/js/api/projectActivity.ts b/server/sonar-web/src/main/js/api/projectActivity.ts index 06e8e582e43..6e19b1cb475 100644 --- a/server/sonar-web/src/main/js/api/projectActivity.ts +++ b/server/sonar-web/src/main/js/api/projectActivity.ts @@ -26,7 +26,7 @@ import { Paging } from '../types/types'; export enum ProjectActivityStatuses { STATUS_PROCESSED = 'P', STATUS_UNPROCESSED = 'U', - STATUS_LIVE_MEASURE_COMPUTE = 'L' + STATUS_LIVE_MEASURE_COMPUTE = 'L', } export function getProjectActivity( @@ -63,7 +63,10 @@ export function createEvent( if (description) { data.description = description; } - return postJSON('/api/project_analyses/create_event', data).then(r => r.event, throwGlobalError); + return postJSON('/api/project_analyses/create_event', data).then( + (r) => r.event, + throwGlobalError + ); } export function deleteEvent(event: string): Promise { @@ -82,7 +85,10 @@ export function changeEvent( if (description) { data.description = description; } - return postJSON('/api/project_analyses/update_event', data).then(r => r.event, throwGlobalError); + return postJSON('/api/project_analyses/update_event', data).then( + (r) => r.event, + throwGlobalError + ); } export function deleteAnalysis(analysis: string): Promise { diff --git a/server/sonar-web/src/main/js/api/projectLinks.ts b/server/sonar-web/src/main/js/api/projectLinks.ts index 6af46e1adc5..478720227a8 100644 --- a/server/sonar-web/src/main/js/api/projectLinks.ts +++ b/server/sonar-web/src/main/js/api/projectLinks.ts @@ -22,7 +22,10 @@ import { getJSON, post, postJSON } from '../helpers/request'; import { ProjectLink } from '../types/types'; export function getProjectLinks(projectKey: string): Promise { - return getJSON('/api/project_links/search', { projectKey }).then(r => r.links, throwGlobalError); + return getJSON('/api/project_links/search', { projectKey }).then( + (r) => r.links, + throwGlobalError + ); } export function deleteLink(linkId: string) { @@ -34,5 +37,5 @@ export function createLink(data: { projectKey: string; url: string; }): Promise { - return postJSON('/api/project_links/create', data).then(r => r.link, throwGlobalError); + return postJSON('/api/project_links/create', data).then((r) => r.link, throwGlobalError); } diff --git a/server/sonar-web/src/main/js/api/quality-gates.ts b/server/sonar-web/src/main/js/api/quality-gates.ts index dbc478b3b60..798a899be81 100644 --- a/server/sonar-web/src/main/js/api/quality-gates.ts +++ b/server/sonar-web/src/main/js/api/quality-gates.ts @@ -26,7 +26,7 @@ import { Group, QualityGateApplicationStatus, QualityGateProjectStatus, - SearchPermissionsParameters + SearchPermissionsParameters, } from '../types/quality-gates'; import { Condition, Paging, QualityGate } from '../types/types'; import { UserBase } from '../types/users'; @@ -83,7 +83,7 @@ export function getGateForProject(data: { project: string }): Promise qualityGate && { ...qualityGate, - isDefault: qualityGate.default + isDefault: qualityGate.default, }, throwGlobalError ); @@ -130,7 +130,7 @@ export function getQualityGateProjectStatus( } & BranchParameters ): Promise { return getJSON('/api/qualitygates/project_status', data) - .then(r => r.projectStatus) + .then((r) => r.projectStatus) .catch(throwGlobalError); } diff --git a/server/sonar-web/src/main/js/api/quality-profiles.ts b/server/sonar-web/src/main/js/api/quality-profiles.ts index 283f0c52d2a..ad42d46bd71 100644 --- a/server/sonar-web/src/main/js/api/quality-profiles.ts +++ b/server/sonar-web/src/main/js/api/quality-profiles.ts @@ -75,7 +75,7 @@ export function searchQualityProfiles( export function getQualityProfile({ compareToSonarWay, - profile: { key } + profile: { key }, }: { compareToSonarWay?: boolean; profile: Profile; @@ -103,24 +103,21 @@ export function getProfileProjects( return getJSON('/api/qualityprofiles/projects', data).catch(throwGlobalError); } -export function getProfileInheritance({ - language, - name: qualityProfile -}: Profile): Promise<{ +export function getProfileInheritance({ language, name: qualityProfile }: Profile): Promise<{ ancestors: ProfileInheritanceDetails[]; children: ProfileInheritanceDetails[]; profile: ProfileInheritanceDetails; }> { return getJSON('/api/qualityprofiles/inheritance', { language, - qualityProfile + qualityProfile, }).catch(throwGlobalError); } export function setDefaultProfile({ language, name: qualityProfile }: Profile) { return post('/api/qualityprofiles/set_default', { language, - qualityProfile + qualityProfile, }); } @@ -143,7 +140,7 @@ export function changeProfileParent( return post('/api/qualityprofiles/change_parent', { language, qualityProfile, - parentQualityProfile: parentProfile ? parentProfile.name : undefined + parentQualityProfile: parentProfile ? parentProfile.name : undefined, }).catch(throwGlobalError); } @@ -167,11 +164,11 @@ export function getQualityProfileExporterUrl( export function getImporters(): Promise< Array<{ key: string; languages: Array; name: string }> > { - return getJSON('/api/qualityprofiles/importers').then(r => r.importers, throwGlobalError); + return getJSON('/api/qualityprofiles/importers').then((r) => r.importers, throwGlobalError); } export function getExporters(): Promise { - return getJSON('/api/qualityprofiles/exporters').then(r => r.exporters); + return getJSON('/api/qualityprofiles/exporters').then((r) => r.exporters); } export function getProfileChangelog( @@ -190,7 +187,7 @@ export function getProfileChangelog( to, language, qualityProfile, - p: page + p: page, }); } @@ -215,7 +212,7 @@ export function associateProject({ language, name: qualityProfile }: Profile, pr return post('/api/qualityprofiles/add_project', { language, qualityProfile, - project + project, }).catch(throwGlobalError); } @@ -223,7 +220,7 @@ export function dissociateProject({ language, name: qualityProfile }: Profile, p return post('/api/qualityprofiles/remove_project', { language, qualityProfile, - project + project, }).catch(throwGlobalError); } diff --git a/server/sonar-web/src/main/js/api/rules.ts b/server/sonar-web/src/main/js/api/rules.ts index 583e684c200..3fa049665cc 100644 --- a/server/sonar-web/src/main/js/api/rules.ts +++ b/server/sonar-web/src/main/js/api/rules.ts @@ -32,7 +32,7 @@ export function searchRules(data: SearchRulesQuery): Promise f.property === property); + const facet = response.facets?.find((f) => f.property === property); return facet ? facet.values : []; } @@ -53,7 +53,7 @@ export function getRuleDetails(parameters: { } export function getRuleTags(parameters: { ps?: number; q: string }): Promise { - return getJSON('/api/rules/tags', parameters).then(r => r.tags, throwGlobalError); + return getJSON('/api/rules/tags', parameters).then((r) => r.tags, throwGlobalError); } export function createRule(data: { @@ -68,8 +68,8 @@ export function createRule(data: { type?: string; }): Promise { return postJSON('/api/rules/create', data).then( - r => r.rule, - response => { + (r) => r.rule, + (response) => { // do not show global error if the status code is 409 // this case should be handled inside a component if (response && response.status === 409) { @@ -86,5 +86,5 @@ export function deleteRule(parameters: { key: string }) { } export function updateRule(data: RulesUpdateRequest): Promise { - return postJSON('/api/rules/update', data).then(r => r.rule, throwGlobalError); + return postJSON('/api/rules/update', data).then((r) => r.rule, throwGlobalError); } diff --git a/server/sonar-web/src/main/js/api/security-hotspots.ts b/server/sonar-web/src/main/js/api/security-hotspots.ts index 7ad46bda59a..7c44c93edbd 100644 --- a/server/sonar-web/src/main/js/api/security-hotspots.ts +++ b/server/sonar-web/src/main/js/api/security-hotspots.ts @@ -27,7 +27,7 @@ import { HotspotResolution, HotspotSearchResponse, HotspotSetStatusRequest, - HotspotStatus + HotspotStatus, } from '../types/security-hotspots'; import { UserBase } from '../types/users'; @@ -100,17 +100,17 @@ export function getSecurityHotspotDetails(securityHotspotKey: string): Promise u.login === hotspot.assignee) || { + hotspot.assigneeUser = users.find((u) => u.login === hotspot.assignee) || { active: true, - login: hotspot.assignee + login: hotspot.assignee, }; } - hotspot.authorUser = users.find(u => u.login === hotspot.author) || { + hotspot.authorUser = users.find((u) => u.login === hotspot.author) || { active: true, - login: hotspot.author + login: hotspot.author, }; - hotspot.comment.forEach(c => { - c.user = users.find(u => u.login === c.login) || { active: true, login: c.login }; + hotspot.comment.forEach((c) => { + c.user = users.find((u) => u.login === c.login) || { active: true, login: c.login }; }); } diff --git a/server/sonar-web/src/main/js/api/settings.ts b/server/sonar-web/src/main/js/api/settings.ts index 5780a8814b8..0baadccc407 100644 --- a/server/sonar-web/src/main/js/api/settings.ts +++ b/server/sonar-web/src/main/js/api/settings.ts @@ -26,12 +26,12 @@ import { ExtendedSettingDefinition, SettingDefinition, SettingValue, - SettingValueResponse + SettingValueResponse, } from '../types/settings'; export function getDefinitions(component?: string): Promise { return getJSON('/api/settings/list_definitions', { component }).then( - r => r.definitions, + (r) => r.definitions, throwGlobalError ); } @@ -47,10 +47,10 @@ export function getValues( ): Promise { return getJSON('/api/settings/values', { keys: data.keys.join(','), - component: data.component + component: data.component, }).then((r: SettingValueResponse) => [ ...r.settings, - ...r.setSecuredSettings.map(key => ({ key })) + ...r.setSecuredSettings.map((key) => ({ key })), ]); } @@ -59,7 +59,7 @@ export function getAllValues( ): Promise { return getJSON('/api/settings/values', data).then((r: SettingValueResponse) => [ ...r.settings, - ...r.setSecuredSettings.map(key => ({ key })) + ...r.setSecuredSettings.map((key) => ({ key })), ]); } @@ -75,7 +75,7 @@ export function setSettingValue( data.values = value; } else if (definition.type === 'PROPERTY_SET') { data.fieldValues = value - .map((fields: any) => omitBy(fields, value => value == null)) + .map((fields: any) => omitBy(fields, (value) => value == null)) .map(JSON.stringify); } else { data.value = value; diff --git a/server/sonar-web/src/main/js/api/static.ts b/server/sonar-web/src/main/js/api/static.ts index 2968e680439..85121065b44 100644 --- a/server/sonar-web/src/main/js/api/static.ts +++ b/server/sonar-web/src/main/js/api/static.ts @@ -23,5 +23,5 @@ export function getPluginStaticFileContent(pluginKey: string, staticFilePath: st return request(`/static/${pluginKey}/${staticFilePath}`) .submit() .then(checkStatus) - .then(response => response.text()); + .then((response) => response.text()); } diff --git a/server/sonar-web/src/main/js/api/time-machine.ts b/server/sonar-web/src/main/js/api/time-machine.ts index 0f9f592cd71..cd59a20b76e 100644 --- a/server/sonar-web/src/main/js/api/time-machine.ts +++ b/server/sonar-web/src/main/js/api/time-machine.ts @@ -53,14 +53,14 @@ export function getAllTimeMachineData( } & BranchParameters, prev?: TimeMachineResponse ): Promise { - return getTimeMachineData({ ...data, ps: 1000 }).then(r => { + return getTimeMachineData({ ...data, ps: 1000 }).then((r) => { const result = prev ? { measures: prev.measures.map((measure, idx) => ({ ...measure, - history: measure.history.concat(r.measures[idx].history) + history: measure.history.concat(r.measures[idx].history), })), - paging: r.paging + paging: r.paging, } : r; diff --git a/server/sonar-web/src/main/js/api/user-tokens.ts b/server/sonar-web/src/main/js/api/user-tokens.ts index c016d4452a3..1cdd58a824e 100644 --- a/server/sonar-web/src/main/js/api/user-tokens.ts +++ b/server/sonar-web/src/main/js/api/user-tokens.ts @@ -23,7 +23,7 @@ import { NewUserToken, UserToken } from '../types/token'; /** List tokens for given user login */ export function getTokens(login: string): Promise { - return getJSON('/api/user_tokens/search', { login }).then(r => r.userTokens, throwGlobalError); + return getJSON('/api/user_tokens/search', { login }).then((r) => r.userTokens, throwGlobalError); } export function generateToken(data: { diff --git a/server/sonar-web/src/main/js/api/user_groups.ts b/server/sonar-web/src/main/js/api/user_groups.ts index 5949d53c70d..217ab99f2a1 100644 --- a/server/sonar-web/src/main/js/api/user_groups.ts +++ b/server/sonar-web/src/main/js/api/user_groups.ts @@ -50,7 +50,7 @@ export function removeUserFromGroup(data: { id?: string; name?: string; login?: } export function createGroup(data: { description?: string; name: string }): Promise { - return postJSON('/api/user_groups/create', data).then(r => r.group, throwGlobalError); + return postJSON('/api/user_groups/create', data).then((r) => r.group, throwGlobalError); } export function updateGroup(data: { description?: string; id: number; name?: string }) { diff --git a/server/sonar-web/src/main/js/api/users.ts b/server/sonar-web/src/main/js/api/users.ts index 423c3b67b80..7353412753e 100644 --- a/server/sonar-web/src/main/js/api/users.ts +++ b/server/sonar-web/src/main/js/api/users.ts @@ -88,7 +88,7 @@ export function updateUser(data: { }): Promise { return postJSON('/api/users/update', { ...data, - scmAccount: data.scmAccount.length > 0 ? data.scmAccount : '' + scmAccount: data.scmAccount.length > 0 ? data.scmAccount : '', }); } diff --git a/server/sonar-web/src/main/js/api/web-api.ts b/server/sonar-web/src/main/js/api/web-api.ts index 31b3770d7ac..b95422dd012 100644 --- a/server/sonar-web/src/main/js/api/web-api.ts +++ b/server/sonar-web/src/main/js/api/web-api.ts @@ -32,7 +32,7 @@ interface RawDomain { export function fetchWebApi(showInternal = true): Promise { return getJSON('/api/webservices/list', { include_internals: showInternal }) - .then(r => r.webServices) + .then((r) => r.webServices) .catch(throwGlobalError); } diff --git a/server/sonar-web/src/main/js/app/components/AdminContainer.tsx b/server/sonar-web/src/main/js/app/components/AdminContainer.tsx index 0b5bcc72ab9..edd745f472f 100644 --- a/server/sonar-web/src/main/js/app/components/AdminContainer.tsx +++ b/server/sonar-web/src/main/js/app/components/AdminContainer.tsx @@ -48,7 +48,7 @@ export class AdminContainer extends React.PureComponent { getSettingsNavigation().then( - r => this.setState({ adminPages: r.extensions }), + (r) => this.setState({ adminPages: r.extensions }), () => {} ); }; fetchPendingPlugins = () => { getPendingPlugins().then( - pendingPlugins => { + (pendingPlugins) => { if (this.mounted) { this.setState({ pendingPlugins }); } @@ -138,8 +138,9 @@ export class AdminContainer extends React.PureComponent + systemStatus, + }} + > diff --git a/server/sonar-web/src/main/js/app/components/AdminContext.tsx b/server/sonar-web/src/main/js/app/components/AdminContext.tsx index 15628a0bd91..2e00bc92316 100644 --- a/server/sonar-web/src/main/js/app/components/AdminContext.tsx +++ b/server/sonar-web/src/main/js/app/components/AdminContext.tsx @@ -35,6 +35,6 @@ const AdminContext = React.createContext({ fetchSystemStatus: () => {}, fetchPendingPlugins: () => {}, pendingPlugins: defaultPendingPlugins, - systemStatus: defaultSystemStatus + systemStatus: defaultSystemStatus, }); export default AdminContext; diff --git a/server/sonar-web/src/main/js/app/components/App.tsx b/server/sonar-web/src/main/js/app/components/App.tsx index 297252eba06..b21724633e3 100644 --- a/server/sonar-web/src/main/js/app/components/App.tsx +++ b/server/sonar-web/src/main/js/app/components/App.tsx @@ -68,7 +68,7 @@ export class App extends React.PureComponent { renderPreconnectLink = () => { const { - appState: { settings } + appState: { settings }, } = this.props; const enableGravatar = settings[GlobalSettingKeys.EnableGravatar] === 'true'; diff --git a/server/sonar-web/src/main/js/app/components/ComponentContainer.tsx b/server/sonar-web/src/main/js/app/components/ComponentContainer.tsx index f4dfc260e65..181517004f8 100644 --- a/server/sonar-web/src/main/js/app/components/ComponentContainer.tsx +++ b/server/sonar-web/src/main/js/app/components/ComponentContainer.tsx @@ -30,13 +30,13 @@ import { getBranchLikeQuery, isBranch, isMainBranch, - isPullRequest + isPullRequest, } from '../../helpers/branch-like'; import { HttpStatus } from '../../helpers/request'; import { getPortfolioUrl } from '../../helpers/urls'; import { ProjectAlmBindingConfigurationErrors, - ProjectAlmBindingResponse + ProjectAlmBindingResponse, } from '../../types/alm-settings'; import { BranchLike } from '../../types/branch-like'; import { ComponentQualifier, isPortfolioLike } from '../../types/component'; @@ -45,7 +45,7 @@ import { Task, TaskStatuses, TaskTypes, TaskWarning } from '../../types/tasks'; import { Component, Status } from '../../types/types'; import handleRequiredAuthorization from '../utils/handleRequiredAuthorization'; import withAvailableFeatures, { - WithAvailableFeaturesProps + WithAvailableFeaturesProps, } from './available-features/withAvailableFeatures'; import withBranchStatusActions from './branch-status/withBranchStatusActions'; import ComponentContainerNotFound from './ComponentContainerNotFound'; @@ -107,7 +107,7 @@ export class ComponentContainer extends React.PureComponent { try { const [nav, { component }] = await Promise.all([ getComponentNavigation({ component: key, branch, pullRequest }), - getComponentData({ component: key, branch, pullRequest }) + getComponentData({ component: key, branch, pullRequest }), ]); componentWithQualifier = this.addQualifier({ ...nav, ...component }); } catch (e) { @@ -146,7 +146,7 @@ export class ComponentContainer extends React.PureComponent { branchLikes, component: componentWithQualifier, projectBinding, - loading: false + loading: false, }); this.fetchStatus(componentWithQualifier.key); @@ -174,7 +174,7 @@ export class ComponentContainer extends React.PureComponent { !hasFeature(Feature.BranchSupport) || breadcrumb.qualifier === ComponentQualifier.Application ? Promise.resolve([]) - : getPullRequests(key) + : getPullRequests(key), ]); branchLikes = [...branches, ...pullRequests]; @@ -214,11 +214,11 @@ export class ComponentContainer extends React.PureComponent { ); } - const isPending = pendingTasks.some(task => task.status === TaskStatuses.Pending); + const isPending = pendingTasks.some((task) => task.status === TaskStatuses.Pending); return { currentTask: newCurrentTask, isPending, - tasksInProgress: newTasksInProgress + tasksInProgress: newTasksInProgress, }; }, () => { @@ -237,7 +237,7 @@ export class ComponentContainer extends React.PureComponent { if (component.qualifier === ComponentQualifier.Project) { getAnalysisStatus({ component: component.key, - ...getBranchLikeQuery(branchLike) + ...getBranchLikeQuery(branchLike), }).then( ({ component }) => { this.setState({ warnings: component.warnings }); @@ -264,14 +264,14 @@ export class ComponentContainer extends React.PureComponent { addQualifier = (component: Component) => ({ ...component, - qualifier: component.breadcrumbs[component.breadcrumbs.length - 1].qualifier + qualifier: component.breadcrumbs[component.breadcrumbs.length - 1].qualifier, }); getCurrentBranchLike = (branchLikes: BranchLike[]) => { const { query } = this.props.location; return query.pullRequest - ? branchLikes.find(b => isPullRequest(b) && b.key === query.pullRequest) - : branchLikes.find(b => isBranch(b) && (query.branch ? b.name === query.branch : b.isMain)); + ? branchLikes.find((b) => isPullRequest(b) && b.key === query.pullRequest) + : branchLikes.find((b) => isBranch(b) && (query.branch ? b.name === query.branch : b.isMain)); }; getCurrentTask = (current: Task, branchLike?: BranchLike) => { @@ -286,12 +286,12 @@ export class ComponentContainer extends React.PureComponent { getPendingTasksForBranchLike = (pendingTasks: Task[], branchLike?: BranchLike) => { return pendingTasks.filter( - task => this.isReportRelatedTask(task) && this.isSameBranch(task, branchLike) + (task) => this.isReportRelatedTask(task) && this.isSameBranch(task, branchLike) ); }; getInProgressTasks = (pendingTasks: Task[]) => { - return pendingTasks.filter(task => task.status === TaskStatuses.InProgress); + return pendingTasks.filter((task) => task.status === TaskStatuses.InProgress); }; isReportRelatedTask = (task: Task) => { @@ -360,7 +360,7 @@ export class ComponentContainer extends React.PureComponent { }; registerBranchStatuses = (branchLikes: BranchLike[], component: Component) => { - branchLikes.forEach(branchLike => { + branchLikes.forEach((branchLike) => { if (branchLike.status) { this.props.updateBranchStatus( branchLike, @@ -373,7 +373,7 @@ export class ComponentContainer extends React.PureComponent { handleComponentChange = (changes: Partial) => { if (this.mounted) { - this.setState(state => { + this.setState((state) => { if (state.component) { const newComponent: Component = { ...state.component, ...changes }; return { component: newComponent }; @@ -422,7 +422,7 @@ export class ComponentContainer extends React.PureComponent { projectBinding, projectBindingErrors, tasksInProgress, - warnings + warnings, } = this.state; const isInProgress = tasksInProgress && tasksInProgress.length > 0; @@ -461,8 +461,9 @@ export class ComponentContainer extends React.PureComponent { isPending, onBranchesChange: this.handleBranchesChange, onComponentChange: this.handleComponentChange, - projectBinding - }}> + projectBinding, + }} + > )} diff --git a/server/sonar-web/src/main/js/app/components/GlobalFooter.tsx b/server/sonar-web/src/main/js/app/components/GlobalFooter.tsx index 3ed1bec60b8..2646c620010 100644 --- a/server/sonar-web/src/main/js/app/components/GlobalFooter.tsx +++ b/server/sonar-web/src/main/js/app/components/GlobalFooter.tsx @@ -62,7 +62,8 @@ export function GlobalFooter({ hideLoggedInInfo, appState }: GlobalFooterProps) + target="_blank" + > {translate('footer.license')} @@ -70,7 +71,8 @@ export function GlobalFooter({ hideLoggedInInfo, appState }: GlobalFooterProps) + target="_blank" + > {translate('footer.community')} @@ -81,7 +83,8 @@ export function GlobalFooter({ hideLoggedInInfo, appState }: GlobalFooterProps) + target="_blank" + > {translate('footer.plugins')} diff --git a/server/sonar-web/src/main/js/app/components/GlobalFooterBranding.tsx b/server/sonar-web/src/main/js/app/components/GlobalFooterBranding.tsx index 1c9145b2231..60e0f5815ba 100644 --- a/server/sonar-web/src/main/js/app/components/GlobalFooterBranding.tsx +++ b/server/sonar-web/src/main/js/app/components/GlobalFooterBranding.tsx @@ -37,7 +37,8 @@ export default function GlobalFooterBranding() { href="https://www.sonarqube.org/?referrer=sonarqube" rel="noopener noreferrer" target="_blank" - title="SonarQube™"> + title="SonarQube™" + > SonarQube™ {' '} but is not an official version provided by{' '} @@ -45,7 +46,8 @@ export default function GlobalFooterBranding() { href="https://www.sonarsource.com" rel="noopener noreferrer" target="_blank" - title="SonarSource SA"> + title="SonarSource SA" + > SonarSource SA . diff --git a/server/sonar-web/src/main/js/app/components/GlobalMessage.tsx b/server/sonar-web/src/main/js/app/components/GlobalMessage.tsx index 9a0a64e1a2d..b7e21d4b416 100644 --- a/server/sonar-web/src/main/js/app/components/GlobalMessage.tsx +++ b/server/sonar-web/src/main/js/app/components/GlobalMessage.tsx @@ -36,7 +36,8 @@ export default function GlobalMessage(props: GlobalMessageProps) { + role={message.level === 'SUCCESS' ? 'status' : 'alert'} + > {cutLongWords(message.text)} super(props); this.state = { - messages: [] + messages: [], }; } @@ -65,7 +65,7 @@ export default class GlobalMessagesContainer extends React.Component<{}, State> closeMessage = (messageId: string) => { if (this.mounted) { this.setState(({ messages }) => { - return { messages: messages.filter(m => m.id !== messageId) }; + return { messages: messages.filter((m) => m.id !== messageId) }; }); } }; @@ -79,7 +79,7 @@ export default class GlobalMessagesContainer extends React.Component<{}, State> return ( - {messages.map(message => ( + {messages.map((message) => ( ( - {keys.map(k => + {keys.map((k) => k === '+' ? ( {k} @@ -143,7 +143,7 @@ export default function KeyboardShortcutsModal() { } if (event.key === KeyboardKeys.KeyQuestionMark) { - setDisplay(d => !d); + setDisplay((d) => !d); } }; @@ -169,7 +169,8 @@ export default function KeyboardShortcutsModal() { onClick={() => { setDisplay(false); return true; - }}> + }} + > {translate('keyboard_shortcuts.disable_link')} diff --git a/server/sonar-web/src/main/js/app/components/MigrationContainer.tsx b/server/sonar-web/src/main/js/app/components/MigrationContainer.tsx index d846dd577bc..49b0619a886 100644 --- a/server/sonar-web/src/main/js/app/components/MigrationContainer.tsx +++ b/server/sonar-web/src/main/js/app/components/MigrationContainer.tsx @@ -27,8 +27,8 @@ export function MigrationContainer() { const to = { pathname: '/maintenance', search: new URLSearchParams({ - return_to: returnTo - }).toString() + return_to: returnTo, + }).toString(), }; return ; diff --git a/server/sonar-web/src/main/js/app/components/NonAdminPagesContainer.tsx b/server/sonar-web/src/main/js/app/components/NonAdminPagesContainer.tsx index 0b1a924ab5f..72a3de1c3e5 100644 --- a/server/sonar-web/src/main/js/app/components/NonAdminPagesContainer.tsx +++ b/server/sonar-web/src/main/js/app/components/NonAdminPagesContainer.tsx @@ -38,7 +38,8 @@ export default function NonAdminPagesContainer() { + variant="error" + >

{translate('application.cannot_access_all_child_projects1')}


{translate('application.cannot_access_all_child_projects2')}

diff --git a/server/sonar-web/src/main/js/app/components/PageTracker.tsx b/server/sonar-web/src/main/js/app/components/PageTracker.tsx index 7ae1adbf0a9..5a4103840f6 100644 --- a/server/sonar-web/src/main/js/app/components/PageTracker.tsx +++ b/server/sonar-web/src/main/js/app/components/PageTracker.tsx @@ -65,7 +65,8 @@ export class PageTracker extends React.Component { + onChangeClientState={appState.webAnalyticsJsPath ? this.trackPage : undefined} + > {this.props.children} ); diff --git a/server/sonar-web/src/main/js/app/components/PluginRiskConsent.tsx b/server/sonar-web/src/main/js/app/components/PluginRiskConsent.tsx index 1de2edd1a28..1bef4d1b85e 100644 --- a/server/sonar-web/src/main/js/app/components/PluginRiskConsent.tsx +++ b/server/sonar-web/src/main/js/app/components/PluginRiskConsent.tsx @@ -55,7 +55,7 @@ export function PluginRiskConsent(props: PluginRiskConsentProps) { try { await setSimpleSettingValue({ key: SettingsKey.PluginRiskConsent, - value: RiskConsent.Accepted + value: RiskConsent.Accepted, }); // force a refresh for the backend diff --git a/server/sonar-web/src/main/js/app/components/RecentHistory.ts b/server/sonar-web/src/main/js/app/components/RecentHistory.ts index 80d3b244ca9..99ede7be7ad 100644 --- a/server/sonar-web/src/main/js/app/components/RecentHistory.ts +++ b/server/sonar-web/src/main/js/app/components/RecentHistory.ts @@ -54,7 +54,7 @@ export default class RecentHistory { static add(componentKey: string, componentName: string, icon: string) { const sonarHistory = RecentHistory.get(); const newEntry = { key: componentKey, name: componentName, icon }; - let newHistory = sonarHistory.filter(entry => entry.key !== newEntry.key); + let newHistory = sonarHistory.filter((entry) => entry.key !== newEntry.key); newHistory.unshift(newEntry); newHistory = newHistory.slice(0, HISTORY_LIMIT); RecentHistory.set(newHistory); @@ -62,7 +62,7 @@ export default class RecentHistory { static remove(componentKey: string) { const history = RecentHistory.get(); - const newHistory = history.filter(entry => entry.key !== componentKey); + const newHistory = history.filter((entry) => entry.key !== componentKey); RecentHistory.set(newHistory); } } diff --git a/server/sonar-web/src/main/js/app/components/SonarLintConnection.tsx b/server/sonar-web/src/main/js/app/components/SonarLintConnection.tsx index 1a997e66bc7..bc0e19f2d97 100644 --- a/server/sonar-web/src/main/js/app/components/SonarLintConnection.tsx +++ b/server/sonar-web/src/main/js/app/components/SonarLintConnection.tsx @@ -31,7 +31,7 @@ import { portIsValid, sendUserToken } from '../../helpers/sonarlint'; import { computeTokenExpirationDate, getAvailableExpirationOptions, - getNextTokenName + getNextTokenName, } from '../../helpers/tokens'; import { NewUserToken, TokenExpiration } from '../../types/token'; import { LoggedInUser } from '../../types/users'; @@ -41,7 +41,7 @@ enum Status { request, tokenError, tokenCreated, - tokenSent + tokenSent, } interface Props { @@ -152,7 +152,7 @@ export function SonarLintConnection({ currentUser }: Props) { {translate('sonarlint-connection.token-error.description2.link')} - ) + ), }} />

diff --git a/server/sonar-web/src/main/js/app/components/StartupModal.tsx b/server/sonar-web/src/main/js/app/components/StartupModal.tsx index f52d1cbce65..6276e8f020c 100644 --- a/server/sonar-web/src/main/js/app/components/StartupModal.tsx +++ b/server/sonar-web/src/main/js/app/components/StartupModal.tsx @@ -69,7 +69,7 @@ export class StartupModal extends React.PureComponent if (!lastPrompt || differenceInDays(new Date(), parseDate(lastPrompt)) >= 1) { showLicense() - .then(license => { + .then((license) => { if (!license || !license.isValidEdition) { save(LICENSE_PROMPT, toShortNotSoISOString(new Date()), currentUser.login); this.setState({ open: true }); diff --git a/server/sonar-web/src/main/js/app/components/SystemAnnouncement.tsx b/server/sonar-web/src/main/js/app/components/SystemAnnouncement.tsx index b889cd478dc..aaf0389f4b7 100644 --- a/server/sonar-web/src/main/js/app/components/SystemAnnouncement.tsx +++ b/server/sonar-web/src/main/js/app/components/SystemAnnouncement.tsx @@ -25,7 +25,7 @@ import { Alert } from '../../components/ui/Alert'; import { Feature } from '../../types/features'; import { GlobalSettingKeys, SettingValue } from '../../types/settings'; import withAvailableFeatures, { - WithAvailableFeaturesProps + WithAvailableFeaturesProps, } from './available-features/withAvailableFeatures'; import './SystemAnnouncement.css'; @@ -54,7 +54,7 @@ export class SystemAnnouncement extends React.PureComponent { const values: SettingValue[] = await getValues({ - keys: [GlobalSettingKeys.DisplayAnnouncementMessage, GlobalSettingKeys.AnnouncementMessage] + keys: [GlobalSettingKeys.DisplayAnnouncementMessage, GlobalSettingKeys.AnnouncementMessage], }); const settings = keyBy(values, 'key'); @@ -63,7 +63,7 @@ export class SystemAnnouncement extends React.PureComponent + variant="warning" + > {message}
diff --git a/server/sonar-web/src/main/js/app/components/__tests__/AdminContainer-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/AdminContainer-test.tsx index fc5b9bcd6ab..d6a1c4b275a 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/AdminContainer-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/AdminContainer-test.tsx @@ -24,11 +24,11 @@ import { AdminContainer, AdminContainerProps } from '../AdminContainer'; jest.mock('../../../api/plugins', () => ({ getSettingsNavigation: jest.fn().mockResolvedValue({}), - getPendingPlugins: jest.fn().mockResolvedValue({}) + getPendingPlugins: jest.fn().mockResolvedValue({}), })); jest.mock('../../../api/system', () => ({ - getSystemStatus: jest.fn().mockResolvedValue({}) + getSystemStatus: jest.fn().mockResolvedValue({}), })); it('should render correctly', () => { @@ -40,9 +40,10 @@ function shallowRender(props: Partial = {}) { return shallow( + {...props} + >
); diff --git a/server/sonar-web/src/main/js/app/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/App-test.tsx index 842155e2977..3550ef1f068 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/App-test.tsx @@ -29,9 +29,9 @@ it('should render correctly', () => { appState: mockAppState({ settings: { 'sonar.lf.enableGravatar': 'true', - 'sonar.lf.gravatarServerUrl': 'http://example.com' - } - }) + 'sonar.lf.gravatarServerUrl': 'http://example.com', + }, + }), }) ).toMatchSnapshot('with gravatar'); }); @@ -47,8 +47,8 @@ function shallowRender(props: Partial = {}) { appState={mockAppState({ settings: { 'sonar.lf.enableGravatar': 'false', - 'sonar.lf.gravatarServerUrl': '' - } + 'sonar.lf.gravatarServerUrl': '', + }, })} {...props} /> diff --git a/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx index 8f637b05dc4..4603bd576af 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/ComponentContainer-test.tsx @@ -51,35 +51,35 @@ jest.mock('../../../api/branches', () => { .fn() .mockResolvedValue([ mockPullRequest({ key: 'pr-89', status: { qualityGateStatus: 'ERROR' } }), - mockPullRequest({ key: 'pr-90', title: 'PR Feature 2' }) - ]) + mockPullRequest({ key: 'pr-90', title: 'PR Feature 2' }), + ]), }; }); jest.mock('../../../api/ce', () => ({ getAnalysisStatus: jest.fn().mockResolvedValue({ component: { warnings: [] } }), - getTasksForComponent: jest.fn().mockResolvedValue({ queue: [] }) + getTasksForComponent: jest.fn().mockResolvedValue({ queue: [] }), })); jest.mock('../../../api/components', () => ({ - getComponentData: jest.fn().mockResolvedValue({ component: { analysisDate: '2018-07-30' } }) + getComponentData: jest.fn().mockResolvedValue({ component: { analysisDate: '2018-07-30' } }), })); jest.mock('../../../api/navigation', () => ({ getComponentNavigation: jest.fn().mockResolvedValue({ breadcrumbs: [{ key: 'portfolioKey', name: 'portfolio', qualifier: 'VW' }], - key: 'portfolioKey' - }) + key: 'portfolioKey', + }), })); jest.mock('../../../api/alm-settings', () => ({ getProjectAlmBinding: jest.fn().mockResolvedValue(undefined), - validateProjectAlmBinding: jest.fn().mockResolvedValue(undefined) + validateProjectAlmBinding: jest.fn().mockResolvedValue(undefined), })); jest.mock('../../utils/handleRequiredAuthorization', () => ({ __esModule: true, - default: jest.fn() + default: jest.fn(), })); const Inner = () =>
; @@ -99,7 +99,7 @@ it('changes component', () => { wrapper.setState({ branchLikes: [mockMainBranch()], component: { qualifier: 'TRK', visibility: 'public' } as Component, - loading: false + loading: false, }); wrapper.instance().handleComponentChange({ visibility: 'private' }); @@ -108,7 +108,7 @@ it('changes component', () => { it('loads the project binding, if any', async () => { const component = mockComponent({ - breadcrumbs: [{ key: 'foo', name: 'foo', qualifier: ComponentQualifier.Project }] + breadcrumbs: [{ key: 'foo', name: 'foo', qualifier: ComponentQualifier.Project }], }); (getComponentNavigation as jest.Mock).mockResolvedValueOnce({}); (getComponentData as jest.Mock) @@ -116,7 +116,7 @@ it('loads the project binding, if any', async () => { .mockResolvedValueOnce({ component }); (getProjectAlmBinding as jest.Mock).mockResolvedValueOnce(undefined).mockResolvedValueOnce({ alm: AlmKeys.GitHub, - key: 'foo' + key: 'foo', }); const wrapper = shallowRender(); @@ -137,7 +137,7 @@ it("doesn't load branches portfolio", async () => { expect(getComponentData).toHaveBeenCalledWith({ component: 'portfolioKey', branch: undefined }); expect(getComponentNavigation).toHaveBeenCalledWith({ component: 'portfolioKey', - branch: undefined + branch: undefined, }); }); @@ -146,14 +146,14 @@ it('updates branches on change', async () => { const wrapper = shallowRender({ hasFeature: () => true, location: mockLocation({ query: { id: 'portfolioKey' } }), - updateBranchStatus + updateBranchStatus, }); wrapper.setState({ branchLikes: [mockMainBranch()], component: mockComponent({ - breadcrumbs: [{ key: 'projectKey', name: 'project', qualifier: 'TRK' }] + breadcrumbs: [{ key: 'projectKey', name: 'project', qualifier: 'TRK' }], }), - loading: false + loading: false, }); wrapper.instance().handleBranchesChange(); expect(getBranches).toHaveBeenCalledWith('projectKey'); @@ -164,7 +164,7 @@ it('updates branches on change', async () => { it('fetches status', async () => { (getComponentData as jest.Mock).mockResolvedValueOnce({ - component: {} + component: {}, }); const wrapper = shallowRender(); @@ -200,17 +200,17 @@ it('filters correctly the pending tasks for a main branch', () => { expect(component.getCurrentTask(currentTask, pullRequest)).toMatchObject(currentTask); expect(component.getPendingTasksForBranchLike(pendingTasks, mainBranch)).toMatchObject([{}]); expect(component.getPendingTasksForBranchLike(pendingTasks, pullRequest)).toMatchObject([ - currentTask + currentTask, ]); }); it('reload component after task progress finished', async () => { (getTasksForComponent as jest.Mock) .mockResolvedValueOnce({ - queue: [{ id: 'foo', status: TaskStatuses.InProgress, type: TaskTypes.ViewRefresh }] + queue: [{ id: 'foo', status: TaskStatuses.InProgress, type: TaskTypes.ViewRefresh }], }) .mockResolvedValueOnce({ - queue: [] + queue: [], }); const wrapper = shallowRender(); @@ -245,13 +245,13 @@ it('reload component after task progress finished', async () => { it('reloads component after task progress finished, and moves straight to current', async () => { (getComponentData as jest.Mock).mockResolvedValueOnce({ - component: { key: 'bar' } + component: { key: 'bar' }, }); (getTasksForComponent as jest.Mock) .mockResolvedValueOnce({ queue: [] }) .mockResolvedValueOnce({ queue: [], - current: { id: 'foo', status: TaskStatuses.Success, type: TaskTypes.AppRefresh } + current: { id: 'foo', status: TaskStatuses.Success, type: TaskTypes.AppRefresh }, }); const wrapper = shallowRender(); @@ -279,11 +279,11 @@ it('reloads component after task progress finished, and moves straight to curren it('only fully loads a non-empty component once', async () => { (getComponentData as jest.Mock).mockResolvedValueOnce({ - component: { key: 'bar', analysisDate: '2019-01-01' } + component: { key: 'bar', analysisDate: '2019-01-01' }, }); (getTasksForComponent as jest.Mock).mockResolvedValueOnce({ queue: [], - current: { id: 'foo', status: TaskStatuses.Success, type: TaskTypes.Report } + current: { id: 'foo', status: TaskStatuses.Success, type: TaskTypes.Report }, }); const wrapper = shallowRender(); @@ -294,15 +294,15 @@ it('only fully loads a non-empty component once', async () => { it('only fully reloads a non-empty component if there was previously some task in progress', async () => { (getComponentData as jest.Mock).mockResolvedValueOnce({ - component: { key: 'bar', analysisDate: '2019-01-01' } + component: { key: 'bar', analysisDate: '2019-01-01' }, }); (getTasksForComponent as jest.Mock) .mockResolvedValueOnce({ - queue: [{ id: 'foo', status: TaskStatuses.InProgress, type: TaskTypes.AppRefresh }] + queue: [{ id: 'foo', status: TaskStatuses.InProgress, type: TaskTypes.AppRefresh }], }) .mockResolvedValueOnce({ queue: [], - current: { id: 'foo', status: TaskStatuses.Success, type: TaskTypes.AppRefresh } + current: { id: 'foo', status: TaskStatuses.Success, type: TaskTypes.AppRefresh }, }); const wrapper = shallowRender(); @@ -347,14 +347,14 @@ it('should redirect if the user has no access', async () => { it('should redirect if the component is a portfolio', async () => { const componentKey = 'comp-key'; (getComponentData as jest.Mock).mockResolvedValueOnce({ - component: { key: componentKey, breadcrumbs: [{ qualifier: ComponentQualifier.Portfolio }] } + component: { key: componentKey, breadcrumbs: [{ qualifier: ComponentQualifier.Portfolio }] }, }); const replace = jest.fn(); const wrapper = shallowRender({ location: mockLocation({ pathname: '/dashboard' }), - router: mockRouter({ replace }) + router: mockRouter({ replace }), }); await waitAndUpdate(wrapper); expect(replace).toHaveBeenCalledWith({ pathname: '/portfolio', search: `?id=${componentKey}` }); @@ -362,7 +362,7 @@ it('should redirect if the component is a portfolio', async () => { it('should display display the unavailable page if the component needs issue sync', async () => { (getComponentData as jest.Mock).mockResolvedValueOnce({ - component: { key: 'test', qualifier: ComponentQualifier.Project, needIssueSync: true } + component: { key: 'test', qualifier: ComponentQualifier.Project, needIssueSync: true }, }); const wrapper = shallowRender(); @@ -375,8 +375,8 @@ it('should display display the unavailable page if the component needs issue syn it('should correctly reload last task warnings if anything got dismissed', async () => { (getComponentData as jest.Mock).mockResolvedValueOnce({ component: mockComponent({ - breadcrumbs: [{ key: 'foo', name: 'Foo', qualifier: ComponentQualifier.Project }] - }) + breadcrumbs: [{ key: 'foo', name: 'Foo', qualifier: ComponentQualifier.Project }], + }), }); (getComponentNavigation as jest.Mock).mockResolvedValueOnce({}); @@ -390,14 +390,14 @@ it('should correctly reload last task warnings if anything got dismissed', async describe('should correctly validate the project binding depending on the context', () => { const COMPONENT = mockComponent({ - breadcrumbs: [{ key: 'foo', name: 'Foo', qualifier: ComponentQualifier.Project }] + breadcrumbs: [{ key: 'foo', name: 'Foo', qualifier: ComponentQualifier.Project }], }); const PROJECT_BINDING_ERRORS = mockProjectAlmBindingConfigurationErrors(); it.each([ ["has an analysis; won't perform any check", { ...COMPONENT, analysisDate: '2020-01' }], ['has a project binding; check is OK', COMPONENT, undefined, 1], - ['has a project binding; check is not OK', COMPONENT, PROJECT_BINDING_ERRORS, 1] + ['has a project binding; check is not OK', COMPONENT, PROJECT_BINDING_ERRORS, 1], ])('%s', async (_, component, projectBindingErrors = undefined, n = 0) => { (getComponentNavigation as jest.Mock).mockResolvedValueOnce({}); (getComponentData as jest.Mock).mockResolvedValueOnce({ component }); @@ -417,12 +417,12 @@ describe('should correctly validate the project binding depending on the context it.each([ [ComponentQualifier.Application], [ComponentQualifier.Portfolio], - [ComponentQualifier.SubPortfolio] + [ComponentQualifier.SubPortfolio], ])( 'should not care about PR decoration settings for %s', async (componentQualifier: ComponentQualifier) => { const component = mockComponent({ - breadcrumbs: [{ key: 'foo', name: 'Foo', qualifier: componentQualifier }] + breadcrumbs: [{ key: 'foo', name: 'Foo', qualifier: componentQualifier }], }); (getComponentNavigation as jest.Mock).mockResolvedValueOnce({}); (getComponentData as jest.Mock).mockResolvedValueOnce({ component }); @@ -442,7 +442,8 @@ function shallowRender(props: Partial = {}) { location={mockLocation({ query: { id: 'foo' } })} updateBranchStatus={jest.fn()} router={mockRouter()} - {...props}> + {...props} + > ); diff --git a/server/sonar-web/src/main/js/app/components/__tests__/GlobalFooter-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/GlobalFooter-test.tsx index afacff7897a..e1b0da75c07 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/GlobalFooter-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/GlobalFooter-test.tsx @@ -31,7 +31,7 @@ it('should not render the only logged in information', () => { expect( getWrapper({ hideLoggedInInfo: true, - appState: mockAppState({ version: '6.4-SNAPSHOT' }) + appState: mockAppState({ version: '6.4-SNAPSHOT' }), }) ).toMatchSnapshot(); }); @@ -39,7 +39,7 @@ it('should not render the only logged in information', () => { it('should show the db warning message', () => { expect( getWrapper({ - appState: mockAppState({ productionDatabase: false, edition: EditionKey.community }) + appState: mockAppState({ productionDatabase: false, edition: EditionKey.community }), }).find('Alert') ).toMatchSnapshot(); }); @@ -47,7 +47,7 @@ it('should show the db warning message', () => { it('should display the sq version', () => { expect( getWrapper({ - appState: mockAppState({ edition: EditionKey.enterprise, version: '6.4-SNAPSHOT' }) + appState: mockAppState({ edition: EditionKey.enterprise, version: '6.4-SNAPSHOT' }), }) ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/app/components/__tests__/KeyboardShortcutsModal-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/KeyboardShortcutsModal-test.tsx index edeee98bd8f..1dcb5bc0961 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/KeyboardShortcutsModal-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/KeyboardShortcutsModal-test.tsx @@ -27,12 +27,12 @@ jest.mock('react', () => { let close: () => void; return { ...jest.requireActual('react'), - useEffect: jest.fn().mockImplementation(f => { + useEffect: jest.fn().mockImplementation((f) => { close = f(); }), clean: () => { close(); - } + }, }; }); @@ -66,13 +66,13 @@ it('should ignore other keydownes', () => { expect(wrapper.type()).toBeNull(); }); -it.each([['input'], ['select'], ['textarea']])('should ignore events on a %s', type => { +it.each([['input'], ['select'], ['textarea']])('should ignore events on a %s', (type) => { const wrapper = shallowRender(); const fakeEvent = new KeyboardEvent('keydown', { key: '!' }); Object.defineProperty(fakeEvent, 'target', { - value: document.createElement(type) + value: document.createElement(type), }); document.dispatchEvent(fakeEvent); diff --git a/server/sonar-web/src/main/js/app/components/__tests__/Landing-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/Landing-test.tsx index 13f854d9bfa..97a188f7a83 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/Landing-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/Landing-test.tsx @@ -29,8 +29,8 @@ it.each([ [mockLoggedInUser(), '/projects'], [ mockLoggedInUser({ homepage: { type: 'ISSUES' } }), - expect.objectContaining({ pathname: '/issues' }) - ] + expect.objectContaining({ pathname: '/issues' }), + ], ])('should render correctly', (currentUser: CurrentUser, expected: string) => { const wrapper = shallowRender({ currentUser }); diff --git a/server/sonar-web/src/main/js/app/components/__tests__/MigrationContainer-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/MigrationContainer-test.tsx index b32306cc8c6..15d0f3e6767 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/MigrationContainer-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/MigrationContainer-test.tsx @@ -24,7 +24,7 @@ import { getSystemStatus } from '../../../helpers/system'; import MigrationContainer from '../MigrationContainer'; jest.mock('../../../helpers/system', () => ({ - getSystemStatus: jest.fn() + getSystemStatus: jest.fn(), })); const originalLocation = window.location; @@ -33,18 +33,18 @@ beforeAll(() => { const location = { pathname: '/projects', search: '?query=toto', - hash: '#hash' + hash: '#hash', }; Object.defineProperty(window, 'location', { writable: true, - value: location + value: location, }); }); afterAll(() => { Object.defineProperty(window, 'location', { writable: true, - value: originalLocation + value: originalLocation, }); }); diff --git a/server/sonar-web/src/main/js/app/components/__tests__/PageTracker-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/PageTracker-test.tsx index e94c228a5e0..12c88b53429 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/PageTracker-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/PageTracker-test.tsx @@ -25,11 +25,11 @@ import { mockAppState, mockLocation } from '../../../helpers/testMocks'; import { PageTracker } from '../PageTracker'; jest.mock('../../../helpers/extensions', () => ({ - installScript: jest.fn().mockResolvedValue({}) + installScript: jest.fn().mockResolvedValue({}), })); jest.mock('../../../helpers/extensionsHandler', () => ({ - getWebAnalyticsPageHandlerFromCache: jest.fn().mockReturnValue(undefined) + getWebAnalyticsPageHandlerFromCache: jest.fn().mockReturnValue(undefined), })); beforeAll(() => { diff --git a/server/sonar-web/src/main/js/app/components/__tests__/PluginRiskConsent-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/PluginRiskConsent-test.tsx index 49decfbdbbb..5f222b0cf09 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/PluginRiskConsent-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/PluginRiskConsent-test.tsx @@ -25,13 +25,13 @@ import { mockLoggedInUser, mockRouter } from '../../../helpers/testMocks'; import { PluginRiskConsent, PluginRiskConsentProps } from '../PluginRiskConsent'; jest.mock('../../../api/settings', () => ({ - setSimpleSettingValue: jest.fn().mockResolvedValue({}) + setSimpleSettingValue: jest.fn().mockResolvedValue({}), })); jest.mock('react', () => { return { ...jest.requireActual('react'), - useEffect: jest.fn().mockImplementation(f => f()) + useEffect: jest.fn().mockImplementation((f) => f()), }; }); @@ -47,7 +47,7 @@ it('should redirect non-admin users', () => { const replace = jest.fn(); const wrapper = shallowRender({ currentUser: mockLoggedInUser(), - router: mockRouter({ replace }) + router: mockRouter({ replace }), }); expect(wrapper.type()).toBeNull(); expect(replace).toHaveBeenCalled(); @@ -56,10 +56,7 @@ it('should redirect non-admin users', () => { it('should handle acknowledgement and redirect', async () => { const wrapper = shallowRender(); - wrapper - .find(Button) - .first() - .simulate('click'); + wrapper.find(Button).first().simulate('click'); await new Promise(setImmediate); diff --git a/server/sonar-web/src/main/js/app/components/__tests__/RecentHistory-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/RecentHistory-test.tsx index 6afd157eab0..a7952ec55c0 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/RecentHistory-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/RecentHistory-test.tsx @@ -23,7 +23,7 @@ import RecentHistory, { History } from '../RecentHistory'; jest.mock('../../../helpers/storage', () => ({ get: jest.fn(), remove: jest.fn(), - save: jest.fn() + save: jest.fn(), })); beforeEach(() => { diff --git a/server/sonar-web/src/main/js/app/components/__tests__/ResetPassword-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/ResetPassword-test.tsx index fd6b3996442..208ffb0e3b7 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/ResetPassword-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/ResetPassword-test.tsx @@ -24,7 +24,7 @@ import { mockLoggedInUser } from '../../../helpers/testMocks'; import { ResetPassword, ResetPasswordProps } from '../ResetPassword'; jest.mock('../../../helpers/system', () => ({ - getBaseUrl: jest.fn().mockReturnValue('/context') + getBaseUrl: jest.fn().mockReturnValue('/context'), })); const originalLocation = window.location; @@ -32,18 +32,18 @@ const originalLocation = window.location; beforeAll(() => { const location = { ...window.location, - href: null + href: null, }; Object.defineProperty(window, 'location', { writable: true, - value: location + value: location, }); }); afterAll(() => { Object.defineProperty(window, 'location', { writable: true, - value: originalLocation + value: originalLocation, }); }); diff --git a/server/sonar-web/src/main/js/app/components/__tests__/SonarLintConnection-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/SonarLintConnection-test.tsx index 4c1daef425d..98da2e15c5d 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/SonarLintConnection-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/SonarLintConnection-test.tsx @@ -32,7 +32,7 @@ jest.mock('../../../api/user-tokens'); jest.mock('../../../helpers/handleRequiredAuthentication', () => ({ __esModule: true, - default: jest.fn() + default: jest.fn(), })); jest.mock('../../../helpers/sonarlint', () => { @@ -61,9 +61,9 @@ jest.mock('../../../api/settings', () => { getAllValues: jest.fn().mockResolvedValue([ { key: SettingsKey.TokenMaxAllowedLifetime, - value: 'No expiration' - } - ]) + value: 'No expiration', + }, + ]), }; }); @@ -141,7 +141,7 @@ function renderSonarLintConnection(overrides: { currentUser?: CurrentUser; port? const { currentUser, port } = { currentUser: mockLoggedInUser(), port: '64120', - ...overrides + ...overrides, }; const searchParams = new URLSearchParams(); @@ -152,6 +152,6 @@ function renderSonarLintConnection(overrides: { currentUser?: CurrentUser; port? renderApp('sonarlint/auth', , { currentUser, - navigateTo: `sonarlint/auth?${searchParams.toString()}` + navigateTo: `sonarlint/auth?${searchParams.toString()}`, }); } diff --git a/server/sonar-web/src/main/js/app/components/__tests__/StartupModal-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/StartupModal-test.tsx index 79daabad3ac..4073e35ffec 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/StartupModal-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/StartupModal-test.tsx @@ -31,21 +31,21 @@ import { LoggedInUser } from '../../../types/users'; import { StartupModal } from '../StartupModal'; jest.mock('../../../api/editions', () => ({ - showLicense: jest.fn().mockResolvedValue(undefined) + showLicense: jest.fn().mockResolvedValue(undefined), })); jest.mock('../../../helpers/storage', () => ({ get: jest.fn(), - save: jest.fn() + save: jest.fn(), })); jest.mock('../../../helpers/l10n', () => ({ - hasMessage: jest.fn().mockReturnValue(true) + hasMessage: jest.fn().mockReturnValue(true), })); jest.mock('../../../helpers/dates', () => ({ parseDate: jest.fn().mockReturnValue('parsed-date'), - toShortNotSoISOString: jest.fn().mockReturnValue('short-not-iso-date') + toShortNotSoISOString: jest.fn().mockReturnValue('short-not-iso-date'), })); jest.mock('date-fns', () => ({ differenceInDays: jest.fn().mockReturnValue(1) })); @@ -56,7 +56,7 @@ const LOGGED_IN_USER: LoggedInUser = { login: 'luke', name: 'Skywalker', scmAccounts: [], - dismissedNotices: {} + dismissedNotices: {}, }; beforeEach(() => { @@ -90,7 +90,7 @@ it('should render only the children', async () => { getWrapper({ appState: mockAppState({ canAdmin: false }), currentUser: { ...LOGGED_IN_USER }, - location: mockLocation({ pathname: '/create-organization' }) + location: mockLocation({ pathname: '/create-organization' }), }) ); }); @@ -124,7 +124,8 @@ function getWrapper(props: Partial = {}) { currentUser={LOGGED_IN_USER} location={mockLocation({ pathname: 'foo/bar' })} router={mockRouter()} - {...props}> + {...props} + >
); diff --git a/server/sonar-web/src/main/js/app/components/__tests__/SystemAnnouncement-test.tsx b/server/sonar-web/src/main/js/app/components/__tests__/SystemAnnouncement-test.tsx index 3dda2518c26..b7ee8387d89 100644 --- a/server/sonar-web/src/main/js/app/components/__tests__/SystemAnnouncement-test.tsx +++ b/server/sonar-web/src/main/js/app/components/__tests__/SystemAnnouncement-test.tsx @@ -26,7 +26,7 @@ import { AvailableFeaturesContext } from '../available-features/AvailableFeature import SystemAnnouncement from '../SystemAnnouncement'; jest.mock('../../../api/settings', () => ({ - getValues: jest.fn() + getValues: jest.fn(), })); jest.mock('lodash', () => { @@ -41,41 +41,41 @@ it('should display system announcement', async () => { { key: 'sonar.announcement.displayMessage', value: 'false', - inherited: true - } + inherited: true, + }, ]) .mockResolvedValueOnce([ { key: 'sonar.announcement.displayMessage', value: 'false', - inherited: true - } + inherited: true, + }, ]) .mockResolvedValueOnce([ { key: 'sonar.announcement.displayMessage', - value: 'true' - } + value: 'true', + }, ]) .mockResolvedValueOnce([ { key: 'sonar.announcement.displayMessage', - value: 'true' + value: 'true', }, { key: 'sonar.announcement.message', - value: '' - } + value: '', + }, ]) .mockResolvedValueOnce([ { key: 'sonar.announcement.displayMessage', - value: 'true' + value: 'true', }, { key: 'sonar.announcement.message', - value: 'Foo' - } + value: 'Foo', + }, ]); renderSystemAnnouncement(); diff --git a/server/sonar-web/src/main/js/app/components/app-state/AppStateContext.tsx b/server/sonar-web/src/main/js/app/components/app-state/AppStateContext.tsx index d327bfb3aa1..de1d2bf3416 100644 --- a/server/sonar-web/src/main/js/app/components/app-state/AppStateContext.tsx +++ b/server/sonar-web/src/main/js/app/components/app-state/AppStateContext.tsx @@ -28,6 +28,6 @@ export const DEFAULT_APP_STATE = { productionDatabase: true, qualifiers: [], settings: {}, - version: '' + version: '', }; export const AppStateContext = React.createContext(DEFAULT_APP_STATE); diff --git a/server/sonar-web/src/main/js/app/components/app-state/AppStateContextProvider.tsx b/server/sonar-web/src/main/js/app/components/app-state/AppStateContextProvider.tsx index 43c937b651f..686341e0dd5 100644 --- a/server/sonar-web/src/main/js/app/components/app-state/AppStateContextProvider.tsx +++ b/server/sonar-web/src/main/js/app/components/app-state/AppStateContextProvider.tsx @@ -29,7 +29,7 @@ export interface AppStateContextProviderProps { export default function AppStateContextProvider({ appState, - children + children, }: React.PropsWithChildren) { return {children}; } diff --git a/server/sonar-web/src/main/js/app/components/app-state/__tests__/AppStateContextProvider-test.tsx b/server/sonar-web/src/main/js/app/components/app-state/__tests__/AppStateContextProvider-test.tsx index 57e3f0a1e0a..d9430d10537 100644 --- a/server/sonar-web/src/main/js/app/components/app-state/__tests__/AppStateContextProvider-test.tsx +++ b/server/sonar-web/src/main/js/app/components/app-state/__tests__/AppStateContextProvider-test.tsx @@ -26,7 +26,7 @@ import AppStateContextProvider, { AppStateContextProviderProps } from '../AppSta it('should set value correctly', async () => { const appState = mockAppState({ settings: { 'sonar.lf.logoUrl': 'whatevs/' } }); const wrapper = render({ - appState + appState, }); await waitAndUpdate(wrapper); diff --git a/server/sonar-web/src/main/js/app/components/app-state/__tests__/withAppStateContext-test.tsx b/server/sonar-web/src/main/js/app/components/app-state/__tests__/withAppStateContext-test.tsx index 78e009131c2..788502e4c8f 100644 --- a/server/sonar-web/src/main/js/app/components/app-state/__tests__/withAppStateContext-test.tsx +++ b/server/sonar-web/src/main/js/app/components/app-state/__tests__/withAppStateContext-test.tsx @@ -30,8 +30,8 @@ jest.mock('../AppStateContext', () => { AppStateContext: { Consumer: ({ children }: { children: (props: {}) => React.ReactNode }) => { return children(appState); - } - } + }, + }, }; }); diff --git a/server/sonar-web/src/main/js/app/components/app-state/withAppStateContext.tsx b/server/sonar-web/src/main/js/app/components/app-state/withAppStateContext.tsx index fa432377d1e..e03a54c9556 100644 --- a/server/sonar-web/src/main/js/app/components/app-state/withAppStateContext.tsx +++ b/server/sonar-web/src/main/js/app/components/app-state/withAppStateContext.tsx @@ -38,7 +38,7 @@ export default function withAppStateContext

( render() { return ( - {appState => } + {(appState) => } ); } diff --git a/server/sonar-web/src/main/js/app/components/available-features/__tests__/withAvailableFeatures-test.tsx b/server/sonar-web/src/main/js/app/components/available-features/__tests__/withAvailableFeatures-test.tsx index 071e941d1f5..473842ca1f6 100644 --- a/server/sonar-web/src/main/js/app/components/available-features/__tests__/withAvailableFeatures-test.tsx +++ b/server/sonar-web/src/main/js/app/components/available-features/__tests__/withAvailableFeatures-test.tsx @@ -27,8 +27,8 @@ jest.mock('../AvailableFeaturesContext', () => { AvailableFeaturesContext: { Consumer: ({ children }: { children: (props: {}) => React.ReactNode }) => { return children([Feature.MonoRepositoryPullRequestDecoration]); - } - } + }, + }, }; }); @@ -44,9 +44,6 @@ it('should provide a way to check if a feature is available', () => { const wrapper = shallow(); expect(wrapper.dive().type()).toBe(Wrapped); expect( - wrapper - .dive() - .props() - .hasFeature(Feature.MonoRepositoryPullRequestDecoration) + wrapper.dive().props().hasFeature(Feature.MonoRepositoryPullRequestDecoration) ).toBe(true); }); diff --git a/server/sonar-web/src/main/js/app/components/available-features/withAvailableFeatures.tsx b/server/sonar-web/src/main/js/app/components/available-features/withAvailableFeatures.tsx index ea133252b76..757175424bf 100644 --- a/server/sonar-web/src/main/js/app/components/available-features/withAvailableFeatures.tsx +++ b/server/sonar-web/src/main/js/app/components/available-features/withAvailableFeatures.tsx @@ -38,9 +38,9 @@ export default function withAvailableFeatures

( render() { return ( - {availableFeatures => ( + {(availableFeatures) => ( availableFeatures.includes(feature)} + hasFeature={(feature) => availableFeatures.includes(feature)} {...(this.props as P)} /> )} diff --git a/server/sonar-web/src/main/js/app/components/branch-status/BranchStatusContext.tsx b/server/sonar-web/src/main/js/app/components/branch-status/BranchStatusContext.tsx index 64220f8c13b..0d2a693a3e1 100644 --- a/server/sonar-web/src/main/js/app/components/branch-status/BranchStatusContext.tsx +++ b/server/sonar-web/src/main/js/app/components/branch-status/BranchStatusContext.tsx @@ -42,5 +42,5 @@ export const BranchStatusContext = React.createContext { throw Error('BranchStatusContext is not provided'); - } + }, }); diff --git a/server/sonar-web/src/main/js/app/components/branch-status/BranchStatusContextProvider.tsx b/server/sonar-web/src/main/js/app/components/branch-status/BranchStatusContextProvider.tsx index fc0e828d5a2..cdae7154fd5 100644 --- a/server/sonar-web/src/main/js/app/components/branch-status/BranchStatusContextProvider.tsx +++ b/server/sonar-web/src/main/js/app/components/branch-status/BranchStatusContextProvider.tsx @@ -34,7 +34,7 @@ interface State { export default class BranchStatusContextProvider extends React.PureComponent<{}, State> { mounted = false; state: State = { - branchStatusByComponent: {} + branchStatusByComponent: {}, }; componentDidMount() { @@ -48,7 +48,7 @@ export default class BranchStatusContextProvider extends React.PureComponent<{}, fetchBranchStatus = async (branchLike: BranchLike, projectKey: string) => { const projectStatus = await getQualityGateProjectStatus({ projectKey, - ...getBranchLikeQuery(branchLike) + ...getBranchLikeQuery(branchLike), }).catch(() => undefined); if (!this.mounted || projectStatus === undefined) { @@ -78,10 +78,10 @@ export default class BranchStatusContextProvider extends React.PureComponent<{}, [branchLikeKey]: { conditions, ignoredConditions, - status - } - } - } + status, + }, + }, + }, })); }; @@ -91,8 +91,9 @@ export default class BranchStatusContextProvider extends React.PureComponent<{}, value={{ branchStatusByComponent: this.state.branchStatusByComponent, fetchBranchStatus: this.fetchBranchStatus, - updateBranchStatus: this.updateBranchStatus - }}> + updateBranchStatus: this.updateBranchStatus, + }} + > {this.props.children} ); diff --git a/server/sonar-web/src/main/js/app/components/branch-status/__tests__/BranchStatusContextProvider-test.tsx b/server/sonar-web/src/main/js/app/components/branch-status/__tests__/BranchStatusContextProvider-test.tsx index 8dc38012f1d..0b6304626b6 100644 --- a/server/sonar-web/src/main/js/app/components/branch-status/__tests__/BranchStatusContextProvider-test.tsx +++ b/server/sonar-web/src/main/js/app/components/branch-status/__tests__/BranchStatusContextProvider-test.tsx @@ -26,7 +26,7 @@ import { QualityGateProjectStatus } from '../../../../types/quality-gates'; import BranchStatusContextProvider from '../BranchStatusContextProvider'; jest.mock('../../../../api/quality-gates', () => ({ - getQualityGateProjectStatus: jest.fn().mockResolvedValue({}) + getQualityGateProjectStatus: jest.fn().mockResolvedValue({}), })); describe('fetchBranchStatus', () => { @@ -36,7 +36,7 @@ describe('fetchBranchStatus', () => { const status: QualityGateProjectStatus = { status: 'OK', conditions: [], - ignoredConditions: false + ignoredConditions: false, }; (getQualityGateProjectStatus as jest.Mock).mockResolvedValueOnce(status); const wrapper = shallowRender(); @@ -48,7 +48,7 @@ describe('fetchBranchStatus', () => { await waitAndUpdate(wrapper); expect(wrapper.state().branchStatusByComponent).toEqual({ - [projectKey]: { [`branch-${branchName}`]: status } + [projectKey]: { [`branch-${branchName}`]: status }, }); }); diff --git a/server/sonar-web/src/main/js/app/components/componentContext/ComponentContext.ts b/server/sonar-web/src/main/js/app/components/componentContext/ComponentContext.ts index 10db938858d..84960fbe182 100644 --- a/server/sonar-web/src/main/js/app/components/componentContext/ComponentContext.ts +++ b/server/sonar-web/src/main/js/app/components/componentContext/ComponentContext.ts @@ -24,5 +24,5 @@ import { ComponentContextShape } from '../../../types/component'; export const ComponentContext = React.createContext({ branchLikes: [], onBranchesChange: noop, - onComponentChange: noop + onComponentChange: noop, }); diff --git a/server/sonar-web/src/main/js/app/components/componentContext/withComponentContext.tsx b/server/sonar-web/src/main/js/app/components/componentContext/withComponentContext.tsx index a9071e2ebb2..da1146596ef 100644 --- a/server/sonar-web/src/main/js/app/components/componentContext/withComponentContext.tsx +++ b/server/sonar-web/src/main/js/app/components/componentContext/withComponentContext.tsx @@ -33,7 +33,7 @@ export default function withComponentContext

- {componentContext => } + {(componentContext) => } ); } diff --git a/server/sonar-web/src/main/js/app/components/current-user/CurrentUserContextProvider.tsx b/server/sonar-web/src/main/js/app/components/current-user/CurrentUserContextProvider.tsx index 2ec9e3de4f7..59ea979bd0d 100644 --- a/server/sonar-web/src/main/js/app/components/current-user/CurrentUserContextProvider.tsx +++ b/server/sonar-web/src/main/js/app/components/current-user/CurrentUserContextProvider.tsx @@ -36,17 +36,17 @@ export default class CurrentUserContextProvider extends React.PureComponent { - this.setState(prevState => ({ - currentUser: { ...prevState.currentUser, homepage } + this.setState((prevState) => ({ + currentUser: { ...prevState.currentUser, homepage }, })); }; updateDismissedNotices = (key: NoticeType, value: boolean) => { - this.setState(prevState => ({ + this.setState((prevState) => ({ currentUser: { ...prevState.currentUser, - dismissedNotices: { ...prevState.currentUser.dismissedNotices, [key]: value } - } + dismissedNotices: { ...prevState.currentUser.dismissedNotices, [key]: value }, + }, })); }; @@ -56,8 +56,9 @@ export default class CurrentUserContextProvider extends React.PureComponent + updateDismissedNotices: this.updateDismissedNotices, + }} + > {this.props.children} ); diff --git a/server/sonar-web/src/main/js/app/components/extensions/CreateApplicationForm.tsx b/server/sonar-web/src/main/js/app/components/extensions/CreateApplicationForm.tsx index aec1e6a6607..01d7929b908 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/CreateApplicationForm.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/CreateApplicationForm.tsx @@ -49,7 +49,7 @@ export default class CreateApplicationForm extends React.PureComponent + size="small" + > {({ onCloseClick, onFormSubmit, submitting }) => (

@@ -156,13 +157,14 @@ export default class CreateApplicationForm extends React.PureComponent
- {[Visibility.Public, Visibility.Private].map(v => ( + {[Visibility.Public, Visibility.Private].map((v) => ( + onCheck={this.handleVisibilityChange} + > {translate('visibility', v)} ))} @@ -178,7 +180,8 @@ export default class CreateApplicationForm extends React.PureComponent + onClick={onCloseClick} + > {translate('cancel')}
diff --git a/server/sonar-web/src/main/js/app/components/extensions/Extension.tsx b/server/sonar-web/src/main/js/app/components/extensions/Extension.tsx index 5d6ce37936d..5845fffa24d 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/Extension.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/Extension.tsx @@ -84,7 +84,7 @@ export class Extension extends React.PureComponent { // See SONAR-16207 and core-extension-enterprise-server/src/main/js/portfolios/components/Header.tsx // for more information on why we're passing this as a prop to an extension. updateCurrentUserHomepage: this.props.updateCurrentUserHomepage, - ...this.props.options + ...this.props.options, }); if (result) { @@ -120,7 +120,7 @@ export class Extension extends React.PureComponent { {this.state.extensionElement ? ( this.state.extensionElement ) : ( -
(this.container = container)} /> +
(this.container = container)} /> )}
); diff --git a/server/sonar-web/src/main/js/app/components/extensions/GlobalAdminPageExtension.tsx b/server/sonar-web/src/main/js/app/components/extensions/GlobalAdminPageExtension.tsx index 388aab27464..1b71c6bc32f 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/GlobalAdminPageExtension.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/GlobalAdminPageExtension.tsx @@ -27,6 +27,6 @@ export default function GlobalAdminPageExtension() { const { pluginKey, extensionKey } = useParams(); const { adminPages } = useOutletContext(); - const extension = (adminPages || []).find(p => p.key === `${pluginKey}/${extensionKey}`); + const extension = (adminPages || []).find((p) => p.key === `${pluginKey}/${extensionKey}`); return extension ? : ; } diff --git a/server/sonar-web/src/main/js/app/components/extensions/GlobalPageExtension.tsx b/server/sonar-web/src/main/js/app/components/extensions/GlobalPageExtension.tsx index 6216cf5f55e..9c22a846101 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/GlobalPageExtension.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/GlobalPageExtension.tsx @@ -35,7 +35,7 @@ export interface GlobalPageExtensionProps { function GlobalPageExtension(props: GlobalPageExtensionProps) { const { appState: { globalPages }, - params + params, } = props; const { extensionKey, pluginKey } = useParams(); @@ -44,7 +44,7 @@ function GlobalPageExtension(props: GlobalPageExtensionProps) { ? `${params.pluginKey}/${params.extensionKey}` : `${pluginKey}/${extensionKey}`; - const extension = (globalPages || []).find(p => p.key === fullKey); + const extension = (globalPages || []).find((p) => p.key === fullKey); return extension ? : ; } diff --git a/server/sonar-web/src/main/js/app/components/extensions/ProjectAdminPageExtension.tsx b/server/sonar-web/src/main/js/app/components/extensions/ProjectAdminPageExtension.tsx index 58e16dc1093..11f2f15fe38 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/ProjectAdminPageExtension.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/ProjectAdminPageExtension.tsx @@ -30,7 +30,9 @@ export default function ProjectAdminPageExtension() { const extension = component && component.configuration && - (component.configuration.extensions || []).find(p => p.key === `${pluginKey}/${extensionKey}`); + (component.configuration.extensions || []).find( + (p) => p.key === `${pluginKey}/${extensionKey}` + ); return extension ? ( diff --git a/server/sonar-web/src/main/js/app/components/extensions/ProjectPageExtension.tsx b/server/sonar-web/src/main/js/app/components/extensions/ProjectPageExtension.tsx index de3ef4ce9ff..b96eb8cc39d 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/ProjectPageExtension.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/ProjectPageExtension.tsx @@ -43,7 +43,7 @@ export default function ProjectPageExtension({ params }: ProjectPageExtensionPro ? `${params.pluginKey}/${params.extensionKey}` : `${pluginKey}/${extensionKey}`; - const extension = component.extensions && component.extensions.find(p => p.key === fullKey); + const extension = component.extensions && component.extensions.find((p) => p.key === fullKey); return extension ? ( ) : ( diff --git a/server/sonar-web/src/main/js/app/components/extensions/__tests__/CreateApplicationForm-test.tsx b/server/sonar-web/src/main/js/app/components/extensions/__tests__/CreateApplicationForm-test.tsx index 91dd44a17ac..1de25703462 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/__tests__/CreateApplicationForm-test.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/__tests__/CreateApplicationForm-test.tsx @@ -26,7 +26,7 @@ import { ComponentQualifier, Visibility } from '../../../../types/component'; import CreateApplicationForm from '../CreateApplicationForm'; jest.mock('../../../../api/application', () => ({ - createApplication: jest.fn().mockResolvedValue({ application: { key: 'foo' } }) + createApplication: jest.fn().mockResolvedValue({ application: { key: 'foo' } }), })); beforeEach(jest.clearAllMocks); @@ -47,17 +47,14 @@ it('should correctly create application on form submit', async () => { instance.handleNameChange(mockEvent({ currentTarget: { value: 'name' } })); instance.handleVisibilityChange(Visibility.Private); - wrapper - .find(SimpleModal) - .props() - .onSubmit(); + wrapper.find(SimpleModal).props().onSubmit(); expect(createApplication).toHaveBeenCalledWith('name', 'description', 'key', Visibility.Private); await waitAndUpdate(wrapper); expect(onCreate).toHaveBeenCalledWith( expect.objectContaining({ key: 'foo', - qualifier: ComponentQualifier.Application + qualifier: ComponentQualifier.Application, }) ); diff --git a/server/sonar-web/src/main/js/app/components/extensions/__tests__/Extension-test.tsx b/server/sonar-web/src/main/js/app/components/extensions/__tests__/Extension-test.tsx index ab75057a69f..8931e4a497d 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/__tests__/Extension-test.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/__tests__/Extension-test.tsx @@ -25,17 +25,17 @@ import { mockAppState, mockCurrentUser, mockLocation, - mockRouter + mockRouter, } from '../../../../helpers/testMocks'; import { waitAndUpdate } from '../../../../helpers/testUtils'; import { Extension } from '../Extension'; jest.mock('../../../../helpers/extensions', () => ({ - getExtensionStart: jest.fn().mockResolvedValue({}) + getExtensionStart: jest.fn().mockResolvedValue({}), })); jest.mock('react-helmet-async', () => ({ - Helmet: () => null + Helmet: () => null, })); beforeEach(() => { diff --git a/server/sonar-web/src/main/js/app/components/extensions/__tests__/GlobalPageExtension-test.tsx b/server/sonar-web/src/main/js/app/components/extensions/__tests__/GlobalPageExtension-test.tsx index fe5dce024dd..df89257ad82 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/__tests__/GlobalPageExtension-test.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/__tests__/GlobalPageExtension-test.tsx @@ -28,7 +28,7 @@ jest.mock('../Extension', () => ({ __esModule: true, default(props: { extension: { key: string; name: string } }) { return

{props.extension.name}

; - } + }, })); const extensions = [{ key: 'plugin123/ext42', name: 'extension 42' }]; @@ -60,6 +60,6 @@ function renderGlobalPageExtension( ) { renderApp(`extension/:pluginKey/:extensionKey`, , { appState: mockAppState({ globalPages }), - navigateTo + navigateTo, }); } diff --git a/server/sonar-web/src/main/js/app/components/extensions/__tests__/ProjectAdminPageExtension-test.tsx b/server/sonar-web/src/main/js/app/components/extensions/__tests__/ProjectAdminPageExtension-test.tsx index 685a32e0897..b87259c00ff 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/__tests__/ProjectAdminPageExtension-test.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/__tests__/ProjectAdminPageExtension-test.tsx @@ -30,13 +30,13 @@ import { ComponentContext } from '../../componentContext/ComponentContext'; import ProjectAdminPageExtension from '../ProjectAdminPageExtension'; jest.mock('../../../../helpers/extensions', () => ({ - getExtensionStart: jest.fn().mockResolvedValue(jest.fn()) + getExtensionStart: jest.fn().mockResolvedValue(jest.fn()), })); it('should render correctly when the extension is found', () => { renderProjectAdminPageExtension( mockComponent({ - configuration: { extensions: [{ key: 'pluginId/extensionId', name: 'name' }] } + configuration: { extensions: [{ key: 'pluginId/extensionId', name: 'name' }] }, }), { pluginKey: 'pluginId', extensionKey: 'extensionId' } ); diff --git a/server/sonar-web/src/main/js/app/components/extensions/__tests__/ProjectPageExtension-test.tsx b/server/sonar-web/src/main/js/app/components/extensions/__tests__/ProjectPageExtension-test.tsx index 43120a4ccb1..9cd345c3ed5 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/__tests__/ProjectPageExtension-test.tsx +++ b/server/sonar-web/src/main/js/app/components/extensions/__tests__/ProjectPageExtension-test.tsx @@ -30,7 +30,7 @@ import { ComponentContext } from '../../componentContext/ComponentContext'; import ProjectPageExtension, { ProjectPageExtensionProps } from '../ProjectPageExtension'; jest.mock('../../../../helpers/extensions', () => ({ - getExtensionStart: jest.fn().mockResolvedValue(jest.fn()) + getExtensionStart: jest.fn().mockResolvedValue(jest.fn()), })); it('should not render when no component is passed', () => { diff --git a/server/sonar-web/src/main/js/app/components/extensions/exposeLibraries.ts b/server/sonar-web/src/main/js/app/components/extensions/exposeLibraries.ts index cfc22f9265b..a582df13f88 100644 --- a/server/sonar-web/src/main/js/app/components/extensions/exposeLibraries.ts +++ b/server/sonar-web/src/main/js/app/components/extensions/exposeLibraries.ts @@ -27,7 +27,7 @@ import { Button, EditButton, ResetButtonLink, - SubmitButton + SubmitButton, } from '../../../components/controls/buttons'; import ButtonToggle from '../../../components/controls/ButtonToggle'; import Checkbox from '../../../components/controls/Checkbox'; @@ -85,7 +85,7 @@ import { isBranch, isMainBranch, isPullRequest, - sortBranches + sortBranches, } from '../../../helpers/branch-like'; import { throwGlobalError } from '../../../helpers/error'; import { addGlobalSuccessMessage } from '../../../helpers/globalMessages'; @@ -101,7 +101,7 @@ import { post, postJSON, postJSONBody, - request + request, } from '../../../helpers/request'; import { sanitizeStringRestricted } from '../../../helpers/sanitize'; import { @@ -110,7 +110,7 @@ import { renderOwaspTop102021Category, renderOwaspTop10Category, renderSansTop25Category, - renderSonarSourceSecurityCategory + renderSonarSourceSecurityCategory, } from '../../../helpers/security-standard'; import { getCodeUrl, @@ -118,7 +118,7 @@ import { getComponentIssuesUrl, getComponentSecurityHotspotsUrl, getMeasureHistoryUrl, - getRulesUrl + getRulesUrl, } from '../../../helpers/urls'; const exposeLibraries = () => { @@ -135,7 +135,7 @@ const exposeLibraries = () => { postJSON, postJSONBody, throwGlobalError, - addGlobalSuccessMessage + addGlobalSuccessMessage, }; global.t = translate; global.tp = translateWithParameters; @@ -166,9 +166,9 @@ const exposeLibraries = () => { getComponentSecurityHotspotsUrl, getMeasureHistoryUrl, getRulesUrl, - sanitizeStringRestricted + sanitizeStringRestricted, }; - } + }, }); /** @@ -179,7 +179,7 @@ const exposeLibraries = () => { // eslint-disable-next-line no-console console.warn('SonarMeasures usages are deprecated since SonarQube 8.7'); return { ...measures }; - } + }, }); /** @@ -253,9 +253,9 @@ const exposeLibraries = () => { Suggestions, Tooltip, VulnerabilityIcon, - WarningIcon + WarningIcon, }; - } + }, }); }; diff --git a/server/sonar-web/src/main/js/app/components/indexation/IndexationNotification.tsx b/server/sonar-web/src/main/js/app/components/indexation/IndexationNotification.tsx index 28c9eae4420..df0f9de39b9 100644 --- a/server/sonar-web/src/main/js/app/components/indexation/IndexationNotification.tsx +++ b/server/sonar-web/src/main/js/app/components/indexation/IndexationNotification.tsx @@ -19,7 +19,7 @@ */ import * as React from 'react'; import withIndexationContext, { - WithIndexationContextProps + WithIndexationContextProps, } from '../../../components/hoc/withIndexationContext'; import { hasGlobalPermission } from '../../../helpers/users'; import { IndexationNotificationType } from '../../../types/indexation'; @@ -70,13 +70,13 @@ export class IndexationNotification extends React.PureComponent { this.setState({ notificationType: hasFailures ? IndexationNotificationType.InProgressWithFailure - : IndexationNotificationType.InProgress + : IndexationNotificationType.InProgress, }); } else if (hasFailures) { this.setState({ notificationType: IndexationNotificationType.CompletedWithFailure }); } else if (IndexationNotificationHelper.shouldDisplayCompletedNotification()) { this.setState({ - notificationType: IndexationNotificationType.Completed + notificationType: IndexationNotificationType.Completed, }); IndexationNotificationHelper.markCompletedNotificationAsDisplayed(); @@ -93,8 +93,8 @@ export class IndexationNotification extends React.PureComponent { const { notificationType } = this.state; const { indexationContext: { - status: { percentCompleted } - } + status: { percentCompleted }, + }, } = this.props; if (notificationType === undefined) { diff --git a/server/sonar-web/src/main/js/app/components/indexation/IndexationNotificationHelper.ts b/server/sonar-web/src/main/js/app/components/indexation/IndexationNotificationHelper.ts index d975000fa7a..92897d64e76 100644 --- a/server/sonar-web/src/main/js/app/components/indexation/IndexationNotificationHelper.ts +++ b/server/sonar-web/src/main/js/app/components/indexation/IndexationNotificationHelper.ts @@ -32,7 +32,7 @@ export default class IndexationNotificationHelper { this.stopPolling(); // eslint-disable-next-line promise/catch-or-return - this.poll(onNewStatus).then(status => { + this.poll(onNewStatus).then((status) => { if (!status.isCompleted) { this.interval = setInterval(() => this.poll(onNewStatus), POLLING_INTERVAL_MS); } diff --git a/server/sonar-web/src/main/js/app/components/indexation/IndexationNotificationRenderer.tsx b/server/sonar-web/src/main/js/app/components/indexation/IndexationNotificationRenderer.tsx index c63bf4def70..08c1a85da72 100644 --- a/server/sonar-web/src/main/js/app/components/indexation/IndexationNotificationRenderer.tsx +++ b/server/sonar-web/src/main/js/app/components/indexation/IndexationNotificationRenderer.tsx @@ -39,7 +39,7 @@ const NOTIFICATION_VARIANTS: { [key in IndexationNotificationType]: AlertProps[' [IndexationNotificationType.InProgress]: 'warning', [IndexationNotificationType.InProgressWithFailure]: 'error', [IndexationNotificationType.Completed]: 'success', - [IndexationNotificationType.CompletedWithFailure]: 'error' + [IndexationNotificationType.CompletedWithFailure]: 'error', }; export default function IndexationNotificationRenderer(props: IndexationNotificationRendererProps) { @@ -50,7 +50,8 @@ export default function IndexationNotificationRenderer(props: IndexationNotifica + variant={NOTIFICATION_VARIANTS[type]} + >
{type === IndexationNotificationType.Completed && renderCompletedBanner(props)} {type === IndexationNotificationType.CompletedWithFailure && @@ -79,7 +80,7 @@ function renderCompletedWithFailureBanner(props: IndexationNotificationRendererP values={{ link: isSystemAdmin ? renderBackgroundTasksPageLink(true, translate('indexation.completed_with_error.link')) - : translate('indexation.completed_with_error.link') + : translate('indexation.completed_with_error.link'), }} /> @@ -102,7 +103,7 @@ function renderInProgressBanner(props: IndexationNotificationRendererProps) { id="indexation.admin_link" defaultMessage={translate('indexation.admin_link')} values={{ - link: renderBackgroundTasksPageLink(false, translate('background_tasks.page')) + link: renderBackgroundTasksPageLink(false, translate('background_tasks.page')), }} /> @@ -131,7 +132,7 @@ function renderInProgressWithFailureBanner(props: IndexationNotificationRenderer true, translate('indexation.progression_with_error.link') ) - : translate('indexation.progression_with_error.link') + : translate('indexation.progression_with_error.link'), }} /> @@ -146,9 +147,10 @@ function renderBackgroundTasksPageLink(hasError: boolean, text: string) { pathname: '/admin/background_tasks', search: queryToSearch({ taskType: TaskTypes.IssueSync, - status: hasError ? TaskStatuses.Failed : undefined - }) - }}> + status: hasError ? TaskStatuses.Failed : undefined, + }), + }} + > {text} ); diff --git a/server/sonar-web/src/main/js/app/components/indexation/PageUnavailableDueToIndexation.tsx b/server/sonar-web/src/main/js/app/components/indexation/PageUnavailableDueToIndexation.tsx index 2e869a6007f..84effbfdc8f 100644 --- a/server/sonar-web/src/main/js/app/components/indexation/PageUnavailableDueToIndexation.tsx +++ b/server/sonar-web/src/main/js/app/components/indexation/PageUnavailableDueToIndexation.tsx @@ -20,7 +20,7 @@ import * as React from 'react'; import { FormattedMessage } from 'react-intl'; import withIndexationContext, { - WithIndexationContextProps + WithIndexationContextProps, } from '../../../components/hoc/withIndexationContext'; import { Alert } from '../../../components/ui/Alert'; import { translate } from '../../../helpers/l10n'; @@ -33,7 +33,7 @@ interface Props extends WithIndexationContextProps { export enum PageContext { Issues = 'issues', - Portfolios = 'portfolios' + Portfolios = 'portfolios', } export class PageUnavailableDueToIndexation extends React.PureComponent { @@ -63,7 +63,7 @@ export class PageUnavailableDueToIndexation extends React.PureComponent { defaultMessage={translate(messageKey)} values={{ componentQualifier: translate('qualifier', component?.qualifier ?? ''), - componentName: {component?.name} + componentName: {component?.name}, }} /> diff --git a/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationContextProvider-test.tsx b/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationContextProvider-test.tsx index c6c383cf158..7d60c9c0dc7 100644 --- a/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationContextProvider-test.tsx +++ b/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationContextProvider-test.tsx @@ -24,7 +24,7 @@ import { IndexationStatus } from '../../../../types/indexation'; import { IndexationContext } from '../IndexationContext'; import { IndexationContextProvider, - IndexationContextProviderProps + IndexationContextProviderProps, } from '../IndexationContextProvider'; import IndexationNotificationHelper from '../IndexationNotificationHelper'; @@ -48,7 +48,7 @@ it('should not start polling if no issue sync is needed', () => { const expectedStatus: IndexationStatus = { isCompleted: true, percentCompleted: 100, - hasFailures: false + hasFailures: false, }; expect(wrapper.state().status).toEqual(expectedStatus); }); @@ -61,7 +61,7 @@ it('should update the state on new status', () => { const newStatus: IndexationStatus = { isCompleted: true, percentCompleted: 100, - hasFailures: false + hasFailures: false, }; triggerNewStatus(newStatus); diff --git a/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotification-test.tsx b/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotification-test.tsx index b144dd38fa4..dac346b4db2 100644 --- a/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotification-test.tsx +++ b/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotification-test.tsx @@ -30,16 +30,16 @@ jest.mock('../IndexationNotificationHelper'); describe('Completed banner', () => { it('should be displayed', () => { - (IndexationNotificationHelper.shouldDisplayCompletedNotification as jest.Mock).mockReturnValueOnce( - true - ); + ( + IndexationNotificationHelper.shouldDisplayCompletedNotification as jest.Mock + ).mockReturnValueOnce(true); const wrapper = shallowRender(); wrapper.setProps({ indexationContext: { - status: { isCompleted: true, percentCompleted: 100, hasFailures: false } - } + status: { isCompleted: true, percentCompleted: 100, hasFailures: false }, + }, }); expect(IndexationNotificationHelper.shouldDisplayCompletedNotification).toHaveBeenCalled(); @@ -47,14 +47,14 @@ describe('Completed banner', () => { }); it('should be displayed at startup', () => { - (IndexationNotificationHelper.shouldDisplayCompletedNotification as jest.Mock).mockReturnValueOnce( - true - ); + ( + IndexationNotificationHelper.shouldDisplayCompletedNotification as jest.Mock + ).mockReturnValueOnce(true); const wrapper = shallowRender({ indexationContext: { - status: { isCompleted: true, percentCompleted: 100, hasFailures: false } - } + status: { isCompleted: true, percentCompleted: 100, hasFailures: false }, + }, }); expect(IndexationNotificationHelper.shouldDisplayCompletedNotification).toHaveBeenCalled(); @@ -63,14 +63,14 @@ describe('Completed banner', () => { it('should be hidden once displayed', () => { jest.useFakeTimers(); - (IndexationNotificationHelper.shouldDisplayCompletedNotification as jest.Mock).mockReturnValueOnce( - true - ); + ( + IndexationNotificationHelper.shouldDisplayCompletedNotification as jest.Mock + ).mockReturnValueOnce(true); const wrapper = shallowRender({ indexationContext: { - status: { isCompleted: true, percentCompleted: 100, hasFailures: false } - } + status: { isCompleted: true, percentCompleted: 100, hasFailures: false }, + }, }); expect(wrapper.state().notificationType).toBe(IndexationNotificationType.Completed); @@ -85,7 +85,7 @@ describe('Completed banner', () => { it('should display the completed-with-failure banner', () => { const wrapper = shallowRender({ - indexationContext: { status: { isCompleted: true, percentCompleted: 100, hasFailures: true } } + indexationContext: { status: { isCompleted: true, percentCompleted: 100, hasFailures: true } }, }); expect(wrapper.state().notificationType).toBe(IndexationNotificationType.CompletedWithFailure); @@ -93,7 +93,7 @@ it('should display the completed-with-failure banner', () => { it('should display the progress banner', () => { const wrapper = shallowRender({ - indexationContext: { status: { isCompleted: false, percentCompleted: 23, hasFailures: false } } + indexationContext: { status: { isCompleted: false, percentCompleted: 23, hasFailures: false } }, }); expect(IndexationNotificationHelper.markCompletedNotificationAsToDisplay).toHaveBeenCalled(); @@ -102,7 +102,7 @@ it('should display the progress banner', () => { it('should display the progress-with-failure banner', () => { const wrapper = shallowRender({ - indexationContext: { status: { isCompleted: false, percentCompleted: 23, hasFailures: true } } + indexationContext: { status: { isCompleted: false, percentCompleted: 23, hasFailures: true } }, }); expect(IndexationNotificationHelper.markCompletedNotificationAsToDisplay).toHaveBeenCalled(); @@ -114,7 +114,7 @@ function shallowRender(props?: Partial) { diff --git a/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotificationHelper-test.tsx b/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotificationHelper-test.tsx index fb5c3defb5a..a5fc5e3aa96 100644 --- a/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotificationHelper-test.tsx +++ b/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotificationHelper-test.tsx @@ -34,13 +34,13 @@ afterEach(() => { }); jest.mock('../../../../api/ce', () => ({ - getIndexationStatus: jest.fn().mockResolvedValue({}) + getIndexationStatus: jest.fn().mockResolvedValue({}), })); jest.mock('../../../../helpers/storage', () => ({ get: jest.fn(), remove: jest.fn(), - save: jest.fn() + save: jest.fn(), })); it('should properly start & stop polling for indexation status', async () => { @@ -48,7 +48,7 @@ it('should properly start & stop polling for indexation status', async () => { const newStatus: IndexationStatus = { isCompleted: false, percentCompleted: 100, - hasFailures: false + hasFailures: false, }; (getIndexationStatus as jest.Mock).mockResolvedValueOnce(newStatus); diff --git a/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotificationRenderer-test.tsx b/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotificationRenderer-test.tsx index 38428a88fa4..c4e531abc7b 100644 --- a/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotificationRenderer-test.tsx +++ b/server/sonar-web/src/main/js/app/components/indexation/__tests__/IndexationNotificationRenderer-test.tsx @@ -21,7 +21,7 @@ import { shallow } from 'enzyme'; import * as React from 'react'; import { IndexationNotificationType } from '../../../../types/indexation'; import IndexationNotificationRenderer, { - IndexationNotificationRendererProps + IndexationNotificationRendererProps, } from '../IndexationNotificationRenderer'; it.each([ @@ -32,7 +32,7 @@ it.each([ [IndexationNotificationType.Completed, false], [IndexationNotificationType.Completed, true], [IndexationNotificationType.CompletedWithFailure, false], - [IndexationNotificationType.CompletedWithFailure, true] + [IndexationNotificationType.CompletedWithFailure, true], ])( 'should render correctly for type=%p & isSystemAdmin=%p', (type: IndexationNotificationType, isSystemAdmin: boolean) => { diff --git a/server/sonar-web/src/main/js/app/components/indexation/__tests__/PageUnavailableDueToIndexation-test.tsx b/server/sonar-web/src/main/js/app/components/indexation/__tests__/PageUnavailableDueToIndexation-test.tsx index 3bd0d2922dc..0059f299f22 100644 --- a/server/sonar-web/src/main/js/app/components/indexation/__tests__/PageUnavailableDueToIndexation-test.tsx +++ b/server/sonar-web/src/main/js/app/components/indexation/__tests__/PageUnavailableDueToIndexation-test.tsx @@ -32,7 +32,7 @@ it('should not refresh the page once the indexation is complete if there were fa Object.defineProperty(window, 'location', { writable: true, - value: { reload } + value: { reload }, }); const wrapper = shallowRender(); @@ -40,7 +40,7 @@ it('should not refresh the page once the indexation is complete if there were fa expect(reload).not.toHaveBeenCalled(); wrapper.setProps({ - indexationContext: { status: { isCompleted: true, percentCompleted: 100, hasFailures: true } } + indexationContext: { status: { isCompleted: true, percentCompleted: 100, hasFailures: true } }, }); wrapper.update(); @@ -52,7 +52,7 @@ it('should refresh the page once the indexation is complete if there were NO fai Object.defineProperty(window, 'location', { writable: true, - value: { reload } + value: { reload }, }); const wrapper = shallowRender(); @@ -60,7 +60,7 @@ it('should refresh the page once the indexation is complete if there were NO fai expect(reload).not.toHaveBeenCalled(); wrapper.setProps({ - indexationContext: { status: { isCompleted: true, percentCompleted: 100, hasFailures: false } } + indexationContext: { status: { isCompleted: true, percentCompleted: 100, hasFailures: false } }, }); wrapper.update(); @@ -71,7 +71,7 @@ function shallowRender(props?: PageUnavailableDueToIndexation['props']) { return shallow( { mounted = false; state: State = { - languages: {} + languages: {}, }; componentDidMount() { diff --git a/server/sonar-web/src/main/js/app/components/languages/__tests__/LanguagesContextProvider-test.tsx b/server/sonar-web/src/main/js/app/components/languages/__tests__/LanguagesContextProvider-test.tsx index aab258a5dc0..b8d3d693ebe 100644 --- a/server/sonar-web/src/main/js/app/components/languages/__tests__/LanguagesContextProvider-test.tsx +++ b/server/sonar-web/src/main/js/app/components/languages/__tests__/LanguagesContextProvider-test.tsx @@ -24,7 +24,7 @@ import { waitAndUpdate } from '../../../../helpers/testUtils'; import LanguagesContextProvider from '../LanguagesContextProvider'; jest.mock('../../../../api/languages', () => ({ - getLanguages: jest.fn().mockResolvedValue({}) + getLanguages: jest.fn().mockResolvedValue({}), })); it('should call language', async () => { diff --git a/server/sonar-web/src/main/js/app/components/languages/__tests__/withLanguagesContext-test.tsx b/server/sonar-web/src/main/js/app/components/languages/__tests__/withLanguagesContext-test.tsx index 4cf91576b65..2d3891d830b 100644 --- a/server/sonar-web/src/main/js/app/components/languages/__tests__/withLanguagesContext-test.tsx +++ b/server/sonar-web/src/main/js/app/components/languages/__tests__/withLanguagesContext-test.tsx @@ -27,8 +27,8 @@ jest.mock('../LanguagesContext', () => { LanguagesContext: { Consumer: ({ children }: { children: (props: {}) => React.ReactNode }) => { return children({ c: { key: 'c', name: 'c' } }); - } - } + }, + }, }; }); diff --git a/server/sonar-web/src/main/js/app/components/languages/withLanguagesContext.tsx b/server/sonar-web/src/main/js/app/components/languages/withLanguagesContext.tsx index 1a7c61bc9f1..2e73fb365c7 100644 --- a/server/sonar-web/src/main/js/app/components/languages/withLanguagesContext.tsx +++ b/server/sonar-web/src/main/js/app/components/languages/withLanguagesContext.tsx @@ -37,7 +37,7 @@ export default function withLanguagesContext

( render() { return ( - {languages => } + {(languages) => } ); } diff --git a/server/sonar-web/src/main/js/app/components/metrics/MetricsContextProvider.tsx b/server/sonar-web/src/main/js/app/components/metrics/MetricsContextProvider.tsx index c1a0d81711c..df2de73ad25 100644 --- a/server/sonar-web/src/main/js/app/components/metrics/MetricsContextProvider.tsx +++ b/server/sonar-web/src/main/js/app/components/metrics/MetricsContextProvider.tsx @@ -31,7 +31,7 @@ interface State { export default class MetricsContextProvider extends React.PureComponent<{}, State> { mounted = false; state: State = { - metrics: {} + metrics: {}, }; componentDidMount() { diff --git a/server/sonar-web/src/main/js/app/components/metrics/__tests__/MetricsContextProvider-test.tsx b/server/sonar-web/src/main/js/app/components/metrics/__tests__/MetricsContextProvider-test.tsx index 169d7765aa3..9a788d7cbdf 100644 --- a/server/sonar-web/src/main/js/app/components/metrics/__tests__/MetricsContextProvider-test.tsx +++ b/server/sonar-web/src/main/js/app/components/metrics/__tests__/MetricsContextProvider-test.tsx @@ -26,7 +26,7 @@ import { waitAndUpdate } from '../../../../helpers/testUtils'; import MetricsContextProvider from '../MetricsContextProvider'; jest.mock('../../../../api/metrics', () => ({ - getAllMetrics: jest.fn().mockResolvedValue({}) + getAllMetrics: jest.fn().mockResolvedValue({}), })); it('should call metric', async () => { diff --git a/server/sonar-web/src/main/js/app/components/metrics/__tests__/withMetricsContext-test.tsx b/server/sonar-web/src/main/js/app/components/metrics/__tests__/withMetricsContext-test.tsx index f4d43f73a5a..b0e234da071 100644 --- a/server/sonar-web/src/main/js/app/components/metrics/__tests__/withMetricsContext-test.tsx +++ b/server/sonar-web/src/main/js/app/components/metrics/__tests__/withMetricsContext-test.tsx @@ -24,7 +24,7 @@ import { Dict, Metric } from '../../../../types/types'; import withMetricsContext from '../withMetricsContext'; const metrics = { - coverage: mockMetric() + coverage: mockMetric(), }; jest.mock('../MetricsContext', () => { @@ -32,8 +32,8 @@ jest.mock('../MetricsContext', () => { MetricsContext: { Consumer: ({ children }: { children: (props: {}) => React.ReactNode }) => { return children({ metrics }); - } - } + }, + }, }; }); diff --git a/server/sonar-web/src/main/js/app/components/metrics/withMetricsContext.tsx b/server/sonar-web/src/main/js/app/components/metrics/withMetricsContext.tsx index e9d3d9ee741..7d3643e343c 100644 --- a/server/sonar-web/src/main/js/app/components/metrics/withMetricsContext.tsx +++ b/server/sonar-web/src/main/js/app/components/metrics/withMetricsContext.tsx @@ -38,7 +38,7 @@ export default function withMetricsContext

( render() { return ( - {metrics => } + {(metrics) => } ); } diff --git a/server/sonar-web/src/main/js/app/components/nav/component/Breadcrumb.tsx b/server/sonar-web/src/main/js/app/components/nav/component/Breadcrumb.tsx index ab7f8f58528..c0112319d51 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/Breadcrumb.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/Breadcrumb.tsx @@ -35,7 +35,7 @@ export interface BreadcrumbProps { export function Breadcrumb(props: BreadcrumbProps) { const { component: { breadcrumbs }, - currentBranchLike + currentBranchLike, } = props; const lastBreadcrumbElement = last(breadcrumbs); const isNotMainBranch = currentBranchLike && !isMainBranch(currentBranchLike); @@ -60,7 +60,8 @@ export function Breadcrumb(props: BreadcrumbProps) { )} + to={getComponentOverviewUrl(breadcrumbElement.key, breadcrumbElement.qualifier)} + > {showQualifierIcon && isNotMainBranch && ( - }> + } + >

0 - })}> + 'little-padded-bottom': warnings.length > 0, + })} + >
setDisplayProjectInfo(false)} - top={globalNavHeightRaw + contextNavHeight}> + top={globalNavHeightRaw + contextNavHeight} + > - ) + ), }} /> diff --git a/server/sonar-web/src/main/js/app/components/nav/component/HeaderMeta.tsx b/server/sonar-web/src/main/js/app/components/nav/component/HeaderMeta.tsx index 4d7ba4f3bea..b1b28173a02 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/HeaderMeta.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/HeaderMeta.tsx @@ -70,7 +70,8 @@ export function HeaderMeta(props: HeaderMetaProps) { 'overview.project.last_analysis.date_time', lastAnalysisDate )} - className="spacer-left nowrap note"> + className="spacer-left nowrap note" + > {lastAnalysisDate} )} @@ -90,7 +91,8 @@ export function HeaderMeta(props: HeaderMetaProps) { className="link-no-underline big-spacer-right" to={branchLike.url} target="_blank" - size={12}> + size={12} + > {translate('branches.see_the_pr')} )} @@ -115,7 +117,7 @@ export function getCurrentPage(component: Component, branchLike: BranchLike | un currentPage = { type: 'APPLICATION', component: component.key, - branch + branch, }; break; case ComponentQualifier.Project: @@ -123,7 +125,7 @@ export function getCurrentPage(component: Component, branchLike: BranchLike | un currentPage = { type: 'PROJECT', component: component.key, - branch + branch, }; break; } diff --git a/server/sonar-web/src/main/js/app/components/nav/component/Menu.tsx b/server/sonar-web/src/main/js/app/components/nav/component/Menu.tsx index 825823e4763..6f74bd5714a 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/Menu.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/Menu.tsx @@ -34,7 +34,7 @@ import { ComponentQualifier, isPortfolioLike } from '../../../../types/component import { Feature } from '../../../../types/features'; import { Component, Dict, Extension } from '../../../../types/types'; import withAvailableFeatures, { - WithAvailableFeaturesProps + WithAvailableFeaturesProps, } from '../../available-features/withAvailableFeatures'; import './Menu.css'; @@ -51,7 +51,7 @@ const SETTINGS_URLS = [ 'background_tasks', '/project/key', '/project/deletion', - '/project/webhooks' + '/project/webhooks', ]; interface Props extends WithAvailableFeaturesProps { @@ -112,10 +112,10 @@ export class Menu extends React.PureComponent { isGovernanceEnabled = () => { const { - component: { extensions } + component: { extensions }, } = this.props; - return extensions && extensions.some(extension => extension.key.startsWith('governance/')); + return extensions && extensions.some((extension) => extension.key.startsWith('governance/')); }; getConfiguration = () => { @@ -133,7 +133,8 @@ export class Menu extends React.PureComponent { overlay={translateWithParameters( 'layout.all_project_must_be_accessible', translate('qualifier', this.props.component.qualifier) - )}> + )} + > {label} @@ -145,7 +146,7 @@ export class Menu extends React.PureComponent { renderMenuLink = ({ label, pathname, - additionalQueryParams = {} + additionalQueryParams = {}, }: { label: React.ReactNode; pathname: string; @@ -163,8 +164,9 @@ export class Menu extends React.PureComponent { + search: new URLSearchParams({ ...query, ...additionalQueryParams }).toString(), + }} + > {label} ) : ( @@ -204,7 +206,7 @@ export class Menu extends React.PureComponent { return this.isPortfolio() && this.isGovernanceEnabled() ? this.renderMenuLink({ label: translate('portfolio_breakdown.page'), - pathname: '/code' + pathname: '/code', }) : null; }; @@ -228,7 +230,7 @@ export class Menu extends React.PureComponent { return this.renderMenuLink({ label: translate('project_activity.page'), - pathname: '/project/activity' + pathname: '/project/activity', }); }; @@ -236,14 +238,14 @@ export class Menu extends React.PureComponent { return this.renderMenuLink({ label: translate('issues.page'), pathname: '/project/issues', - additionalQueryParams: { resolved: 'false' } + additionalQueryParams: { resolved: 'false' }, }); }; renderComponentMeasuresLink = () => { return this.renderMenuLink({ label: translate('layout.measures'), - pathname: '/component_measures' + pathname: '/component_measures', }); }; @@ -253,7 +255,7 @@ export class Menu extends React.PureComponent { !isPortfolio && this.renderMenuLink({ label: translate('layout.security_hotspots'), - pathname: '/security_hotspots' + pathname: '/security_hotspots', }) ); }; @@ -266,7 +268,7 @@ export class Menu extends React.PureComponent { return null; } - const hasSecurityReportsEnabled = extensions.some(extension => + const hasSecurityReportsEnabled = extensions.some((extension) => extension.key.startsWith('securityreport/') ); @@ -276,7 +278,7 @@ export class Menu extends React.PureComponent { return this.renderMenuLink({ label: translate('layout.security_reports'), - pathname: '/project/extension/securityreport/securityreport' + pathname: '/project/extension/securityreport/securityreport', }); }; @@ -291,10 +293,10 @@ export class Menu extends React.PureComponent { return null; } - const isSettingsActive = SETTINGS_URLS.some(url => window.location.href.indexOf(url) !== -1); + const isSettingsActive = SETTINGS_URLS.some((url) => window.location.href.indexOf(url) !== -1); const adminLinks = this.renderAdministrationLinks(query, isProject, isApplication, isPortfolio); - if (!adminLinks.some(link => link != null)) { + if (!adminLinks.some((link) => link != null)) { return null; } @@ -302,14 +304,16 @@ export class Menu extends React.PureComponent { {adminLinks}} - tagName="li"> + tagName="li" + > {({ onToggleClick, open }) => ( + onClick={onToggleClick} + > {hasMessage('layout.settings', component.qualifier) ? translate('layout.settings', component.qualifier) : translate('layout.settings')} @@ -339,7 +343,7 @@ export class Menu extends React.PureComponent { this.renderBackgroundTasksLink(query), this.renderUpdateKeyLink(query), this.renderWebhooksLink(query, isProject), - this.renderDeletionLink(query) + this.renderDeletionLink(query), ]; }; @@ -363,9 +367,10 @@ export class Menu extends React.PureComponent { { + innerRef={(node) => { this.projectInfoLink = node; - }}> + }} + > {label} @@ -381,7 +386,8 @@ export class Menu extends React.PureComponent { return (
  • + to={{ pathname: '/project/settings', search: new URLSearchParams(query).toString() }} + > {translate('project_settings.page')}
  • @@ -400,7 +406,8 @@ export class Menu extends React.PureComponent { return (
  • + to={{ pathname: '/project/branches', search: new URLSearchParams(query).toString() }} + > {translate('project_branch_pull_request.page')}
  • @@ -414,7 +421,8 @@ export class Menu extends React.PureComponent { return (
  • + to={{ pathname: '/project/baseline', search: new URLSearchParams(query).toString() }} + > {translate('project_baseline.page')}
  • @@ -430,8 +438,9 @@ export class Menu extends React.PureComponent { + search: new URLSearchParams(query).toString(), + }} + > {translate('project_dump.page')} @@ -447,8 +456,9 @@ export class Menu extends React.PureComponent { + search: new URLSearchParams(query).toString(), + }} + > {translate('project_quality_profiles.page')} @@ -462,7 +472,8 @@ export class Menu extends React.PureComponent { return (
  • + to={{ pathname: '/project/quality_gate', search: new URLSearchParams(query).toString() }} + > {translate('project_quality_gate.page')}
  • @@ -504,8 +515,9 @@ export class Menu extends React.PureComponent { + search: new URLSearchParams(query).toString(), + }} + > {translate('background_tasks.page')} @@ -532,7 +544,8 @@ export class Menu extends React.PureComponent { return (
  • + to={{ pathname: '/project/webhooks', search: new URLSearchParams(query).toString() }} + > {translate('webhooks.page')}
  • @@ -550,7 +563,7 @@ export class Menu extends React.PureComponent { ![ ComponentQualifier.Project, ComponentQualifier.Portfolio, - ComponentQualifier.Application + ComponentQualifier.Application, ].includes(qualifier as ComponentQualifier) ) { return null; @@ -559,7 +572,8 @@ export class Menu extends React.PureComponent { return (
  • + to={{ pathname: '/project/deletion', search: new URLSearchParams(query).toString() }} + > {translate('deletion.page')}
  • @@ -579,15 +593,15 @@ export class Menu extends React.PureComponent { renderAdminExtensions = (query: Query, isApplication: boolean) => { const extensions = this.getConfiguration().extensions || []; return extensions - .filter(e => !isApplication || e.key !== 'governance/console') - .map(e => this.renderExtension(e, true, query)); + .filter((e) => !isApplication || e.key !== 'governance/console') + .map((e) => this.renderExtension(e, true, query)); }; renderExtensions = () => { const query = this.getQuery(); const extensions = this.props.component.extensions || []; const withoutSecurityExtension = extensions.filter( - extension => + (extension) => !extension.key.startsWith('securityreport/') && !extension.key.startsWith('governance/') ); @@ -600,17 +614,19 @@ export class Menu extends React.PureComponent { data-test="extensions" overlay={
      - {withoutSecurityExtension.map(e => this.renderExtension(e, false, query))} + {withoutSecurityExtension.map((e) => this.renderExtension(e, false, query))}
    } - tagName="li"> + tagName="li" + > {({ onToggleClick, open }) => ( + onClick={onToggleClick} + > {translate('more')} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/Breadcrumb-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/Breadcrumb-test.tsx index 58372411efb..85a8c920948 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/Breadcrumb-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/Breadcrumb-test.tsx @@ -38,11 +38,11 @@ it('should render correctly when not on a main branch', () => { { key: 'project', name: 'My Project', - qualifier: ComponentQualifier.Project - } - ] + qualifier: ComponentQualifier.Project, + }, + ], }), - currentBranchLike: mockBranch() + currentBranchLike: mockBranch(), }); expect( screen.getByRole('link', { name: `qualifier.${ComponentQualifier.Project} My Project` }) @@ -57,14 +57,14 @@ function renderBreadcrumb(props: Partial = {}) { { key: 'parent-portfolio', name: 'Parent portfolio', - qualifier: ComponentQualifier.Portfolio + qualifier: ComponentQualifier.Portfolio, }, { key: 'child-portfolio', name: 'Child portfolio', - qualifier: ComponentQualifier.SubPortfolio - } - ] + qualifier: ComponentQualifier.SubPortfolio, + }, + ], })} currentBranchLike={mockMainBranch()} {...props} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx index edefa213b80..a41b942c525 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNav-test.tsx @@ -57,7 +57,7 @@ it('renders correctly when there is a failing background task', () => { it('renders correctly when the project binding is incorrect', () => { renderComponentNav({ - projectBindingErrors: mockProjectAlmBindingConfigurationErrors() + projectBindingErrors: mockProjectAlmBindingConfigurationErrors(), }); expect( screen.getByText('component_navigation.pr_deco.error_detected_X', { exact: false }) @@ -79,7 +79,7 @@ function renderComponentNav(props: Partial = {}) { ({ ...jest.requireActual('../../../../../helpers/l10n'), - hasMessage: jest.fn().mockReturnValue(true) + hasMessage: jest.fn().mockReturnValue(true), })); const UNKNOWN_TASK_TYPE: TaskTypes = 'UNKOWN' as TaskTypes; @@ -42,8 +42,8 @@ it('renders correctly', () => { currentTask: mockTask({ status: TaskStatuses.Failed, errorType: 'LICENSING', - errorMessage: 'Foo' - }) + errorMessage: 'Foo', + }), }) ).toMatchSnapshot('license issue'); expect(shallowRender({ currentTask: undefined }).type()).toBeNull(); // No task. @@ -58,7 +58,7 @@ it.each([ false, false, false, - false + false, ], [ 'component_navigation.status.failed_X', @@ -67,7 +67,7 @@ it.each([ false, false, false, - false + false, ], [ 'component_navigation.status.failed.admin.link', @@ -76,7 +76,7 @@ it.each([ false, false, true, - false + false, ], [ 'component_navigation.status.failed_X.admin.link', @@ -85,7 +85,7 @@ it.each([ false, false, true, - false + false, ], [ 'component_navigation.status.failed.admin.help', @@ -94,7 +94,7 @@ it.each([ false, false, true, - true + true, ], [ 'component_navigation.status.failed_X.admin.help', @@ -103,7 +103,7 @@ it.each([ false, false, true, - true + true, ], // failed_branch [ @@ -113,7 +113,7 @@ it.each([ false, false, false, - false + false, ], [ 'component_navigation.status.failed_branch_X', @@ -122,7 +122,7 @@ it.each([ false, false, false, - false + false, ], [ 'component_navigation.status.failed_branch.admin.link', @@ -131,7 +131,7 @@ it.each([ false, false, true, - false + false, ], [ 'component_navigation.status.failed_branch_X.admin.link', @@ -140,7 +140,7 @@ it.each([ false, false, true, - false + false, ], [ 'component_navigation.status.failed_branch.admin.help', @@ -149,7 +149,7 @@ it.each([ false, false, true, - true + true, ], [ 'component_navigation.status.failed_branch_X.admin.help', @@ -158,7 +158,7 @@ it.each([ false, false, true, - true + true, ], // pending [ @@ -168,7 +168,7 @@ it.each([ true, false, false, - false + false, ], ['component_navigation.status.pending_X', 'info', mockTask(), true, false, false, false], [ @@ -178,7 +178,7 @@ it.each([ true, false, true, - false + false, ], [ 'component_navigation.status.pending_X.admin.link', @@ -187,7 +187,7 @@ it.each([ true, false, true, - false + false, ], [ 'component_navigation.status.pending.admin.help', @@ -196,7 +196,7 @@ it.each([ true, false, true, - true + true, ], [ 'component_navigation.status.pending_X.admin.help', @@ -205,7 +205,7 @@ it.each([ true, false, true, - true + true, ], // in_progress [ @@ -215,7 +215,7 @@ it.each([ true, true, false, - false + false, ], ['component_navigation.status.in_progress_X', 'info', mockTask(), true, true, false, false], [ @@ -225,7 +225,7 @@ it.each([ true, true, true, - false + false, ], [ 'component_navigation.status.in_progress_X.admin.link', @@ -234,7 +234,7 @@ it.each([ true, true, true, - false + false, ], [ 'component_navigation.status.in_progress.admin.help', @@ -243,7 +243,7 @@ it.each([ true, true, true, - true + true, ], [ 'component_navigation.status.in_progress_X.admin.help', @@ -252,8 +252,8 @@ it.each([ true, true, true, - true - ] + true, + ], ])( 'should render the expected message=%p', ( @@ -276,8 +276,8 @@ it.each([ isPending, isInProgress, location: mockLocation({ - pathname: onBackgroudTaskPage ? '/project/background_tasks' : '/foo/bar' - }) + pathname: onBackgroudTaskPage ? '/project/background_tasks' : '/foo/bar', + }), }); const messageProps = wrapper.find(FormattedMessage).props(); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavLicenseNotif-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavLicenseNotif-test.tsx index 292790dfdce..495da548085 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavLicenseNotif-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavLicenseNotif-test.tsx @@ -28,11 +28,11 @@ import { ComponentNavLicenseNotif } from '../ComponentNavLicenseNotif'; jest.mock('../../../../../helpers/l10n', () => ({ ...jest.requireActual('../../../../../helpers/l10n'), - hasMessage: jest.fn().mockReturnValue(true) + hasMessage: jest.fn().mockReturnValue(true), })); jest.mock('../../../../../api/editions', () => ({ - isValidLicense: jest.fn().mockResolvedValue({ isValidLicense: false }) + isValidLicense: jest.fn().mockResolvedValue({ isValidLicense: false }), })); beforeEach(() => { @@ -44,8 +44,8 @@ it('renders background task license info correctly', async () => { currentTask: mockTask({ status: TaskStatuses.Failed, errorType: 'LICENSING', - errorMessage: 'Foo' - }) + errorMessage: 'Foo', + }), }); await waitAndUpdate(wrapper); expect(wrapper).toMatchSnapshot(); @@ -55,8 +55,8 @@ it('renders background task license info correctly', async () => { currentTask: mockTask({ status: TaskStatuses.Failed, errorType: 'LICENSING', - errorMessage: 'Foo' - }) + errorMessage: 'Foo', + }), }); await waitAndUpdate(wrapper); expect(wrapper).toMatchSnapshot(); @@ -68,8 +68,8 @@ it('renders a different message if the license is valid', async () => { currentTask: mockTask({ status: TaskStatuses.Failed, errorType: 'LICENSING', - errorMessage: 'Foo' - }) + errorMessage: 'Foo', + }), }); await waitAndUpdate(wrapper); expect(wrapper).toMatchSnapshot(); @@ -81,8 +81,8 @@ it('renders correctly for LICENSING_LOC error', async () => { currentTask: mockTask({ status: TaskStatuses.Failed, errorType: 'LICENSING_LOC', - errorMessage: 'Foo' - }) + errorMessage: 'Foo', + }), }); await waitAndUpdate(wrapper); expect(wrapper).toMatchSnapshot(); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavProjectBindingErrorNotif-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavProjectBindingErrorNotif-test.tsx index 5028cca1edc..5e71d4b85d2 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavProjectBindingErrorNotif-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/ComponentNavProjectBindingErrorNotif-test.tsx @@ -22,7 +22,7 @@ import * as React from 'react'; import { mockComponent } from '../../../../../helpers/mocks/component'; import { ComponentNavProjectBindingErrorNotif, - ComponentNavProjectBindingErrorNotifProps + ComponentNavProjectBindingErrorNotifProps, } from '../ComponentNavProjectBindingErrorNotif'; it('should render correctly', () => { diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/HeaderMeta-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/HeaderMeta-test.tsx index bc5ff09ba86..4c9df3a0c0c 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/HeaderMeta-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/HeaderMeta-test.tsx @@ -29,8 +29,8 @@ import { getCurrentPage, HeaderMeta, HeaderMetaProps } from '../HeaderMeta'; jest.mock('react-intl', () => ({ useIntl: jest.fn().mockImplementation(() => ({ - formatDate: jest.fn().mockImplementation(() => '2017-01-02T00:00:00.000Z') - })) + formatDate: jest.fn().mockImplementation(() => '2017-01-02T00:00:00.000Z'), + })), })); it('should render correctly for a branch', () => { @@ -40,14 +40,14 @@ it('should render correctly for a branch', () => { it('should render correctly for a main project branch', () => { const wrapper = shallowRender({ - branchLike: mockBranch({ isMain: true }) + branchLike: mockBranch({ isMain: true }), }); expect(wrapper).toMatchSnapshot(); }); it('should render correctly for a portfolio', () => { const wrapper = shallowRender({ - component: mockComponent({ key: 'foo', qualifier: ComponentQualifier.Portfolio }) + component: mockComponent({ key: 'foo', qualifier: ComponentQualifier.Portfolio }), }); expect(wrapper).toMatchSnapshot(); }); @@ -55,8 +55,8 @@ it('should render correctly for a portfolio', () => { it('should render correctly for a pull request', () => { const wrapper = shallowRender({ branchLike: mockPullRequest({ - url: 'https://example.com/pull/1234' - }) + url: 'https://example.com/pull/1234', + }), }); expect(wrapper).toMatchSnapshot(); }); @@ -75,7 +75,7 @@ describe('#getCurrentPage', () => { ) ).toEqual({ type: 'PORTFOLIO', - component: 'foo' + component: 'foo', }); }); @@ -92,7 +92,7 @@ describe('#getCurrentPage', () => { expect(getCurrentPage(mockComponent(), mockBranch({ name: 'feature/foo' }))).toEqual({ type: 'PROJECT', component: 'my-project', - branch: 'feature/foo' + branch: 'feature/foo', }); }); }); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/Menu-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/Menu-test.tsx index fe446883e96..bda66dc8b46 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/__tests__/Menu-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/__tests__/Menu-test.tsx @@ -22,7 +22,7 @@ import * as React from 'react'; import { mockBranch, mockMainBranch, - mockPullRequest + mockPullRequest, } from '../../../../../helpers/mocks/branch-like'; import { mockComponent } from '../../../../../helpers/mocks/component'; import { renderComponent } from '../../../../../helpers/testReactTestingUtils'; @@ -32,7 +32,7 @@ import { Menu } from '../Menu'; const BASE_COMPONENT = mockComponent({ analysisDate: '2019-12-01', key: 'foo', - name: 'foo' + name: 'foo', }); it('should render correctly', () => { @@ -43,14 +43,14 @@ it('should render correctly', () => { extensions: [ { key: 'foo', name: 'Foo' }, { key: 'bar', name: 'Bar' }, - { key: 'securityreport/foo', name: 'Foo' } - ] + { key: 'securityreport/foo', name: 'Foo' }, + ], }, extensions: [ { key: 'component-foo', name: 'ComponentFoo' }, { key: 'component-bar', name: 'ComponentBar' }, - { key: 'securityreport/foo', name: 'Security Report' } - ] + { key: 'securityreport/foo', name: 'Security Report' }, + ], }; renderMenu({ component }); @@ -71,8 +71,8 @@ it('should render correctly when on a branch', () => { component: { ...BASE_COMPONENT, configuration: { showSettings: true }, - extensions: [{ key: 'component-foo', name: 'ComponentFoo' }] - } + extensions: [{ key: 'component-foo', name: 'ComponentFoo' }], + }, }); expect(screen.getByRole('link', { name: 'overview.page' })).toBeInTheDocument(); @@ -93,8 +93,8 @@ it('should render correctly when on a pull request', () => { component: { ...BASE_COMPONENT, configuration: { showSettings: true }, - extensions: [{ key: 'component-foo', name: 'ComponentFoo' }] - } + extensions: [{ key: 'component-foo', name: 'ComponentFoo' }], + }, }); expect(screen.getByRole('link', { name: 'overview.page' })).toBeInTheDocument(); @@ -111,8 +111,8 @@ it('should disable links if no analysis has been done', () => { renderMenu({ component: { ...BASE_COMPONENT, - analysisDate: undefined - } + analysisDate: undefined, + }, }); expect(screen.getByRole('link', { name: 'overview.page' })).toBeInTheDocument(); expect(screen.queryByRole('link', { name: 'issues.page' })).not.toBeInTheDocument(); @@ -125,8 +125,8 @@ it('should disable links if application has inaccessible projects', () => { component: { ...BASE_COMPONENT, qualifier: ComponentQualifier.Application, - canBrowseAllChildProjects: false - } + canBrowseAllChildProjects: false, + }, }); expect(screen.queryByRole('link', { name: 'overview.page' })).not.toBeInTheDocument(); expect(screen.queryByRole('link', { name: 'issues.page' })).not.toBeInTheDocument(); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/BranchLikeNavigation.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/BranchLikeNavigation.tsx index 8a7dff79217..75781499872 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/BranchLikeNavigation.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/BranchLikeNavigation.tsx @@ -26,7 +26,7 @@ import { BranchLike } from '../../../../../types/branch-like'; import { Feature } from '../../../../../types/features'; import { Component } from '../../../../../types/types'; import withAvailableFeatures, { - WithAvailableFeaturesProps + WithAvailableFeaturesProps, } from '../../../available-features/withAvailableFeatures'; import './BranchLikeNavigation.css'; import CurrentBranchLike from './CurrentBranchLike'; @@ -45,7 +45,7 @@ export function BranchLikeNavigation(props: BranchLikeNavigationProps) { component, component: { configuration }, currentBranchLike, - projectBinding + projectBinding, } = props; const [isMenuOpen, setIsMenuOpen] = React.useState(false); @@ -70,9 +70,10 @@ export function BranchLikeNavigation(props: BranchLikeNavigationProps) { className={classNames( 'big-spacer-left flex-0 branch-like-navigation-toggler-container display-flex-center', { - dropdown: isMenuEnabled + dropdown: isMenuEnabled, } - )}> + )} + > {isMenuEnabled ? ( setIsMenuOpen(false)} @@ -85,12 +86,14 @@ export function BranchLikeNavigation(props: BranchLikeNavigationProps) { currentBranchLike={currentBranchLike} onClose={() => setIsMenuOpen(false)} /> - }> + } + > setIsMenuOpen(!isMenuOpen)} aria-expanded={isMenuOpen} - aria-haspopup="menu"> + aria-haspopup="menu" + > {currentBranchLikeElement} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/CurrentBranchLike.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/CurrentBranchLike.tsx index 3cbee80e9e5..926fd1684e2 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/CurrentBranchLike.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/CurrentBranchLike.tsx @@ -48,7 +48,7 @@ export function CurrentBranchLike(props: CurrentBranchLikeProps) { component: { configuration }, currentBranchLike, hasManyBranches, - projectBinding + projectBinding, } = props; const displayName = getBranchLikeDisplayName(currentBranchLike); @@ -75,7 +75,8 @@ export function CurrentBranchLike(props: CurrentBranchLikeProps) { {translate('application.branches.link')} - }> + } + > {plusIcon} ); @@ -97,8 +98,8 @@ export function CurrentBranchLike(props: CurrentBranchLikeProps) { { href: 'https://redirect.sonarsource.com/editions/developer.html', label: translate('learn_more'), - doc: false - } + doc: false, + }, ]} title={ projectBinding !== undefined @@ -107,7 +108,8 @@ export function CurrentBranchLike(props: CurrentBranchLikeProps) { isGitLab ? 'mr' : 'pr' ) : translate('branch_like_navigation.no_branch_support.title') - }> + } + > {plusIcon} ); @@ -121,20 +123,21 @@ export function CurrentBranchLike(props: CurrentBranchLikeProps) { links={[ { href: '/branches/overview/', - label: translate('branch_like_navigation.only_one_branch.documentation') + label: translate('branch_like_navigation.only_one_branch.documentation'), }, { href: '/analysis/pull-request/', - label: translate('branch_like_navigation.only_one_branch.pr_analysis') + label: translate('branch_like_navigation.only_one_branch.pr_analysis'), }, { href: `/tutorials?id=${component.key}`, label: translate('branch_like_navigation.tutorial_for_ci'), inPlace: true, - doc: false - } + doc: false, + }, ]} - title={translate('branch_like_navigation.only_one_branch.title')}> + title={translate('branch_like_navigation.only_one_branch.title')} + > {plusIcon} ); @@ -149,7 +152,8 @@ export function CurrentBranchLike(props: CurrentBranchLikeProps) { + title={displayName} + > {displayName} {additionalIcon()} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/CurrentBranchLikeMergeInformation.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/CurrentBranchLikeMergeInformation.tsx index 002f917e810..1f71622160f 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/CurrentBranchLikeMergeInformation.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/CurrentBranchLikeMergeInformation.tsx @@ -41,7 +41,7 @@ export function CurrentBranchLikeMergeInformation(props: CurrentBranchLikeMergeI id="branch_like_navigation.for_merge_into_x_from_y" values={{ target: {currentBranchLike.target}, - branch: {currentBranchLike.branch} + branch: {currentBranchLike.branch}, }} /> diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/Menu.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/Menu.tsx index e171e41daff..f6cf75af2f3 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/Menu.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/Menu.tsx @@ -26,7 +26,7 @@ import { getBrancheLikesAsTree, isBranch, isPullRequest, - isSameBranchLike + isSameBranchLike, } from '../../../../../helpers/branch-like'; import { KeyboardKeys } from '../../../../../helpers/keycodes'; import { translate } from '../../../../../helpers/l10n'; @@ -58,7 +58,7 @@ export class Menu extends React.PureComponent { let selectedBranchLike = undefined; - if (props.branchLikes.some(b => isSameBranchLike(b, props.currentBranchLike))) { + if (props.branchLikes.some((b) => isSameBranchLike(b, props.currentBranchLike))) { selectedBranchLike = props.currentBranchLike; } else if (props.branchLikes.length > 0) { selectedBranchLike = props.branchLikes[0]; @@ -67,7 +67,7 @@ export class Menu extends React.PureComponent { this.state = { query: '', selectedBranchLike, - ...this.processBranchLikes(props.branchLikes) + ...this.processBranchLikes(props.branchLikes), }; } @@ -80,9 +80,9 @@ export class Menu extends React.PureComponent { : []), ...tree.branchTree.reduce((prev, t) => [...prev, t.branch, ...t.pullRequests], []), ...tree.parentlessPullRequests, - ...tree.orphanPullRequests + ...tree.orphanPullRequests, ], - branchLikesToDisplayTree: tree + branchLikesToDisplayTree: tree, }; }; @@ -93,7 +93,7 @@ export class Menu extends React.PureComponent { }; highlightSiblingBranchlike = (indexDelta: number) => { - const selectBranchLikeIndex = this.state.branchLikesToDisplay.findIndex(b => + const selectBranchLikeIndex = this.state.branchLikesToDisplay.findIndex((b) => isSameBranchLike(b, this.state.selectedBranchLike) ); const newIndex = selectBranchLikeIndex + indexDelta; @@ -104,7 +104,7 @@ export class Menu extends React.PureComponent { newIndex < this.state.branchLikesToDisplay.length ) { this.setState(({ branchLikesToDisplay }) => ({ - selectedBranchLike: branchLikesToDisplay[newIndex] + selectedBranchLike: branchLikesToDisplay[newIndex], })); } }; @@ -135,13 +135,13 @@ export class Menu extends React.PureComponent { isPullRequest(pr) && (pr.title.toLowerCase().includes(q) || pr.key.toLowerCase().includes(q)); const filteredBranchLikes = this.props.branchLikes.filter( - bl => filterBranch(bl) || filterPullRequest(bl) + (bl) => filterBranch(bl) || filterPullRequest(bl) ); this.setState({ query: q, selectedBranchLike: filteredBranchLikes.length > 0 ? filteredBranchLikes[0] : undefined, - ...this.processBranchLikes(filteredBranchLikes) + ...this.processBranchLikes(filteredBranchLikes), }); }; @@ -154,12 +154,8 @@ export class Menu extends React.PureComponent { render() { const { canAdminComponent, component, onClose } = this.props; - const { - branchLikesToDisplay, - branchLikesToDisplayTree, - query, - selectedBranchLike - } = this.state; + const { branchLikesToDisplay, branchLikesToDisplayTree, query, selectedBranchLike } = + this.state; const showManageLink = component.qualifier === ComponentQualifier.Project && canAdminComponent; const hasResults = branchLikesToDisplay.length > 0; @@ -190,7 +186,8 @@ export class Menu extends React.PureComponent {
    onClose()} - to={{ pathname: '/project/branches', search: queryToSearch({ id: component.key }) }}> + to={{ pathname: '/project/branches', search: queryToSearch({ id: component.key }) }} + > {translate('branch_like_navigation.manage')}
    diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/MenuItem.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/MenuItem.tsx index 298ae9448f0..ac96b0e5d0d 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/MenuItem.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/MenuItem.tsx @@ -42,14 +42,16 @@ export function MenuItem(props: MenuItemProps) { return (
  • onSelect(branchLike)} - ref={selected ? setSelectedNode : undefined}> + ref={selected ? setSelectedNode : undefined} + >
    + 'big-spacer-left': indent, + })} + >
    {displayName} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/MenuItemList.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/MenuItemList.tsx index 50c99ecb63f..b8b52818db9 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/MenuItemList.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/MenuItemList.tsx @@ -55,12 +55,12 @@ export function MenuItemList(props: MenuItemListProps) { key={getBranchLikeKey(branchLike)} onSelect={onSelect} selected={isSameBranchLike(branchLike, selectedBranchLike)} - setSelectedNode={node => (selectedNode = node)} + setSelectedNode={(node) => (selectedNode = node)} /> ); return ( -
      (listNode = node)}> +
        (listNode = node)}> {!hasResults && (
      • {translate('no_results')} @@ -68,28 +68,30 @@ export function MenuItemList(props: MenuItemListProps) { )} {/* BRANCHES & PR */} - {[branchLikeTree.mainBranchTree, ...branchLikeTree.branchTree].filter(isDefined).map(tree => ( - - {renderItem(tree.branch)} - {tree.pullRequests.length > 0 && ( - <> -
      • - - {translate('branch_like_navigation.pull_requests')} - -
      • - {tree.pullRequests.map(pr => renderItem(pr, true))} - - )} -
        - - ))} + {[branchLikeTree.mainBranchTree, ...branchLikeTree.branchTree] + .filter(isDefined) + .map((tree) => ( + + {renderItem(tree.branch)} + {tree.pullRequests.length > 0 && ( + <> +
      • + + {translate('branch_like_navigation.pull_requests')} + +
      • + {tree.pullRequests.map((pr) => renderItem(pr, true))} + + )} +
        +
        + ))} {/* PARENTLESS PR (for display during search) */} {branchLikeTree.parentlessPullRequests.length > 0 && ( <>
      • {translate('branch_like_navigation.pull_requests')}
      • - {branchLikeTree.parentlessPullRequests.map(pr => renderItem(pr))} + {branchLikeTree.parentlessPullRequests.map((pr) => renderItem(pr))} )} @@ -103,7 +105,7 @@ export function MenuItemList(props: MenuItemListProps) { overlay={translate('branch_like_navigation.orphan_pull_requests.tooltip')} /> - {branchLikeTree.orphanPullRequests.map(pr => renderItem(pr))} + {branchLikeTree.orphanPullRequests.map((pr) => renderItem(pr))} )}
      diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/BranchLikeNavigation-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/BranchLikeNavigation-test.tsx index 3278a79b8c4..9b560d0686b 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/BranchLikeNavigation-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/BranchLikeNavigation-test.tsx @@ -54,10 +54,7 @@ it('should properly close menu when toggler asks for', () => { click(wrapper.find(ButtonPlain)); expect(wrapper.find(Toggler).props().open).toBe(true); - wrapper - .find(Toggler) - .props() - .onRequestClose(); + wrapper.find(Toggler).props().onRequestClose(); expect(wrapper.find(Toggler).props().open).toBe(false); }); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/CurrentBranchLike-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/CurrentBranchLike-test.tsx index 6905e107555..0d0b67f92b0 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/CurrentBranchLike-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/CurrentBranchLike-test.tsx @@ -21,7 +21,7 @@ import { shallow } from 'enzyme'; import * as React from 'react'; import { mockProjectGithubBindingResponse, - mockProjectGitLabBindingResponse + mockProjectGitLabBindingResponse, } from '../../../../../../helpers/mocks/alm-settings'; import { mockMainBranch } from '../../../../../../helpers/mocks/branch-like'; import { mockComponent } from '../../../../../../helpers/mocks/component'; @@ -33,9 +33,9 @@ describe('applications', () => { const wrapper = shallowRender({ component: mockComponent({ configuration: { showSettings: true }, - qualifier: ComponentQualifier.Application + qualifier: ComponentQualifier.Application, }), - hasManyBranches: false + hasManyBranches: false, }); expect(wrapper).toMatchSnapshot(); }); @@ -44,9 +44,9 @@ describe('applications', () => { const wrapper = shallowRender({ component: mockComponent({ configuration: { showSettings: false }, - qualifier: ComponentQualifier.Application + qualifier: ComponentQualifier.Application, }), - hasManyBranches: false + hasManyBranches: false, }); expect(wrapper).toMatchSnapshot(); }); @@ -55,9 +55,9 @@ describe('applications', () => { const wrapper = shallowRender({ branchesEnabled: true, component: mockComponent({ - qualifier: ComponentQualifier.Application + qualifier: ComponentQualifier.Application, }), - hasManyBranches: true + hasManyBranches: true, }); expect(wrapper).toMatchSnapshot(); }); @@ -69,26 +69,26 @@ describe('projects', () => { shallowRender({ branchesEnabled: false, component: mockComponent({ - qualifier: ComponentQualifier.Project - }) + qualifier: ComponentQualifier.Project, + }), }) ).toMatchSnapshot('default'); expect( shallowRender({ branchesEnabled: false, component: mockComponent({ - qualifier: ComponentQualifier.Project + qualifier: ComponentQualifier.Project, }), - projectBinding: mockProjectGithubBindingResponse() + projectBinding: mockProjectGithubBindingResponse(), }) ).toMatchSnapshot('alm with prs'); expect( shallowRender({ branchesEnabled: false, component: mockComponent({ - qualifier: ComponentQualifier.Project + qualifier: ComponentQualifier.Project, }), - projectBinding: mockProjectGitLabBindingResponse() + projectBinding: mockProjectGitLabBindingResponse(), }) ).toMatchSnapshot('alm with mrs'); }); @@ -97,9 +97,9 @@ describe('projects', () => { const wrapper = shallowRender({ branchesEnabled: true, component: mockComponent({ - qualifier: ComponentQualifier.Project + qualifier: ComponentQualifier.Project, }), - hasManyBranches: false + hasManyBranches: false, }); expect(wrapper).toMatchSnapshot(); }); @@ -108,9 +108,9 @@ describe('projects', () => { const wrapper = shallowRender({ branchesEnabled: true, component: mockComponent({ - qualifier: ComponentQualifier.Project + qualifier: ComponentQualifier.Project, }), - hasManyBranches: true + hasManyBranches: true, }); expect(wrapper).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/CurrentBranchLikeMergeInformation-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/CurrentBranchLikeMergeInformation-test.tsx index 8885bd5d397..e650372bdd9 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/CurrentBranchLikeMergeInformation-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/CurrentBranchLikeMergeInformation-test.tsx @@ -22,7 +22,7 @@ import * as React from 'react'; import { mockMainBranch, mockPullRequest } from '../../../../../../helpers/mocks/branch-like'; import { CurrentBranchLikeMergeInformation, - CurrentBranchLikeMergeInformationProps + CurrentBranchLikeMergeInformationProps, } from '../CurrentBranchLikeMergeInformation'; it('should render correctly', () => { diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/Menu-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/Menu-test.tsx index f11ac90ad01..45fa22ce757 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/Menu-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/Menu-test.tsx @@ -24,7 +24,7 @@ import SearchBox from '../../../../../../components/controls/SearchBox'; import { KeyboardKeys } from '../../../../../../helpers/keycodes'; import { mockPullRequest, - mockSetOfBranchAndPullRequest + mockSetOfBranchAndPullRequest, } from '../../../../../../helpers/mocks/branch-like'; import { mockComponent } from '../../../../../../helpers/mocks/component'; import { mockRouter } from '../../../../../../helpers/testMocks'; @@ -60,18 +60,15 @@ it('should change url and close menu when an element is selected', () => { const wrapper = shallowRender({ component, onClose, router }); - wrapper - .find(MenuItemList) - .props() - .onSelect(pr); + wrapper.find(MenuItemList).props().onSelect(pr); expect(onClose).toHaveBeenCalled(); expect(push).toHaveBeenCalledWith( expect.objectContaining({ search: queryToSearch({ id: component.key, - pullRequest: pr.key - }) + pullRequest: pr.key, + }), }) ); }); @@ -79,10 +76,7 @@ it('should change url and close menu when an element is selected', () => { it('should filter branchlike list correctly', () => { const wrapper = shallowRender(); - wrapper - .find(SearchBox) - .props() - .onChange('PR'); + wrapper.find(SearchBox).props().onChange('PR'); expect(wrapper.state().branchLikesToDisplay.length).toBe(3); }); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/MenuItemList-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/MenuItemList-test.tsx index 90bacadd703..9dffa5931db 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/MenuItemList-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/branch-like/__tests__/MenuItemList-test.tsx @@ -22,7 +22,7 @@ import * as React from 'react'; import { getBrancheLikesAsTree } from '../../../../../../helpers/branch-like'; import { mockPullRequest, - mockSetOfBranchAndPullRequest + mockSetOfBranchAndPullRequest, } from '../../../../../../helpers/mocks/branch-like'; import { mockComponent } from '../../../../../../helpers/mocks/component'; import { MenuItemList, MenuItemListProps } from '../MenuItemList'; @@ -35,7 +35,7 @@ it('should render correctly', () => { function shallowRender(props?: Partial) { const branchLikes = [ ...mockSetOfBranchAndPullRequest(), - mockPullRequest({ base: 'not-in-the-list' }) + mockPullRequest({ base: 'not-in-the-list' }), ]; const branchLikeTree = getBrancheLikesAsTree(branchLikes); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/DrawerLink.tsx b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/DrawerLink.tsx index fbcf1437de3..7a9cdea9d7f 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/DrawerLink.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/DrawerLink.tsx @@ -34,7 +34,8 @@ export function DrawerLink

      (props: DrawerLinkProps

      ) { className="display-flex-space-between bordered-bottom big-padded" onClick={() => props.onPageChange(to)} role="link" - tabIndex={0}> + tabIndex={0} + > {label} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/InfoDrawer.tsx b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/InfoDrawer.tsx index cc45d2574a5..d49f882d98e 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/InfoDrawer.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/InfoDrawer.tsx @@ -38,7 +38,8 @@ export default function InfoDrawer(props: InfoDrawerProps) { return (

      + style={{ top }} + > {displayed && ( <>
      diff --git a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/InfoDrawerPage.tsx b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/InfoDrawerPage.tsx index 26d210e5231..a13e8d12a23 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/InfoDrawerPage.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/InfoDrawerPage.tsx @@ -35,16 +35,18 @@ export default function InfoDrawerPage(props: InfoDrawerPageProps) { className={classNames( 'info-drawer-page info-drawer-pane display-flex-column overflow-hidden', { - open: displayed + open: displayed, } - )}> + )} + > {displayed && ( <> onPageChange()} role="link" - tabIndex={-1}> + tabIndex={-1} + > {translate('back')} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformation.tsx b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformation.tsx index 3010c8f5564..d5f8f321952 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformation.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformation.tsx @@ -49,7 +49,7 @@ interface State { export class ProjectInformation extends React.PureComponent { mounted = false; state: State = { - page: ProjectInformationPages.main + page: ProjectInformationPages.main, }; componentDidMount() { @@ -67,13 +67,13 @@ export class ProjectInformation extends React.PureComponent { loadMeasures = () => { const { - component: { key } + component: { key }, } = this.props; return getMeasures({ component: key, - metricKeys: [MetricKey.ncloc, MetricKey.projects].join() - }).then(measures => { + metricKeys: [MetricKey.ncloc, MetricKey.projects].join(), + }).then((measures) => { if (this.mounted) { this.setState({ measures }); } @@ -105,14 +105,16 @@ export class ProjectInformation extends React.PureComponent { {canUseBadges && ( + onPageChange={this.setPage} + > )} {canConfigureNotifications && ( + onPageChange={this.setPage} + > )} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformationPages.ts b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformationPages.ts index 3c89f91a4f2..484f9ca36e0 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformationPages.ts +++ b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformationPages.ts @@ -20,5 +20,5 @@ export enum ProjectInformationPages { main, badges, - notifications + notifications, } diff --git a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformationRenderer.tsx b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformationRenderer.tsx index 8402bd8e277..9d47545d798 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformationRenderer.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/ProjectInformationRenderer.tsx @@ -27,7 +27,7 @@ import { ComponentQualifier } from '../../../../../types/component'; import { Feature } from '../../../../../types/features'; import { Component, Measure } from '../../../../../types/types'; import withAvailableFeatures, { - WithAvailableFeaturesProps + WithAvailableFeaturesProps, } from '../../../available-features/withAvailableFeatures'; import DrawerLink from './DrawerLink'; import MetaKey from './meta/MetaKey'; @@ -144,7 +144,8 @@ export function ProjectInformationRenderer(props: ProjectInformationRendererProp branchLike={branchLike} onClose={onClose} /> - )}> + )} + > {({ onClick }) => ( {translate('regulatory_report.page')} )} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/__tests__/ProjectInformation-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/__tests__/ProjectInformation-test.tsx index b1006634dee..194de71df4c 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/__tests__/ProjectInformation-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/__tests__/ProjectInformation-test.tsx @@ -30,7 +30,7 @@ import { ProjectInformationPages } from '../ProjectInformationPages'; jest.mock('../../../../../../api/measures', () => { const { mockMeasure } = jest.requireActual('../../../../../../helpers/testMocks'); return { - getMeasures: jest.fn().mockResolvedValue([mockMeasure()]) + getMeasures: jest.fn().mockResolvedValue([mockMeasure()]), }; }); @@ -57,7 +57,7 @@ it('should handle page change', async () => { it('should display badge', () => { const wrapper = shallowRender({ - component: mockComponent({ qualifier: ComponentQualifier.Project }) + component: mockComponent({ qualifier: ComponentQualifier.Project }), }); expect(wrapper.find(ProjectBadges).type).toBeDefined(); @@ -72,7 +72,7 @@ function shallowRender(props: Partial = {}) { component={mockComponent()} currentUser={mockCurrentUser()} metrics={{ - coverage: mockMetric() + coverage: mockMetric(), }} onComponentChange={jest.fn()} {...props} diff --git a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/__tests__/ProjectInformationRenderer-test.tsx b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/__tests__/ProjectInformationRenderer-test.tsx index bec0684abee..40f09aa2e9c 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/__tests__/ProjectInformationRenderer-test.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/__tests__/ProjectInformationRenderer-test.tsx @@ -22,14 +22,14 @@ import * as React from 'react'; import { mockComponent } from '../../../../../../helpers/mocks/component'; import { ProjectInformationRenderer, - ProjectInformationRendererProps + ProjectInformationRendererProps, } from '../ProjectInformationRenderer'; jest.mock('react', () => { return { ...jest.requireActual('react'), - useEffect: jest.fn().mockImplementation(f => f()), - useRef: jest.fn().mockReturnValue(document.createElement('h2')) + useEffect: jest.fn().mockImplementation((f) => f()), + useRef: jest.fn().mockReturnValue(document.createElement('h2')), }; }); @@ -59,7 +59,7 @@ it('should render with description', () => { it('should handle missing quality profiles and quality gates', () => { expect( shallowRender({ - component: mockComponent({ qualityGate: undefined, qualityProfiles: undefined }) + component: mockComponent({ qualityGate: undefined, qualityProfiles: undefined }), }) ).toMatchSnapshot(); }); @@ -67,7 +67,7 @@ it('should handle missing quality profiles and quality gates', () => { it('should render app correctly when regulatoryReport feature is not enabled', () => { expect( shallowRender({ - hasFeature: jest.fn().mockReturnValue(false) + hasFeature: jest.fn().mockReturnValue(false), }) ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/badges/BadgeParams.tsx b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/badges/BadgeParams.tsx index d2a3fb1e650..b08792b91dc 100644 --- a/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/badges/BadgeParams.tsx +++ b/server/sonar-web/src/main/js/app/components/nav/component/projectInformation/badges/BadgeParams.tsx @@ -54,11 +54,11 @@ export class BadgeParams extends React.PureComponent { fetchBadgeMetrics() { fetchWebApi(false).then( - webservices => { + (webservices) => { if (this.mounted) { - const domain = webservices.find(d => d.path === 'api/project_badges'); - const ws = domain && domain.actions.find(w => w.key === 'measure'); - const param = ws && ws.params && ws.params.find(p => p.key === 'metric'); + const domain = webservices.find((d) => d.path === 'api/project_badges'); + const ws = domain && domain.actions.find((w) => w.key === 'measure'); + const param = ws && ws.params && ws.params.find((p) => p.key === 'metric'); if (param && param.possibleValues) { this.setState({ badgeMetrics: param.possibleValues }); } @@ -69,25 +69,25 @@ export class BadgeParams extends React.PureComponent { } getColorOptions = () => { - return ['white', 'black', 'orange'].map(color => ({ + return ['white', 'black', 'orange'].map((color) => ({ label: translate('overview.badges.options.colors', color), - value: color + value: color, })); }; getFormatOptions = () => { - return ['md', 'url'].map(format => ({ + return ['md', 'url'].map((format) => ({ label: translate('overview.badges.options.formats', format), - value: format as BadgeFormats + value: format as BadgeFormats, })); }; getMetricOptions = () => { - return this.state.badgeMetrics.map(key => { + return this.state.badgeMetrics.map((key) => { const metric = this.props.metrics[key]; return { value: key, - label: metric ? getLocalizedMetricName(metric) : key + label: metric ? getLocalizedMetricName(metric) : key, }; }); }; @@ -114,7 +114,7 @@ export class BadgeParams extends React.PureComponent { isSearchable={false} onChange={this.handleMetricChange} options={metricOptions} - value={metricOptions.find(o => o.value === options.metric)} + value={metricOptions.find((o) => o.value === options.metric)} /> ); @@ -131,9 +131,10 @@ export class BadgeParams extends React.PureComponent { {highlight(project.name, searchQuery, true)}}> + title={

      {highlight(project.name, searchQuery, true)}

      } + > {open && ( {/* The extra loading guard is to prevent the flash of the Alert */} @@ -110,21 +111,26 @@ export default function AzureProjectAccordion(props: AzureProjectAccordionProps) + search: queryToSearch({ + mode: CreateProjectModes.AzureDevOps, + resetPat: 1, + }), + }} + > {translate('onboarding.create_project.update_your_token')} - ) + ), }} /> ) : ( <>
      - {limitedRepositories.map(repo => ( + {limitedRepositories.map((repo) => (
      + key={repo.name} + > {repo.sqProjectKey ? ( <> @@ -143,7 +149,8 @@ export default function AzureProjectAccordion(props: AzureProjectAccordionProps) className="overflow-hidden" disabled={importing} onCheck={() => props.onSelectRepository(repo)} - value={repo.name}> + value={repo.name} + > {highlight(repo.name, searchQuery)} @@ -155,7 +162,7 @@ export default function AzureProjectAccordion(props: AzureProjectAccordionProps) setPage(p => p + 1)} + loadMore={() => setPage((p) => p + 1)} /> )} diff --git a/server/sonar-web/src/main/js/apps/create/project/AzureProjectCreate.tsx b/server/sonar-web/src/main/js/apps/create/project/AzureProjectCreate.tsx index 50144f74416..fb2ffd7920d 100644 --- a/server/sonar-web/src/main/js/apps/create/project/AzureProjectCreate.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/AzureProjectCreate.tsx @@ -24,7 +24,7 @@ import { getAzureRepositories, importAzureRepository, searchAzureRepositories, - setAlmPersonalAccessToken + setAlmPersonalAccessToken, } from '../../../api/alm-integrations'; import { Location, Router } from '../../../components/hoc/withRouter'; import { AzureProject, AzureRepository } from '../../../types/alm-integration'; @@ -70,7 +70,7 @@ export default class AzureProjectCreate extends React.PureComponent ({ - loadingRepositories: { ...loadingRepositories, [firstProjectName]: true } + loadingRepositories: { ...loadingRepositories, [firstProjectName]: true }, })); const repos = await this.fetchAzureRepositories(firstProjectName); @@ -128,7 +128,7 @@ export default class AzureProjectCreate extends React.PureComponent ({ - loadingRepositories: { ...loadingRepositories, [projectName]: true } + loadingRepositories: { ...loadingRepositories, [projectName]: true }, })); const projectRepos = await this.fetchAzureRepositories(projectName); this.setState(({ loadingRepositories, repositories }) => ({ loadingRepositories: { ...loadingRepositories, [projectName]: false }, - repositories: { ...repositories, [projectName]: projectRepos } + repositories: { ...repositories, [projectName]: projectRepos }, })); }; @@ -204,7 +204,7 @@ export default class AzureProjectCreate extends React.PureComponent + onClick={props.onImportRepository} + > {translate('onboarding.create_project.import_selected_repo')}
      @@ -124,7 +125,7 @@ export default function AzureProjectCreateRenderer(props: AzureProjectCreateRend {translate('settings.page')} - ) + ), }} /> ) : ( diff --git a/server/sonar-web/src/main/js/apps/create/project/AzureProjectsList.tsx b/server/sonar-web/src/main/js/apps/create/project/AzureProjectsList.tsx index 09e18f2efae..ff36f9e6887 100644 --- a/server/sonar-web/src/main/js/apps/create/project/AzureProjectsList.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/AzureProjectsList.tsx @@ -52,7 +52,7 @@ export default function AzureProjectsList(props: AzureProjectsListProps) { repositories, searchResults, searchQuery, - selectedRepository + selectedRepository, } = props; const [page, setPage] = React.useState(1); @@ -76,11 +76,12 @@ export default function AzureProjectsList(props: AzureProjectsListProps) { + search: queryToSearch({ mode: CreateProjectModes.AzureDevOps, resetPat: 1 }), + }} + > {translate('onboarding.create_project.update_your_token')} - ) + ), }} /> @@ -90,14 +91,14 @@ export default function AzureProjectsList(props: AzureProjectsListProps) { let filteredProjects: AzureProject[]; if (searchResults !== undefined) { filteredProjects = uniqBy( - searchResults.map(r => { + searchResults.map((r) => { return ( - projects.find(p => p.name === r.projectName) || { + projects.find((p) => p.name === r.projectName) || { name: r.projectName, description: translateWithParameters( 'onboarding.create_project.azure.search_results_for_project_X', r.projectName - ) + ), } ); }), @@ -125,7 +126,7 @@ export default function AzureProjectsList(props: AzureProjectsListProps) { project={p} repositories={ searchResults - ? searchResults.filter(s => s.projectName === p.name) + ? searchResults.filter((s) => s.projectName === p.name) : repositories[p.name] } selectedRepository={selectedRepository} @@ -136,7 +137,7 @@ export default function AzureProjectsList(props: AzureProjectsListProps) { setPage(p => p + 1)} + loadMore={() => setPage((p) => p + 1)} total={filteredProjects.length} />
      diff --git a/server/sonar-web/src/main/js/apps/create/project/BitbucketCloudProjectCreate.tsx b/server/sonar-web/src/main/js/apps/create/project/BitbucketCloudProjectCreate.tsx index 74fe4a49838..a091375ccad 100644 --- a/server/sonar-web/src/main/js/apps/create/project/BitbucketCloudProjectCreate.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/BitbucketCloudProjectCreate.tsx @@ -20,7 +20,7 @@ import * as React from 'react'; import { importBitbucketCloudRepository, - searchForBitbucketCloudRepositories + searchForBitbucketCloudRepositories, } from '../../../api/alm-integrations'; import { Location, Router } from '../../../components/hoc/withRouter'; import { BitbucketCloudRepository } from '../../../types/alm-integration'; @@ -68,7 +68,7 @@ export default class BitbucketCloudProjectCreate extends React.PureComponent ({ + this.setState((state) => ({ isLastPage, - repositories: [...state.repositories, ...repositories] + repositories: [...state.repositories, ...repositories], })); } else { this.setState({ isLastPage, repositories }); @@ -132,7 +132,7 @@ export default class BitbucketCloudProjectCreate extends React.PureComponent { await this.fetchData(); @@ -157,12 +157,12 @@ export default class BitbucketCloudProjectCreate extends React.PureComponent { this.setState( - state => ({ + (state) => ({ loadingMore: true, projectsPaging: { pageIndex: state.projectsPaging.pageIndex + 1, - pageSize: state.projectsPaging.pageSize - } + pageSize: state.projectsPaging.pageSize, + }, }), async () => { await this.fetchData(true); @@ -207,7 +207,7 @@ export default class BitbucketCloudProjectCreate extends React.PureComponent + search: queryToSearch({ mode: CreateProjectModes.BitbucketCloud, resetPat: 1 }), + }} + > {translate('onboarding.create_project.update_your_token')} - ) + ), }} /> @@ -99,7 +100,7 @@ export default function BitbucketCloudSearchForm(props: BitbucketCloudSearchForm ) : ( - {repositories.map(repository => ( + {repositories.map((repository) => ( @@ -145,7 +147,8 @@ export default function BitbucketCloudSearchForm(props: BitbucketCloudSearchForm disabled={Boolean(importingSlug)} onClick={() => { props.onImport(repository.slug); - }}> + }} + > {translate('onboarding.create_project.set_up')} {importingSlug === repository.slug && ( @@ -170,7 +173,8 @@ export default function BitbucketCloudSearchForm(props: BitbucketCloudSearchForm className="spacer-left" disabled={loadingMore} data-test="show-more" - onClick={props.onLoadMore}> + onClick={props.onLoadMore} + > {translate('show_more')} )} diff --git a/server/sonar-web/src/main/js/apps/create/project/BitbucketImportRepositoryForm.tsx b/server/sonar-web/src/main/js/apps/create/project/BitbucketImportRepositoryForm.tsx index 5434db6d159..295b27f5058 100644 --- a/server/sonar-web/src/main/js/apps/create/project/BitbucketImportRepositoryForm.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/BitbucketImportRepositoryForm.tsx @@ -27,7 +27,7 @@ import { queryToSearch } from '../../../helpers/urls'; import { BitbucketProject, BitbucketProjectRepositories, - BitbucketRepository + BitbucketRepository, } from '../../../types/alm-integration'; import BitbucketRepositories from './BitbucketRepositories'; import BitbucketSearchResults from './BitbucketSearchResults'; @@ -51,7 +51,7 @@ export default function BitbucketImportRepositoryForm(props: BitbucketImportRepo projectRepositories = {}, searchResults, searching, - selectedRepository + selectedRepository, } = props; if (projects.length === 0) { @@ -65,11 +65,12 @@ export default function BitbucketImportRepositoryForm(props: BitbucketImportRepo + search: queryToSearch({ mode: CreateProjectModes.BitbucketServer, resetPat: 1 }), + }} + > {translate('onboarding.create_project.update_your_token')} - ) + ), }} /> diff --git a/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectAccordion.tsx b/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectAccordion.tsx index 707f4d6415d..ebf4240cb8c 100644 --- a/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectAccordion.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectAccordion.tsx @@ -49,7 +49,7 @@ export default function BitbucketProjectAccordion(props: BitbucketProjectAccordi project, repositories, selectedRepository, - showingAllRepositories + showingAllRepositories, } = props; const repositoryCount = repositories.length; @@ -61,7 +61,7 @@ export default function BitbucketProjectAccordion(props: BitbucketProjectAccordi className={classNames('big-spacer-bottom', { open, 'not-clickable': !props.onClick, - 'no-hover': !props.onClick + 'no-hover': !props.onClick, })} onClick={ props.onClick @@ -71,7 +71,8 @@ export default function BitbucketProjectAccordion(props: BitbucketProjectAccordi } } open={open} - title={

      {title}

      }> + title={

      {title}

      } + > {open && ( <>
      @@ -87,22 +88,24 @@ export default function BitbucketProjectAccordion(props: BitbucketProjectAccordi pathname: '/projects/create', search: queryToSearch({ mode: CreateProjectModes.BitbucketServer, - resetPat: 1 - }) - }}> + resetPat: 1, + }), + }} + > {translate('onboarding.create_project.update_your_token')} - ) + ), }} /> )} - {repositories.map(repo => + {repositories.map((repo) => repo.sqProjectKey ? (
      + key={repo.id} + >
      @@ -119,12 +122,13 @@ export default function BitbucketProjectAccordion(props: BitbucketProjectAccordi className={classNames( 'display-flex-start spacer-right spacer-bottom create-project-import-bbs-repo overflow-hidden', { - disabled: disableRepositories + disabled: disableRepositories, } )} key={repo.id} onCheck={() => props.onSelectRepository(repo)} - value={String(repo.id)}> + value={String(repo.id)} + > {repo.name} diff --git a/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx b/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx index 5c56e0683c5..97b08aeed0d 100644 --- a/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx @@ -22,13 +22,13 @@ import { getBitbucketServerProjects, getBitbucketServerRepositories, importBitbucketServerProject, - searchForBitbucketServerRepositories + searchForBitbucketServerRepositories, } from '../../../api/alm-integrations'; import { Location, Router } from '../../../components/hoc/withRouter'; import { BitbucketProject, BitbucketProjectRepositories, - BitbucketRepository + BitbucketRepository, } from '../../../types/alm-integration'; import { AlmSettingsInstance } from '../../../types/alm-settings'; import BitbucketCreateProjectRenderer from './BitbucketProjectCreateRenderer'; @@ -67,7 +67,7 @@ export default class BitbucketProjectCreate extends React.PureComponent { + projects.map((p) => { return getBitbucketServerRepositories(bitbucketSetting.key, p.name).then( ({ isLastPage, repositories }) => { // Because the WS uses the project name rather than its key to find @@ -139,7 +139,7 @@ export default class BitbucketProjectCreate extends React.PureComponent r.projectKey === p.key); + const filteredRepositories = repositories.filter((r) => r.projectKey === p.key); // And because of the above, the "isLastPage" cannot be relied upon // either. This one is impossible to get 100% for now. We can only @@ -155,12 +155,12 @@ export default class BitbucketProjectCreate extends React.PureComponent { + ).then((results) => { return results.reduce( (acc: BitbucketProjectRepositories, { isLastPage, projectKey, repositories }) => { return { ...acc, [projectKey]: { allShown: isLastPage, repositories } }; @@ -249,7 +249,7 @@ export default class BitbucketProjectCreate extends React.PureComponent + onClick={props.onImportRepository} + > {translate('onboarding.create_project.import_selected_repo')}
      diff --git a/server/sonar-web/src/main/js/apps/create/project/BitbucketRepositories.tsx b/server/sonar-web/src/main/js/apps/create/project/BitbucketRepositories.tsx index ed686200500..47749f7c548 100644 --- a/server/sonar-web/src/main/js/apps/create/project/BitbucketRepositories.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/BitbucketRepositories.tsx @@ -24,7 +24,7 @@ import { translate } from '../../../helpers/l10n'; import { BitbucketProject, BitbucketProjectRepositories, - BitbucketRepository + BitbucketRepository, } from '../../../types/alm-integration'; import BitbucketProjectAccordion from './BitbucketProjectAccordion'; @@ -56,12 +56,13 @@ export default function BitbucketRepositories(props: BitbucketRepositoriesProps)
      setOpenProjectKeys(allAreExpanded ? [] : projects.map(p => p.key))}> + onClick={() => setOpenProjectKeys(allAreExpanded ? [] : projects.map((p) => p.key))} + > {allAreExpanded ? translate('collapse_all') : translate('expand_all')}
      - {projects.map(project => { + {projects.map((project) => { const isOpen = openProjectKeys.includes(project.key); const { allShown, repositories = [] } = projectRepositories[project.key] || {}; diff --git a/server/sonar-web/src/main/js/apps/create/project/BitbucketSearchResults.tsx b/server/sonar-web/src/main/js/apps/create/project/BitbucketSearchResults.tsx index 8edf6d88a90..53f321b3534 100644 --- a/server/sonar-web/src/main/js/apps/create/project/BitbucketSearchResults.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/BitbucketSearchResults.tsx @@ -39,7 +39,7 @@ export default function BitbucketSearchResults(props: BitbucketSearchResultsProp projects, searching, searchResults = [], - selectedRepository + selectedRepository, } = props; if (searchResults.length === 0 && !searching) { @@ -50,10 +50,12 @@ export default function BitbucketSearchResults(props: BitbucketSearchResultsProp ); } - const filteredProjects = projects.filter(p => searchResults.some(r => r.projectKey === p.key)); - const filteredProjectKeys = filteredProjects.map(p => p.key); + const filteredProjects = projects.filter((p) => + searchResults.some((r) => r.projectKey === p.key) + ); + const filteredProjectKeys = filteredProjects.map((p) => p.key); const filteredSearchResults = searchResults.filter( - r => !filteredProjectKeys.includes(r.projectKey) + (r) => !filteredProjectKeys.includes(r.projectKey) ); return ( @@ -70,8 +72,8 @@ export default function BitbucketSearchResults(props: BitbucketSearchResultsProp /> )} - {filteredProjects.map(project => { - const repositories = searchResults.filter(r => r.projectKey === project.key); + {filteredProjects.map((project) => { + const repositories = searchResults.filter((r) => r.projectKey === project.key); return ( 0; @@ -100,7 +100,8 @@ function renderAlmOption( )} disabled={disabled} onClick={onClick} - type="button"> + type="button" + > prev + cur); @@ -159,7 +160,8 @@ export function CreateProjectModeSelection(props: CreateProjectModeSelectionProp
      @@ -226,7 +230,7 @@ export default function GitHubProjectCreateRenderer(props: GitHubProjectCreateRe {translate('onboarding.create_project.github.warning.message_admin.link')} - ) + ), }} /> ) : ( @@ -260,7 +264,7 @@ export default function GitHubProjectCreateRenderer(props: GitHubProjectCreateRe 'onboarding.create_project.github.warning.message_admin.link' )} - ) + ), }} /> ) : ( diff --git a/server/sonar-web/src/main/js/apps/create/project/GitlabProjectCreate.tsx b/server/sonar-web/src/main/js/apps/create/project/GitlabProjectCreate.tsx index f1dab9ad7be..b51ade4a0e9 100644 --- a/server/sonar-web/src/main/js/apps/create/project/GitlabProjectCreate.tsx +++ b/server/sonar-web/src/main/js/apps/create/project/GitlabProjectCreate.tsx @@ -63,7 +63,7 @@ export default class GitlabProjectCreate extends React.PureComponent ({ loadingMore: false, projects: result ? [...projects, ...result.projects] : projects, - projectsPaging: result ? result.projectsPaging : projectsPaging + projectsPaging: result ? result.projectsPaging : projectsPaging, })); } }; @@ -191,7 +191,7 @@ export default class GitlabProjectCreate extends React.PureComponent ({ searching: false, projects: result ? result.projects : projects, - projectsPaging: result ? result.projectsPaging : projectsPaging + projectsPaging: result ? result.projectsPaging : projectsPaging, })); } }; @@ -220,7 +220,7 @@ export default class GitlabProjectCreate extends React.PureComponent + search: queryToSearch({ mode: CreateProjectModes.GitLab, resetPat: 1 }), + }} + > {translate('onboarding.create_project.update_your_token')} - ) + ), }} /> @@ -96,7 +97,7 @@ export default function GitlabProjectSelectionForm(props: GitlabProjectSelection ) : (
      @@ -128,7 +129,8 @@ export default function BitbucketCloudSearchForm(props: BitbucketCloudSearchForm + target="_blank" + > {translate('onboarding.create_project.bitbucketcloud.link')}
      - {projects.map(project => ( + {projects.map((project) => ( @@ -140,7 +142,8 @@ export default function GitlabProjectSelectionForm(props: GitlabProjectSelection )} - {sortBy(props.groups, group => group.name.toLowerCase()).map(group => ( + {sortBy(props.groups, (group) => group.name.toLowerCase()).map((group) => ( props.onDelete(group)}> + onClick={() => props.onDelete(group)} + > {translate('delete')} diff --git a/server/sonar-web/src/main/js/apps/groups/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/groups/components/__tests__/App-test.tsx index 31fe6ef3cf1..7e5d25d83f5 100644 --- a/server/sonar-web/src/main/js/apps/groups/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/groups/components/__tests__/App-test.tsx @@ -23,7 +23,7 @@ import { createGroup, deleteGroup, searchUsersGroups, - updateGroup + updateGroup, } from '../../../../api/user_groups'; import { mockGroup } from '../../../../helpers/testMocks'; import { waitAndUpdate } from '../../../../helpers/testUtils'; @@ -35,7 +35,7 @@ jest.mock('../../../../api/user_groups', () => ({ description: 'Desc foo', id: 3, membersCount: 0, - name: 'Foo' + name: 'Foo', }), deleteGroup: jest.fn().mockResolvedValue({}), searchUsersGroups: jest.fn().mockResolvedValue({ @@ -46,18 +46,18 @@ jest.mock('../../../../api/user_groups', () => ({ description: 'Owners of organization foo', id: 1, membersCount: 1, - name: 'Owners' + name: 'Owners', }, { default: true, description: 'Members of organization foo', id: 2, membersCount: 2, - name: 'Members' - } - ] + name: 'Members', + }, + ], }), - updateGroup: jest.fn().mockResolvedValue({}) + updateGroup: jest.fn().mockResolvedValue({}), })); beforeEach(() => { @@ -112,7 +112,7 @@ it('should correctly handle edition', async () => { description: 'foo', id: 1, membersCount: 1, - name: 'bar' + name: 'bar', }); }); diff --git a/server/sonar-web/src/main/js/apps/groups/components/__tests__/EditMembersModal-test.tsx b/server/sonar-web/src/main/js/apps/groups/components/__tests__/EditMembersModal-test.tsx index 0cd013f7572..5c60f04477c 100644 --- a/server/sonar-web/src/main/js/apps/groups/components/__tests__/EditMembersModal-test.tsx +++ b/server/sonar-web/src/main/js/apps/groups/components/__tests__/EditMembersModal-test.tsx @@ -33,12 +33,12 @@ jest.mock('../../../../api/user_groups', () => ({ { login: 'foo', name: 'bar', - selected: true - } - ] + selected: true, + }, + ], }), addUserToGroup: jest.fn().mockResolvedValue({}), - removeUserFromGroup: jest.fn().mockResolvedValue({}) + removeUserFromGroup: jest.fn().mockResolvedValue({}), })); beforeEach(() => { @@ -47,15 +47,12 @@ beforeEach(() => { it('should render modal properly', async () => { const wrapper = shallowRender(); - wrapper - .find(SelectList) - .props() - .onSearch({ - query: '', - filter: SelectListFilter.Selected, - page: 1, - pageSize: 100 - }); + wrapper.find(SelectList).props().onSearch({ + query: '', + filter: SelectListFilter.Selected, + page: 1, + pageSize: 100, + }); await waitAndUpdate(wrapper); expect(wrapper.state().needToReload).toBe(false); @@ -70,7 +67,7 @@ it('should render modal properly', async () => { p: 1, ps: 100, q: undefined, - selected: SelectListFilter.Selected + selected: SelectListFilter.Selected, }) ); @@ -86,7 +83,7 @@ it('should handle selection properly', async () => { expect(addUserToGroup).toHaveBeenCalledWith( expect.objectContaining({ name: group.name, - login: 'toto' + login: 'toto', }) ); expect(wrapper.state().needToReload).toBe(true); @@ -100,7 +97,7 @@ it('should handle deselection properly', async () => { expect(removeUserFromGroup).toHaveBeenCalledWith( expect.objectContaining({ name: group.name, - login: 'tata' + login: 'tata', }) ); expect(wrapper.state().needToReload).toBe(true); diff --git a/server/sonar-web/src/main/js/apps/groups/components/__tests__/List-test.tsx b/server/sonar-web/src/main/js/apps/groups/components/__tests__/List-test.tsx index c5e8c25de54..50c9720a1c0 100644 --- a/server/sonar-web/src/main/js/apps/groups/components/__tests__/List-test.tsx +++ b/server/sonar-web/src/main/js/apps/groups/components/__tests__/List-test.tsx @@ -26,18 +26,14 @@ it('should render', () => { }); it('should not render "Anyone"', () => { - expect( - shallowRender(false) - .find('.js-anyone') - .exists() - ).toBe(false); + expect(shallowRender(false).find('.js-anyone').exists()).toBe(false); }); function shallowRender(showAnyone = true) { const groups = [ { id: 1, name: 'sonar-users', description: '', membersCount: 55, default: true }, { id: 2, name: 'foo', description: 'foobar', membersCount: 0, default: false }, - { id: 3, name: 'bar', description: 'barbar', membersCount: 1, default: false } + { id: 3, name: 'bar', description: 'barbar', membersCount: 1, default: false }, ]; return shallow( { expect( issueBoxFixThat.getByRole('button', { - name: 'issue.type.type_x_click_to_change.issue.type.CODE_SMELL' + name: 'issue.type.type_x_click_to_change.issue.type.CODE_SMELL', }) ).toBeInTheDocument(); @@ -78,13 +78,13 @@ it('should be able to bulk change', async () => { expect(screen.getByRole('button', { name: 'apply' })).toBeDisabled(); await selectEvent.select(screen.getByRole('textbox', { name: 'issue.set_type' }), [ - 'issue.type.BUG' + 'issue.type.BUG', ]); await user.click(screen.getByRole('button', { name: 'apply' })); expect( issueBoxFixThat.getByRole('button', { - name: 'issue.type.type_x_click_to_change.issue.type.BUG' + name: 'issue.type.type_x_click_to_change.issue.type.BUG', }) ).toBeInTheDocument(); }); @@ -239,7 +239,7 @@ it('should open issue and navigate', async () => { expect(screen.getByRole('region', { name: 'Issue on file' })).toBeInTheDocument(); expect( screen.getByRole('row', { - name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;' + name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;', }) ).toBeInTheDocument(); }); @@ -282,12 +282,12 @@ it('should be able to perform action on issues', async () => { // changing issue type expect( screen.getByRole('button', { - name: `issue.type.type_x_click_to_change.issue.type.CODE_SMELL` + name: `issue.type.type_x_click_to_change.issue.type.CODE_SMELL`, }) ).toBeInTheDocument(); await user.click( screen.getByRole('button', { - name: `issue.type.type_x_click_to_change.issue.type.CODE_SMELL` + name: `issue.type.type_x_click_to_change.issue.type.CODE_SMELL`, }) ); expect(screen.getByText('issue.type.BUG')).toBeInTheDocument(); @@ -296,7 +296,7 @@ it('should be able to perform action on issues', async () => { await user.click(screen.getByText('issue.type.VULNERABILITY')); expect( screen.getByRole('button', { - name: `issue.type.type_x_click_to_change.issue.type.VULNERABILITY` + name: `issue.type.type_x_click_to_change.issue.type.VULNERABILITY`, }) ).toBeInTheDocument(); @@ -305,7 +305,7 @@ it('should be able to perform action on issues', async () => { await user.click( screen.getByRole('button', { - name: `issue.severity.severity_x_click_to_change.severity.MAJOR` + name: `issue.severity.severity_x_click_to_change.severity.MAJOR`, }) ); expect(screen.getByText('severity.MINOR')).toBeInTheDocument(); @@ -313,7 +313,7 @@ it('should be able to perform action on issues', async () => { await user.click(screen.getByText('severity.MINOR')); expect( screen.getByRole('button', { - name: `issue.severity.severity_x_click_to_change.severity.MINOR` + name: `issue.severity.severity_x_click_to_change.severity.MINOR`, }) ).toBeInTheDocument(); @@ -327,7 +327,7 @@ it('should be able to perform action on issues', async () => { await user.click(screen.getByText('issue.transition.confirm')); expect( screen.getByRole('button', { - name: `issue.transition.status_x_click_to_change.issue.status.CONFIRMED` + name: `issue.transition.status_x_click_to_change.issue.status.CONFIRMED`, }) ).toBeInTheDocument(); @@ -343,13 +343,13 @@ it('should be able to perform action on issues', async () => { // assigning issue to a different user expect( screen.getByRole('button', { - name: `issue.assign.unassigned_click_to_assign` + name: `issue.assign.unassigned_click_to_assign`, }) ).toBeInTheDocument(); await user.click( screen.getByRole('button', { - name: `issue.assign.unassigned_click_to_assign` + name: `issue.assign.unassigned_click_to_assign`, }) ); expect(screen.getByRole('searchbox', { name: 'search_verb' })).toBeInTheDocument(); @@ -363,13 +363,13 @@ it('should be able to perform action on issues', async () => { // adding comment to the issue expect( screen.getByRole('button', { - name: `issue.comment.add_comment` + name: `issue.comment.add_comment`, }) ).toBeInTheDocument(); await user.click( screen.getByRole('button', { - name: `issue.comment.add_comment` + name: `issue.comment.add_comment`, }) ); expect(screen.getByText('issue.comment.submit')).toBeInTheDocument(); @@ -438,29 +438,29 @@ it('should not allow performing actions when user does not have permission', asy expect( screen.queryByRole('button', { - name: `issue.assign.unassigned_click_to_assign` + name: `issue.assign.unassigned_click_to_assign`, }) ).not.toBeInTheDocument(); expect( screen.queryByRole('button', { - name: `issue.type.type_x_click_to_change.issue.type.CODE_SMELL` + name: `issue.type.type_x_click_to_change.issue.type.CODE_SMELL`, }) ).not.toBeInTheDocument(); await user.click( screen.getByRole('button', { - name: `issue.comment.add_comment` + name: `issue.comment.add_comment`, }) ); expect(screen.queryByRole('button', { name: 'issue.comment.submit' })).not.toBeInTheDocument(); expect( screen.queryByRole('button', { - name: `issue.transition.status_x_click_to_change.issue.status.OPEN` + name: `issue.transition.status_x_click_to_change.issue.status.OPEN`, }) ).not.toBeInTheDocument(); expect( screen.queryByRole('button', { - name: `issue.severity.severity_x_click_to_change.severity.MAJOR` + name: `issue.severity.severity_x_click_to_change.severity.MAJOR`, }) ).not.toBeInTheDocument(); }); @@ -535,14 +535,14 @@ it('should show code tabs when any secondary location is selected', async () => ); expect( screen.queryByRole('row', { - name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;' + name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;', }) ).not.toBeInTheDocument(); await user.click(screen.getByRole('button', { name: '1 location 1' })); expect( screen.getByRole('row', { - name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;' + name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;', }) ).toBeInTheDocument(); @@ -552,14 +552,14 @@ it('should show code tabs when any secondary location is selected', async () => ); expect( screen.queryByRole('row', { - name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;' + name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;', }) ).not.toBeInTheDocument(); await user.click(screen.getByRole('button', { name: '1 location 1' })); expect( screen.getByRole('row', { - name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;' + name: '2 source_viewer.tooltip.covered import java.util. ArrayList ;', }) ).toBeInTheDocument(); }); @@ -574,7 +574,7 @@ it('should show issue tags if applicable', async () => { expect( screen.getByRole('heading', { - name: 'Issue with tags sonar-lint-icon issue.resolution.badge.DEPRECATED' + name: 'Issue with tags sonar-lint-icon issue.resolution.badge.DEPRECATED', }) ).toBeInTheDocument(); }); diff --git a/server/sonar-web/src/main/js/apps/issues/__tests__/actions-test.ts b/server/sonar-web/src/main/js/apps/issues/__tests__/actions-test.ts index 1a5b23ef3f2..aade2bdba87 100644 --- a/server/sonar-web/src/main/js/apps/issues/__tests__/actions-test.ts +++ b/server/sonar-web/src/main/js/apps/issues/__tests__/actions-test.ts @@ -26,7 +26,7 @@ describe('selectFlow', () => { expect(selectFlow(5)()).toEqual({ locationsNavigator: true, selectedFlowIndex: 5, - selectedLocationIndex: undefined + selectedLocationIndex: undefined, }); }); }); @@ -38,13 +38,13 @@ describe('enableLocationsNavigator', () => { ).toEqual( expect.objectContaining({ locationsNavigator: true, - selectedFlowIndex: 20 + selectedFlowIndex: 20, }) ); expect(enableLocationsNavigator({ openIssue: mockIssue(true) } as State)).toEqual( expect.objectContaining({ locationsNavigator: true, - selectedFlowIndex: 0 + selectedFlowIndex: 0, }) ); expect( @@ -52,7 +52,7 @@ describe('enableLocationsNavigator', () => { ).toEqual( expect.objectContaining({ locationsNavigator: true, - selectedFlowIndex: undefined + selectedFlowIndex: undefined, }) ); }); @@ -61,7 +61,7 @@ describe('enableLocationsNavigator', () => { expect(enableLocationsNavigator({ openIssue: mockIssue(true) } as State)).toEqual( expect.objectContaining({ locationsNavigator: true, - selectedLocationIndex: undefined + selectedLocationIndex: undefined, }) ); @@ -70,7 +70,7 @@ describe('enableLocationsNavigator', () => { ).toEqual( expect.objectContaining({ locationsNavigator: true, - selectedLocationIndex: 0 + selectedLocationIndex: 0, }) ); @@ -79,7 +79,7 @@ describe('enableLocationsNavigator', () => { ).toEqual( expect.objectContaining({ locationsNavigator: true, - selectedLocationIndex: 20 + selectedLocationIndex: 20, }) ); }); @@ -88,7 +88,7 @@ describe('enableLocationsNavigator', () => { expect(enableLocationsNavigator({ openIssue: mockIssue() } as State)).toBeNull(); expect( enableLocationsNavigator({ - openIssue: mockIssue(true, { flows: [], secondaryLocations: [] }) + openIssue: mockIssue(true, { flows: [], secondaryLocations: [] }), } as State) ).toBeNull(); }); diff --git a/server/sonar-web/src/main/js/apps/issues/__tests__/utils-test.ts b/server/sonar-web/src/main/js/apps/issues/__tests__/utils-test.ts index 3b2c8a7c5dc..74db752161e 100644 --- a/server/sonar-web/src/main/js/apps/issues/__tests__/utils-test.ts +++ b/server/sonar-web/src/main/js/apps/issues/__tests__/utils-test.ts @@ -22,11 +22,11 @@ import { serializeQuery, shouldOpenSonarSourceSecurityFacet, shouldOpenStandardsChildFacet, - shouldOpenStandardsFacet + shouldOpenStandardsFacet, } from '../utils'; jest.mock('../../../helpers/scrolling', () => ({ - scrollToElement: jest.fn() + scrollToElement: jest.fn(), })); beforeEach(() => { @@ -67,7 +67,7 @@ describe('serialize/deserialize', () => { sonarsourceSecurity: ['a', 'b'], statuses: ['a', 'b'], tags: ['a', 'b'], - types: ['a', 'b'] + types: ['a', 'b'], }) ).toStrictEqual({ assignees: 'a,b', @@ -98,7 +98,7 @@ describe('serialize/deserialize', () => { sonarsourceSecurity: 'a,b', statuses: 'a,b', tags: 'a,b', - types: 'a,b' + types: 'a,b', }); }); }); diff --git a/server/sonar-web/src/main/js/apps/issues/actions.ts b/server/sonar-web/src/main/js/apps/issues/actions.ts index 86077870ebe..6132db4d2e3 100644 --- a/server/sonar-web/src/main/js/apps/issues/actions.ts +++ b/server/sonar-web/src/main/js/apps/issues/actions.ts @@ -31,7 +31,7 @@ export function enableLocationsNavigator(state: State) { selectedFlowIndex, // Also reset index = -1 to 0, we don't want to start on the issue when enabling the location navigator selectedLocationIndex: - selectedLocationIndex && selectedLocationIndex < 0 ? 0 : selectedLocationIndex + selectedLocationIndex && selectedLocationIndex < 0 ? 0 : selectedLocationIndex, }; } return null; @@ -55,7 +55,7 @@ export function selectNextLocation( } return { selectedLocationIndex: index !== undefined && index < lastLocationIdx ? index + 1 : index, - locationsNavigator: true + locationsNavigator: true, }; } return null; @@ -71,7 +71,7 @@ export function selectPreviousLocation(state: State) { } return { selectedLocationIndex: index !== undefined && index > 0 ? index - 1 : index, - locationsNavigator: true + locationsNavigator: true, }; } return null; @@ -82,7 +82,7 @@ export function selectFlow(nextIndex?: number) { return { locationsNavigator: true, selectedFlowIndex: nextIndex, - selectedLocationIndex: undefined + selectedLocationIndex: undefined, }; }; } @@ -99,7 +99,7 @@ export function selectNextFlow(state: State) { return { selectedFlowIndex: selectedFlowIndex + 1, selectedLocationIndex: 0, - locationsNavigator: true + locationsNavigator: true, }; } else if ( openIssue && @@ -117,7 +117,7 @@ export function selectPreviousFlow(state: State) { return { selectedFlowIndex: selectedFlowIndex - 1, selectedLocationIndex: 0, - locationsNavigator: true + locationsNavigator: true, }; } return null; diff --git a/server/sonar-web/src/main/js/apps/issues/components/AssigneeSelect.tsx b/server/sonar-web/src/main/js/apps/issues/components/AssigneeSelect.tsx index 780fd24494a..cdb7fb3c7d0 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/AssigneeSelect.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/AssigneeSelect.tsx @@ -58,17 +58,17 @@ export default class AssigneeSelect extends React.Component if (isLoggedIn(currentUser)) { const canBeAssignedToMe = - issues.filter(issue => issue.assignee !== currentUser.login).length > 0; + issues.filter((issue) => issue.assignee !== currentUser.login).length > 0; if (canBeAssignedToMe) { options.push({ avatar: currentUser.avatar, label: currentUser.name, - value: currentUser.login + value: currentUser.login, }); } } - const canBeUnassigned = issues.filter(issue => issue.assignee).length > 0; + const canBeUnassigned = issues.filter((issue) => issue.assignee).length > 0; if (canBeUnassigned) { options.push({ label: translate('unassigned'), value: '' }); } @@ -84,13 +84,13 @@ export default class AssigneeSelect extends React.Component searchAssignees(query) .then(({ results }) => - results.map(r => { + results.map((r) => { const userInfo = r.name || r.login; return { avatar: r.avatar, label: isUserActive(r) ? userInfo : translateWithParameters('user.x_deleted', userInfo), - value: r.login + value: r.login, }; }) ) @@ -125,7 +125,7 @@ export default class AssigneeSelect extends React.Component inputId={inputId} components={{ Option: this.renderAssigneeOption, - SingleValue: this.renderSingleAssignee + SingleValue: this.renderSingleAssignee, }} isClearable={true} defaultOptions={this.getDefaultAssignee()} diff --git a/server/sonar-web/src/main/js/apps/issues/components/BulkChangeModal.tsx b/server/sonar-web/src/main/js/apps/issues/components/BulkChangeModal.tsx index b40ad4a4043..e1c814765b0 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/BulkChangeModal.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/BulkChangeModal.tsx @@ -31,7 +31,7 @@ import Radio from '../../../components/controls/Radio'; import Select, { BasicSelectOption, CreatableSelect, - SearchSelect + SearchSelect, } from '../../../components/controls/Select'; import Tooltip from '../../../components/controls/Tooltip'; import IssueTypeIcon from '../../../components/icons/IssueTypeIcon'; @@ -85,7 +85,7 @@ enum InputField { assignee = 'assignee', removeTags = 'removeTags', severity = 'severity', - type = 'type' + type = 'type', } export const MAX_PAGE_SIZE = 500; @@ -111,10 +111,10 @@ export default class BulkChangeModal extends React.PureComponent { } this.setState({ - initialTags: tags.map(tag => ({ label: tag, value: tag })), + initialTags: tags.map((tag) => ({ label: tag, value: tag })), issues, loading: false, - paging + paging, }); } }, @@ -136,16 +136,15 @@ export default class BulkChangeModal extends React.PureComponent { handleTagsSearch = (query: string, resolve: (option: TagOption[]) => void) => { searchIssueTags({ q: query }) - .then(tags => tags.map(tag => ({ label: tag, value: tag }))) + .then((tags) => tags.map((tag) => ({ label: tag, value: tag }))) .then(resolve) .catch(() => resolve([])); }; - handleTagsSelect = (field: InputField.addTags | InputField.removeTags) => ( - options: TagOption[] - ) => { - this.setState({ [field]: options }); - }; + handleTagsSelect = + (field: InputField.addTags | InputField.removeTags) => (options: TagOption[]) => { + this.setState({ [field]: options }); + }; handleFieldCheck = (field: keyof FormFields) => (checked: boolean) => { if (!checked) { @@ -176,19 +175,19 @@ export default class BulkChangeModal extends React.PureComponent { const query = pickBy( { - add_tags: this.state.addTags && this.state.addTags.map(t => t.value).join(), + add_tags: this.state.addTags && this.state.addTags.map((t) => t.value).join(), assign: this.state.assignee ? this.state.assignee.value : null, comment: this.state.comment, do_transition: this.state.transition, - remove_tags: this.state.removeTags && this.state.removeTags.map(t => t.value).join(), + remove_tags: this.state.removeTags && this.state.removeTags.map((t) => t.value).join(), sendNotifications: this.state.notifications, set_severity: this.state.severity, - set_type: this.state.type + set_type: this.state.type, }, - x => x !== undefined + (x) => x !== undefined ); - const issueKeys = this.state.issues.map(issue => issue.key); + const issueKeys = this.state.issues.map((issue) => issue.key); this.setState({ submitting: true }); bulkChangeIssues(issueKeys, query).then( @@ -196,7 +195,7 @@ export default class BulkChangeModal extends React.PureComponent { this.setState({ submitting: false }); this.props.onDone(); }, - error => { + (error) => { this.setState({ submitting: false }); throwGlobalError(error); } @@ -205,9 +204,9 @@ export default class BulkChangeModal extends React.PureComponent { getAvailableTransitions(issues: Issue[]) { const transitions: Dict = {}; - issues.forEach(issue => { + issues.forEach((issue) => { if (issue.transitions) { - issue.transitions.forEach(t => { + issue.transitions.forEach((t) => { if (transitions[t] !== undefined) { transitions[t]++; } else { @@ -216,9 +215,9 @@ export default class BulkChangeModal extends React.PureComponent { }); } }); - return sortBy(Object.keys(transitions)).map(transition => ({ + return sortBy(Object.keys(transitions)).map((transition) => ({ transition, - count: transitions[transition] + count: transitions[transition], })); } @@ -305,9 +304,9 @@ export default class BulkChangeModal extends React.PureComponent { } const types: IssueType[] = ['BUG', 'VULNERABILITY', 'CODE_SMELL']; - const options: BasicSelectOption[] = types.map(type => ({ + const options: BasicSelectOption[] = types.map((type) => ({ label: translate('issue.type', type), - value: type + value: type, })); const typeRenderer = (option: BasicSelectOption) => ( @@ -329,7 +328,7 @@ export default class BulkChangeModal extends React.PureComponent { ), SingleValue: (props: SingleValueProps) => ( {typeRenderer(props.data)} - ) + ), }} onChange={this.handleSelectFieldChange('type')} options={options} @@ -348,9 +347,9 @@ export default class BulkChangeModal extends React.PureComponent { } const severities = ['BLOCKER', 'CRITICAL', 'MAJOR', 'MINOR', 'INFO']; - const options: BasicSelectOption[] = severities.map(severity => ({ + const options: BasicSelectOption[] = severities.map((severity) => ({ label: translate('severity', severity), - value: severity + value: severity, })); const input = ( @@ -370,7 +369,7 @@ export default class BulkChangeModal extends React.PureComponent { {} - ) + ), }} options={options} /> @@ -398,7 +397,7 @@ export default class BulkChangeModal extends React.PureComponent { defaultOptions: this.state.initialTags, isMulti: true, onChange: this.handleTagsSelect(field), - loadOptions: this.handleTagsSearch + loadOptions: this.handleTagsSearch, }; const input = allowCreate ? ( @@ -421,14 +420,16 @@ export default class BulkChangeModal extends React.PureComponent {
      {translate('issue.transition')} - {transitions.map(transition => ( + {transitions.map((transition) => ( + key={transition.transition} + > + value={transition.transition} + > {translate('issue.transition', transition.transition)} {this.renderAffected(transition.count)} @@ -472,7 +473,8 @@ export default class BulkChangeModal extends React.PureComponent { className="display-inline-block spacer-top" id="send-notifications" onCheck={this.handleFieldCheck('notifications')} - right={true}> + right={true} + > {translate('issue.send_notifications')} ); @@ -518,7 +520,8 @@ export default class BulkChangeModal extends React.PureComponent { + id="bulk-change-submit" + > {translate('apply')} diff --git a/server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx b/server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx index 12391f0f991..09b792dd4a0 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/ComponentBreadcrumbs.tsx @@ -37,7 +37,7 @@ export default function ComponentBreadcrumbs({ component, issue, selectedFlowIndex, - selectedLocationIndex + selectedLocationIndex, }: Props) { const displayProject = !component || @@ -49,7 +49,7 @@ export default function ComponentBreadcrumbs({ const selectedLocation = getSelectedLocation(issue, selectedFlowIndex, selectedLocationIndex); const componentName = selectedLocation ? selectedLocation.componentName : issue.componentLongName; - const projectName = [issue.projectName, issue.branch].filter(s => !!s).join(' - '); + const projectName = [issue.projectName, issue.branch].filter((s) => !!s).join(' - '); return (
      + className="component-name text-ellipsis" + > {displayProject && ( diff --git a/server/sonar-web/src/main/js/apps/issues/components/IssueHeader.tsx b/server/sonar-web/src/main/js/apps/issues/components/IssueHeader.tsx index c2573472526..243ac925d1d 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/IssueHeader.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/IssueHeader.tsx @@ -120,14 +120,14 @@ export default class IssueHeader extends React.PureComponent { const { issue, ruleDetails: { key, name }, - branchLike + branchLike, } = this.props; const { issuePopupName } = this.state; const issueUrl = getComponentIssuesUrl(issue.project, { ...getBranchLikeQuery(branchLike), issues: issue.key, open: issue.key, - types: issue.type === 'SECURITY_HOTSPOT' ? issue.type : undefined + types: issue.type === 'SECURITY_HOTSPOT' ? issue.type : undefined, }); const ruleStatus = issue.ruleStatus as RuleStatus | undefined; const { quickFixAvailable } = issue; @@ -148,7 +148,8 @@ export default class IssueHeader extends React.PureComponent { className="js-issue-permalink link-no-underline" target="_blank" title={translate('permalink')} - to={issueUrl}> + to={issueUrl} + > {translate('issue.action.permalink')} diff --git a/server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx b/server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx index 4c9aee53cec..ec9ef204ef6 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/IssuesApp.tsx @@ -49,7 +49,7 @@ import { fillBranchLike, getBranchLikeQuery, isPullRequest, - isSameBranchLike + isSameBranchLike, } from '../../../helpers/branch-like'; import handleRequiredAuthentication from '../../../helpers/handleRequiredAuthentication'; import { parseIssueFromResponse } from '../../../helpers/issues'; @@ -60,7 +60,7 @@ import { addSideBarClass, addWhitePageClass, removeSideBarClass, - removeWhitePageClass + removeWhitePageClass, } from '../../../helpers/pages'; import { serializeDate } from '../../../helpers/query'; import { BranchLike } from '../../../types/branch-like'; @@ -70,7 +70,7 @@ import { FetchIssuesPromise, ReferencedComponent, ReferencedLanguage, - ReferencedRule + ReferencedRule, } from '../../../types/issues'; import { SecurityStandard } from '../../../types/security'; import { Component, Dict, Issue, Paging, RawQuery, RuleDetails } from '../../../types/types'; @@ -93,7 +93,7 @@ import { shouldOpenSonarSourceSecurityFacet, shouldOpenStandardsChildFacet, shouldOpenStandardsFacet, - STANDARDS + STANDARDS, } from '../utils'; import BulkChangeModal, { MAX_PAGE_SIZE } from './BulkChangeModal'; import IssueHeader from './IssueHeader'; @@ -176,7 +176,7 @@ export class App extends React.PureComponent { severities: true, sonarsourceSecurity: shouldOpenSonarSourceSecurityFacet({}, query), standards: shouldOpenStandardsFacet({}, query), - types: true + types: true, }, query, referencedComponentsById: {}, @@ -184,20 +184,20 @@ export class App extends React.PureComponent { referencedLanguages: {}, referencedRules: {}, referencedUsers: {}, - selected: getOpen(props.location.query) + selected: getOpen(props.location.query), }; this.refreshBranchStatus = debounce(this.refreshBranchStatus, BRANCH_STATUS_REFRESH_INTERVAL); } static getDerivedStateFromProps(props: Props, state: State) { const { - location: { query } + location: { query }, } = props; return { myIssues: areMyIssuesSelected(query), query: parseQuery(query), - openIssue: getOpenIssue(props, state.issues) + openIssue: getOpenIssue(props, state.issues), }; } @@ -233,7 +233,7 @@ export class App extends React.PureComponent { locationsNavigator: true, selected: openIssue.key, selectedFlowIndex: 0, - selectedLocationIndex: undefined + selectedLocationIndex: undefined, }); } if (this.state.openIssue && this.state.openIssue.key !== prevState.openIssue?.key) { @@ -322,7 +322,7 @@ export class App extends React.PureComponent { getSelectedIndex() { const { issues = [], selected } = this.state; - const index = issues.findIndex(issue => issue.key === selected); + const index = issues.findIndex((issue) => issue.key === selected); return index !== -1 ? index : undefined; } @@ -336,7 +336,7 @@ export class App extends React.PureComponent { this.setState({ selected: issues[selectedIndex + 1].key, selectedFlowIndex: undefined, - selectedLocationIndex: undefined + selectedLocationIndex: undefined, }); } } @@ -349,7 +349,7 @@ export class App extends React.PureComponent { } this.setState({ loadingRule: true }); const openRuleDetails = await getRuleDetails({ key: openIssue.rule }) - .then(response => response.rule) + .then((response) => response.rule) .catch(() => undefined); if (this.mounted) { this.setState({ loadingRule: false, openRuleDetails }); @@ -366,7 +366,7 @@ export class App extends React.PureComponent { this.setState({ selected: issues[selectedIndex - 1].key, selectedFlowIndex: undefined, - selectedLocationIndex: undefined + selectedLocationIndex: undefined, }); } } @@ -380,15 +380,15 @@ export class App extends React.PureComponent { ...getBranchLikeQuery(this.props.branchLike), id: this.props.component && this.props.component.key, myIssues: this.state.myIssues ? 'true' : undefined, - open: issueKey - } + open: issueKey, + }, }; if (this.state.openIssue) { if (path.query.open && path.query.open === this.state.openIssue.key) { this.setState({ locationsNavigator: false, selectedFlowIndex: undefined, - selectedLocationIndex: undefined + selectedLocationIndex: undefined, }); } else { this.props.router.replace(path); @@ -407,8 +407,8 @@ export class App extends React.PureComponent { ...getBranchLikeQuery(this.props.branchLike), id: this.props.component && this.props.component.key, myIssues: this.state.myIssues ? 'true' : undefined, - open: undefined - } + open: undefined, + }, }); } }; @@ -426,9 +426,9 @@ export class App extends React.PureComponent { return searchIssues({ ...query, additionalFields: '_all', - timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone - }).then(response => { - const parsedIssues = response.issues.map(issue => + timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone, + }).then((response) => { + const parsedIssues = response.issues.map((issue) => parseIssueFromResponse(issue, response.components, response.users, response.rules) ); return { ...response, issues: parsedIssues } as FetchIssuesPromise; @@ -441,7 +441,7 @@ export class App extends React.PureComponent { const facets = requestFacets ? Object.keys(openFacets) - .filter(facet => facet !== STANDARDS && openFacets[facet]) + .filter((facet) => facet !== STANDARDS && openFacets[facet]) .join(',') : undefined; @@ -452,7 +452,7 @@ export class App extends React.PureComponent { ...serializeQuery(query), ps: '100', facets, - ...additional + ...additional, }; if (query.createdAfter !== undefined && this.createdAfterIncludesTime()) { @@ -485,7 +485,7 @@ export class App extends React.PureComponent { ) { return true; } - return pageIssues.some(issue => issue.key === openIssueKey); + return pageIssues.some((issue) => issue.key === openIssueKey); }); } else { fetchPromise = this.fetchIssues({}, true); @@ -499,7 +499,7 @@ export class App extends React.PureComponent { if (issues.length > 0) { selected = openIssue ? openIssue.key : issues[0].key; } - this.setState(state => ({ + this.setState((state) => ({ cannotShowOpenIssue: Boolean(openIssueKey && !openIssue), effortTotal, facets: { ...state.facets, ...parseFacets(facets) }, @@ -515,7 +515,7 @@ export class App extends React.PureComponent { referencedUsers: keyBy(other.users, 'login'), selected, selectedFlowIndex: 0, - selectedLocationIndex: undefined + selectedLocationIndex: undefined, })); } return issues; @@ -560,12 +560,12 @@ export class App extends React.PureComponent { this.setState({ checkAll: false, loadingMore: true }); return this.fetchIssuesPage(p).then( - response => { + (response) => { if (this.mounted) { - this.setState(state => ({ + this.setState((state) => ({ loadingMore: false, issues: [...state.issues, ...response.issues], - paging: response.paging + paging: response.paging, })); } }, @@ -581,23 +581,23 @@ export class App extends React.PureComponent { return this.fetchIssues({ ps: 1, facets: facet }, false).then( ({ facets, ...other }) => { if (this.mounted) { - this.setState(state => ({ + this.setState((state) => ({ facets: { ...state.facets, ...parseFacets(facets) }, loadingFacets: omit(state.loadingFacets, facet), referencedComponentsById: { ...state.referencedComponentsById, - ...keyBy(other.components, 'uuid') + ...keyBy(other.components, 'uuid'), }, referencedComponentsByKey: { ...state.referencedComponentsByKey, - ...keyBy(other.components, 'key') + ...keyBy(other.components, 'key'), }, referencedLanguages: { ...state.referencedLanguages, - ...keyBy(other.languages, 'key') + ...keyBy(other.languages, 'key'), }, referencedRules: { ...state.referencedRules, ...keyBy(other.rules, 'key') }, - referencedUsers: { ...state.referencedUsers, ...keyBy(other.users, 'login') } + referencedUsers: { ...state.referencedUsers, ...keyBy(other.users, 'login') }, })); } }, @@ -614,7 +614,7 @@ export class App extends React.PureComponent { getCheckedIssues = () => { const issues = this.state.checked - .map(checked => this.state.issues.find(issue => issue.key === checked)) + .map((checked) => this.state.issues.find((issue) => issue.key === checked)) .filter((issue): issue is Issue => issue !== undefined); const paging = { pageIndex: 1, pageSize: issues.length, total: issues.length }; return Promise.resolve({ issues, paging }); @@ -642,15 +642,15 @@ export class App extends React.PureComponent { ...serializeQuery({ ...this.state.query, ...changes }), ...getBranchLikeQuery(this.props.branchLike), id: this.props.component && this.props.component.key, - myIssues: this.state.myIssues ? 'true' : undefined - } + myIssues: this.state.myIssues ? 'true' : undefined, + }, }); this.setState(({ openFacets }) => ({ openFacets: { ...openFacets, sonarsourceSecurity: shouldOpenSonarSourceSecurityFacet(openFacets, changes), - standards: shouldOpenStandardsFacet(openFacets, changes) - } + standards: shouldOpenStandardsFacet(openFacets, changes), + }, })); }; @@ -665,8 +665,8 @@ export class App extends React.PureComponent { ...serializeQuery({ ...this.state.query, assigned: true, assignees: [] }), ...getBranchLikeQuery(this.props.branchLike), id: this.props.component && this.props.component.key, - myIssues: myIssues ? 'true' : undefined - } + myIssues: myIssues ? 'true' : undefined, + }, }); }; @@ -680,7 +680,7 @@ export class App extends React.PureComponent { facets: property, s: 'FILE_LINE', ...serializeQuery({ ...query, ...changes }), - ps: 1 + ps: 1, }; if (myIssues) { @@ -691,17 +691,17 @@ export class App extends React.PureComponent { }; closeFacet = (property: string) => { - this.setState(state => ({ - openFacets: { ...state.openFacets, [property]: false } + this.setState((state) => ({ + openFacets: { ...state.openFacets, [property]: false }, })); }; handleFacetToggle = (property: string) => { - this.setState(state => { + this.setState((state) => { const willOpenProperty = !state.openFacets[property]; const newState = { loadingFacets: state.loadingFacets, - openFacets: { ...state.openFacets, [property]: willOpenProperty } + openFacets: { ...state.openFacets, [property]: willOpenProperty }, }; // Try to open sonarsource security "subfacet" by default if the standard facet is open @@ -731,8 +731,8 @@ export class App extends React.PureComponent { ...DEFAULT_QUERY, ...getBranchLikeQuery(this.props.branchLike), id: this.props.component && this.props.component.key, - myIssues: this.state.myIssues ? 'true' : undefined - } + myIssues: this.state.myIssues ? 'true' : undefined, + }, }); }; @@ -752,18 +752,18 @@ export class App extends React.PureComponent { }; handleIssueCheck = (issue: string) => { - this.setState(state => ({ + this.setState((state) => ({ checkAll: false, checked: state.checked.includes(issue) ? without(state.checked, issue) - : [...state.checked, issue] + : [...state.checked, issue], })); }; handleIssueChange = (issue: Issue) => { this.refreshBranchStatus(); - this.setState(state => ({ - issues: state.issues.map(candidate => (candidate.key === issue.key ? issue : candidate)) + this.setState((state) => ({ + issues: state.issues.map((candidate) => (candidate.key === issue.key ? issue : candidate)), })); }; @@ -812,9 +812,9 @@ export class App extends React.PureComponent { handleCheckAll = (checked: boolean) => { if (checked) { - this.setState(state => ({ + this.setState((state) => ({ checkAll: true, - checked: state.issues.map(issue => issue.key) + checked: state.issues.map((issue) => issue.key), })); } else { this.setState({ checkAll: false, checked: [] }); @@ -867,7 +867,8 @@ export class App extends React.PureComponent { innerRef={this.bulkButtonRef} disabled={checked.length === 0} id="issues-bulk-change" - onClick={this.handleOpenBulkChange}> + onClick={this.handleOpenBulkChange} + > {this.getButtonLabel(checked, checkAll, paging)} @@ -895,7 +896,7 @@ export class App extends React.PureComponent { {
      + style={{ top }} + >
      { {!canBrowseAllChildProjects && isPortfolioLike(qualifier) && ( + variant="warning" + > {translate('issues.not_all_issue_show')} { renderHeader({ openIssue, paging, - selectedIndex + selectedIndex, }: { openIssue: Issue | undefined; paging: Paging | undefined; @@ -1090,7 +1093,7 @@ export class App extends React.PureComponent { loading, openIssue, paging, - loadingRule + loadingRule, } = this.state; return (
      @@ -1156,7 +1159,8 @@ export class App extends React.PureComponent { return (
      + id="issues-page" + > diff --git a/server/sonar-web/src/main/js/apps/issues/components/IssuesList.tsx b/server/sonar-web/src/main/js/apps/issues/components/IssuesList.tsx index fad89e4aae1..4afb18fe2ab 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/IssuesList.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/IssuesList.tsx @@ -43,7 +43,7 @@ interface State { export default class IssuesList extends React.PureComponent { state: State = { - prerender: true + prerender: true, }; componentDidMount() { diff --git a/server/sonar-web/src/main/js/apps/issues/components/IssuesSourceViewer.tsx b/server/sonar-web/src/main/js/apps/issues/components/IssuesSourceViewer.tsx index 8e0999fd403..282dde3441e 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/IssuesSourceViewer.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/IssuesSourceViewer.tsx @@ -72,12 +72,12 @@ export default class IssuesSourceViewer extends React.PureComponent { @@ -112,8 +112,9 @@ export default class IssuesSourceViewer extends React.PureComponent + registerSelectedSecondaryLocationRef: this.registerSelectedSecondaryLocationRef, + }} + > { previousIssue.branch !== issue.branch; return ( -
    • (this.nodeRef = node)}> +
    • (this.nodeRef = node)}> {displayComponent && (
      diff --git a/server/sonar-web/src/main/js/apps/issues/components/__tests__/AssigneeSelect-test.tsx b/server/sonar-web/src/main/js/apps/issues/components/__tests__/AssigneeSelect-test.tsx index 95e7b6473f3..1ae09b00ad2 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/__tests__/AssigneeSelect-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/__tests__/AssigneeSelect-test.tsx @@ -27,7 +27,7 @@ import { searchAssignees } from '../../utils'; import AssigneeSelect, { AssigneeOption, AssigneeSelectProps, - MIN_QUERY_LENGTH + MIN_QUERY_LENGTH, } from '../AssigneeSelect'; jest.mock('../../utils', () => ({ @@ -37,21 +37,21 @@ jest.mock('../../utils', () => ({ active: true, avatar: '##avatar1', login: 'toto@toto', - name: 'toto' + name: 'toto', }, { active: false, avatar: '##avatar2', login: 'tata@tata', - name: 'tata' + name: 'tata', }, { active: true, avatar: '##avatar3', - login: 'titi@titi' - } - ] - }) + login: 'titi@titi', + }, + ], + }), })); it('should render correctly', () => { @@ -75,7 +75,7 @@ it('should render options correctly', () => { wrapper.instance().renderAssignee({ avatar: '##avatar1', value: 'toto@toto', - label: 'toto' + label: 'toto', }) ) .find(Avatar) @@ -86,7 +86,7 @@ it('should render options correctly', () => { shallow( wrapper.instance().renderAssignee({ value: 'toto@toto', - label: 'toto' + label: 'toto', }) ) .find(Avatar) @@ -122,18 +122,18 @@ it('should handle assignee search', async () => { { avatar: '##avatar1', value: 'toto@toto', - label: 'toto' + label: 'toto', }, { avatar: '##avatar2', value: 'tata@tata', - label: 'user.x_deleted.tata' + label: 'user.x_deleted.tata', }, { avatar: '##avatar3', value: 'titi@titi', - label: 'user.x_deleted.titi@titi' - } + label: 'user.x_deleted.titi@titi', + }, ]); }); diff --git a/server/sonar-web/src/main/js/apps/issues/components/__tests__/BulkChangeModal-test.tsx b/server/sonar-web/src/main/js/apps/issues/components/__tests__/BulkChangeModal-test.tsx index fdaed62701b..5f9de47d13f 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/__tests__/BulkChangeModal-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/__tests__/BulkChangeModal-test.tsx @@ -30,7 +30,7 @@ import { Issue } from '../../../../types/types'; import BulkChangeModal, { MAX_PAGE_SIZE } from '../BulkChangeModal'; jest.mock('../../../../api/issues', () => ({ - searchIssueTags: jest.fn().mockResolvedValue([undefined, []]) + searchIssueTags: jest.fn().mockResolvedValue([undefined, []]), })); it('should display error message when no issues available', async () => { @@ -59,7 +59,7 @@ it('should display warning when too many issues are passed', async () => { it('should properly handle the search for tags', async () => { const wrapper = getWrapper([]); - await new Promise(resolve => { + await new Promise((resolve) => { wrapper.instance().handleTagsSearch('query', resolve); }); expect(searchIssueTags).toHaveBeenCalled(); @@ -67,7 +67,7 @@ it('should properly handle the search for tags', async () => { it.each([ ['type', 'set_type'], - ['severity', 'set_severity'] + ['severity', 'set_severity'], ])('should render select for %s', async (_field, action) => { const wrapper = getWrapper([mockIssue(false, { actions: [action] })]); await waitAndUpdate(wrapper); @@ -90,17 +90,14 @@ it('should disable the submit button unless some change is configured', async () const wrapper = getWrapper([mockIssue(false, { actions: ['set_severity', 'comment'] })]); await waitAndUpdate(wrapper); - return new Promise(resolve => { + return new Promise((resolve) => { expect(wrapper.find(SubmitButton).props().disabled).toBe(true); // Setting a comment is not sufficient; some other change must occur. change(wrapper.find('#comment'), 'Some comment'); expect(wrapper.find(SubmitButton).props().disabled).toBe(true); - wrapper - .find(Select) - .at(0) - .simulate('change', { value: 'foo' }); + wrapper.find(Select).at(0).simulate('change', { value: 'foo' }); expect(wrapper.find(SubmitButton).props().disabled).toBe(false); resolve(); @@ -118,8 +115,8 @@ const getWrapper = (issues: Issue[]) => { paging: { pageIndex: issues.length, pageSize: issues.length, - total: issues.length - } + total: issues.length, + }, }) } onClose={() => {}} diff --git a/server/sonar-web/src/main/js/apps/issues/components/__tests__/ComponentBreadcrumbs-test.tsx b/server/sonar-web/src/main/js/apps/issues/components/__tests__/ComponentBreadcrumbs-test.tsx index f037f698591..77805805d04 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/__tests__/ComponentBreadcrumbs-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/__tests__/ComponentBreadcrumbs-test.tsx @@ -30,7 +30,7 @@ const baseIssue = mockIssue(false, { componentQualifier: ComponentQualifier.File, project: 'proj', projectName: 'proj-name', - branch: 'test-branch' + branch: 'test-branch', }); it('renders', () => { diff --git a/server/sonar-web/src/main/js/apps/issues/components/__tests__/IssuesApp-test.tsx b/server/sonar-web/src/main/js/apps/issues/components/__tests__/IssuesApp-test.tsx index d080b03bb50..256797c4bf4 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/__tests__/IssuesApp-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/__tests__/IssuesApp-test.tsx @@ -29,7 +29,7 @@ import { addSideBarClass, addWhitePageClass, removeSideBarClass, - removeWhitePageClass + removeWhitePageClass, } from '../../../../helpers/pages'; import { mockCurrentUser, @@ -37,7 +37,7 @@ import { mockLocation, mockLoggedInUser, mockRawIssue, - mockRouter + mockRouter, } from '../../../../helpers/testMocks'; import { keydown, mockEvent, waitAndUpdate } from '../../../../helpers/testUtils'; import { ComponentQualifier } from '../../../../types/component'; @@ -49,7 +49,7 @@ import { selectNextFlow, selectNextLocation, selectPreviousFlow, - selectPreviousLocation + selectPreviousLocation, } from '../../actions'; import BulkChangeModal from '../BulkChangeModal'; import { App } from '../IssuesApp'; @@ -58,39 +58,39 @@ jest.mock('../../../../helpers/pages', () => ({ addSideBarClass: jest.fn(), addWhitePageClass: jest.fn(), removeSideBarClass: jest.fn(), - removeWhitePageClass: jest.fn() + removeWhitePageClass: jest.fn(), })); jest.mock('../../../../helpers/handleRequiredAuthentication', () => jest.fn()); jest.mock('../../../../api/issues', () => ({ - searchIssues: jest.fn().mockResolvedValue({ facets: [], issues: [] }) + searchIssues: jest.fn().mockResolvedValue({ facets: [], issues: [] }), })); jest.mock('../../../../api/rules', () => ({ - getRuleDetails: jest.fn() + getRuleDetails: jest.fn(), })); jest.mock('../../../../api/users', () => ({ getCurrentUser: jest.fn().mockResolvedValue({ dismissedNotices: { - something: false - } + something: false, + }, }), - dismissNotification: jest.fn() + dismissNotification: jest.fn(), })); const RAW_ISSUES = [ mockRawIssue(false, { key: 'foo' }), mockRawIssue(false, { key: 'bar' }), mockRawIssue(true, { key: 'third' }), - mockRawIssue(false, { key: 'fourth' }) + mockRawIssue(false, { key: 'fourth' }), ]; const ISSUES = [ mockIssue(false, { key: 'foo' }), mockIssue(false, { key: 'bar' }), mockIssue(true, { key: 'third' }), - mockIssue(false, { key: 'fourth' }) + mockIssue(false, { key: 'fourth' }), ]; const FACETS = [{ property: 'severities', values: [{ val: 'MINOR', count: 4 }] }]; const PAGING = { pageIndex: 1, pageSize: 100, total: 4 }; @@ -106,7 +106,7 @@ beforeEach(() => { languages: [], paging: PAGING, rules: [], - users: [] + users: [], }); (getRuleDetails as jest.Mock).mockResolvedValue({ rule: { test: 'test' } }); @@ -120,8 +120,8 @@ it('should show warnning when not all projects are accessible', () => { const wrapper = shallowRender({ component: mockComponent({ canBrowseAllChildProjects: false, - qualifier: ComponentQualifier.Portfolio - }) + qualifier: ComponentQualifier.Portfolio, + }), }); const rootNode = shallow(wrapper.instance().renderSide(undefined)); expect(rootNode).toMatchSnapshot(); @@ -148,8 +148,8 @@ it('should handle my issue change properly', () => { query: { id: 'foo', author: [], - myIssues: 'true' - } + myIssues: 'true', + }, }); }); @@ -162,7 +162,7 @@ it('should load search result count correcly', async () => { it('should not render for anonymous user', () => { shallowRender({ currentUser: mockCurrentUser({ isLoggedIn: false }), - location: mockLocation({ query: { myIssues: true.toString() } }) + location: mockLocation({ query: { myIssues: true.toString() } }), }); expect(handleRequiredAuthentication).toHaveBeenCalled(); }); @@ -176,14 +176,14 @@ it('should handle reset properly', () => { query: { id: 'foo', myIssues: undefined, - resolved: 'false' - } + resolved: 'false', + }, }); }); it('should open standard facets for vulnerabilities and hotspots', () => { const wrapper = shallowRender({ - location: mockLocation({ pathname: '/issues', query: { types: 'VULNERABILITY' } }) + location: mockLocation({ pathname: '/issues', query: { types: 'VULNERABILITY' } }), }); const instance = wrapper.instance(); const fetchFacet = jest.spyOn(instance, 'fetchFacet'); @@ -266,17 +266,14 @@ it('should be able to bulk change specific issues', async () => { instance.handleOpenBulkChange(); wrapper.update(); expect(wrapper.find(BulkChangeModal).exists()).toBe(true); - const { issues } = await wrapper - .find(BulkChangeModal) - .props() - .fetchIssues({}); + const { issues } = await wrapper.find(BulkChangeModal).props().fetchIssues({}); expect(issues).toHaveLength(2); }); it('should display the right facets open', () => { expect( shallowRender({ - location: mockLocation({ query: { types: 'BUGS' } }) + location: mockLocation({ query: { types: 'BUGS' } }), }).state('openFacets') ).toEqual({ owaspTop10: false, @@ -285,11 +282,11 @@ it('should display the right facets open', () => { severities: true, standards: false, sonarsourceSecurity: false, - types: true + types: true, }); expect( shallowRender({ - location: mockLocation({ query: { owaspTop10: 'a1' } }) + location: mockLocation({ query: { owaspTop10: 'a1' } }), }).state('openFacets') ).toEqual({ owaspTop10: true, @@ -298,7 +295,7 @@ it('should display the right facets open', () => { severities: true, standards: true, sonarsourceSecurity: false, - types: true + types: true, }); }); @@ -310,14 +307,14 @@ it('should correctly handle filter changes', () => { expect(instance.state.openFacets).toEqual({ types: true, sonarsourceSecurity: true, - standards: true + standards: true, }); expect(push).toHaveBeenCalled(); instance.handleFilterChange({ types: ['BUGS'] }); expect(instance.state.openFacets).toEqual({ types: true, sonarsourceSecurity: true, - standards: true + standards: true, }); }); @@ -329,8 +326,8 @@ it('should fetch issues until defined', async () => { const wrapper = shallowRender({ location: mockLocation({ - query: { open: '0' } - }) + query: { open: '0' }, + }), }); const instance = wrapper.instance(); await waitAndUpdate(wrapper); @@ -444,7 +441,7 @@ it('should handle createAfter query param with time', async () => { (searchIssues as jest.Mock).mockImplementation(mockSearchIssuesResponse()); const wrapper = shallowRender({ - location: mockLocation({ query: { createdAfter: '2020-10-21' } }) + location: mockLocation({ query: { createdAfter: '2020-10-21' } }), }); expect(wrapper.instance().createdAfterIncludesTime()).toBe(false); await waitAndUpdate(wrapper); @@ -473,8 +470,8 @@ function mockSearchIssuesResponse(keyCount = 0, lineCount = 1) { startLine: lineCount++, endLine: lineCount, startOffset: 0, - endOffset: 15 - } + endOffset: 15, + }, }), mockRawIssue(false, { key: `${keyCount}`, @@ -482,14 +479,14 @@ function mockSearchIssuesResponse(keyCount = 0, lineCount = 1) { startLine: lineCount++, endLine: lineCount, startOffset: 0, - endOffset: 15 - } - }) + endOffset: 15, + }, + }), ], languages: [], paging: { pageIndex: p, pageSize: 2, total: 6 }, rules: [], - users: [] + users: [], }); } @@ -500,7 +497,7 @@ function shallowRender(props: Partial = {}) { breadcrumbs: [], key: 'foo', name: 'bar', - qualifier: 'Doe' + qualifier: 'Doe', }} currentUser={mockLoggedInUser()} fetchBranchStatus={jest.fn()} diff --git a/server/sonar-web/src/main/js/apps/issues/components/__tests__/IssuesSourceViewer-test.tsx b/server/sonar-web/src/main/js/apps/issues/components/__tests__/IssuesSourceViewer-test.tsx index 2a29aa7ea46..20532c78913 100644 --- a/server/sonar-web/src/main/js/apps/issues/components/__tests__/IssuesSourceViewer-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/components/__tests__/IssuesSourceViewer-test.tsx @@ -28,15 +28,15 @@ it('should render SourceViewer correctly', () => { expect( shallowRender({ issues: [mockIssue(true)], - openIssue: mockIssue(true, { flows: [[mockFlowLocation()]] }) + openIssue: mockIssue(true, { flows: [[mockFlowLocation()]] }), }) ).toMatchSnapshot('single secondary location'); expect( shallowRender({ issues: [mockIssue(true)], openIssue: mockIssue(true, { - flows: [[mockFlowLocation(), mockFlowLocation(), mockFlowLocation()]] - }) + flows: [[mockFlowLocation(), mockFlowLocation(), mockFlowLocation()]], + }), }) ).toMatchSnapshot('all secondary locations on same line'); }); @@ -54,12 +54,12 @@ it('should render CrossComponentSourceViewer correctly', () => { startLine: 10, startOffset: 1, endLine: 12, - endOffset: 2 - } - }) - ] - ] - }) + endOffset: 2, + }, + }), + ], + ], + }), }) ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueBox.tsx b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueBox.tsx index 936aa79e414..59504f3543b 100644 --- a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueBox.tsx +++ b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueBox.tsx @@ -74,12 +74,14 @@ export default class ConciseIssueBox extends React.PureComponent { return (
      + onClick={selected ? undefined : this.handleClick} + > (this.messageElement = node)} - onClick={this.handleClick}> + innerRef={(node) => (this.messageElement = node)} + onClick={this.handleClick} + > {issue.message}
      @@ -88,7 +90,7 @@ export default class ConciseIssueBox extends React.PureComponent { {translateWithParameters( 'issue.x_data_flows', - issue.flowsWithType.filter(f => f.type === FlowType.DATA).length + issue.flowsWithType.filter((f) => f.type === FlowType.DATA).length )} ) : ( diff --git a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueLocationBadge.tsx b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueLocationBadge.tsx index 679f5bdc0ce..972cf36a90c 100644 --- a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueLocationBadge.tsx +++ b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueLocationBadge.tsx @@ -40,7 +40,8 @@ export default function ConciseIssueLocationBadge(props: Props) { ? 'issue.this_flow_involves_x_code_locations' : 'issue.this_issue_involves_x_code_locations', formatMeasure(count, 'INT') - )}> + )} + > {'+'} {count} diff --git a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueLocations.tsx b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueLocations.tsx index 43c509cea5a..899a4637f11 100644 --- a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueLocations.tsx +++ b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueLocations.tsx @@ -45,7 +45,8 @@ export default class ConciseIssueLocations extends React.PureComponent + onClick={this.handleExpandClick} + > ... ); diff --git a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/__tests__/ConciseIssue-test.tsx b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/__tests__/ConciseIssue-test.tsx index 206217baf01..cf56fa0b1d7 100644 --- a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/__tests__/ConciseIssue-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/__tests__/ConciseIssue-test.tsx @@ -42,7 +42,7 @@ const issue: Issue = { severity: '', status: '', transitions: [], - type: 'BUG' + type: 'BUG', }; it('should render', () => { diff --git a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/__tests__/ConciseIssueLocations-test.tsx b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/__tests__/ConciseIssueLocations-test.tsx index 4c5df99760b..ee7eda2c9df 100644 --- a/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/__tests__/ConciseIssueLocations-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/conciseIssuesList/__tests__/ConciseIssueLocations-test.tsx @@ -28,7 +28,7 @@ const loc = { component: '', msg: '', textRange }; it('should render secondary locations', () => { const issue = { flows: [], - secondaryLocations: [loc, loc, loc] + secondaryLocations: [loc, loc, loc], }; expect( shallow( @@ -40,7 +40,7 @@ it('should render secondary locations', () => { it('should render one flow', () => { const issue = { flows: [[loc, loc, loc]], - secondaryLocations: [] + secondaryLocations: [], }; expect( shallow( @@ -54,9 +54,9 @@ it('should render several flows', () => { flows: [ [loc, loc, loc], [loc, loc], - [loc, loc, loc] + [loc, loc, loc], ], - secondaryLocations: [] + secondaryLocations: [], }; expect( shallow( diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/ComponentSourceSnippetGroupViewer.tsx b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/ComponentSourceSnippetGroupViewer.tsx index 9be1aa102cc..1209fa02ba1 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/ComponentSourceSnippetGroupViewer.tsx +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/ComponentSourceSnippetGroupViewer.tsx @@ -35,7 +35,7 @@ import { Snippet, SnippetGroup, SourceLine, - SourceViewerFile + SourceViewerFile, } from '../../../types/types'; import { IssueSourceViewerScrollContext } from '../components/IssueSourceViewerScrollContext'; import IssueSourceViewerHeader from './IssueSourceViewerHeader'; @@ -46,7 +46,7 @@ import { EXPAND_BY_LINES, getPrimaryLocation, linesForSnippets, - MERGE_DISTANCE + MERGE_DISTANCE, } from './utils'; interface Props { @@ -86,7 +86,7 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone additionalLines: {}, highlightedSymbols: [], loading: false, - snippets: [] + snippets: [], }; } @@ -108,7 +108,7 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone locations: snippetGroup.locations.length === 0 ? [getPrimaryLocation(issue)] - : [getPrimaryLocation(issue), ...snippetGroup.locations] + : [getPrimaryLocation(issue), ...snippetGroup.locations], }); this.setState({ snippets }); @@ -118,7 +118,7 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone const { branchLike, snippetGroup } = this.props; const { key } = snippetGroup.component; const { snippets } = this.state; - const snippet = snippets.find(s => s.index === snippetIndex); + const snippet = snippets.find((s) => s.index === snippetIndex); if (!snippet) { return Promise.reject(); } @@ -128,36 +128,36 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone direction === 'up' ? { from: Math.max(1, snippet.start - extension), - to: snippet.start - 1 + to: snippet.start - 1, } : { from: snippet.end + 1, - to: snippet.end + extension + to: snippet.end + extension, }; return getSources({ key, ...range, - ...getBranchLikeQuery(branchLike) + ...getBranchLikeQuery(branchLike), }) - .then(lines => + .then((lines) => lines.reduce((lineMap: Dict, line) => { line.coverageStatus = getCoverageStatus(line); lineMap[line.line] = line; return lineMap; }, {}) ) - .then(newLinesMapped => { + .then((newLinesMapped) => { const newSnippets = expandSnippet({ direction, snippetIndex, - snippets + snippets, }); this.setState(({ additionalLines }) => { const combinedLines = { ...additionalLines, ...newLinesMapped }; return { additionalLines: combinedLines, - snippets: newSnippets.filter(s => !s.toDelete) + snippets: newSnippets.filter((s) => !s.toDelete), }; }); }); @@ -170,14 +170,14 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone this.setState({ loading: true }); getSources({ key, ...getBranchLikeQuery(branchLike) }).then( - lines => { + (lines) => { if (this.mounted) { this.setState(({ additionalLines }) => { const combinedLines = { ...additionalLines, ...lines }; return { additionalLines: combinedLines, loading: false, - snippets: [{ start: 0, end: lines[lines.length - 1].line, index: -1 }] + snippets: [{ start: 0, end: lines[lines.length - 1].line, index: -1 }], }; }); } @@ -193,7 +193,7 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone handleSymbolClick = (clickedSymbols: string[]) => { this.setState(({ highlightedSymbols }) => { const newHighlightedSymbols = clickedSymbols.filter( - symb => !highlightedSymbols.includes(symb) + (symb) => !highlightedSymbols.includes(symb) ); return { highlightedSymbols: newHighlightedSymbols }; }); @@ -222,11 +222,11 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone return ( issuesForLine.length > 0 && (
      - {issuesForLine.map(issueToDisplay => { + {issuesForLine.map((issueToDisplay) => { const isSelectedIssue = issueToDisplay.key === issue.key; return ( - {ctx => ( + {(ctx) => ( 0)} issue={issueToDisplay} @@ -243,13 +243,8 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone }; render() { - const { - branchLike, - isLastOccurenceOfPrimaryComponent, - issue, - lastSnippetGroup, - snippetGroup - } = this.props; + const { branchLike, isLastOccurenceOfPrimaryComponent, issue, lastSnippetGroup, snippetGroup } = + this.props; const { additionalLines, loading, snippets } = this.state; const locations = issue.component === snippetGroup.component.key && issue.textRange !== undefined @@ -264,7 +259,7 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone const snippetLines = linesForSnippets(snippets, { ...snippetGroup.sources, - ...additionalLines + ...additionalLines, }); const isFlow = issue.secondaryLocations.length === 0; @@ -282,7 +277,7 @@ export default class ComponentSourceSnippetGroupViewer extends React.PureCompone {issue.component === snippetGroup.component.key && issue.textRange === undefined && ( - {ctx => ( + {(ctx) => ( { getDuplications({ key: component, - ...getBranchLikeQuery(this.props.branchLike) + ...getBranchLikeQuery(this.props.branchLike), }).then( - r => { + (r) => { if (this.mounted) { this.setState({ duplicatedFiles: r.files, duplications: r.duplications, - duplicationsByLine: getDuplicationsByLine(r.duplications) + duplicationsByLine: getDuplicationsByLine(r.duplications), }); } }, @@ -126,7 +126,7 @@ export default class CrossComponentSourceViewer extends React.PureComponent keyBy(lines, 'line')); + to: 10, + }).then((lines) => keyBy(lines, 'line')); components[issue.component].sources = sources; } } if (this.mounted) { this.setState({ components, - loading: false + loading: false, }); } } catch (response) { @@ -220,7 +220,8 @@ export default class CrossComponentSourceViewer extends React.PureComponent + value={{ branchLike: this.props.branchLike, file: snippetGroup.component }} + > + aria-label={sourceViewerFile.path} + >
      {displayProjectName && (
      {linkToProject ? ( + href={getPathUrlAsString(getBranchLikeUrl(project, branchLike))} + > {projectNameLabel} ) : ( @@ -105,14 +107,16 @@ export default function IssueSourceViewerHeader(props: Props) { {!isProjectRoot && measures.issues !== undefined && (
      + 'little-spacer-right': !expandable || loading, + })} + > + resolved: 'false', + })} + > {translate('source_viewer.view_all_issues')}
      @@ -124,7 +128,8 @@ export default function IssueSourceViewerHeader(props: Props) { + onClick={onExpand} + >
      diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/SnippetViewer.tsx b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/SnippetViewer.tsx index 1e21f308b1a..f49cd3d8d99 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/SnippetViewer.tsx +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/SnippetViewer.tsx @@ -25,7 +25,7 @@ import { symbolsByLine } from '../../../components/SourceViewer/helpers/indexing import { getSecondaryIssueLocationsForLine } from '../../../components/SourceViewer/helpers/issueLocations'; import { optimizeHighlightedSymbols, - optimizeLocationMessage + optimizeLocationMessage, } from '../../../components/SourceViewer/helpers/lines'; import { translate } from '../../../helpers/l10n'; import { @@ -35,7 +35,7 @@ import { Issue, LinearIssueLocation, SourceLine, - SourceViewerFile + SourceViewerFile, } from '../../../types/types'; import './SnippetViewer.css'; import { LINES_BELOW_ISSUE } from './utils'; @@ -74,7 +74,7 @@ export default class SnippetViewer extends React.PureComponent { line, snippet, symbols, - verticalBuffer + verticalBuffer, }: { displayDuplications: boolean; displaySCM?: boolean; @@ -128,21 +128,16 @@ export default class SnippetViewer extends React.PureComponent { previousLine={index > 0 ? snippet[index - 1] : undefined} renderDuplicationPopup={this.props.renderDuplicationPopup} secondaryIssueLocations={secondaryIssueLocations} - verticalBuffer={verticalBuffer}> + verticalBuffer={verticalBuffer} + > {this.props.renderAdditionalChildInLine && this.props.renderAdditionalChildInLine(line)} ); } render() { - const { - component, - displaySCM, - issue, - lastSnippetOfLastGroup, - locationsByLine, - snippet - } = this.props; + const { component, displaySCM, issue, lastSnippetOfLastGroup, locationsByLine, snippet } = + this.props; const lastLine = component.measures && component.measures.lines && parseInt(component.measures.lines, 10); @@ -157,7 +152,7 @@ export default class SnippetViewer extends React.PureComponent { : 0; const displayDuplications = - Boolean(this.props.loadDuplications) && snippet.some(s => !!s.duplicated); + Boolean(this.props.loadDuplications) && snippet.some((s) => !!s.duplicated); return (
      @@ -167,7 +162,8 @@ export default class SnippetViewer extends React.PureComponent {
      @@ -175,8 +171,9 @@ export default class SnippetViewer extends React.PureComponent {
    • @@ -125,7 +126,8 @@ export default function GitlabProjectSelectionForm(props: GitlabProjectSelection + target="_blank" + > {translate('onboarding.create_project.gitlab.link')}
      1, - 'expand-down': !lastLine || snippet[snippet.length - 1].line < lastLine - })}> + 'expand-down': !lastLine || snippet[snippet.length - 1].line < lastLine, + })} + > {snippet.map((line, index) => this.renderLine({ @@ -187,7 +184,7 @@ export default class SnippetViewer extends React.PureComponent { line, snippet, symbols: symbols[line.line], - verticalBuffer: index === snippet.length - 1 ? verticalBuffer : 0 + verticalBuffer: index === snippet.length - 1 ? verticalBuffer : 0, }) )} @@ -197,7 +194,8 @@ export default class SnippetViewer extends React.PureComponent { diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/ComponentSourceSnippetGroupViewer-test.tsx b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/ComponentSourceSnippetGroupViewer-test.tsx index ca406031813..9a4cf4441bb 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/ComponentSourceSnippetGroupViewer-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/ComponentSourceSnippetGroupViewer-test.tsx @@ -26,7 +26,7 @@ import { mockBranch, mockMainBranch } from '../../../../helpers/mocks/branch-lik import { mockSnippetsByComponent, mockSourceLine, - mockSourceViewerFile + mockSourceViewerFile, } from '../../../../helpers/mocks/sources'; import { mockFlowLocation, mockIssue } from '../../../../helpers/testMocks'; import { waitAndUpdate } from '../../../../helpers/testUtils'; @@ -35,7 +35,7 @@ import ComponentSourceSnippetGroupViewer from '../ComponentSourceSnippetGroupVie import SnippetViewer from '../SnippetViewer'; jest.mock('../../../../api/components', () => ({ - getSources: jest.fn().mockResolvedValue([]) + getSources: jest.fn().mockResolvedValue([]), })); beforeEach(() => { @@ -51,25 +51,25 @@ it('should render correctly with secondary locations', () => { const issue = mockIssue(true, { component: 'project:main.js', flows: [], - textRange: { startLine: 7, endLine: 7, startOffset: 5, endOffset: 10 } + textRange: { startLine: 7, endLine: 7, startOffset: 5, endOffset: 10 }, }); const snippetGroup: SnippetGroup = { locations: [ mockFlowLocation({ component: issue.component, - textRange: { startLine: 34, endLine: 34, startOffset: 0, endOffset: 0 } + textRange: { startLine: 34, endLine: 34, startOffset: 0, endOffset: 0 }, }), mockFlowLocation({ component: issue.component, - textRange: { startLine: 74, endLine: 74, startOffset: 0, endOffset: 0 } - }) + textRange: { startLine: 74, endLine: 74, startOffset: 0, endOffset: 0 }, + }), ], ...mockSnippetsByComponent('main.js', 'project', [ ...range(2, 17), ...range(29, 39), - ...range(69, 79) - ]) + ...range(69, 79), + ]), }; const wrapper = shallowRender({ issue, snippetGroup }); expect(wrapper.state('snippets')).toHaveLength(3); @@ -83,25 +83,25 @@ it('should render correctly with flows', () => { const issue = mockIssue(true, { component: 'project:main.js', secondaryLocations: [], - textRange: { startLine: 7, endLine: 7, startOffset: 5, endOffset: 10 } + textRange: { startLine: 7, endLine: 7, startOffset: 5, endOffset: 10 }, }); const snippetGroup: SnippetGroup = { locations: [ mockFlowLocation({ component: issue.component, - textRange: { startLine: 34, endLine: 34, startOffset: 0, endOffset: 0 } + textRange: { startLine: 34, endLine: 34, startOffset: 0, endOffset: 0 }, }), mockFlowLocation({ component: issue.component, - textRange: { startLine: 74, endLine: 74, startOffset: 0, endOffset: 0 } - }) + textRange: { startLine: 74, endLine: 74, startOffset: 0, endOffset: 0 }, + }), ], ...mockSnippetsByComponent('main.js', 'project', [ ...range(2, 17), ...range(29, 39), - ...range(69, 79) - ]) + ...range(69, 79), + ]), }; const wrapper = shallowRender({ issue, snippetGroup }); expect(wrapper.state('snippets')).toHaveLength(3); @@ -110,18 +110,13 @@ it('should render correctly with flows', () => { expect(wrapper.state('snippets')[2]).toEqual({ index: 2, start: 69, end: 79 }); // Check that locationsByLine is defined when isLastOccurenceOfPrimaryComponent - expect( - wrapper - .find(SnippetViewer) - .at(0) - .props().locationsByLine - ).not.toEqual({}); + expect(wrapper.find(SnippetViewer).at(0).props().locationsByLine).not.toEqual({}); // If not, it should be an empty object: const snippets = shallowRender({ isLastOccurenceOfPrimaryComponent: false, issue, - snippetGroup + snippetGroup, }).find(SnippetViewer); expect(snippets.at(0).props().locationsByLine).toEqual({}); @@ -133,7 +128,7 @@ it('should render file-level issue correctly', () => { const issue = mockIssue(true, { component: 'project:main.js', flows: [], - textRange: undefined + textRange: undefined, }); const wrapper = shallowRender({ @@ -142,20 +137,14 @@ it('should render file-level issue correctly', () => { locations: [ mockFlowLocation({ component: issue.component, - textRange: { startLine: 34, endLine: 34, startOffset: 0, endOffset: 0 } - }) + textRange: { startLine: 34, endLine: 34, startOffset: 0, endOffset: 0 }, + }), ], - ...mockSnippetsByComponent('main.js', 'project', range(29, 39)) - } + ...mockSnippetsByComponent('main.js', 'project', range(29, 39)), + }, }); - expect( - wrapper - .find('ContextConsumer') - .dive() - .find(IssueMessageBox) - .exists() - ).toBe(true); + expect(wrapper.find('ContextConsumer').dive().find(IssueMessageBox).exists()).toBe(true); }); it('should expand block', async () => { @@ -163,20 +152,20 @@ it('should expand block', async () => { Object.values(mockSnippetsByComponent('a', 'project', range(6, 59)).sources) ); const issue = mockIssue(true, { - textRange: { startLine: 74, endLine: 74, startOffset: 5, endOffset: 10 } + textRange: { startLine: 74, endLine: 74, startOffset: 5, endOffset: 10 }, }); const snippetGroup: SnippetGroup = { locations: [ mockFlowLocation({ component: 'a', - textRange: { startLine: 74, endLine: 74, startOffset: 0, endOffset: 0 } + textRange: { startLine: 74, endLine: 74, startOffset: 0, endOffset: 0 }, }), mockFlowLocation({ component: 'a', - textRange: { startLine: 107, endLine: 107, startOffset: 0, endOffset: 0 } - }) + textRange: { startLine: 107, endLine: 107, startOffset: 0, endOffset: 0 }, + }), ], - ...mockSnippetsByComponent('a', 'project', [...range(69, 83), ...range(102, 112)]) + ...mockSnippetsByComponent('a', 'project', [...range(69, 83), ...range(102, 112)]), }; const wrapper = shallowRender({ issue, snippetGroup }); @@ -198,14 +187,14 @@ it('should expand full component', async () => { locations: [ mockFlowLocation({ component: 'a', - textRange: { startLine: 3, endLine: 3, startOffset: 0, endOffset: 0 } + textRange: { startLine: 3, endLine: 3, startOffset: 0, endOffset: 0 }, }), mockFlowLocation({ component: 'a', - textRange: { startLine: 12, endLine: 12, startOffset: 0, endOffset: 0 } - }) + textRange: { startLine: 12, endLine: 12, startOffset: 0, endOffset: 0 }, + }), ], - ...mockSnippetsByComponent('a', 'project', [1, 2, 3, 4, 5, 10, 11, 12, 13, 14]) + ...mockSnippetsByComponent('a', 'project', [1, 2, 3, 4, 5, 10, 11, 12, 13, 14]), }; const wrapper = shallowRender({ snippetGroup }); @@ -227,12 +216,12 @@ it('should get the right branch when expanding', async () => { ); const snippetGroup: SnippetGroup = { locations: [mockFlowLocation()], - ...mockSnippetsByComponent('a', 'project', [1, 2, 3, 4, 5, 6, 7]) + ...mockSnippetsByComponent('a', 'project', [1, 2, 3, 4, 5, 6, 7]), }; const wrapper = shallowRender({ branchLike: mockBranch({ name: 'asdf' }), - snippetGroup + snippetGroup, }); wrapper.instance().expandBlock(0, 'down'); @@ -255,14 +244,18 @@ it('should correctly handle lines actions', () => { locations: [ mockFlowLocation({ component: 'my-project:foo/bar.ts', - textRange: { startLine: 34, endLine: 34, startOffset: 0, endOffset: 0 } + textRange: { startLine: 34, endLine: 34, startOffset: 0, endOffset: 0 }, }), mockFlowLocation({ component: 'my-project:foo/bar.ts', - textRange: { startLine: 54, endLine: 54, startOffset: 0, endOffset: 0 } - }) + textRange: { startLine: 54, endLine: 54, startOffset: 0, endOffset: 0 }, + }), ], - ...mockSnippetsByComponent('foo/bar.ts', 'my-project', [32, 33, 34, 35, 36, 52, 53, 54, 55, 56]) + ...mockSnippetsByComponent( + 'foo/bar.ts', + 'my-project', + [32, 33, 34, 35, 36, 52, 53, 54, 55, 56] + ), }; const loadDuplications = jest.fn(); const renderDuplicationPopup = jest.fn(); @@ -270,20 +263,14 @@ it('should correctly handle lines actions', () => { const wrapper = shallowRender({ loadDuplications, renderDuplicationPopup, - snippetGroup + snippetGroup, }); const line = mockSourceLine(); - wrapper - .find('SnippetViewer') - .first() - .prop('loadDuplications')(line); + wrapper.find('SnippetViewer').first().prop('loadDuplications')(line); expect(loadDuplications).toHaveBeenCalledWith('my-project:foo/bar.ts', line); - wrapper - .find('SnippetViewer') - .first() - .prop('renderDuplicationPopup')(1, 13); + wrapper.find('SnippetViewer').first().prop('renderDuplicationPopup')(1, 13); expect(renderDuplicationPopup).toHaveBeenCalledWith( mockSourceViewerFile('foo/bar.ts', 'my-project'), 1, @@ -295,7 +282,7 @@ function shallowRender(props: Partial( { const { mockSnippetsByComponent } = jest.requireActual('../../../../helpers/mocks/sources'); return { - getIssueFlowSnippets: jest.fn().mockResolvedValue({ 'main.js': mockSnippetsByComponent() }) + getIssueFlowSnippets: jest.fn().mockResolvedValue({ 'main.js': mockSnippetsByComponent() }), }; }); jest.mock('../../../../api/components', () => ({ getDuplications: jest.fn().mockResolvedValue({}), - getComponentForSourceViewer: jest.fn().mockResolvedValue({}) + getComponentForSourceViewer: jest.fn().mockResolvedValue({}), })); beforeEach(() => { @@ -92,10 +92,7 @@ it('should handle duplication popup', async () => { const wrapper = shallowRender(); await waitAndUpdate(wrapper); - wrapper - .find(ComponentSourceSnippetGroupViewer) - .props() - .loadDuplications('foo', mockSourceLine()); + wrapper.find(ComponentSourceSnippetGroupViewer).props().loadDuplications('foo', mockSourceLine()); await waitAndUpdate(wrapper); expect(getDuplications).toHaveBeenCalledWith({ key: 'foo' }); @@ -119,7 +116,7 @@ function shallowRender(props: Partial = {}) issue={mockIssue(true, { key: '1', component: 'project:main.js', - textRange: { startLine: 1, endLine: 2, startOffset: 0, endOffset: 15 } + textRange: { startLine: 1, endLine: 2, startOffset: 0, endOffset: 15 }, })} issues={[]} locations={[mockFlowLocation({ component: 'project:main.js' })]} diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/IssueSourceViewerHeader-test.tsx b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/IssueSourceViewerHeader-test.tsx index 06655111a37..d67b331f0b7 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/IssueSourceViewerHeader-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/IssueSourceViewerHeader-test.tsx @@ -31,8 +31,8 @@ it('should render correctly', () => { expect( shallowRender({ sourceViewerFile: mockSourceViewerFile('foo/bar.ts', 'my-project', { - q: ComponentQualifier.Project - }) + q: ComponentQualifier.Project, + }), }) ).toMatchSnapshot('project root'); }); diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/SnippetViewer-test.tsx b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/SnippetViewer-test.tsx index 88b099b2ce7..d1fffc77c55 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/SnippetViewer-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/SnippetViewer-test.tsx @@ -25,7 +25,7 @@ import { mockIssue } from '../../../../helpers/testMocks'; import SnippetViewer from '../SnippetViewer'; jest.mock('../../../../helpers/scrolling', () => ({ - scrollHorizontally: jest.fn() + scrollHorizontally: jest.fn(), })); beforeEach(() => { @@ -33,19 +33,19 @@ beforeEach(() => { }); it('should render correctly', () => { - const snippet = range(5, 8).map(line => mockSourceLine({ line })); + const snippet = range(5, 8).map((line) => mockSourceLine({ line })); const wrapper = shallowRender({ - snippet + snippet, }); expect(wrapper).toMatchSnapshot(); }); it('should render correctly with no SCM', () => { - const snippet = range(5, 8).map(line => mockSourceLine({ line })); + const snippet = range(5, 8).map((line) => mockSourceLine({ line })); const wrapper = shallowRender({ displaySCM: false, - snippet + snippet, }); expect(wrapper).toMatchSnapshot(); @@ -65,16 +65,16 @@ it('should render additional child in line', () => { line: sourceline, snippet: [sourceline], symbols: [], - verticalBuffer: 5 + verticalBuffer: 5, }); expect(renderAdditionalChildInLine).toHaveBeenCalledWith(sourceline); }); it('should render correctly when at the top of the file', () => { - const snippet = range(1, 8).map(line => mockSourceLine({ line })); + const snippet = range(1, 8).map((line) => mockSourceLine({ line })); const wrapper = shallowRender({ - snippet + snippet, }); expect(wrapper).toMatchSnapshot(); @@ -82,35 +82,29 @@ it('should render correctly when at the top of the file', () => { it('should render correctly when at the bottom of the file', () => { const component = mockSourceViewerFile('foo/bar.ts', 'my-project', { measures: { lines: '14' } }); - const snippet = range(10, 14).map(line => mockSourceLine({ line })); + const snippet = range(10, 14).map((line) => mockSourceLine({ line })); const wrapper = shallowRender({ component, - snippet + snippet, }); expect(wrapper).toMatchSnapshot(); }); it('should correctly handle expansion', () => { - const snippet = range(5, 8).map(line => mockSourceLine({ line })); + const snippet = range(5, 8).map((line) => mockSourceLine({ line })); const expandBlock = jest.fn(() => Promise.resolve()); const wrapper = shallowRender({ expandBlock, index: 2, - snippet + snippet, }); - wrapper - .find('.expand-block-above button') - .first() - .simulate('click'); + wrapper.find('.expand-block-above button').first().simulate('click'); expect(expandBlock).toHaveBeenCalledWith(2, 'up'); - wrapper - .find('.expand-block-below button') - .first() - .simulate('click'); + wrapper.find('.expand-block-below button').first().simulate('click'); expect(expandBlock).toHaveBeenCalledWith(2, 'down'); }); diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/utils-test.ts b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/utils-test.ts index bc9896d68a6..b16926cefa0 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/utils-test.ts +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/__tests__/utils-test.ts @@ -31,28 +31,21 @@ describe('groupLocationsByComponent', () => { mockIssue(), [ mockFlowLocation({ - textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 } + textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 }, }), mockFlowLocation({ - textRange: { startLine: 16, startOffset: 2, endLine: 16, endOffset: 3 } + textRange: { startLine: 16, startOffset: 2, endLine: 16, endOffset: 3 }, }), mockFlowLocation({ - textRange: { startLine: 24, startOffset: 1, endLine: 24, endOffset: 2 } - }) + textRange: { startLine: 24, startOffset: 1, endLine: 24, endOffset: 2 }, + }), ], { - 'main.js': mockSnippetsByComponent('main.js', 'project', [ - 14, - 15, - 16, - 17, - 18, - 22, - 23, - 24, - 25, - 26 - ]) + 'main.js': mockSnippetsByComponent( + 'main.js', + 'project', + [14, 15, 16, 17, 18, 22, 23, 24, 25, 26] + ), } ); @@ -65,20 +58,20 @@ describe('groupLocationsByComponent', () => { [ mockFlowLocation({ component: 'A.js', - textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 } + textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 }, }), mockFlowLocation({ component: 'B.js', - textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 } + textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 }, }), mockFlowLocation({ component: 'A.js', - textRange: { startLine: 15, startOffset: 2, endLine: 15, endOffset: 3 } - }) + textRange: { startLine: 15, startOffset: 2, endLine: 15, endOffset: 3 }, + }), ], { 'A.js': mockSnippetsByComponent('A.js', 'project', [13, 14, 15, 16, 17, 18]), - 'B.js': mockSnippetsByComponent('B.js', 'project', [14, 15, 16, 17, 18]) + 'B.js': mockSnippetsByComponent('B.js', 'project', [14, 15, 16, 17, 18]), } ); @@ -96,16 +89,16 @@ describe('createSnippets', () => { it('should merge snippets correctly', () => { const locations = [ mockFlowLocation({ - textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 } + textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 }, }), mockFlowLocation({ - textRange: { startLine: 19, startOffset: 2, endLine: 19, endOffset: 3 } - }) + textRange: { startLine: 19, startOffset: 2, endLine: 19, endOffset: 3 }, + }), ]; const results = createSnippets({ component: '', locations, - issue: mockIssue(false, locations[1]) + issue: mockIssue(false, locations[1]), }); expect(results).toHaveLength(1); @@ -115,19 +108,19 @@ describe('createSnippets', () => { it('should merge snippets correctly, even when not in sequence', () => { const locations = [ mockFlowLocation({ - textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 } + textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 }, }), mockFlowLocation({ - textRange: { startLine: 47, startOffset: 2, endLine: 47, endOffset: 3 } + textRange: { startLine: 47, startOffset: 2, endLine: 47, endOffset: 3 }, }), mockFlowLocation({ - textRange: { startLine: 14, startOffset: 2, endLine: 14, endOffset: 3 } - }) + textRange: { startLine: 14, startOffset: 2, endLine: 14, endOffset: 3 }, + }), ]; const results = createSnippets({ component: '', locations, - issue: mockIssue(false, locations[2]) + issue: mockIssue(false, locations[2]), }); expect(results).toHaveLength(2); @@ -138,22 +131,22 @@ describe('createSnippets', () => { it('should merge three snippets together', () => { const locations = [ mockFlowLocation({ - textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 } + textRange: { startLine: 16, startOffset: 10, endLine: 16, endOffset: 14 }, }), mockFlowLocation({ - textRange: { startLine: 47, startOffset: 2, endLine: 47, endOffset: 3 } + textRange: { startLine: 47, startOffset: 2, endLine: 47, endOffset: 3 }, }), mockFlowLocation({ - textRange: { startLine: 23, startOffset: 2, endLine: 23, endOffset: 3 } + textRange: { startLine: 23, startOffset: 2, endLine: 23, endOffset: 3 }, }), mockFlowLocation({ - textRange: { startLine: 18, startOffset: 2, endLine: 18, endOffset: 3 } - }) + textRange: { startLine: 18, startOffset: 2, endLine: 18, endOffset: 3 }, + }), ]; const results = createSnippets({ component: '', locations, - issue: mockIssue(false, locations[0]) + issue: mockIssue(false, locations[0]), }); expect(results).toHaveLength(2); @@ -164,20 +157,20 @@ describe('createSnippets', () => { it("should prepend the issue's main location if necessary", () => { const locations = [ mockFlowLocation({ - textRange: { startLine: 85, startOffset: 2, endLine: 85, endOffset: 3 } + textRange: { startLine: 85, startOffset: 2, endLine: 85, endOffset: 3 }, }), mockFlowLocation({ - textRange: { startLine: 42, startOffset: 2, endLine: 42, endOffset: 3 } - }) + textRange: { startLine: 42, startOffset: 2, endLine: 42, endOffset: 3 }, + }), ]; const issue = mockIssue(false, { secondaryLocations: [mockFlowLocation()], - textRange: { startLine: 12, endLine: 12, startOffset: 0, endOffset: 0 } + textRange: { startLine: 12, endLine: 12, startOffset: 0, endOffset: 0 }, }); const results = createSnippets({ component: issue.component, locations, - issue + issue, }); expect(results).toHaveLength(3); @@ -189,17 +182,17 @@ describe('createSnippets', () => { it('should ignore location with no textrange', () => { const locations = [ mockFlowLocation({ - textRange: { startLine: 85, startOffset: 2, endLine: 85, endOffset: 3 } - }) + textRange: { startLine: 85, startOffset: 2, endLine: 85, endOffset: 3 }, + }), ]; const issue = mockIssue(false, { secondaryLocations: [mockFlowLocation()], - textRange: undefined + textRange: undefined, }); const results = createSnippets({ component: issue.component, locations, - issue + issue, }); expect(results).toHaveLength(1); @@ -230,7 +223,7 @@ describe('expandSnippet', () => { const snippets = [ { index: 1, start: 4, end: 14 }, { index: 2, start: 82, end: 92 }, - { index: 3, start: 37, end: 47 } + { index: 3, start: 37, end: 47 }, ]; const result = expandSnippet({ direction: 'down', snippetIndex: 1, snippets }); diff --git a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/utils.ts b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/utils.ts index 7476c471fb1..408d1cb010a 100644 --- a/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/utils.ts +++ b/server/sonar-web/src/main/js/apps/issues/crossComponentSourceViewer/utils.ts @@ -26,7 +26,7 @@ import { Snippet, SnippetGroup, SnippetsByComponent, - SourceLine + SourceLine, } from '../../../types/types'; const LINES_ABOVE = 5; @@ -44,9 +44,9 @@ function unknownComponent(key: string): SnippetsByComponent { project: '', projectName: '', q: ComponentQualifier.File, - uuid: '' + uuid: '', }, - sources: [] + sources: [], }; } @@ -61,8 +61,8 @@ export function getPrimaryLocation(issue: Issue): FlowLocation { endLine: 0, endOffset: 0, startLine: 0, - startOffset: 0 - } + startOffset: 0, + }, }; } @@ -98,7 +98,7 @@ export function createSnippets(params: { let firstCollision: { start: number; end: number } | undefined; // Remove ranges that collide into the first collision - snippets = snippets.filter(snippet => { + snippets = snippets.filter((snippet) => { if (collision([snippet.start, snippet.end], [startIndex, endIndex])) { let keep = false; // Check if we've already collided @@ -120,7 +120,7 @@ export function createSnippets(params: { snippets.push({ start: startIndex, end: endIndex, - index + index, }); } @@ -136,7 +136,7 @@ export function createSnippets(params: { export function linesForSnippets(snippets: Snippet[], componentLines: LineMap) { return snippets - .map(snippet => { + .map((snippet) => { const lines = []; for (let i = snippet.start; i <= snippet.end; i++) { if (componentLines[i]) { @@ -145,7 +145,7 @@ export function linesForSnippets(snippets: Snippet[], componentLines: LineMap) { } return lines; }) - .filter(snippet => snippet.length > 0); + .filter((snippet) => snippet.length > 0); } export function groupLocationsByComponent( @@ -160,7 +160,7 @@ export function groupLocationsByComponent( const addGroup = (componentKey: string) => { currentGroup = { ...(components[componentKey] || unknownComponent(componentKey)), - locations: [] + locations: [], }; groups.push(currentGroup); currentComponent = componentKey; @@ -168,7 +168,7 @@ export function groupLocationsByComponent( if ( issue.secondaryLocations.length > 0 && - locations.every(loc => loc.component !== issue.component) + locations.every((loc) => loc.component !== issue.component) ) { addGroup(issue.component); } @@ -191,13 +191,13 @@ export function groupLocationsByComponent( export function expandSnippet({ direction, snippetIndex, - snippets + snippets, }: { direction: ExpandDirection; snippetIndex: number; snippets: Snippet[]; }) { - const snippetToExpand = snippets.find(s => s.index === snippetIndex); + const snippetToExpand = snippets.find((s) => s.index === snippetIndex); if (!snippetToExpand) { throw new Error(`Snippet ${snippetIndex} not found`); } @@ -208,7 +208,7 @@ export function expandSnippet({ ); snippetToExpand.end += direction === 'down' ? EXPAND_BY_LINES : 0; - return snippets.map(snippet => { + return snippets.map((snippet) => { if (snippet.index === snippetIndex) { return snippetToExpand; } diff --git a/server/sonar-web/src/main/js/apps/issues/routes.tsx b/server/sonar-web/src/main/js/apps/issues/routes.tsx index 61354aba355..f32d22bc7cf 100644 --- a/server/sonar-web/src/main/js/apps/issues/routes.tsx +++ b/server/sonar-web/src/main/js/apps/issues/routes.tsx @@ -46,9 +46,9 @@ function IssuesNavigate() { id: searchParams.get('id'), branch: searchParams.get('branch'), pullRequest: searchParams.get('pullRequest'), - assignedToMe: 'false' + assignedToMe: 'false', }) - ).toString() + ).toString(), }, { replace: true } ); diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/AssigneeFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/AssigneeFacet.tsx index 9412a6395f7..db95de826ad 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/AssigneeFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/AssigneeFacet.tsx @@ -59,7 +59,7 @@ export default class AssigneeFacet extends React.PureComponent { } else { this.props.onChange({ assigned: true, - assignees: assignees.includes(itemValue) && assignees.length < 2 ? [] : [itemValue] + assignees: assignees.includes(itemValue) && assignees.length < 2 ? [] : [itemValue], }); } }; @@ -83,7 +83,7 @@ export default class AssigneeFacet extends React.PureComponent { loadSearchResultCount = (assignees: UserBase[]) => { return this.props.loadSearchResultCount('assignees', { assigned: undefined, - assignees: assignees.map(assignee => assignee.login) + assignees: assignees.map((assignee) => assignee.login), }); }; @@ -92,9 +92,9 @@ export default class AssigneeFacet extends React.PureComponent { return sortBy( Object.keys(stats), // put "not assigned" first - key => (key === '' ? 0 : 1), + (key) => (key === '' ? 0 : 1), // the sort by number - key => -stats[key] + (key) => -stats[key] ); }; @@ -147,8 +147,8 @@ export default class AssigneeFacet extends React.PureComponent { facetHeader={translate('issues.facet.assignees')} fetching={this.props.fetching} getFacetItemText={this.getAssigneeName} - getSearchResultKey={user => user.login} - getSearchResultText={user => user.name || user.login} + getSearchResultKey={(user) => user.login} + getSearchResultText={(user) => user.name || user.login} // put "not assigned" item first getSortedItems={this.getSortedItems} loadSearchResultCount={this.loadSearchResultCount} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/AuthorFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/AuthorFacet.tsx index dfea386d98f..bd83518fb45 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/AuthorFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/AuthorFacet.tsx @@ -53,8 +53,8 @@ export default class AuthorFacet extends React.PureComponent { return searchIssueAuthors({ project, ps: SEARCH_SIZE, // maximum - q: query - }).then(authors => ({ maxResults: authors.length === SEARCH_SIZE, results: authors })); + q: query, + }).then((authors) => ({ maxResults: authors.length === SEARCH_SIZE, results: authors })); }; loadSearchResultCount = (author: string[]) => { diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/CreationDateFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/CreationDateFacet.tsx index 0287f037fad..8c2ccb89ac0 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/CreationDateFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/CreationDateFacet.tsx @@ -29,7 +29,7 @@ import FacetItem from '../../../components/facet/FacetItem'; import { longFormatterOption } from '../../../components/intl/DateFormatter'; import DateFromNow from '../../../components/intl/DateFromNow'; import DateTimeFormatter, { - formatterOption as dateTimeFormatterOption + formatterOption as dateTimeFormatterOption, } from '../../../components/intl/DateTimeFormatter'; import { parseDate } from '../../../helpers/dates'; import { translate, translateWithParameters } from '../../../helpers/l10n'; @@ -56,7 +56,7 @@ export class CreationDateFacet extends React.PureComponent @@ -81,13 +81,13 @@ export class CreationDateFacet extends React.PureComponent this.resetTo({ createdInLast: period }); getValues() { - const { - createdAfter, - createdAfterIncludesTime, - createdAt, - createdBefore, - createdInLast - } = this.props; + const { createdAfter, createdAfterIncludesTime, createdAt, createdBefore, createdInLast } = + this.props; const { formatDate } = this.props.intl; const values = []; if (createdAfter) { @@ -146,7 +141,7 @@ export class CreationDateFacet extends React.PureComponent !stats[period])) { + if (periods.length < 2 || periods.every((period) => !stats[period])) { return null; } @@ -185,15 +180,15 @@ export class CreationDateFacet extends React.PureComponent d.y)); - const xValues = data.map(d => (d.y === maxValue ? formatMeasure(maxValue, 'SHORT_INT') : '')); + const maxValue = max(data.map((d) => d.y)); + const xValues = data.map((d) => (d.y === maxValue ? formatMeasure(maxValue, 'SHORT_INT') : '')); return ( { ...getBranchLikeQuery(branchLike), q: query, p: page, - ps: 30 + ps: 30, }).then(({ components, paging }) => ({ paging, - results: components.filter(dir => dir.path !== undefined) + results: components.filter((dir) => dir.path !== undefined), })); }; loadSearchResultCount = (directories: TreeComponentWithPath[]) => { return this.props.loadSearchResultCount('directories', { - directories: directories.map(directory => directory.path) + directories: directories.map((directory) => directory.path), }); }; diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/FileFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/FileFacet.tsx index f2d2f2f4cee..5a102ccf9d6 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/FileFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/FileFacet.tsx @@ -67,20 +67,20 @@ export default class FileFacet extends React.PureComponent { ...getBranchLikeQuery(branchLike), q: query, p: page, - ps: 30 + ps: 30, }).then(({ components, paging }) => ({ paging, - results: components.filter(file => file.path !== undefined) + results: components.filter((file) => file.path !== undefined), })); }; loadSearchResultCount = (files: TreeComponentWithPath[]) => { return this.props.loadSearchResultCount('files', { files: files - .map(file => { + .map((file) => { return file.path; }) - .filter(isDefined) + .filter(isDefined), }); }; diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/LanguageFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/LanguageFacet.tsx index c10a038f8b7..f3eef01d016 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/LanguageFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/LanguageFacet.tsx @@ -49,7 +49,7 @@ class LanguageFacet extends React.PureComponent { handleSearch = (query: string) => { const options = this.getAllPossibleOptions(); - const results = options.filter(language => + const results = options.filter((language) => language.name.toLowerCase().includes(query.toLowerCase()) ); const paging = { pageIndex: 1, pageSize: results.length, total: results.length }; @@ -63,14 +63,14 @@ class LanguageFacet extends React.PureComponent { // for such language we don't know their display name, so let's just use their key // and make sure we reference each language only once return uniqBy( - [...Object.values(languages), ...Object.keys(stats).map(key => ({ key, name: key }))], - language => language.key + [...Object.values(languages), ...Object.keys(stats).map((key) => ({ key, name: key }))], + (language) => language.key ); }; loadSearchResultCount = (languages: Language[]) => { return this.props.loadSearchResultCount('languages', { - languages: languages.map(language => language.key) + languages: languages.map((language) => language.key), }); }; @@ -84,8 +84,8 @@ class LanguageFacet extends React.PureComponent { facetHeader={translate('issues.facet.languages')} fetching={this.props.fetching} getFacetItemText={this.getLanguageName} - getSearchResultKey={language => language.key} - getSearchResultText={language => language.name} + getSearchResultKey={(language) => language.key} + getSearchResultText={(language) => language.name} loadSearchResultCount={this.loadSearchResultCount} minSearchLength={1} onChange={this.props.onChange} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/PeriodFilter.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/PeriodFilter.tsx index c75cd9a2b6d..27370ecf119 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/PeriodFilter.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/PeriodFilter.tsx @@ -33,7 +33,7 @@ export interface PeriodFilterProps { } enum Period { - NewCode = 'inNewCodePeriod' + NewCode = 'inNewCodePeriod', } const PROPERTY = 'period'; @@ -49,7 +49,7 @@ export default function PeriodFilter(props: PeriodFilterProps) { createdAt: undefined, createdBefore: undefined, createdInLast: undefined, - [Period.NewCode]: !newCodeSelected + [Period.NewCode]: !newCodeSelected, }); }, [newCodeSelected, onChange]); diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/ProjectFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/ProjectFacet.tsx index d96d452a39f..744f7207ec5 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/ProjectFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/ProjectFacet.tsx @@ -58,7 +58,7 @@ export default class ProjectFacet extends React.PureComponent { [ ComponentQualifier.Portfolio, ComponentQualifier.SubPortfolio, - ComponentQualifier.Application + ComponentQualifier.Application, ].includes(component.qualifier as ComponentQualifier) ) { return getTree({ @@ -66,26 +66,26 @@ export default class ProjectFacet extends React.PureComponent { p: page, ps: 30, q: query, - qualifiers: ComponentQualifier.Project + qualifiers: ComponentQualifier.Project, }).then(({ components, paging }) => ({ paging, - results: components.map(component => ({ + results: components.map((component) => ({ key: component.refKey || component.key, - name: component.name - })) + name: component.name, + })), })); } return searchProjects({ p: page, ps: 30, - filter: query ? `query = "${query}"` : '' + filter: query ? `query = "${query}"` : '', }).then(({ components, paging }) => ({ paging, - results: components.map(component => ({ + results: components.map((component) => ({ key: component.key, - name: component.name - })) + name: component.name, + })), })); }; @@ -96,7 +96,7 @@ export default class ProjectFacet extends React.PureComponent { loadSearchResultCount = (projects: SearchedProject[]) => { return this.props.loadSearchResultCount('projects', { - projects: projects.map(project => project.key) + projects: projects.map((project) => project.key), }); }; @@ -122,8 +122,8 @@ export default class ProjectFacet extends React.PureComponent { facetHeader={translate('issues.facet.projects')} fetching={this.props.fetching} getFacetItemText={this.getProjectName} - getSearchResultKey={project => project.key} - getSearchResultText={project => project.name} + getSearchResultKey={(project) => project.key} + getSearchResultText={(project) => project.name} loadSearchResultCount={this.loadSearchResultCount} onChange={this.props.onChange} onSearch={this.handleSearch} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/ResolutionFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/ResolutionFacet.tsx index 1a54f9b3eee..f35af217a23 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/ResolutionFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/ResolutionFacet.tsx @@ -44,7 +44,7 @@ export default class ResolutionFacet extends React.PureComponent { property = 'resolutions'; static defaultProps = { - open: true + open: true, }; handleItemClick = (itemValue: string, multiple: boolean) => { @@ -63,7 +63,7 @@ export default class ResolutionFacet extends React.PureComponent { this.props.onChange({ resolved: true, [this.property]: - resolutions.includes(itemValue) && resolutions.length < 2 ? [] : [itemValue] + resolutions.includes(itemValue) && resolutions.length < 2 ? [] : [itemValue], }); } }; @@ -109,7 +109,7 @@ export default class ResolutionFacet extends React.PureComponent { render() { const { resolutions, stats = {} } = this.props; - const values = resolutions.map(resolution => this.getFacetItemName(resolution)); + const values = resolutions.map((resolution) => this.getFacetItemName(resolution)); return ( diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/RuleFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/RuleFacet.tsx index fb6d1177191..5d0f35ebacb 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/RuleFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/RuleFacet.tsx @@ -49,15 +49,15 @@ export default class RuleFacet extends React.PureComponent { p: page, ps: 30, s: 'name', - include_external: true - }).then(response => ({ + include_external: true, + }).then((response) => ({ paging: { pageIndex: response.p, pageSize: response.ps, total: response.total }, - results: response.rules + results: response.rules, })); }; loadSearchResultCount = (rules: Rule[]) => { - return this.props.loadSearchResultCount('rules', { rules: rules.map(rule => rule.key) }); + return this.props.loadSearchResultCount('rules', { rules: rules.map((rule) => rule.key) }); }; getRuleName = (ruleKey: string) => { @@ -81,8 +81,8 @@ export default class RuleFacet extends React.PureComponent { facetHeader={translate('issues.facet.rules')} fetching={this.props.fetching} getFacetItemText={this.getRuleName} - getSearchResultKey={rule => rule.key} - getSearchResultText={rule => rule.name} + getSearchResultKey={(rule) => rule.key} + getSearchResultText={(rule) => rule.name} loadSearchResultCount={this.loadSearchResultCount} onChange={this.props.onChange} onSearch={this.handleSearch} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/ScopeFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/ScopeFacet.tsx index f831854f467..508a2141f22 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/ScopeFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/ScopeFacet.tsx @@ -41,7 +41,7 @@ export interface ScopeFacetProps { export default function ScopeFacet(props: ScopeFacetProps) { const { fetching, open, scopes = [], stats = {} } = props; - const values = scopes.map(scope => translate('issue.scope', scope)); + const values = scopes.map((scope) => translate('issue.scope', scope)); return ( @@ -78,11 +78,11 @@ export default function ScopeFacet(props: ScopeFacetProps) { onClick={(itemValue: string, multiple: boolean) => { if (multiple) { props.onChange({ - scopes: active ? without(scopes, itemValue) : [...scopes, itemValue] + scopes: active ? without(scopes, itemValue) : [...scopes, itemValue], }); } else { props.onChange({ - scopes: active && scopes.length === 1 ? [] : [itemValue] + scopes: active && scopes.length === 1 ? [] : [itemValue], }); } }} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/SeverityFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/SeverityFacet.tsx index 360ead170ca..f574fe09c9f 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/SeverityFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/SeverityFacet.tsx @@ -44,7 +44,7 @@ export default class SeverityFacet extends React.PureComponent { property = 'severities'; static defaultProps = { - open: true + open: true, }; handleItemClick = (itemValue: string, multiple: boolean) => { @@ -56,7 +56,7 @@ export default class SeverityFacet extends React.PureComponent { this.props.onChange({ [this.property]: newValue }); } else { this.props.onChange({ - [this.property]: severities.includes(itemValue) && severities.length < 2 ? [] : [itemValue] + [this.property]: severities.includes(itemValue) && severities.length < 2 ? [] : [itemValue], }); } }; @@ -94,7 +94,7 @@ export default class SeverityFacet extends React.PureComponent { render() { const { severities, stats = {} } = this.props; - const values = severities.map(severity => translate('severity', severity)); + const values = severities.map((severity) => translate('severity', severity)); return ( diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/Sidebar.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/Sidebar.tsx index 2496a4dcf9b..83a792aa168 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/Sidebar.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/Sidebar.tsx @@ -26,13 +26,13 @@ import { ComponentQualifier, isApplication, isPortfolioLike, - isView + isView, } from '../../../types/component'; import { Facet, ReferencedComponent, ReferencedLanguage, - ReferencedRule + ReferencedRule, } from '../../../types/issues'; import { GlobalSettingKeys } from '../../../types/settings'; import { Component, Dict } from '../../../types/types'; @@ -88,7 +88,7 @@ export class Sidebar extends React.PureComponent { loadSearchResultCount: this.props.loadSearchResultCount, onChange: this.props.onFilterChange, onToggle: this.props.onFacetToggle, - query + query, }; return ( <> @@ -122,7 +122,7 @@ export class Sidebar extends React.PureComponent { facets, openFacets, query, - branchLike + branchLike, } = this.props; const disableDeveloperAggregatedInfo = diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/StandardFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/StandardFacet.tsx index 02b892f6bb0..030d27486f5 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/StandardFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/StandardFacet.tsx @@ -37,7 +37,7 @@ import { renderOwaspTop102021Category, renderOwaspTop10Category, renderSansTop25Category, - renderSonarSourceSecurityCategory + renderSonarSourceSecurityCategory, } from '../../../helpers/security-standard'; import { Facet } from '../../../types/issues'; import { SecurityStandard, Standards } from '../../../types/security'; @@ -99,8 +99,8 @@ export default class StandardFacet extends React.PureComponent { sonarsourceSecurity: {}, 'pciDss-3.2': {}, 'pciDss-4.0': {}, - 'owaspAsvs-4.0': {} - } + 'owaspAsvs-4.0': {}, + }, }; componentDidMount() { @@ -139,7 +139,7 @@ export default class StandardFacet extends React.PureComponent { sonarsourceSecurity, 'pciDss-3.2': pciDss3_2, 'pciDss-4.0': pciDss4_0, - 'owaspAsvs-4.0': owaspAsvs4_0 + 'owaspAsvs-4.0': owaspAsvs4_0, }: Standards) => { if (this.mounted) { this.setState({ @@ -151,8 +151,8 @@ export default class StandardFacet extends React.PureComponent { sonarsourceSecurity, 'pciDss-3.2': pciDss3_2, 'pciDss-4.0': pciDss4_0, - 'owaspAsvs-4.0': owaspAsvs4_0 - } + 'owaspAsvs-4.0': owaspAsvs4_0, + }, }); } }, @@ -162,19 +162,19 @@ export default class StandardFacet extends React.PureComponent { getValues = () => { return [ - ...this.props.sonarsourceSecurity.map(item => + ...this.props.sonarsourceSecurity.map((item) => renderSonarSourceSecurityCategory(this.state.standards, item, true) ), - ...this.props.owaspTop10.map(item => + ...this.props.owaspTop10.map((item) => renderOwaspTop10Category(this.state.standards, item, true) ), - ...this.props['owaspTop10-2021'].map(item => + ...this.props['owaspTop10-2021'].map((item) => renderOwaspTop102021Category(this.state.standards, item, true) ), - ...this.props.sansTop25.map(item => + ...this.props.sansTop25.map((item) => renderSansTop25Category(this.state.standards, item, true) ), - ...this.props.cwe.map(item => renderCWECategory(this.state.standards, item)) + ...this.props.cwe.map((item) => renderCWECategory(this.state.standards, item)), ]; }; @@ -205,7 +205,7 @@ export default class StandardFacet extends React.PureComponent { 'owaspTop10-2021': [], sansTop25: [], cwe: [], - sonarsourceSecurity: [] + sonarsourceSecurity: [], }); }; @@ -218,7 +218,7 @@ export default class StandardFacet extends React.PureComponent { this.props.onChange({ [prop]: newValue }); } else { this.props.onChange({ - [prop]: items.includes(itemValue) && items.length < 2 ? [] : [itemValue] + [prop]: items.includes(itemValue) && items.length < 2 ? [] : [itemValue], }); } }; @@ -241,11 +241,9 @@ export default class StandardFacet extends React.PureComponent { handleCWESearch = (query: string) => { return Promise.resolve({ - results: Object.keys(this.state.standards.cwe).filter(cwe => - renderCWECategory(this.state.standards, cwe) - .toLowerCase() - .includes(query.toLowerCase()) - ) + results: Object.keys(this.state.standards.cwe).filter((cwe) => + renderCWECategory(this.state.standards, cwe).toLowerCase().includes(query.toLowerCase()) + ), }); }; @@ -267,7 +265,7 @@ export default class StandardFacet extends React.PureComponent { if (!stats) { return null; } - const categories = sortBy(Object.keys(stats), key => -stats[key]); + const categories = sortBy(Object.keys(stats), (key) => -stats[key]); return this.renderFacetItemsList(stats, values, categories, renderName, renderName, onClick); }; @@ -294,7 +292,7 @@ export default class StandardFacet extends React.PureComponent { return ( - {categories.map(category => ( + {categories.map((category) => ( { const sortedItems = sortBy( Object.keys(stats), - key => -stats[key], - key => renderSonarSourceSecurityCategory(this.state.standards, key) + (key) => -stats[key], + (key) => renderSonarSourceSecurityCategory(this.state.standards, key) ); const limitedList = this.state.showFullSonarSourceList @@ -363,13 +361,13 @@ export default class StandardFacet extends React.PureComponent { // make sure all selected items are displayed const selectedBelowLimit = this.state.showFullSonarSourceList ? [] - : sortedItems.slice(INITIAL_FACET_COUNT).filter(item => values.includes(item)); + : sortedItems.slice(INITIAL_FACET_COUNT).filter((item) => values.includes(item)); const allItemShown = limitedList.length + selectedBelowLimit.length === sortedItems.length; return ( <> - {limitedList.map(item => ( + {limitedList.map((item) => ( { <> {!allItemShown &&
      } - {selectedBelowLimit.map(item => ( + {selectedBelowLimit.map((item) => ( { name={translate('issues.facet.sonarsourceSecurity')} onClick={this.handleSonarSourceSecurityHeaderClick} open={this.props.sonarsourceSecurityOpen} - values={this.props.sonarsourceSecurity.map(item => + values={this.props.sonarsourceSecurity.map((item) => renderSonarSourceSecurityCategory(this.state.standards, item) )} /> @@ -457,7 +455,7 @@ export default class StandardFacet extends React.PureComponent { name={translate('issues.facet.owaspTop10_2021')} onClick={this.handleOwaspTop102021HeaderClick} open={this.props['owaspTop10-2021Open']} - values={this.props['owaspTop10-2021'].map(item => + values={this.props['owaspTop10-2021'].map((item) => renderOwaspTop102021Category(this.state.standards, item) )} /> @@ -474,7 +472,7 @@ export default class StandardFacet extends React.PureComponent { name={translate('issues.facet.owaspTop10')} onClick={this.handleOwaspTop10HeaderClick} open={this.props.owaspTop10Open} - values={this.props.owaspTop10.map(item => + values={this.props.owaspTop10.map((item) => renderOwaspTop10Category(this.state.standards, item) )} /> @@ -491,7 +489,7 @@ export default class StandardFacet extends React.PureComponent { name={translate('issues.facet.sansTop25')} onClick={this.handleSansTop25HeaderClick} open={this.props.sansTop25Open} - values={this.props.sansTop25.map(item => + values={this.props.sansTop25.map((item) => renderSansTop25Category(this.state.standards, item) )} /> @@ -506,9 +504,9 @@ export default class StandardFacet extends React.PureComponent { className="is-inner" facetHeader={translate('issues.facet.cwe')} fetching={this.props.fetchingCwe} - getFacetItemText={item => renderCWECategory(this.state.standards, item)} - getSearchResultKey={item => item} - getSearchResultText={item => renderCWECategory(this.state.standards, item)} + getFacetItemText={(item) => renderCWECategory(this.state.standards, item)} + getSearchResultKey={(item) => item} + getSearchResultText={(item) => renderCWECategory(this.state.standards, item)} loadSearchResultCount={this.loadCWESearchResultCount} onChange={this.props.onChange} onSearch={this.handleCWESearch} @@ -516,7 +514,7 @@ export default class StandardFacet extends React.PureComponent { open={this.props.cweOpen} property={SecurityStandard.CWE} query={omit(this.props.query, 'cwe')} - renderFacetItem={item => renderCWECategory(this.state.standards, item)} + renderFacetItem={(item) => renderCWECategory(this.state.standards, item)} renderSearchResult={(item, query) => highlightTerm(renderCWECategory(this.state.standards, item), query) } diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/StatusFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/StatusFacet.tsx index c2b91369b1c..d47bc17b8b2 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/StatusFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/StatusFacet.tsx @@ -54,7 +54,7 @@ export default class StatusFacet extends React.PureComponent { this.props.onChange({ [this.property]: newValue }); } else { this.props.onChange({ - [this.property]: statuses.includes(itemValue) && statuses.length < 2 ? [] : [itemValue] + [this.property]: statuses.includes(itemValue) && statuses.length < 2 ? [] : [itemValue], }); } }; @@ -92,7 +92,7 @@ export default class StatusFacet extends React.PureComponent { render() { const { statuses, stats = {} } = this.props; - const values = statuses.map(status => translate('issue.status', status)); + const values = statuses.map((status) => translate('issue.status', status)); return ( diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/TagFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/TagFacet.tsx index 66c6f296e5e..0767102a7cb 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/TagFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/TagFacet.tsx @@ -53,8 +53,8 @@ export default class TagFacet extends React.PureComponent { project, branch, ps: SEARCH_SIZE, - q: query - }).then(tags => ({ maxResults: tags.length === SEARCH_SIZE, results: tags })); + q: query, + }).then((tags) => ({ maxResults: tags.length === SEARCH_SIZE, results: tags })); }; getTagName = (tag: string) => { @@ -87,8 +87,8 @@ export default class TagFacet extends React.PureComponent { facetHeader={translate('issues.facet.tags')} fetching={this.props.fetching} getFacetItemText={this.getTagName} - getSearchResultKey={tag => tag} - getSearchResultText={tag => tag} + getSearchResultKey={(tag) => tag} + getSearchResultText={(tag) => tag} loadSearchResultCount={this.loadSearchResultCount} onChange={this.props.onChange} onSearch={this.handleSearch} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/TypeFacet.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/TypeFacet.tsx index 9b04c49c307..f2095d0a684 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/TypeFacet.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/TypeFacet.tsx @@ -43,7 +43,7 @@ export default class TypeFacet extends React.PureComponent { property = 'types'; static defaultProps = { - open: true + open: true, }; handleItemClick = (itemValue: string, multiple: boolean) => { @@ -55,7 +55,7 @@ export default class TypeFacet extends React.PureComponent { this.props.onChange({ [this.property]: newValue }); } else { this.props.onChange({ - [this.property]: types.includes(itemValue) && types.length < 2 ? [] : [itemValue] + [this.property]: types.includes(itemValue) && types.length < 2 ? [] : [itemValue], }); } }; @@ -100,7 +100,7 @@ export default class TypeFacet extends React.PureComponent { render() { const { types, stats = {} } = this.props; - const values = types.map(type => translate('issue.type', type)); + const values = types.map((type) => translate('issue.type', type)); return ( @@ -116,7 +116,7 @@ export default class TypeFacet extends React.PureComponent { {this.props.open && ( <> - {ISSUE_TYPES.filter(t => t !== 'SECURITY_HOTSPOT').map(this.renderItem)} + {ISSUE_TYPES.filter((t) => t !== 'SECURITY_HOTSPOT').map(this.renderItem)} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/AssigneeFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/AssigneeFacet-test.tsx index a9841ccf695..94e18c28d34 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/AssigneeFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/AssigneeFacet-test.tsx @@ -27,11 +27,7 @@ it('should render', () => { }); it('should select unassigned', () => { - expect( - shallowRender({ assigned: false }) - .find('ListStyleFacet') - .prop('values') - ).toEqual(['']); + expect(shallowRender({ assigned: false }).find('ListStyleFacet').prop('values')).toEqual(['']); }); it('should call onChange', () => { @@ -54,8 +50,8 @@ describe('test behavior', () => { assignees: ['foo', 'baz'], referencedUsers: { foo: { active: false, login: 'foo' }, - baz: { active: true, login: 'baz', name: 'Name Baz' } - } + baz: { active: true, login: 'baz', name: 'Name Baz' }, + }, }).instance(); it('should correctly render assignee name', () => { diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/CreationDateFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/CreationDateFacet-test.tsx index b7dc314c058..064cbfae9d0 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/CreationDateFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/CreationDateFacet-test.tsx @@ -31,13 +31,13 @@ it('should render correctly', () => { expect( shallowRender({ createdAfter: new Date('2019.04.29T13:33:00Z'), - createdAfterIncludesTime: true + createdAfterIncludesTime: true, }) ).toMatchSnapshot('created after'); expect( shallowRender({ createdAfter: new Date('2019.04.29T13:33:00Z'), - createdAfterIncludesTime: true + createdAfterIncludesTime: true, }) ).toMatchSnapshot('created after timestamp'); expect(shallowRender({ component: mockComponent() })).toMatchSnapshot('project'); @@ -49,7 +49,7 @@ it('should render correctly', () => { it.each([ ['week', '1w'], ['month', '1m'], - ['year', '1y'] + ['year', '1y'], ])('should render correctly for createdInLast %s', (_, createdInLast) => { expect(shallowRender({ component: mockComponent(), createdInLast })).toMatchSnapshot(); }); @@ -67,7 +67,7 @@ function shallowRender(props?: Partial) { inNewCodePeriod={false} intl={ { - formatDate: (date: string) => 'formatted.' + date + formatDate: (date: string) => 'formatted.' + date, } as IntlShape } onChange={jest.fn()} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/DirectoryFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/DirectoryFacet-test.tsx index 3ed3dbd5223..86158f1a518 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/DirectoryFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/DirectoryFacet-test.tsx @@ -28,7 +28,7 @@ import { Query } from '../../utils'; import DirectoryFacet from '../DirectoryFacet'; jest.mock('../../../../api/components', () => ({ - getDirectories: jest.fn().mockResolvedValue({ components: [] }) + getDirectories: jest.fn().mockResolvedValue({ components: [] }), })); beforeEach(() => jest.clearAllMocks()); @@ -51,17 +51,14 @@ it('should properly search for directory', () => { const query = 'foo'; - wrapper - .find(ListStyleFacet) - .props() - .onSearch(query); + wrapper.find(ListStyleFacet).props().onSearch(query); expect(getDirectories).toHaveBeenCalledWith({ branch: branch.name, component: component.key, q: query, ps: 30, - p: undefined + p: undefined, }); }); diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/FileFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/FileFacet-test.tsx index 6e77daa6f4c..0a8d45e2eb4 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/FileFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/FileFacet-test.tsx @@ -28,7 +28,7 @@ import { Query } from '../../utils'; import FileFacet from '../FileFacet'; jest.mock('../../../../api/components', () => ({ - getFiles: jest.fn().mockResolvedValue({ components: [] }) + getFiles: jest.fn().mockResolvedValue({ components: [] }), })); beforeEach(() => jest.clearAllMocks()); @@ -53,17 +53,14 @@ it('should properly search for file', () => { const query = 'foo'; - wrapper - .find(ListStyleFacet) - .props() - .onSearch(query); + wrapper.find(ListStyleFacet).props().onSearch(query); expect(getFiles).toHaveBeenCalledWith({ branch: branch.name, component: component.key, q: query, ps: 30, - p: undefined + p: undefined, }); }); diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/PeriodFilter-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/PeriodFilter-test.tsx index 346fcea74b9..06ebef3c213 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/PeriodFilter-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/PeriodFilter-test.tsx @@ -36,7 +36,7 @@ it('should filter when clicked', async () => { createdAt: undefined, createdBefore: undefined, createdInLast: undefined, - inNewCodePeriod: true + inNewCodePeriod: true, }); }); diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/ProjectFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/ProjectFacet-test.tsx index 45ce1c7f9a1..b702cd21da3 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/ProjectFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/ProjectFacet-test.tsx @@ -32,8 +32,8 @@ jest.mock('../../../../api/components', () => ({ searchProjects: jest.fn().mockResolvedValue({ components: [], facets: [], - paging: {} - }) + paging: {}, + }), })); beforeEach(() => jest.clearAllMocks()); @@ -47,7 +47,7 @@ it('should callback to load search results', () => { const wrapper = shallowRender({ loadSearchResultCount }); wrapper.instance().loadSearchResultCount([ { key: '1', name: 'first' }, - { key: '2', name: 'seecond' } + { key: '2', name: 'seecond' }, ]); expect(loadSearchResultCount).toHaveBeenCalledWith('projects', { projects: ['1', '2'] }); @@ -65,7 +65,7 @@ it('should handle search for projects globally', async () => { it('should handle search for projects in portfolio', async () => { const wrapper = shallowRender({ - component: mockComponent({ qualifier: ComponentQualifier.Portfolio }) + component: mockComponent({ qualifier: ComponentQualifier.Portfolio }), }); const query = 'my project'; @@ -78,9 +78,9 @@ it('should handle search for projects in portfolio', async () => { describe("ListStyleFacet's renderers", () => { const components: ReferencedComponent[] = [ { key: 'projectKey', name: 'First Project Name', uuid: '141324' }, - { key: 'projectKey2', name: 'Second Project Name', uuid: '643878' } + { key: 'projectKey2', name: 'Second Project Name', uuid: '643878' }, ]; - const referencedComponents = keyBy(components, c => c.key); + const referencedComponents = keyBy(components, (c) => c.key); const wrapper = shallowRender({ referencedComponents }); const instance = wrapper.instance(); diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/RuleFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/RuleFacet-test.tsx index 75a3c8ac9c1..43d5230f53f 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/RuleFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/RuleFacet-test.tsx @@ -26,7 +26,7 @@ import { Query } from '../../utils'; import RuleFacet from '../RuleFacet'; jest.mock('../../../../api/rules', () => ({ - searchRules: jest.fn().mockResolvedValue({}) + searchRules: jest.fn().mockResolvedValue({}), })); it('should render correctly', () => { diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/ScopeFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/ScopeFacet-test.tsx index abc273c3101..505ab8d4007 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/ScopeFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/ScopeFacet-test.tsx @@ -59,7 +59,7 @@ it('should correctly handle facet item clicks', () => { clickFacetItem(wrapper, IssueScope.Test, true); clickFacetItem(wrapper, IssueScope.Main, true); expect(onChange).toHaveBeenLastCalledWith({ - scopes: expect.arrayContaining([IssueScope.Main, IssueScope.Test]) + scopes: expect.arrayContaining([IssueScope.Main, IssueScope.Test]), }); clickFacetItem(wrapper, IssueScope.Test, true); @@ -73,7 +73,7 @@ function clickFacetItem( ) { return wrapper .find(FacetItem) - .filterWhere(f => f.key() === scope) + .filterWhere((f) => f.key() === scope) .props() .onClick(scope, multiple); } diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/Sidebar-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/Sidebar-test.tsx index bdfb4b033bd..51e24764183 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/Sidebar-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/Sidebar-test.tsx @@ -38,8 +38,8 @@ it('should render facets for project', () => { it.each([ [ComponentQualifier.Application], [ComponentQualifier.Portfolio], - [ComponentQualifier.SubPortfolio] -])('should render facets for %p', qualifier => { + [ComponentQualifier.SubPortfolio], +])('should render facets for %p', (qualifier) => { expect(renderSidebar({ component: mockComponent({ qualifier }) })).toMatchSnapshot(); }); @@ -51,8 +51,8 @@ it('should not render developer nominative facets when asked not to', () => { expect( renderSidebar({ appState: mockAppState({ - settings: { [GlobalSettingKeys.DeveloperAggregatedInfoDisabled]: 'true' } - }) + settings: { [GlobalSettingKeys.DeveloperAggregatedInfoDisabled]: 'true' }, + }), }) ).toMatchSnapshot(); }); @@ -63,7 +63,7 @@ const renderSidebar = (props?: Partial) => { shallow( ) => { ); function mapChildren(wrapper: ShallowWrapper) { - return wrapper.children().map(node => { + return wrapper.children().map((node) => { if (typeof node.type() === 'symbol') { - return node.children().map(n => n.name()); + return node.children().map((n) => n.name()); } return node.name(); }); diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/StandardFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/StandardFacet-test.tsx index fa4b3eaf027..936691f2b3b 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/StandardFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/StandardFacet-test.tsx @@ -30,42 +30,42 @@ jest.mock('../../../../helpers/security-standard', () => ({ getStandards: jest.fn().mockResolvedValue({ owaspTop10: { a1: { - title: 'Injection' + title: 'Injection', }, a2: { - title: 'Broken Authentication' - } + title: 'Broken Authentication', + }, }, 'owaspTop10-2021': { a1: { - title: 'Injection' + title: 'Injection', }, a2: { - title: 'Broken Authentication' - } + title: 'Broken Authentication', + }, }, sansTop25: { 'insecure-interaction': { - title: 'Insecure Interaction Between Components' - } + title: 'Insecure Interaction Between Components', + }, }, cwe: { unknown: { - title: 'No CWE associated' + title: 'No CWE associated', }, '1004': { - title: "Sensitive Cookie Without 'HttpOnly' Flag" - } + title: "Sensitive Cookie Without 'HttpOnly' Flag", + }, }, sonarsourceSecurity: { 'sql-injection': { - title: 'SQL Injection' + title: 'SQL Injection', }, 'command-injection': { - title: 'Command Injection' - } - } - }) + title: 'Command Injection', + }, + }, + }), })); it('should render closed', () => { @@ -90,7 +90,7 @@ it('should clear standards facet', () => { 'owaspTop10-2021': [], sansTop25: [], sonarsourceSecurity: [], - standards: [] + standards: [], }); }); @@ -109,7 +109,7 @@ it('should render sub-facets', () => { sansTop25Stats: { foo: 12, 'risky-resource': 10 }, sonarsourceSecurity: ['sql-injection'], sonarsourceSecurityOpen: true, - sonarsourceSecurityStats: { 'sql-injection': 12 } + sonarsourceSecurityStats: { 'sql-injection': 12 }, }) ).toMatchSnapshot(); expect(getStandards).toHaveBeenCalled(); @@ -145,8 +145,8 @@ it('should show sonarsource facet more button', () => { 'encrypt-data': 3, traceability: 3, permission: 3, - others: 3 - } + others: 3, + }, }); expect(wrapper.find(ListStyleFacetFooter).exists()).toBe(true); @@ -179,7 +179,7 @@ it('should select items', () => { sansTop25Stats: { foo: 12, 'risky-resource': 10 }, sonarsourceSecurity: ['command-injection'], sonarsourceSecurityOpen: true, - sonarsourceSecurityStats: { 'sql-injection': 10 } + sonarsourceSecurityStats: { 'sql-injection': 10 }, }); selectAndCheck('owaspTop10', 'a1'); @@ -214,7 +214,7 @@ it('should display correct selection', () => { 'owaspTop10-2021': ['a1', 'a2'], sansTop25: ['risky-resource', 'foo'], cwe: ['42', '1111', 'unknown'], - sonarsourceSecurity: ['sql-injection', 'others'] + sonarsourceSecurity: ['sql-injection', 'others'], }); checkValues('standards', [ 'SONAR SQL Injection', @@ -227,7 +227,7 @@ it('should display correct selection', () => { 'SANS foo', 'CWE-42 - cwe-42 title', 'CWE-1111', - 'Unknown CWE' + 'Unknown CWE', ]); checkValues('owaspTop10', ['A1 - a1 title', 'A3']); checkValues('owaspTop10-2021', ['A1 - a1 title', 'A2']); @@ -236,10 +236,7 @@ it('should display correct selection', () => { function checkValues(property: string, values: string[]) { expect( - wrapper - .find(`FacetBox[property="${property}"]`) - .children('FacetHeader') - .prop('values') + wrapper.find(`FacetBox[property="${property}"]`).children('FacetHeader').prop('values') ).toEqual(values); } }); @@ -283,9 +280,9 @@ function shallowRender(props: Partial = {}) { cwe: { 42: { title: 'cwe-42 title' }, unknown: { title: 'Unknown CWE' } }, sonarsourceSecurity: { 'sql-injection': { title: 'SQL Injection' }, - others: { title: 'Others' } - } - } + others: { title: 'Others' }, + }, + }, }); return wrapper; } diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/StatusFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/StatusFacet-test.tsx index 666f381a72c..452e68cba2c 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/StatusFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/StatusFacet-test.tsx @@ -48,10 +48,10 @@ it('should select a status', () => { clickAndCheck('CLOSED'); function clickAndCheck(status: string, multiple = false, expected = [status]) { - wrapper - .find(`FacetItemsList`) - .find(`FacetItem[value="${status}"]`) - .prop('onClick')(status, multiple); + wrapper.find(`FacetItemsList`).find(`FacetItem[value="${status}"]`).prop('onClick')( + status, + multiple + ); expect(onChange).toHaveBeenLastCalledWith({ statuses: expected }); wrapper.setProps({ statuses: expected }); } @@ -69,7 +69,7 @@ function shallowRender(props: Partial = {}) { CONFIRMED: 8, REOPENED: 0, RESOLVED: 0, - CLOSED: 8 + CLOSED: 8, }} statuses={[]} {...props} diff --git a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/TypeFacet-test.tsx b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/TypeFacet-test.tsx index 3a778362f68..131449e62c2 100644 --- a/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/TypeFacet-test.tsx +++ b/server/sonar-web/src/main/js/apps/issues/sidebar/__tests__/TypeFacet-test.tsx @@ -47,10 +47,10 @@ it('should select a type', () => { clickAndCheck('VULNERABILITY', true, ['CODE_SMELL', 'VULNERABILITY']); function clickAndCheck(type: string, multiple = false, expected = [type]) { - wrapper - .find(`FacetItemsList`) - .find(`FacetItem[value="${type}"]`) - .prop('onClick')(type, multiple); + wrapper.find(`FacetItemsList`).find(`FacetItem[value="${type}"]`).prop('onClick')( + type, + multiple + ); expect(onChange).toHaveBeenLastCalledWith({ types: expected }); wrapper.setProps({ types: expected }); } diff --git a/server/sonar-web/src/main/js/apps/issues/utils.ts b/server/sonar-web/src/main/js/apps/issues/utils.ts index cd77fa72956..cc6ab93aa9e 100644 --- a/server/sonar-web/src/main/js/apps/issues/utils.ts +++ b/server/sonar-web/src/main/js/apps/issues/utils.ts @@ -29,7 +29,7 @@ import { queriesEqual, serializeDateShort, serializeString, - serializeStringArray + serializeStringArray, } from '../../helpers/query'; import { get, save } from '../../helpers/storage'; import { isDefined } from '../../helpers/types'; @@ -112,7 +112,7 @@ export function parseQuery(query: RawQuery): Query { sort: parseAsSort(query.s), statuses: parseAsArray(query.statuses, parseAsString), tags: parseAsArray(query.tags, parseAsString), - types: parseAsArray(query.types, parseAsString) + types: parseAsArray(query.types, parseAsString), }; } @@ -122,7 +122,7 @@ export function getOpen(query: RawQuery): string | undefined { export function getOpenIssue(props: { location: { query: RawQuery } }, issues: Issue[]) { const open = getOpen(props.location.query); - return open ? issues.find(issue => issue.key === open) : undefined; + return open ? issues.find((issue) => issue.key === open) : undefined; } export const areMyIssuesSelected = (query: RawQuery) => query.myIssues === 'true'; @@ -159,7 +159,7 @@ export function serializeQuery(query: Query): RawQuery { sonarsourceSecurity: serializeStringArray(query.sonarsourceSecurity), statuses: serializeStringArray(query.statuses), tags: serializeStringArray(query.tags), - types: serializeStringArray(query.types) + types: serializeStringArray(query.types), }; return cleanQuery(filter); @@ -174,9 +174,9 @@ export function parseFacets(facets: RawFacet[]): Dict { } const result: Dict = {}; - facets.forEach(facet => { + facets.forEach((facet) => { const values: Facet = {}; - facet.values.forEach(value => { + facet.values.forEach((value) => { values[value.val] = value.count; }); result[facet.property] = values; @@ -194,7 +194,7 @@ export const searchAssignees = ( ): Promise<{ paging: Paging; results: UserBase[] }> => { return searchUsers({ p: page, q: query }).then(({ paging, users }) => ({ paging, - results: users + results: users, })); }; @@ -212,7 +212,7 @@ export function getLocations( { flows, secondaryLocations, - flowsWithType + flowsWithType, }: Pick, selectedFlowIndex: number | undefined ) { @@ -244,7 +244,7 @@ export function allLocationsEmpty( issue: Pick, selectedFlowIndex: number | undefined ) { - return getLocations(issue, selectedFlowIndex).every(location => !location.msg); + return getLocations(issue, selectedFlowIndex).every((location) => !location.msg); } export function shouldOpenStandardsFacet( @@ -296,7 +296,7 @@ function isOneStandardChildFacetOpen(openFacets: Dict, query: Partial { message: undefined, startedAt: undefined, state: undefined, - status: 'OFFLINE' + status: 'OFFLINE', }); } }); @@ -141,9 +141,10 @@ export default class App extends React.PureComponent {
      + id="nonav" + > {status === 'OFFLINE' && ( <>

      @@ -212,10 +213,11 @@ export default class App extends React.PureComponent { link: ( + target="_blank" + > {translate('maintenance.sonarqube_is_under_maintenance_link.1')} - ) + ), }} />

      @@ -227,10 +229,11 @@ export default class App extends React.PureComponent { link: ( + target="_blank" + > {translate('maintenance.sonarqube_is_under_maintenance_link.2')} - ) + ), }} />

      diff --git a/server/sonar-web/src/main/js/apps/maintenance/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/maintenance/components/__tests__/App-test.tsx index bd74666d3c9..ba1cc32d9c7 100644 --- a/server/sonar-web/src/main/js/apps/maintenance/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/maintenance/components/__tests__/App-test.tsx @@ -28,12 +28,12 @@ import App from '../App'; jest.mock('../../../../api/system', () => ({ getMigrationStatus: jest.fn().mockResolvedValue(null), getSystemStatus: jest.fn().mockResolvedValue(null), - migrateDatabase: jest.fn().mockResolvedValue(null) + migrateDatabase: jest.fn().mockResolvedValue(null), })); jest.mock('../../../../helpers/system', () => ({ ...jest.requireActual('../../../../helpers/system'), - getBaseUrl: jest.fn().mockReturnValue('/context') + getBaseUrl: jest.fn().mockReturnValue('/context'), })); const originalLocation = window.location; @@ -44,11 +44,11 @@ beforeAll(() => { const location = { ...window.location, - replace + replace, }; Object.defineProperty(window, 'location', { writable: true, - value: location + value: location, }); }); @@ -58,7 +58,7 @@ afterAll(() => { Object.defineProperty(window, 'location', { writable: true, - value: originalLocation + value: originalLocation, }); }); @@ -70,23 +70,23 @@ describe('Maintenance', () => { 'OFFLINE', 'maintenance.is_offline', 'maintenance.sonarqube_is_offline.text', - { name: 'maintenance.try_again', href: '/context/' } + { name: 'maintenance.try_again', href: '/context/' }, ], [ 'UP', 'maintenance.is_up', 'maintenance.all_systems_opetational', - { name: 'layout.home', href: '/' } + { name: 'layout.home', href: '/' }, ], ['STARTING', 'maintenance.is_starting'], [ 'DOWN', 'maintenance.is_down', 'maintenance.sonarqube_is_down.text', - { name: 'maintenance.try_again', href: '/context/' } + { name: 'maintenance.try_again', href: '/context/' }, ], ['DB_MIGRATION_NEEDED', 'maintenance.is_under_maintenance'], - ['DB_MIGRATION_RUNNING', 'maintenance.is_under_maintenance'] + ['DB_MIGRATION_RUNNING', 'maintenance.is_under_maintenance'], ])( 'should handle "%p" status correctly', async (status, heading, body = undefined, linkInfo = undefined) => { @@ -155,7 +155,7 @@ describe('Setup', () => { 'NO_MIGRATION', 'maintenance.database_is_up_to_date', undefined, - { name: 'layout.home', href: '/' } + { name: 'layout.home', href: '/' }, ], [ 'MIGRATION_REQUIRED', @@ -163,28 +163,28 @@ describe('Setup', () => { [ 'maintenance.upgrade_database.1', 'maintenance.upgrade_database.2', - 'maintenance.upgrade_database.3' - ] + 'maintenance.upgrade_database.3', + ], ], [ 'NOT_SUPPORTED', 'maintenance.migration_not_supported', - ['maintenance.migration_not_supported.text'] + ['maintenance.migration_not_supported.text'], ], [ 'MIGRATION_RUNNING', 'maintenance.database_migration', undefined, undefined, - { message: 'MESSAGE', startedAt: '2022-12-01' } + { message: 'MESSAGE', startedAt: '2022-12-01' }, ], [ 'MIGRATION_SUCCEEDED', 'maintenance.database_is_up_to_date', undefined, - { name: 'layout.home', href: '/' } + { name: 'layout.home', href: '/' }, ], - ['MIGRATION_FAILED', 'maintenance.upgrade_failed', ['maintenance.upgrade_failed.text']] + ['MIGRATION_FAILED', 'maintenance.upgrade_failed', ['maintenance.upgrade_failed.text']], ])( 'should handle "%p" state correctly', async (state, heading, bodyText: string[] = [], linkInfo = undefined, payload = undefined) => { @@ -195,7 +195,7 @@ describe('Setup', () => { expect(title).toBeInTheDocument(); // eslint-disable-next-line jest/no-conditional-in-test if (bodyText.length) { - bodyText.forEach(text => { + bodyText.forEach((text) => { // eslint-disable-next-line jest/no-conditional-expect expect(screen.getByText(text)).toBeInTheDocument(); }); @@ -222,7 +222,7 @@ describe('Setup', () => { (migrateDatabase as jest.Mock).mockResolvedValueOnce({ message: 'MESSAGE', startedAt: '2022-12-01', - state: 'MIGRATION_RUNNING' + state: 'MIGRATION_RUNNING', }); (getMigrationStatus as jest.Mock) .mockResolvedValueOnce({ state: 'MIGRATION_REQUIRED' }) diff --git a/server/sonar-web/src/main/js/apps/marketplace/App.tsx b/server/sonar-web/src/main/js/apps/marketplace/App.tsx index ece024efdae..05222ad8fa4 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/App.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/App.tsx @@ -25,7 +25,7 @@ import { getAvailablePlugins, getInstalledPlugins, getInstalledPluginsWithUpdates, - getPluginUpdates + getPluginUpdates, } from '../../api/plugins'; import { getValue, setSimpleSettingValue } from '../../api/settings'; import DocLink from '../../components/common/DocLink'; @@ -97,7 +97,7 @@ export class App extends React.PureComponent { if (this.mounted) { this.setState({ loadingPlugins: false, - plugins: sortBy(plugins, 'name') + plugins: sortBy(plugins, 'name'), }); } }, this.stopLoadingPlugins); @@ -123,7 +123,7 @@ export class App extends React.PureComponent { acknowledgeRisk = async () => { await setSimpleSettingValue({ key: SettingsKey.PluginRiskConsent, - value: RiskConsent.Accepted + value: RiskConsent.Accepted, }); await this.fetchRiskConsent(); @@ -175,7 +175,7 @@ export class App extends React.PureComponent { {translate('marketplace.page.plugins.description2.link')} - ) + ), }} /> diff --git a/server/sonar-web/src/main/js/apps/marketplace/EditionBoxes.tsx b/server/sonar-web/src/main/js/apps/marketplace/EditionBoxes.tsx index f4c18553a1e..102937e6b14 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/EditionBoxes.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/EditionBoxes.tsx @@ -47,7 +47,7 @@ export default class EditionBoxes extends React.PureComponent { fetchData = () => { getMarketplaceNavigation().then( - formData => { + (formData) => { if (this.mounted) { this.setState({ ...formData }); } @@ -67,7 +67,7 @@ export default class EditionBoxes extends React.PureComponent { return (
      - {visibleEditions.map(edition => ( + {visibleEditions.map((edition) => ( p.key === plugin.key)) { + if (installing.find((p) => p.key === plugin.key)) { return 'installing'; } - if (updating.find(p => p.key === plugin.key)) { + if (updating.find((p) => p.key === plugin.key)) { return 'updating'; } - if (removing.find(p => p.key === plugin.key)) { + if (removing.find((p) => p.key === plugin.key)) { return 'removing'; } return undefined; @@ -54,7 +54,7 @@ export default function PluginsList(props: PluginsListProps) { return (
        - {sortBy(plugins, ({ name }) => name).map(plugin => ( + {sortBy(plugins, ({ name }) => name).map((plugin) => (

      diff --git a/server/sonar-web/src/main/js/apps/marketplace/Search.tsx b/server/sonar-web/src/main/js/apps/marketplace/Search.tsx index 8adefc03bb3..03f1bcbbedc 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/Search.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/Search.tsx @@ -45,8 +45,8 @@ export default class Search extends React.PureComponent { disabled: !updateCenterActive, label: translate('marketplace.updates_only'), tooltip: !updateCenterActive ? translate('marketplace.not_activated') : undefined, - value: 'updates' - } + value: 'updates', + }, ]; return ( diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginActions.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginActions.tsx index 19f4ce99a1b..c823e63aac5 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginActions.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginActions.tsx @@ -127,7 +127,8 @@ export default class PluginActions extends React.PureComponent { checked={this.state.acceptTerms} className="js-terms" id={'plugin-terms-' + plugin.key} - onCheck={this.handleTermsCheck}> + onCheck={this.handleTermsCheck} + > @@ -136,7 +137,8 @@ export default class PluginActions extends React.PureComponent { className="js-plugin-terms nowrap little-spacer-left" href={plugin.termsAndConditionsUrl} target="_blank" - rel="noopener noreferrer"> + rel="noopener noreferrer" + > {translate('marketplace.terms_and_conditions')}

      @@ -157,7 +159,8 @@ export default class PluginActions extends React.PureComponent { @@ -170,7 +173,8 @@ export default class PluginActions extends React.PureComponent { disabled={ loading || (plugin.termsAndConditionsUrl != null && !this.state.acceptTerms) } - onClick={this.handleInstall}> + onClick={this.handleInstall} + > {translate('marketplace.install')} diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginAvailable.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginAvailable.tsx index 27819e8f4cc..27ffbb7e4da 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginAvailable.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginAvailable.tsx @@ -57,7 +57,7 @@ export default function PluginAvailable(props: PluginAvailableProps) { 'marketplace.installing_this_plugin_will_also_install_x', plugin.update.requires .filter(({ key }) => !installedPluginKeys.includes(key)) - .map(requiredPlugin => requiredPlugin.name) + .map((requiredPlugin) => requiredPlugin.name) .join(', ') )} diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLog.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLog.tsx index 814d8d69d48..804a55f2fa7 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLog.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLog.tsx @@ -34,17 +34,15 @@ export default function PluginChangeLog({ release, update }: Props) {
      {translate('changelog')}
        {update.previousUpdates && - sortBy( - update.previousUpdates, - prevUpdate => prevUpdate.release?.date - ).map(previousUpdate => - previousUpdate.release ? ( - - ) : null + sortBy(update.previousUpdates, (prevUpdate) => prevUpdate.release?.date).map( + (previousUpdate) => + previousUpdate.release ? ( + + ) : null )}
      diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLogButton.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLogButton.tsx index 3367ec62b2a..2fd503c4b1f 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLogButton.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLogButton.tsx @@ -33,7 +33,8 @@ export default function PluginChangeLogButton({ release, update }: Props) { return ( }> + overlay={} + > diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLogItem.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLogItem.tsx index 691f92fec35..cbcbba43481 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLogItem.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginChangeLogItem.tsx @@ -51,7 +51,8 @@ export default function PluginChangeLogItem({ release, update }: Props) { className="js-plugin-changelog-link" href={release.changeLogUrl} target="_blank" - rel="noopener noreferrer"> + rel="noopener noreferrer" + > {translate('marketplace.release_notes')} )} diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginLicense.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginLicense.tsx index 5340bdbc0a9..6565f46b30c 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginLicense.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginLicense.tsx @@ -37,7 +37,7 @@ export default function PluginLicense({ license }: Props) { defaultMessage={translate('marketplace.licensed_under_x')} id="marketplace.licensed_under_x" values={{ - license: {license} + license: {license}, }} /> diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginOrganization.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginOrganization.tsx index c0c5218ba93..e255849869a 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginOrganization.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginOrganization.tsx @@ -41,12 +41,13 @@ export default function PluginOrganization({ plugin }: PluginOrganizationProps) className="js-plugin-organization" href={plugin.organizationUrl} target="_blank" - rel="noopener noreferrer"> + rel="noopener noreferrer" + > {plugin.organizationName} ) : ( {plugin.organizationName} - ) + ), }} /> diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginRiskConsentBox.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginRiskConsentBox.tsx index 84c2d0ed2b7..3e216de3b38 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginRiskConsentBox.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginRiskConsentBox.tsx @@ -46,7 +46,8 @@ export default function PluginRiskConsentBox(props: PluginRiskConsentBoxProps) { )} diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateButton.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateButton.tsx index cd1be181feb..1178b6140ad 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateButton.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateButton.tsx @@ -44,7 +44,8 @@ export default class PluginUpdateButton extends React.PureComponent { diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateItem.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateItem.tsx index 1e17f7acbba..bc6b447a649 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateItem.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateItem.tsx @@ -45,7 +45,7 @@ export default class PluginUpdateItem extends React.PureComponent if (show !== undefined) { this.setState({ changelogOpen: show }); } else { - this.setState(state => ({ changelogOpen: !state.changelogOpen })); + this.setState((state) => ({ changelogOpen: !state.changelogOpen })); } }; diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdates.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdates.tsx index af2cea1f297..5499adf3f41 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdates.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdates.tsx @@ -34,7 +34,7 @@ export default function PluginUpdates({ updates }: PluginUpdatesProps) {
    • {translate('marketplace.updates')}:
        - {updates.map(update => + {updates.map((update) => update.release ? ( + rel="noopener noreferrer" + > {translate('marketplace.homepage')} @@ -49,7 +50,8 @@ export default function PluginUrls({ plugin }: Props) { className="js-plugin-issues" href={plugin.issueTrackerUrl} target="_blank" - rel="noopener noreferrer"> + rel="noopener noreferrer" + > {translate('marketplace.issue_tracker')} diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginActions-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginActions-test.tsx index 05b9d9a539e..95089f66d93 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginActions-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginActions-test.tsx @@ -32,7 +32,7 @@ const installedPlugin: InstalledPlugin = { termsAndConditionsUrl: 'https://url', updatedAt: 1, updates: [{ status: 'COMPATIBLE', requires: [] }], - version: '7.7' + version: '7.7', }; const availablePlugin: AvailablePlugin = { @@ -40,7 +40,7 @@ const availablePlugin: AvailablePlugin = { name: 'Foo', release: { version: '7.7', date: 'date' }, termsAndConditionsUrl: 'https://url', - update: { status: 'COMPATIBLE', requires: [] } + update: { status: 'COMPATIBLE', requires: [] }, }; it('should render installed plugin correctly', () => { diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginAvailable-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginAvailable-test.tsx index 4fb87c22329..bf39c4a88fb 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginAvailable-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginAvailable-test.tsx @@ -23,7 +23,7 @@ import { mockAvailablePlugin, mockInstalledPlugin, mockPlugin, - mockUpdate + mockUpdate, } from '../../../../helpers/mocks/plugins'; import PluginAvailable, { PluginAvailableProps } from '../PluginAvailable'; @@ -33,8 +33,8 @@ it('should render correctly', () => { expect( shallowRender({ plugin: mockAvailablePlugin({ - update: mockUpdate({ requires: [mockPlugin()] }) - }) + update: mockUpdate({ requires: [mockPlugin()] }), + }), }) ).toMatchSnapshot('has requirements'); const installed = mockInstalledPlugin({ key: 'sonar-bar', name: 'Sonar Bar' }); @@ -43,9 +43,9 @@ it('should render correctly', () => { installedPlugins: [installed], plugin: mockAvailablePlugin({ update: mockUpdate({ - requires: [mockPlugin(), installed] - }) - }) + requires: [mockPlugin(), installed], + }), + }), }) ).toMatchSnapshot('has requirements, some of them already met'); }); diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginChangeLog-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginChangeLog-test.tsx index 1770f2aa660..766930df360 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginChangeLog-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginChangeLog-test.tsx @@ -33,7 +33,7 @@ function shallowRender(props: Partial = {}) { version: '0.11', date: '2018-11-05', description: 'Change version description', - changeLogUrl: 'https://my.change.log/url' + changeLogUrl: 'https://my.change.log/url', }} update={{ previousUpdates: [ @@ -42,24 +42,24 @@ function shallowRender(props: Partial = {}) { version: '0.11', date: '2018-06-08', description: 'Change version description', - changeLogUrl: 'https://my.change.log/url' + changeLogUrl: 'https://my.change.log/url', }, requires: [], - status: 'COMPATIBLE' + status: 'COMPATIBLE', }, { release: { version: '0.10', date: '2018-06-05', description: 'Change version description', - changeLogUrl: 'https://my.change.log/url' + changeLogUrl: 'https://my.change.log/url', }, requires: [], - status: 'COMPATIBLE' - } + status: 'COMPATIBLE', + }, ], requires: [{ key: 'java', name: 'SonarJava', description: 'Code Analyzer for Java' }], - status: 'COMPATIBLE' + status: 'COMPATIBLE', }} {...props} /> diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginDescription-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginDescription-test.tsx index eaaba29a480..9bcb5a0dfd1 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginDescription-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginDescription-test.tsx @@ -38,7 +38,7 @@ function getWrapper(props = {}) { key: 'foo', name: 'Foo', description: 'foo description', - category: 'foocategory' + category: 'foocategory', }} {...props} /> diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginOrganization-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginOrganization-test.tsx index c7fc5619e7a..c3c5770b638 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginOrganization-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginOrganization-test.tsx @@ -28,7 +28,7 @@ it('should render correctly', () => { it('should render correctly with no organization name', () => { const wrapper = shallowRender({ - plugin: { key: 'test', name: 'test', organizationName: undefined } + plugin: { key: 'test', name: 'test', organizationName: undefined }, }); expect(wrapper.type()).toBeNull(); }); diff --git a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginUrls-test.tsx b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginUrls-test.tsx index 77c361636d3..ed936a92ffd 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginUrls-test.tsx +++ b/server/sonar-web/src/main/js/apps/marketplace/components/__tests__/PluginUrls-test.tsx @@ -42,7 +42,7 @@ function getWrapper(plugin = {}) { description: 'foo description', homepageUrl: 'homepageurl', issueTrackerUrl: 'issuetrackerurl', - ...plugin + ...plugin, }} /> ); diff --git a/server/sonar-web/src/main/js/apps/marketplace/utils.ts b/server/sonar-web/src/main/js/apps/marketplace/utils.ts index 0e4ed921d4d..12b844f03ff 100644 --- a/server/sonar-web/src/main/js/apps/marketplace/utils.ts +++ b/server/sonar-web/src/main/js/apps/marketplace/utils.ts @@ -30,11 +30,11 @@ export interface Query { const EXCLUDED_PLUGINS = ['license']; export function filterPlugins(plugins: Plugin[], search?: string): Plugin[] { if (!search) { - return plugins.filter(plugin => !EXCLUDED_PLUGINS.includes(plugin.key)); + return plugins.filter((plugin) => !EXCLUDED_PLUGINS.includes(plugin.key)); } const s = search.toLowerCase(); - return plugins.filter(plugin => { + return plugins.filter((plugin) => { return ( !EXCLUDED_PLUGINS.includes(plugin.key) && (plugin.name.toLowerCase().includes(s) || @@ -48,7 +48,7 @@ export const DEFAULT_FILTER = 'all'; export const parseQuery = memoize( (urlQuery: RawQuery): Query => ({ filter: parseAsString(urlQuery['filter']) || DEFAULT_FILTER, - search: parseAsString(urlQuery['search']) + search: parseAsString(urlQuery['search']), }) ); @@ -56,6 +56,6 @@ export const serializeQuery = memoize( (query: Query): RawQuery => cleanQuery({ filter: query.filter === DEFAULT_FILTER ? undefined : serializeString(query.filter), - search: query.search ? serializeString(query.search) : undefined + search: query.search ? serializeString(query.search) : undefined, }) ); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/ActivityPanel.tsx b/server/sonar-web/src/main/js/apps/overview/branches/ActivityPanel.tsx index 8fb7721b7d6..3ef1ddcc51c 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/ActivityPanel.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/ActivityPanel.tsx @@ -24,7 +24,7 @@ import { DEFAULT_GRAPH, generateSeries, getDisplayedHistoryMetrics, - splitSeriesInGraphs + splitSeriesInGraphs, } from '../../../components/activity-graph/utils'; import ActivityLink from '../../../components/common/ActivityLink'; import DeferredSpinner from '../../../components/ui/DeferredSpinner'; @@ -35,7 +35,7 @@ import { BranchLike } from '../../../types/branch-like'; import { Analysis as AnalysisType, GraphType, - MeasureHistory + MeasureHistory, } from '../../../types/project-activity'; import { Component, Metric } from '../../../types/types'; import Analysis from './Analysis'; @@ -65,7 +65,7 @@ export function ActivityPanel(props: ActivityPanelProps) { leakPeriodDate, loading, measuresHistory, - metrics + metrics, } = props; const displayedMetrics = getDisplayedHistoryMetrics(graph, []); @@ -85,7 +85,7 @@ export function ActivityPanel(props: ActivityPanelProps) { startDate.getTime() > leakPeriodDate.getTime() ? startDate : leakPeriodDate; } - const filteredAnalyses = analyses.filter(a => a.events.length > 0).slice(0, MAX_ANALYSES_NB); + const filteredAnalyses = analyses.filter((a) => a.events.length > 0).slice(0, MAX_ANALYSES_NB); return (
        @@ -100,7 +100,7 @@ export function ActivityPanel(props: ActivityPanelProps) { analyses={[]} ariaLabel={translateWithParameters( 'overview.activity.graph_shows_data_for_x', - displayedMetrics.map(metricKey => localizeMetric(metricKey)).join(', ') + displayedMetrics.map((metricKey) => localizeMetric(metricKey)).join(', ') )} canShowDataAsTable={false} graph={graph} @@ -121,12 +121,13 @@ export function ActivityPanel(props: ActivityPanelProps) {
        + loading={analyses.length === 0 && loading} + > {analyses.length === 0 ? (

        {translate('no_results')}

        ) : (
          - {filteredAnalyses.map(analysis => ( + {filteredAnalyses.map((analysis) => ( (event.category === 'VERSION' ? 0 : 1), + (event) => (event.category === 'VERSION' ? 0 : 1), // then the rest sorted by category 'category' ); @@ -55,7 +55,7 @@ export function Analysis({ analysis, ...props }: AnalysisProps) { {sortedEvents.length > 0 ? (
          - {sortedEvents.map(event => ( + {sortedEvents.map((event) => ( ))}
          diff --git a/server/sonar-web/src/main/js/apps/overview/branches/ApplicationLeakPeriodInfo.tsx b/server/sonar-web/src/main/js/apps/overview/branches/ApplicationLeakPeriodInfo.tsx index 27c8821aea3..24826848cfc 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/ApplicationLeakPeriodInfo.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/ApplicationLeakPeriodInfo.tsx @@ -31,7 +31,7 @@ export function ApplicationLeakPeriodInfo({ leakPeriod }: ApplicationLeakPeriodI return (
          - {fromNow => translateWithParameters('overview.started_x', fromNow)} + {(fromNow) => translateWithParameters('overview.started_x', fromNow)} { // data for the application as a whole. const appStatus = await getApplicationQualityGate({ application: component.key, - ...getBranchLikeQuery(branch) + ...getBranchLikeQuery(branch), }); - const { measures: appMeasures, metrics, period } = await this.loadMeasuresAndMeta( - component.key, - branch - ); + const { + measures: appMeasures, + metrics, + period, + } = await this.loadMeasuresAndMeta(component.key, branch); const appBranchName = (branch && !isMainBranch(branch) && getBranchLikeDisplayName(branch)) || undefined; @@ -141,13 +142,13 @@ export default class BranchOverview extends React.PureComponent { // We also need to load the application leak periods separately. getApplicationLeak(component.key, appBranchName).then( - leaks => { + (leaks) => { if (this.mounted && leaks && leaks.length) { - const sortedLeaks = sortBy(leaks, leak => { + const sortedLeaks = sortBy(leaks, (leak) => { return new Date(leak.date); }); this.setState({ - appLeak: sortedLeaks[0] + appLeak: sortedLeaks[0], }); } }, @@ -163,8 +164,8 @@ export default class BranchOverview extends React.PureComponent { // them at the parent application level will not get all the necessary // information, unfortunately, as they are aggregated. Promise.all( - appStatus.projects.map(project => { - const projectDetails = appDetails.projects.find(p => p.key === project.key); + appStatus.projects.map((project) => { + const projectDetails = appDetails.projects.find((p) => p.key === project.key); const projectBranchLike = projectDetails ? { isMain: projectDetails.isMain, name: projectDetails.branch, excludedFromPurge: false } : undefined; @@ -174,15 +175,15 @@ export default class BranchOverview extends React.PureComponent { projectBranchLike, // Only load metrics that apply to failing QG conditions; we don't // need the others anyway. - project.conditions.filter(c => c.status !== 'OK').map(c => c.metric) + project.conditions.filter((c) => c.status !== 'OK').map((c) => c.metric) ).then(({ measures }) => ({ measures, project, - projectBranchLike + projectBranchLike, })); }) ).then( - results => { + (results) => { if (this.mounted) { const qgStatuses = results.map(({ measures = [], project, projectBranchLike }) => { const { key, name, status } = project; @@ -194,7 +195,7 @@ export default class BranchOverview extends React.PureComponent { key, name, status, - branchLike: projectBranchLike + branchLike: projectBranchLike, }; }); @@ -203,7 +204,7 @@ export default class BranchOverview extends React.PureComponent { measures: appMeasures, metrics, period, - qgStatuses + qgStatuses, }); } }, @@ -218,20 +219,20 @@ export default class BranchOverview extends React.PureComponent { loadProjectStatus = async () => { const { branch, - component: { key, name } + component: { key, name }, } = this.props; this.setState({ loadingStatus: true }); const projectStatus = await getQualityGateProjectStatus({ projectKey: key, - ...getBranchLikeQuery(branch) + ...getBranchLikeQuery(branch), }); // Get failing condition metric keys. We need measures for them as well to // render them. const metricKeys = projectStatus.conditions !== undefined - ? uniq([...METRICS, ...projectStatus.conditions.map(c => c.metricKey)]) + ? uniq([...METRICS, ...projectStatus.conditions.map((c) => c.metricKey)]) : METRICS; this.loadMeasuresAndMeta(key, branch, metricKeys).then( @@ -247,7 +248,7 @@ export default class BranchOverview extends React.PureComponent { key, name, status, - branchLike: branch + branchLike: branch, }; this.setState({ @@ -255,7 +256,7 @@ export default class BranchOverview extends React.PureComponent { measures, metrics, period, - qgStatuses: [qgStatus] + qgStatuses: [qgStatus], }); } else if (this.mounted) { this.setState({ loadingStatus: false, qgStatuses: undefined }); @@ -282,7 +283,7 @@ export default class BranchOverview extends React.PureComponent { return { measures: enhanceMeasuresWithMetrics(measures || [], metrics || []), metrics, - period + period, }; }); }; @@ -307,18 +308,18 @@ export default class BranchOverview extends React.PureComponent { ...getBranchLikeQuery(branch), from: FROM_DATE, component: component.key, - metrics: metrics.join() + metrics: metrics.join(), }).then( ({ measures }) => { if (this.mounted) { this.setState({ - measuresHistory: measures.map(measure => ({ + measuresHistory: measures.map((measure) => ({ metric: measure.metric, - history: measure.history.map(analysis => ({ + history: measure.history.map((analysis) => ({ date: parseDate(analysis.date), - value: analysis.value - })) - })) + value: analysis.value, + })), + })), }); } }, @@ -332,7 +333,7 @@ export default class BranchOverview extends React.PureComponent { return getProjectActivity({ ...getBranchLikeQuery(branch), project: this.getTopLevelComponent(), - from: FROM_DATE + from: FROM_DATE, }).then( ({ analyses }) => { if (this.mounted) { @@ -341,7 +342,7 @@ export default class BranchOverview extends React.PureComponent { analyses.length > 0 ? analyses[0].detectedCI !== undefined && analyses[0].detectedCI !== NO_CI_DETECTED : undefined, - analyses + analyses, }); } }, @@ -352,10 +353,10 @@ export default class BranchOverview extends React.PureComponent { getFailedConditions = (conditions: QualityGateStatusCondition[], measures: MeasureEnhanced[]) => { return ( conditions - .filter(c => c.level !== 'OK') + .filter((c) => c.level !== 'OK') // Enhance them with Metric information, which will be needed // to render the conditions properly. - .map(c => enhanceConditionWithMeasure(c, measures)) + .map((c) => enhanceConditionWithMeasure(c, measures)) // The enhancement will return undefined if it cannot find the // appropriate measure. Make sure we filter them out. .filter(isDefined) @@ -367,11 +368,13 @@ export default class BranchOverview extends React.PureComponent { let current = component.breadcrumbs.length - 1; while ( current > 0 && - !([ - ComponentQualifier.Project, - ComponentQualifier.Portfolio, - ComponentQualifier.Application - ] as string[]).includes(component.breadcrumbs[current].qualifier) + !( + [ + ComponentQualifier.Project, + ComponentQualifier.Portfolio, + ComponentQualifier.Application, + ] as string[] + ).includes(component.breadcrumbs[current].qualifier) ) { current--; } @@ -381,7 +384,7 @@ export default class BranchOverview extends React.PureComponent { doneLoadingHistory = () => { if (this.mounted) { this.setState({ - loadingHistory: false + loadingHistory: false, }); } }; @@ -407,13 +410,13 @@ export default class BranchOverview extends React.PureComponent { measuresHistory, metrics, period, - qgStatuses + qgStatuses, } = this.state; const projectIsEmpty = loadingStatus === false && (measures === undefined || - measures.find(measure => + measures.find((measure) => ([MetricKey.lines, MetricKey.new_lines] as string[]).includes(measure.metric.key) ) === undefined); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/BranchOverviewRenderer.tsx b/server/sonar-web/src/main/js/apps/overview/branches/BranchOverviewRenderer.tsx index 969790a0bfb..324c7879b90 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/BranchOverviewRenderer.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/BranchOverviewRenderer.tsx @@ -71,7 +71,7 @@ export function BranchOverviewRenderer(props: BranchOverviewRendererProps) { period, projectBinding, projectIsEmpty, - qgStatuses + qgStatuses, } = props; const leakPeriod = component.qualifier === ComponentQualifier.Application ? appLeak : period; diff --git a/server/sonar-web/src/main/js/apps/overview/branches/DebtValue.tsx b/server/sonar-web/src/main/js/apps/overview/branches/DebtValue.tsx index e9219dfb5f7..c1028a58585 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/DebtValue.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/DebtValue.tsx @@ -62,7 +62,8 @@ export function DebtValue(props: DebtValueProps) { branchLike={branchLike} className="overview-measures-value text-light" component={component.key} - metric={metricKey}> + metric={metricKey} + > {formattedValue} )} diff --git a/server/sonar-web/src/main/js/apps/overview/branches/DrilldownMeasureValue.tsx b/server/sonar-web/src/main/js/apps/overview/branches/DrilldownMeasureValue.tsx index 87846f3f6c9..299730855c7 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/DrilldownMeasureValue.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/DrilldownMeasureValue.tsx @@ -51,7 +51,8 @@ export function DrilldownMeasureValue(props: DrilldownMeasureValueProps) { branchLike={branchLike} className="overview-measures-value text-light" component={component.key} - metric={metric}> + metric={metric} + > {formatMeasure(measure.value, 'SHORT_INT')} diff --git a/server/sonar-web/src/main/js/apps/overview/branches/Event.tsx b/server/sonar-web/src/main/js/apps/overview/branches/Event.tsx index b10845593df..cd0103a767f 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/Event.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/Event.tsx @@ -34,7 +34,8 @@ export function Event({ event }: Props) { return ( + title={`${translate('version')} ${event.name}`} + > {event.name} ); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/FirstAnalysisNextStepsNotif.tsx b/server/sonar-web/src/main/js/apps/overview/branches/FirstAnalysisNextStepsNotif.tsx index cde368eb107..cbe175cb33a 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/FirstAnalysisNextStepsNotif.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/FirstAnalysisNextStepsNotif.tsx @@ -39,13 +39,8 @@ export interface FirstAnalysisNextStepsNotifProps { } export function FirstAnalysisNextStepsNotif(props: FirstAnalysisNextStepsNotifProps) { - const { - component, - currentUser, - branchesEnabled, - detectedCIOnLastAnalysis, - projectBinding - } = props; + const { component, currentUser, branchesEnabled, detectedCIOnLastAnalysis, projectBinding } = + props; if (!isLoggedIn(currentUser) || component.qualifier !== ComponentQualifier.Project) { return null; @@ -67,8 +62,9 @@ export function FirstAnalysisNextStepsNotif(props: FirstAnalysisNextStepsNotifPr + search: queryToSearch({ id: component.key }), + }} + > {translate('overview.project.next_steps.links.set_up_ci')} ); @@ -78,9 +74,10 @@ export function FirstAnalysisNextStepsNotif(props: FirstAnalysisNextStepsNotifPr pathname: '/project/settings', search: queryToSearch({ id: component.key, - category: PULL_REQUEST_DECORATION_BINDING_CATEGORY - }) - }}> + category: PULL_REQUEST_DECORATION_BINDING_CATEGORY, + }), + }} + > {translate('overview.project.next_steps.links.project_settings')} ); @@ -92,7 +89,7 @@ export function FirstAnalysisNextStepsNotif(props: FirstAnalysisNextStepsNotifPr defaultMessage={translate('overview.project.next_steps.set_up_ci')} id="overview.project.next_steps.set_up_ci" values={{ - link: tutorialsLink + link: tutorialsLink, }} /> )} @@ -103,7 +100,7 @@ export function FirstAnalysisNextStepsNotif(props: FirstAnalysisNextStepsNotifPr defaultMessage={translate('overview.project.next_steps.set_up_pr_deco.admin')} id="overview.project.next_steps.set_up_pr_deco.admin" values={{ - link_project_settings: projectSettingsLink + link_project_settings: projectSettingsLink, }} /> ) : ( @@ -117,7 +114,7 @@ export function FirstAnalysisNextStepsNotif(props: FirstAnalysisNextStepsNotifPr id="overview.project.next_steps.set_up_pr_deco_and_ci.admin" values={{ link_ci: tutorialsLink, - link_project_settings: projectSettingsLink + link_project_settings: projectSettingsLink, }} /> ) : ( diff --git a/server/sonar-web/src/main/js/apps/overview/branches/MeasuresPanel.tsx b/server/sonar-web/src/main/js/apps/overview/branches/MeasuresPanel.tsx index e3be38745b2..5819bf69b2e 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/MeasuresPanel.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/MeasuresPanel.tsx @@ -51,13 +51,13 @@ export interface MeasuresPanelProps { export enum MeasuresPanelTabs { New = 'new', - Overall = 'overall' + Overall = 'overall', } export function MeasuresPanel(props: MeasuresPanelProps) { const { appLeak, branch, component, loading, measures = [], period, location } = props; - const hasDiffMeasures = measures.some(m => isDiffMetric(m.metric.key)); + const hasDiffMeasures = measures.some((m) => isDiffMetric(m.metric.key)); const isApp = component.qualifier === ComponentQualifier.Application; const leakPeriod = isApp ? appLeak : period; const query = parseQuery(location.query); @@ -88,7 +88,7 @@ export function MeasuresPanel(props: MeasuresPanelProps) { {translate('overview.new_code')} {leakPeriod && }
          - ) + ), }, { key: MeasuresPanelTabs.Overall, @@ -98,8 +98,8 @@ export function MeasuresPanel(props: MeasuresPanelProps) { {translate('overview.overall_code')}
        - ) - } + ), + }, ]; return ( @@ -115,13 +115,14 @@ export function MeasuresPanel(props: MeasuresPanelProps) {
        ) : ( <> - selectTab(key)} selected={tab} tabs={tabs} /> + selectTab(key)} selected={tab} tabs={tabs} />
        + aria-labelledby={getTabId(tab)} + > {!hasDiffMeasures && isNewCodeTab ? ( ) : ( @@ -130,7 +131,7 @@ export function MeasuresPanel(props: MeasuresPanelProps) { IssueType.Bug, IssueType.Vulnerability, IssueType.SecurityHotspot, - IssueType.CodeSmell + IssueType.CodeSmell, ].map((type: IssueType) => ( + data-test="overview__measures-coverage" + > + data-test={`overview__measures-${type.toString().toLowerCase()}`} + > {type === IssueType.CodeSmell ? ( <>
        diff --git a/server/sonar-web/src/main/js/apps/overview/branches/MeasuresPanelNoNewCode.tsx b/server/sonar-web/src/main/js/apps/overview/branches/MeasuresPanelNoNewCode.tsx index 15cdb87860c..5378e8fdd97 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/MeasuresPanelNoNewCode.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/MeasuresPanelNoNewCode.tsx @@ -79,11 +79,12 @@ export default function MeasuresPanelNoNewCode(props: MeasuresPanelNoNewCodeProp + search: queryToSearch({ id: component.key, ...getBranchLikeQuery(branch) }), + }} + > {translate('settings.new_code_period.category')} - ) + ), }} />

        @@ -96,7 +97,7 @@ export default function MeasuresPanelNoNewCode(props: MeasuresPanelNoNewCodeProp values={{ learn_more_link: ( {translate('learn_more')} - ) + ), }} />

        diff --git a/server/sonar-web/src/main/js/apps/overview/branches/NoCodeWarning.tsx b/server/sonar-web/src/main/js/apps/overview/branches/NoCodeWarning.tsx index de302036cf1..a0bfd6f8085 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/NoCodeWarning.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/NoCodeWarning.tsx @@ -52,7 +52,7 @@ export function NoCodeWarning({ branchLike, component, measures }: Props) { if (isApp) { if ( measures === undefined || - measures.find(measure => measure.metric.key === MetricKey.projects) === undefined + measures.find((measure) => measure.metric.key === MetricKey.projects) === undefined ) { title = translate('portfolio.app.empty'); } else { diff --git a/server/sonar-web/src/main/js/apps/overview/branches/ProjectLeakPeriodInfo.tsx b/server/sonar-web/src/main/js/apps/overview/branches/ProjectLeakPeriodInfo.tsx index eccfce5a45a..c5c462a9530 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/ProjectLeakPeriodInfo.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/ProjectLeakPeriodInfo.tsx @@ -33,7 +33,7 @@ export interface ProjectLeakPeriodInfoProps extends WrappedComponentProps { export function ProjectLeakPeriodInfo(props: ProjectLeakPeriodInfoProps) { const { intl: { formatDate, formatTime }, - leakPeriod + leakPeriod, } = props; const leakPeriodLabel = getPeriodLabel( @@ -67,7 +67,7 @@ export function ProjectLeakPeriodInfo(props: ProjectLeakPeriodInfoProps) { {leakPeriodLabel}
        - {fromNow => ( + {(fromNow) => (
        {translateWithParameters( leakPeriod.mode === 'previous_analysis' diff --git a/server/sonar-web/src/main/js/apps/overview/branches/QualityGatePanel.tsx b/server/sonar-web/src/main/js/apps/overview/branches/QualityGatePanel.tsx index 800bbee2f37..47c8d400aec 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/QualityGatePanel.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/QualityGatePanel.tsx @@ -42,7 +42,7 @@ export function QualityGatePanel(props: QualityGatePanelProps) { return null; } - const overallLevel = qgStatuses.map(s => s.status).includes('ERROR') ? 'ERROR' : 'OK'; + const overallLevel = qgStatuses.map((s) => s.status).includes('ERROR') ? 'ERROR' : 'OK'; const success = overallLevel === 'OK'; const overallFailedConditionsCount = qgStatuses.reduce( @@ -53,7 +53,7 @@ export function QualityGatePanel(props: QualityGatePanelProps) { const showIgnoredConditionWarning = component.qualifier === 'TRK' && qgStatuses !== undefined && - qgStatuses.some(p => Boolean(p.ignoredConditions)); + qgStatuses.some((p) => Boolean(p.ignoredConditions)); return (
        @@ -92,8 +92,9 @@ export function QualityGatePanel(props: QualityGatePanelProps) {
        + success, + })} + >

        {translate('metric.level', overallLevel)}

        @@ -108,7 +109,7 @@ export function QualityGatePanel(props: QualityGatePanelProps) { {overallFailedConditionsCount > 0 && (
        - {qgStatuses.map(qgStatus => ( + {qgStatuses.map((qgStatus) => ( qgStatus.failedConditions)} + qgConditions={flatMap(qgStatuses, (qgStatus) => qgStatus.failedConditions)} />
        ); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/QualityGatePanelSection.tsx b/server/sonar-web/src/main/js/apps/overview/branches/QualityGatePanelSection.tsx index efd1fdaae20..0fc0748abb6 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/QualityGatePanelSection.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/QualityGatePanelSection.tsx @@ -34,8 +34,8 @@ export interface QualityGatePanelSectionProps { export function QualityGatePanelSection(props: QualityGatePanelSectionProps) { const { component, qgStatus } = props; - const newCodeFailedConditions = qgStatus.failedConditions.filter(c => isDiffMetric(c.metric)); - const overallFailedConditions = qgStatus.failedConditions.filter(c => !isDiffMetric(c.metric)); + const newCodeFailedConditions = qgStatus.failedConditions.filter((c) => isDiffMetric(c.metric)); + const overallFailedConditions = qgStatus.failedConditions.filter((c) => !isDiffMetric(c.metric)); if (newCodeFailedConditions.length === 0 && overallFailedConditions.length === 0) { return null; diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ActivityPanel-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ActivityPanel-test.tsx index 93f43fa5705..3488e272750 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ActivityPanel-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ActivityPanel-test.tsx @@ -36,7 +36,7 @@ it('should render correctly', () => { it('should correctly pass the leak period start date', () => { // Leak period start is more recent than the oldest historic measure. let { leakPeriodDate } = shallowRender({ - leakPeriodDate: parseDate('2017-08-27T16:33:50+0200') + leakPeriodDate: parseDate('2017-08-27T16:33:50+0200'), }) .find(GraphsHistory) .props(); @@ -59,9 +59,9 @@ function shallowRender(props: Partial = {}) { component={mockComponent()} graph={GraphType.issues} loading={false} - measuresHistory={[mockMeasure()].map(m => ({ + measuresHistory={[mockMeasure()].map((m) => ({ ...m, - history: [{ date: parseDate('2016-10-27T16:33:50+0200'), value: '20' }] + history: [{ date: parseDate('2016-10-27T16:33:50+0200'), value: '20' }], }))} metrics={[mockMetric({ key: 'bugs' })]} onGraphChange={jest.fn()} diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/Analysis-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/Analysis-test.tsx index d5d1e9fd151..482240bed3d 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/Analysis-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/Analysis-test.tsx @@ -34,8 +34,8 @@ function shallowRender(props: Partial = {}) { analysis={mockAnalysis({ events: [ { key: '1', category: 'OTHER', name: 'test' }, - { key: '2', category: 'VERSION', name: '6.5-SNAPSHOT' } - ] + { key: '2', category: 'VERSION', name: '6.5-SNAPSHOT' }, + ], })} qualifier={ComponentQualifier.Project} {...props} diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ApplicationLeakPeriodInfo-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ApplicationLeakPeriodInfo-test.tsx index 58e6d7988c9..b6044a3bfd0 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ApplicationLeakPeriodInfo-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ApplicationLeakPeriodInfo-test.tsx @@ -22,7 +22,7 @@ import * as React from 'react'; import { mockApplicationPeriod } from '../../../../helpers/mocks/application'; import { ApplicationLeakPeriodInfo, - ApplicationLeakPeriodInfoProps + ApplicationLeakPeriodInfoProps, } from '../ApplicationLeakPeriodInfo'; jest.mock('../../../../components/intl/DateFromNow'); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/BranchOverview-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/BranchOverview-test.tsx index fba029f57fa..a97bb9ea6cb 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/BranchOverview-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/BranchOverview-test.tsx @@ -24,7 +24,7 @@ import { getMeasuresWithPeriodAndMetrics } from '../../../../api/measures'; import { getProjectActivity } from '../../../../api/projectActivity'; import { getApplicationQualityGate, - getQualityGateProjectStatus + getQualityGateProjectStatus, } from '../../../../api/quality-gates'; import { getAllTimeMachineData } from '../../../../api/time-machine'; import { getActivityGraph, saveActivityGraph } from '../../../../components/activity-graph/utils'; @@ -41,8 +41,8 @@ import BranchOverview, { BRANCH_OVERVIEW_ACTIVITY_GRAPH, NO_CI_DETECTED } from ' import BranchOverviewRenderer from '../BranchOverviewRenderer'; jest.mock('../../../../helpers/dates', () => ({ - parseDate: jest.fn(date => `PARSED:${date}`), - toNotSoISOString: jest.fn(date => date) + parseDate: jest.fn((date) => `PARSED:${date}`), + toNotSoISOString: jest.fn((date) => date), })); jest.mock('../../../../api/measures', () => { @@ -51,7 +51,7 @@ jest.mock('../../../../api/measures', () => { getMeasuresWithPeriodAndMetrics: jest.fn((_, metricKeys: string[]) => { const metrics: Metric[] = []; const measures: Measure[] = []; - metricKeys.forEach(key => { + metricKeys.forEach((key) => { if (key === 'unknown_metric') { return; } @@ -68,18 +68,18 @@ jest.mock('../../../../api/measures', () => { measures.push( mockMeasure({ metric: key, - ...(isDiffMetric(key) ? { leak: '1' } : { period: undefined }) + ...(isDiffMetric(key) ? { leak: '1' } : { period: undefined }), }) ); }); return Promise.resolve({ component: { measures, - name: 'foo' + name: 'foo', }, - metrics + metrics, }); - }) + }), }; }); @@ -99,7 +99,7 @@ jest.mock('../../../../api/quality-gates', () => { errorThreshold: '1.0', metricKey: MetricKey.new_bugs, periodIndex: 1, - status: 'ERROR' + status: 'ERROR', }, { actualValue: '5', @@ -107,7 +107,7 @@ jest.mock('../../../../api/quality-gates', () => { errorThreshold: '2.0', metricKey: MetricKey.bugs, periodIndex: 0, - status: 'ERROR' + status: 'ERROR', }, { actualValue: '2', @@ -115,12 +115,12 @@ jest.mock('../../../../api/quality-gates', () => { errorThreshold: '1.0', metricKey: 'unknown_metric', periodIndex: 0, - status: 'ERROR' - } - ] + status: 'ERROR', + }, + ], }) ), - getApplicationQualityGate: jest.fn().mockResolvedValue(mockQualityGateApplicationStatus()) + getApplicationQualityGate: jest.fn().mockResolvedValue(mockQualityGateApplicationStatus()), }; }); @@ -134,12 +134,12 @@ jest.mock('../../../../api/time-machine', () => { { metric: MetricKey.sqale_index, history: [{ date: '2019-01-01', value: '1.0' }] }, { metric: MetricKey.duplicated_lines_density, - history: [{ date: '2019-01-02', value: '1.0' }] + history: [{ date: '2019-01-02', value: '1.0' }], }, { metric: MetricKey.ncloc, history: [{ date: '2019-01-03', value: '10000' }] }, - { metric: MetricKey.coverage, history: [{ date: '2019-01-04', value: '95.5' }] } - ] - }) + { metric: MetricKey.coverage, history: [{ date: '2019-01-04', value: '95.5' }] }, + ], + }), }; }); @@ -152,9 +152,9 @@ jest.mock('../../../../api/projectActivity', () => { mockAnalysis(), mockAnalysis(), mockAnalysis(), - mockAnalysis() - ] - }) + mockAnalysis(), + ], + }), }; }); @@ -167,18 +167,18 @@ jest.mock('../../../../api/application', () => ({ { branch: 'foo', key: 'KEY-P1', - name: 'P1' - } + name: 'P1', + }, ], - visibility: 'Private' + visibility: 'Private', }), getApplicationLeak: jest.fn().mockResolvedValue([ { date: '2017-01-05', project: 'foo', - projectName: 'Foo' - } - ]) + projectName: 'Foo', + }, + ]), })); jest.mock('../../../../components/activity-graph/utils', () => { @@ -187,7 +187,7 @@ jest.mock('../../../../components/activity-graph/utils', () => { return { getActivityGraph: jest.fn(() => ({ graph: GraphType.coverage })), saveActivityGraph: jest.fn(), - getHistoryMetrics: jest.fn(() => [MetricKey.lines_to_cover, MetricKey.uncovered_lines]) + getHistoryMetrics: jest.fn(() => [MetricKey.lines_to_cover, MetricKey.uncovered_lines]), }; }); @@ -215,7 +215,7 @@ describe('project overview', () => { expect.objectContaining({ name: 'Foo', key: 'foo', - status: 'ERROR' + status: 'ERROR', }) ); @@ -226,16 +226,16 @@ describe('project overview', () => { level: 'ERROR', metric: MetricKey.new_bugs, measure: expect.objectContaining({ - metric: expect.objectContaining({ key: MetricKey.new_bugs }) - }) + metric: expect.objectContaining({ key: MetricKey.new_bugs }), + }), }); expect(failedConditions[1]).toMatchObject({ actual: '5', level: 'ERROR', metric: MetricKey.bugs, measure: expect.objectContaining({ - metric: expect.objectContaining({ key: MetricKey.bugs }) - }) + metric: expect.objectContaining({ key: MetricKey.bugs }), + }), }); }); @@ -251,7 +251,7 @@ describe('project overview', () => { describe('application overview', () => { const component = mockComponent({ breadcrumbs: [mockComponent({ key: 'foo', qualifier: ComponentQualifier.Application })], - qualifier: ComponentQualifier.Application + qualifier: ComponentQualifier.Application, }); it('should render correctly', async () => { @@ -283,7 +283,7 @@ describe('application overview', () => { expect.objectContaining({ name: 'Foo', key: 'foo', - status: 'ERROR' + status: 'ERROR', }) ); @@ -294,23 +294,23 @@ describe('application overview', () => { level: 'ERROR', metric: MetricKey.coverage, measure: expect.objectContaining({ - metric: expect.objectContaining({ key: MetricKey.coverage }) - }) + metric: expect.objectContaining({ key: MetricKey.coverage }), + }), }); expect(failedConditions1[1]).toMatchObject({ actual: '5', level: 'ERROR', metric: MetricKey.new_bugs, measure: expect.objectContaining({ - metric: expect.objectContaining({ key: MetricKey.new_bugs }) - }) + metric: expect.objectContaining({ key: MetricKey.new_bugs }), + }), }); expect(qgStatus1).toEqual( expect.objectContaining({ name: 'Foo', key: 'foo', - status: 'ERROR' + status: 'ERROR', }) ); @@ -321,8 +321,8 @@ describe('application overview', () => { level: 'ERROR', metric: MetricKey.new_bugs, measure: expect.objectContaining({ - metric: expect.objectContaining({ key: MetricKey.new_bugs }) - }) + metric: expect.objectContaining({ key: MetricKey.new_bugs }), + }), }); }); @@ -347,7 +347,7 @@ it("should correctly load a component's history", async () => { expect(measuresHistory![0]).toEqual( expect.objectContaining({ metric: MetricKey.bugs, - history: [{ date: 'PARSED:2019-01-05', value: '2.0' }] + history: [{ date: 'PARSED:2019-01-05', value: '2.0' }], }) ); }); @@ -356,7 +356,7 @@ it.each([ ['no analysis', [], undefined], ['1 analysis, no CI data', [mockAnalysis()], false], ['1 analysis, no CI detected', [mockAnalysis({ detectedCI: NO_CI_DETECTED })], false], - ['1 analysis, CI detected', [mockAnalysis({ detectedCI: 'Cirrus CI' })], true] + ['1 analysis, CI detected', [mockAnalysis({ detectedCI: 'Cirrus CI' })], true], ])( "should correctly flag a project that wasn't analyzed using a CI (%s)", async (_, analyses, expected) => { @@ -389,7 +389,7 @@ function shallowRender(props: Partial = {}) { component={mockComponent({ breadcrumbs: [mockComponent({ key: 'foo' })], key: 'foo', - name: 'Foo' + name: 'Foo', })} {...props} /> diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/DebtValue-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/DebtValue-test.tsx index df5a657faee..fe0f25d23e3 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/DebtValue-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/DebtValue-test.tsx @@ -38,7 +38,7 @@ function shallowRender(props: Partial = {}) { component={mockComponent()} measures={[ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.sqale_index }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_technical_debt }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_technical_debt }) }), ]} {...props} /> diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/Event-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/Event-test.tsx index 9426d128179..5eaccc938bc 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/Event-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/Event-test.tsx @@ -42,8 +42,8 @@ it('should render rich quality gate event', () => { qualityGate: { failing: [{ branch: 'master', key: 'foo', name: 'Foo' }], status: 'ERROR', - stillFailing: true - } + stillFailing: true, + }, }; expect(shallow()).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/FirstAnalysisNextStepsNotif-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/FirstAnalysisNextStepsNotif-test.tsx index 0f4ba3d37ba..16547a5448f 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/FirstAnalysisNextStepsNotif-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/FirstAnalysisNextStepsNotif-test.tsx @@ -25,14 +25,14 @@ import { mockCurrentUser, mockLoggedInUser } from '../../../../helpers/testMocks import { ComponentQualifier } from '../../../../types/component'; import { FirstAnalysisNextStepsNotif, - FirstAnalysisNextStepsNotifProps + FirstAnalysisNextStepsNotifProps, } from '../FirstAnalysisNextStepsNotif'; it('should render correctly', () => { expect(shallowRender({ currentUser: mockCurrentUser() }).type()).toBeNull(); expect( shallowRender({ - component: mockComponent({ qualifier: ComponentQualifier.Application }) + component: mockComponent({ qualifier: ComponentQualifier.Application }), }).type() ).toBeNull(); expect(shallowRender({ detectedCIOnLastAnalysis: false })).toMatchSnapshot( @@ -40,26 +40,26 @@ it('should render correctly', () => { ); expect( shallowRender({ - projectBinding: undefined + projectBinding: undefined, }) ).toMatchSnapshot('show prompt to configure PR decoration, regular user'); expect( shallowRender({ component: mockComponent({ configuration: { showSettings: true } }), - projectBinding: undefined + projectBinding: undefined, }) ).toMatchSnapshot('show prompt to configure PR decoration, project admin'); expect( shallowRender({ projectBinding: undefined, - detectedCIOnLastAnalysis: false + detectedCIOnLastAnalysis: false, }) ).toMatchSnapshot('show prompt to configure PR decoration + CI, regular user'); expect( shallowRender({ component: mockComponent({ configuration: { showSettings: true } }), projectBinding: undefined, - detectedCIOnLastAnalysis: false + detectedCIOnLastAnalysis: false, }) ).toMatchSnapshot('show prompt to configure PR decoration + CI, project admin'); }); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanel-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanel-test.tsx index 2564e650feb..7667546f36e 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanel-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanel-test.tsx @@ -26,7 +26,7 @@ import { mockLocation, mockMeasureEnhanced, mockMetric, - mockPeriod + mockPeriod, } from '../../../../helpers/testMocks'; import { ComponentQualifier } from '../../../../types/component'; import { MetricKey } from '../../../../types/metrics'; @@ -35,7 +35,7 @@ import { MeasuresPanel, MeasuresPanelProps, MeasuresPanelTabs } from '../Measure jest.mock('react', () => { return { ...jest.requireActual('react'), - useEffect: jest.fn().mockImplementation(f => f()) + useEffect: jest.fn().mockImplementation((f) => f()), }; }); @@ -48,7 +48,7 @@ it('should render correctly for projects', () => { it('should render correctly for applications', () => { const wrapper = shallowRender({ - component: mockComponent({ qualifier: ComponentQualifier.Application }) + component: mockComponent({ qualifier: ComponentQualifier.Application }), }); expect(wrapper).toMatchSnapshot('default'); wrapper.find(BoxedTabs).prop('onSelect')(MeasuresPanelTabs.Overall); @@ -59,8 +59,8 @@ it('should render correctly if there is no new code measures', () => { const wrapper = shallowRender({ measures: [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.coverage }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.bugs }) }) - ] + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.bugs }) }), + ], }); wrapper.find(BoxedTabs).prop('onSelect')(MeasuresPanelTabs.New); expect(wrapper).toMatchSnapshot(); @@ -71,9 +71,9 @@ it('should render correctly if branch is misconfigured', () => { branch: mockBranch({ name: 'own-reference' }), measures: [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.coverage }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.bugs }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.bugs }) }), ], - period: mockPeriod({ date: undefined, mode: 'REFERENCE_BRANCH', parameter: 'own-reference' }) + period: mockPeriod({ date: undefined, mode: 'REFERENCE_BRANCH', parameter: 'own-reference' }), }); wrapper.find(BoxedTabs).prop('onSelect')(MeasuresPanelTabs.New); expect(wrapper).toMatchSnapshot('hide settings'); @@ -87,8 +87,8 @@ it('should render correctly if there is no coverage', () => { shallowRender({ measures: [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.bugs }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_bugs }) }) - ] + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_bugs }) }), + ], }) ).toMatchSnapshot(); }); @@ -100,7 +100,7 @@ it('should render correctly if the data is still loading', () => { it('should render correctly when code scope is overall code', () => { expect( shallowRender({ - location: mockLocation({ pathname: '/dashboard', query: { code_scope: 'overall' } }) + location: mockLocation({ pathname: '/dashboard', query: { code_scope: 'overall' } }), }) ).toMatchSnapshot(); }); @@ -108,7 +108,7 @@ it('should render correctly when code scope is overall code', () => { it('should render correctly when code scope is new code', () => { expect( shallowRender({ - location: mockLocation({ pathname: '/dashboard', query: { code_scope: 'new' } }) + location: mockLocation({ pathname: '/dashboard', query: { code_scope: 'new' } }), }) ).toMatchSnapshot(); }); @@ -122,7 +122,7 @@ function shallowRender(props: Partial = {}) { mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.coverage }) }), mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_coverage }) }), mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.bugs }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_bugs }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_bugs }) }), ]} location={mockLocation()} {...props} diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanelIssueMeasureRow-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanelIssueMeasureRow-test.tsx index 7282bf3f609..415490d8c67 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanelIssueMeasureRow-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanelIssueMeasureRow-test.tsx @@ -26,7 +26,7 @@ import { ComponentQualifier } from '../../../../types/component'; import { IssueType } from '../../../../types/issues'; import { MetricKey } from '../../../../types/metrics'; import MeasuresPanelIssueMeasureRow, { - MeasuresPanelIssueMeasureRowProps + MeasuresPanelIssueMeasureRowProps, } from '../MeasuresPanelIssueMeasureRow'; it('should render correctly for projects', () => { @@ -54,7 +54,7 @@ function shallowRender(props: Partial = {}) { mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.coverage }) }), mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_coverage }) }), mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.bugs }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_bugs }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_bugs }) }), ]} type={IssueType.Bug} {...props} diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanelNoNewCode-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanelNoNewCode-test.tsx index 49def02a09b..d629829c66d 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanelNoNewCode-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/MeasuresPanelNoNewCode-test.tsx @@ -85,12 +85,12 @@ it('should render the default message', () => { ).toMatchInlineSnapshot(defaultMessage); expect( shallowRender({ - period: mockPeriod({ date: undefined, mode: 'REFERENCE_BRANCH', parameter: 'master' }) + period: mockPeriod({ date: undefined, mode: 'REFERENCE_BRANCH', parameter: 'master' }), }) ).toMatchSnapshot(); expect( shallowRender({ - period: mockPeriod({ date: undefined, mode: 'REFERENCE_BRANCH', parameter: 'notsame' }) + period: mockPeriod({ date: undefined, mode: 'REFERENCE_BRANCH', parameter: 'notsame' }), }) ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/NoCodeWarning-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/NoCodeWarning-test.tsx index 28303220ee6..c8f70fe9802 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/NoCodeWarning-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/NoCodeWarning-test.tsx @@ -51,7 +51,7 @@ it('should correctly if the project is empty', () => { it('should render correctly if the application is empty or has no lines of code', () => { const wrapper = shallowRender({ component: mockComponent({ qualifier: ComponentQualifier.Application }), - measures: [mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.projects }) })] + measures: [mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.projects }) })], }); expect(wrapper.children().text()).toBe('portfolio.app.no_lines_of_code'); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ProjectLeakPeriodInfo-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ProjectLeakPeriodInfo-test.tsx index f21aa5f15c9..40a6a7d8f67 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ProjectLeakPeriodInfo-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/ProjectLeakPeriodInfo-test.tsx @@ -72,7 +72,7 @@ function shallowRender(period: Partial = {}) { intl={ { formatDate: (date: string) => 'formatted.' + date, - formatTime: (date: string) => 'formattedTime.' + date + formatTime: (date: string) => 'formattedTime.' + date, } as IntlShape } leakPeriod={mockPeriod({ ...period })} diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/QualityGatePanel-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/QualityGatePanel-test.tsx index f75329ee6e3..3e4aa3e3279 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/QualityGatePanel-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/QualityGatePanel-test.tsx @@ -22,7 +22,7 @@ import * as React from 'react'; import { mockComponent } from '../../../../helpers/mocks/component'; import { mockQualityGateStatus, - mockQualityGateStatusConditionEnhanced + mockQualityGateStatusConditionEnhanced, } from '../../../../helpers/mocks/quality-gates'; import { mockMeasureEnhanced, mockMetric } from '../../../../helpers/testMocks'; import { ComponentQualifier } from '../../../../types/component'; @@ -36,7 +36,7 @@ it('should render correctly for projects', () => { ).toMatchSnapshot(); const wrapper = shallowRender({ - qgStatuses: [mockQualityGateStatus({ ignoredConditions: true })] + qgStatuses: [mockQualityGateStatus({ ignoredConditions: true })], }); expect(wrapper).toMatchSnapshot(); }); @@ -52,13 +52,13 @@ it('should render correctly for applications', () => { mockQualityGateStatusConditionEnhanced(), mockQualityGateStatusConditionEnhanced({ measure: mockMeasureEnhanced({ - metric: mockMetric({ key: MetricKey.new_code_smells }) + metric: mockMetric({ key: MetricKey.new_code_smells }), }), - metric: MetricKey.new_code_smells - }) - ] - }) - ] + metric: MetricKey.new_code_smells, + }), + ], + }), + ], }) ).toMatchSnapshot(); @@ -68,9 +68,9 @@ it('should render correctly for applications', () => { mockQualityGateStatus(), mockQualityGateStatus({ status: 'OK', - failedConditions: [] - }) - ] + failedConditions: [], + }), + ], }); expect(wrapper).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/QualityGatePanelSection-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/QualityGatePanelSection-test.tsx index f07859b5589..087885af540 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/QualityGatePanelSection-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/QualityGatePanelSection-test.tsx @@ -23,7 +23,7 @@ import { mockMainBranch } from '../../../../helpers/mocks/branch-like'; import { mockComponent } from '../../../../helpers/mocks/component'; import { mockQualityGateStatus, - mockQualityGateStatusConditionEnhanced + mockQualityGateStatusConditionEnhanced, } from '../../../../helpers/mocks/quality-gates'; import { ComponentQualifier } from '../../../../types/component'; import { MetricKey } from '../../../../types/metrics'; @@ -35,8 +35,8 @@ it('should render correctly', () => { shallowRender({ qgStatus: mockQualityGateStatus({ failedConditions: [], - status: 'OK' - }) + status: 'OK', + }), }).type() ).toBeNull(); expect( @@ -52,9 +52,9 @@ function shallowRender(props: Partial = {}) { qgStatus={mockQualityGateStatus({ failedConditions: [ mockQualityGateStatusConditionEnhanced({ metric: MetricKey.bugs }), - mockQualityGateStatusConditionEnhanced({ metric: MetricKey.new_bugs }) + mockQualityGateStatusConditionEnhanced({ metric: MetricKey.new_bugs }), ], - status: 'ERROR' + status: 'ERROR', })} {...props} /> diff --git a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/SecurityHotspotsReviewed-test.tsx b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/SecurityHotspotsReviewed-test.tsx index e65141a4e8d..4cde0bcd7fe 100644 --- a/server/sonar-web/src/main/js/apps/overview/branches/__tests__/SecurityHotspotsReviewed-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/branches/__tests__/SecurityHotspotsReviewed-test.tsx @@ -22,7 +22,7 @@ import * as React from 'react'; import { mockMeasureEnhanced, mockMetric } from '../../../../helpers/testMocks'; import { MetricKey } from '../../../../types/metrics'; import SecurityHotspotsReviewed, { - SecurityHotspotsReviewedProps + SecurityHotspotsReviewedProps, } from '../SecurityHotspotsReviewed'; it('should render correctly', () => { @@ -37,8 +37,8 @@ function shallowRender(props: Partial = {}) { measures={[ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.security_hotspots_reviewed }) }), mockMeasureEnhanced({ - metric: mockMetric({ key: MetricKey.new_security_hotspots_reviewed }) - }) + metric: mockMetric({ key: MetricKey.new_security_hotspots_reviewed }), + }), ]} {...props} /> diff --git a/server/sonar-web/src/main/js/apps/overview/components/App.tsx b/server/sonar-web/src/main/js/apps/overview/components/App.tsx index 26771be6dcb..1d23de7b263 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/App.tsx @@ -19,7 +19,7 @@ */ import * as React from 'react'; import withAvailableFeatures, { - WithAvailableFeaturesProps + WithAvailableFeaturesProps, } from '../../../app/components/available-features/withAvailableFeatures'; import withComponentContext from '../../../app/components/componentContext/withComponentContext'; import Suggestions from '../../../components/embed-docs-modal/Suggestions'; diff --git a/server/sonar-web/src/main/js/apps/overview/components/EmptyOverview.tsx b/server/sonar-web/src/main/js/apps/overview/components/EmptyOverview.tsx index d85ec9885b1..4f5ba161051 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/EmptyOverview.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/EmptyOverview.tsx @@ -55,7 +55,7 @@ export function EmptyOverview(props: EmptyOverviewProps) { const hasBranches = branchLikes.length > 1; const hasBadBranchConfig = branchLikes.length > 2 || - (branchLikes.length === 2 && branchLikes.some(branch => isBranch(branch))); + (branchLikes.length === 2 && branchLikes.some((branch) => isBranch(branch))); const showWarning = isMainBranch(branchLike) && hasBranches; const showTutorial = isMainBranch(branchLike) && !hasBranches && !hasAnalyses; @@ -68,7 +68,7 @@ export function EmptyOverview(props: EmptyOverviewProps) { id="provisioning.no_analysis_on_main_branch.bad_configuration" values={{ branchName: getBranchLikeDisplayName(branchLike), - branchType: translate('branches.main_branch') + branchType: translate('branches.main_branch'), }} /> ); @@ -78,7 +78,7 @@ export function EmptyOverview(props: EmptyOverviewProps) { defaultMessage={translate('provisioning.no_analysis_on_main_branch')} id="provisioning.no_analysis_on_main_branch" values={{ - branchName: getBranchLikeDisplayName(branchLike) + branchName: getBranchLikeDisplayName(branchLike), }} /> ); diff --git a/server/sonar-web/src/main/js/apps/overview/components/IssueLabel.tsx b/server/sonar-web/src/main/js/apps/overview/components/IssueLabel.tsx index fecd47bd0f5..140d31feb91 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/IssueLabel.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/IssueLabel.tsx @@ -54,7 +54,7 @@ export function IssueLabel(props: IssueLabelProps) { ...getBranchLikeQuery(branchLike), resolved: 'false', types: type, - inNewCodePeriod: useDiffMetric ? 'true' : 'false' + inNewCodePeriod: useDiffMetric ? 'true' : 'false', }; const url = @@ -74,7 +74,8 @@ export function IssueLabel(props: IssueLabelProps) { localizeMetric(metricKey) )} className="overview-measures-value text-light" - to={url}> + to={url} + > {formatMeasure(value, 'SHORT_INT')} )} diff --git a/server/sonar-web/src/main/js/apps/overview/components/IssueRating.tsx b/server/sonar-web/src/main/js/apps/overview/components/IssueRating.tsx index df9280474bf..670f1eacfbd 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/IssueRating.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/IssueRating.tsx @@ -62,7 +62,8 @@ function renderRatingLink(props: IssueRatingProps) { branchLike={branchLike} className="link-no-underline link-rating" component={component.key} - metric={rating}> + metric={rating} + >
        diff --git a/server/sonar-web/src/main/js/apps/overview/components/LeakPeriodLegend.tsx b/server/sonar-web/src/main/js/apps/overview/components/LeakPeriodLegend.tsx index 297e0fe3b36..181d74482dd 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/LeakPeriodLegend.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/LeakPeriodLegend.tsx @@ -34,7 +34,7 @@ interface Props { const MODE_INCLUDES_TIME: Dict = { manual_baseline: true, - SPECIFIC_ANALYSIS: true + SPECIFIC_ANALYSIS: true, }; export class LeakPeriodLegend extends React.PureComponent { @@ -95,7 +95,7 @@ export class LeakPeriodLegend extends React.PureComponent - {fromNow => ( + {(fromNow) => ( {translateWithParameters( period.mode === 'previous_analysis' diff --git a/server/sonar-web/src/main/js/apps/overview/components/MeasurementLabel.tsx b/server/sonar-web/src/main/js/apps/overview/components/MeasurementLabel.tsx index 9532e2e18b3..139bbcccee0 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/MeasurementLabel.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/MeasurementLabel.tsx @@ -30,7 +30,7 @@ import { getMeasurementLabelKeys, getMeasurementLinesMetricKey, getMeasurementMetricKey, - MeasurementType + MeasurementType, } from '../utils'; interface Props { @@ -65,10 +65,11 @@ export default class MeasurementLabel extends React.Component { branchLike={branchLike} className="big" component={component.key} - metric={linesMetric}> + metric={linesMetric} + > {formatMeasure(value, 'SHORT_INT')} - ) + ), }} /> ); @@ -97,7 +98,7 @@ export default class MeasurementLabel extends React.Component { const icon = React.createElement(iconClass, { size: 'big', value: Number(value) }); const formattedValue = formatMeasure(value, 'PERCENT', { decimals: 2, - omitExtraDecimalZeros: true + omitExtraDecimalZeros: true, }); const link = ( { branchLike={branchLike} className="overview-measures-value text-light" component={component.key} - metric={metricKey}> + metric={metricKey} + > {formattedValue} ); diff --git a/server/sonar-web/src/main/js/apps/overview/components/QualityGateCondition.tsx b/server/sonar-web/src/main/js/apps/overview/components/QualityGateCondition.tsx index d9335143d60..d042f9caa21 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/QualityGateCondition.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/QualityGateCondition.tsx @@ -45,7 +45,7 @@ export default class QualityGateCondition extends React.PureComponent { const query: Dict = { resolved: 'false', ...getBranchLikeQuery(this.props.branchLike), - ...customQuery + ...customQuery, }; if (inNewCodePeriod) { Object.assign(query, { inNewCodePeriod: 'true' }); @@ -55,7 +55,7 @@ export default class QualityGateCondition extends React.PureComponent { getUrlForSecurityHotspot(inNewCodePeriod: boolean) { const query: Dict = { - ...getBranchLikeQuery(this.props.branchLike) + ...getBranchLikeQuery(this.props.branchLike), }; if (inNewCodePeriod) { Object.assign(query, { inNewCodePeriod: 'true' }); @@ -72,7 +72,7 @@ export default class QualityGateCondition extends React.PureComponent { 'BLOCKER,CRITICAL,MAJOR,MINOR', 'BLOCKER,CRITICAL,MAJOR', 'BLOCKER,CRITICAL', - 'BLOCKER' + 'BLOCKER', ]; const { condition } = this.props; @@ -80,7 +80,7 @@ export default class QualityGateCondition extends React.PureComponent { return this.getIssuesUrl(inNewCodePeriod, { types: type, - severities: RATING_TO_SEVERITIES_MAPPING[Number(threshold) - 1] + severities: RATING_TO_SEVERITIES_MAPPING[Number(threshold) - 1], }); } @@ -106,7 +106,7 @@ export default class QualityGateCondition extends React.PureComponent { [MetricKey.sqale_rating]: () => this.getUrlForCodeSmells(false), [MetricKey.new_maintainability_rating]: () => this.getUrlForCodeSmells(true), [MetricKey.security_hotspots_reviewed]: () => this.getUrlForSecurityHotspot(false), - [MetricKey.new_security_hotspots_reviewed]: () => this.getUrlForSecurityHotspot(true) + [MetricKey.new_security_hotspots_reviewed]: () => this.getUrlForSecurityHotspot(true), }; return ( @@ -121,7 +121,8 @@ export default class QualityGateCondition extends React.PureComponent { className={className} component={component.key} metric={condition.measure.metric.key} - inNewCodePeriod={condition.period != null}> + inNewCodePeriod={condition.period != null} + > {children} )} diff --git a/server/sonar-web/src/main/js/apps/overview/components/QualityGateConditions.tsx b/server/sonar-web/src/main/js/apps/overview/components/QualityGateConditions.tsx index 486d802e10f..16c4a631784 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/QualityGateConditions.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/QualityGateConditions.tsx @@ -46,7 +46,7 @@ export function QualityGateConditions(props: QualityGateConditionsProps) { return null; } - const sortedConditions = sortBy(failedConditions, condition => + const sortedConditions = sortBy(failedConditions, (condition) => LEVEL_ORDER.indexOf(condition.level) ); @@ -63,8 +63,9 @@ export function QualityGateConditions(props: QualityGateConditionsProps) { return (
          - {renderConditions.map(condition => ( + id="overview-quality-gate-conditions-list" + > + {renderConditions.map((condition) => ( toggleCollapsed(!collapsed)}> + onClick={() => toggleCollapsed(!collapsed)} + > {translateWithParameters( 'overview.X_more_failed_conditions', sortedConditions.length - MAX_CONDITIONS diff --git a/server/sonar-web/src/main/js/apps/overview/components/SonarLintPromotion.tsx b/server/sonar-web/src/main/js/apps/overview/components/SonarLintPromotion.tsx index e183f17cc6e..b6044de79df 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/SonarLintPromotion.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/SonarLintPromotion.tsx @@ -43,12 +43,12 @@ const CONDITIONS_TO_SHOW = [ MetricKey.new_vulnerabilities, MetricKey.new_security_rating, MetricKey.new_maintainability_rating, - MetricKey.new_reliability_rating + MetricKey.new_reliability_rating, ]; export function SonarLintPromotion({ currentUser, qgConditions }: SonarLintPromotionProps) { const showMessage = qgConditions?.some( - qgCondition => + (qgCondition) => CONDITIONS_TO_SHOW.includes(qgCondition.metric as MetricKey) && qgCondition.level === 'ERROR' ); if (!showMessage || currentUser.usingSonarLintConnectedMode) { @@ -65,12 +65,13 @@ export function SonarLintPromotion({ currentUser, qgConditions }: SonarLintPromo + target="_blank" + > SonarLint - ) + ), }} />
        diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/overview/components/__tests__/App-test.tsx index 6d9959e0bf5..117f6c8b91f 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/App-test.tsx @@ -28,15 +28,11 @@ const component = { breadcrumbs: [], name: 'Foo', qualifier: 'TRK', - version: '0.0.1' + version: '0.0.1', }; it('should render BranchOverview', () => { - expect( - getWrapper() - .find(BranchOverview) - .exists() - ).toBe(true); + expect(getWrapper().find(BranchOverview).exists()).toBe(true); }); function getWrapper(props = {}) { diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/EmptyOverview-test.tsx b/server/sonar-web/src/main/js/apps/overview/components/__tests__/EmptyOverview-test.tsx index ec01374e7c6..3d587bca6ac 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/__tests__/EmptyOverview-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/EmptyOverview-test.tsx @@ -37,7 +37,7 @@ it('should render another message when there are branches', () => { expect(shallowRender({ branchLikes: [mockMainBranch(), mockBranch()] })).toMatchSnapshot(); expect( shallowRender({ - branchLikes: [mockMainBranch(), mockBranch(), mockBranch({ name: 'branch-7.8' })] + branchLikes: [mockMainBranch(), mockBranch(), mockBranch({ name: 'branch-7.8' })], }) ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/IssueLabel-test.tsx b/server/sonar-web/src/main/js/apps/overview/components/__tests__/IssueLabel-test.tsx index 65881b99565..220149d24a8 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/__tests__/IssueLabel-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/IssueLabel-test.tsx @@ -29,7 +29,7 @@ import { IssueLabel, IssueLabelProps } from '../IssueLabel'; it('should render correctly for bugs', () => { const measures = [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.bugs }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_bugs }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_bugs }) }), ]; expect(shallowRender({ measures })).toMatchSnapshot(); expect(shallowRender({ measures, useDiffMetric: true })).toMatchSnapshot(); @@ -39,7 +39,7 @@ it('should render correctly for code smells', () => { const type = IssueType.CodeSmell; const measures = [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.code_smells }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_code_smells }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_code_smells }) }), ]; expect(shallowRender({ measures, type })).toMatchSnapshot(); expect(shallowRender({ measures, type, useDiffMetric: true })).toMatchSnapshot(); @@ -49,7 +49,7 @@ it('should render correctly for vulnerabilities', () => { const type = IssueType.Vulnerability; const measures = [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.vulnerabilities }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_vulnerabilities }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_vulnerabilities }) }), ]; expect(shallowRender({ measures, type })).toMatchSnapshot(); expect(shallowRender({ measures, type, useDiffMetric: true })).toMatchSnapshot(); @@ -60,13 +60,13 @@ it('should render correctly for hotspots', () => { const type = IssueType.SecurityHotspot; const measures = [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.security_hotspots }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_security_hotspots }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_security_hotspots }) }), ]; expect( shallowRender({ helpTooltip, measures, - type + type, }) ).toMatchSnapshot(); expect( @@ -74,7 +74,7 @@ it('should render correctly for hotspots', () => { helpTooltip, measures, type, - useDiffMetric: true + useDiffMetric: true, }) ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/IssueRating-test.tsx b/server/sonar-web/src/main/js/apps/overview/components/__tests__/IssueRating-test.tsx index 0f317f5a501..1059aa6a141 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/__tests__/IssueRating-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/IssueRating-test.tsx @@ -44,7 +44,7 @@ it('should render correctly for vulnerabilities', () => { it('should render correctly if no values are present', () => { expect( shallowRender({ - measures: [mockMeasureEnhanced({ metric: mockMetric({ key: 'NONE' }) })] + measures: [mockMeasureEnhanced({ metric: mockMetric({ key: 'NONE' }) })], }) ).toMatchSnapshot(); }); @@ -60,7 +60,7 @@ function shallowRender(props: Partial = {}) { mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_maintainability_rating }) }), mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.sqale_rating }) }), mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_security_rating }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.security_rating }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.security_rating }) }), ]} type={IssueType.Bug} {...props} diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/LeakPeriodLegend-test.tsx b/server/sonar-web/src/main/js/apps/overview/components/__tests__/LeakPeriodLegend-test.tsx index 156a425fd51..93d794f81eb 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/__tests__/LeakPeriodLegend-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/LeakPeriodLegend-test.tsx @@ -67,14 +67,14 @@ function getWrapper(period: Partial = {}) { intl={ { formatDate: (date: string) => 'formatted.' + date, - formatTime: (date: string) => 'formattedTime.' + date + formatTime: (date: string) => 'formattedTime.' + date, } as IntlShape } period={{ date: '2013-09-22T00:00:00+0200', index: 0, mode: 'version', - ...period + ...period, }} /> ); diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/MeasurementLabel-test.tsx b/server/sonar-web/src/main/js/apps/overview/components/__tests__/MeasurementLabel-test.tsx index 89f40459064..d0569af765f 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/__tests__/MeasurementLabel-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/MeasurementLabel-test.tsx @@ -32,17 +32,17 @@ it('should render correctly for coverage', () => { shallowRender({ measures: [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.coverage }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.lines_to_cover }) }) - ] + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.lines_to_cover }) }), + ], }) ).toMatchSnapshot(); expect( shallowRender({ measures: [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_coverage }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_lines_to_cover }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_lines_to_cover }) }), ], - useDiffMetric: true + useDiffMetric: true, }) ).toMatchSnapshot(); }); @@ -51,30 +51,30 @@ it('should render correctly for duplications', () => { expect( shallowRender({ measures: [ - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.duplicated_lines_density }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.duplicated_lines_density }) }), ], - type: MeasurementType.Duplication + type: MeasurementType.Duplication, }) ).toMatchSnapshot(); expect( shallowRender({ measures: [ mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.duplicated_lines_density }) }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.ncloc }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.ncloc }) }), ], - type: MeasurementType.Duplication + type: MeasurementType.Duplication, }) ).toMatchSnapshot(); expect( shallowRender({ measures: [ mockMeasureEnhanced({ - metric: mockMetric({ key: MetricKey.new_duplicated_lines_density }) + metric: mockMetric({ key: MetricKey.new_duplicated_lines_density }), }), - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_lines }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.new_lines }) }), ], type: MeasurementType.Duplication, - useDiffMetric: true + useDiffMetric: true, }) ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/QualityGateCondition-test.tsx b/server/sonar-web/src/main/js/apps/overview/components/__tests__/QualityGateCondition-test.tsx index 7d031f698c8..21239787a6d 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/__tests__/QualityGateCondition-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/QualityGateCondition-test.tsx @@ -35,8 +35,8 @@ it.each([ [quickMock(MetricKey.new_security_rating, 'RATING', true)], [quickMock(MetricKey.new_maintainability_rating, 'RATING', true)], [quickMock(MetricKey.security_hotspots_reviewed)], - [quickMock(MetricKey.new_security_hotspots_reviewed, 'RATING', true)] -])('should render correclty', condition => { + [quickMock(MetricKey.new_security_hotspots_reviewed, 'RATING', true)], +])('should render correclty', (condition) => { expect(shallowRender({ condition })).toMatchSnapshot(); }); @@ -66,12 +66,12 @@ function quickMock( metric: mockMetric({ key: metric, name: metric, - type + type, }), value: '3', - ...(addPeriod ? { period: { value: '3', index: 1 } } : {}) + ...(addPeriod ? { period: { value: '3', index: 1 } } : {}), }, metric, - ...(addPeriod ? { period: 1 } : {}) + ...(addPeriod ? { period: 1 } : {}), }); } diff --git a/server/sonar-web/src/main/js/apps/overview/components/__tests__/SonarLintPromition-test.tsx b/server/sonar-web/src/main/js/apps/overview/components/__tests__/SonarLintPromition-test.tsx index 1513fd41264..c3c1f43efd8 100644 --- a/server/sonar-web/src/main/js/apps/overview/components/__tests__/SonarLintPromition-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/components/__tests__/SonarLintPromition-test.tsx @@ -31,7 +31,9 @@ it('should render correctly', () => { ).toBeNull(); expect( shallowRender({ - qgConditions: [mockQualityGateStatusCondition({ metric: MetricKey.new_bugs, level: 'ERROR' })] + qgConditions: [ + mockQualityGateStatusCondition({ metric: MetricKey.new_bugs, level: 'ERROR' }), + ], }) ).toMatchSnapshot('has failed condition'); }); @@ -49,11 +51,11 @@ it.each( MetricKey.new_vulnerabilities, MetricKey.new_security_rating, MetricKey.new_maintainability_rating, - MetricKey.new_reliability_rating + MetricKey.new_reliability_rating, ].map(Array.of) -)('should show message for %s', metric => { +)('should show message for %s', (metric) => { const wrapper = shallowRender({ - qgConditions: [mockQualityGateStatusCondition({ metric: metric as string })] + qgConditions: [mockQualityGateStatusCondition({ metric: metric as string })], }); expect(wrapper.type()).not.toBeNull(); }); diff --git a/server/sonar-web/src/main/js/apps/overview/pullRequests/LargeQualityGateBadge.tsx b/server/sonar-web/src/main/js/apps/overview/pullRequests/LargeQualityGateBadge.tsx index 46c3f448280..2563e6c7f0e 100644 --- a/server/sonar-web/src/main/js/apps/overview/pullRequests/LargeQualityGateBadge.tsx +++ b/server/sonar-web/src/main/js/apps/overview/pullRequests/LargeQualityGateBadge.tsx @@ -45,8 +45,9 @@ export function LargeQualityGateBadge({ component, level }: Props) {
        + success, + })} + >
        {translate('overview.on_new_code_long')} @@ -57,10 +58,11 @@ export function LargeQualityGateBadge({ component, level }: Props) { defaultMessage={translate('overview.quality_gate.conditions_on_new_code')} id="overview.quality_gate.conditions_on_new_code" values={{ - link: {translate('overview.quality_gate')} + link: {translate('overview.quality_gate')}, }} /> - }> + } + >
        diff --git a/server/sonar-web/src/main/js/apps/overview/pullRequests/PullRequestOverview.tsx b/server/sonar-web/src/main/js/apps/overview/pullRequests/PullRequestOverview.tsx index 50b98a20b64..870db6918ed 100644 --- a/server/sonar-web/src/main/js/apps/overview/pullRequests/PullRequestOverview.tsx +++ b/server/sonar-web/src/main/js/apps/overview/pullRequests/PullRequestOverview.tsx @@ -58,7 +58,7 @@ export class PullRequestOverview extends React.PureComponent { state: State = { loading: false, - measures: [] + measures: [], }; componentDidMount() { @@ -84,9 +84,9 @@ export class PullRequestOverview extends React.PureComponent { const prevConditions = prevProps.conditions ?? []; const newConditions = this.props.conditions ?? []; const diff = differenceBy( - prevConditions.filter(c => c.level === 'ERROR'), - newConditions.filter(c => c.level === 'ERROR'), - c => c.metric + prevConditions.filter((c) => c.level === 'ERROR'), + newConditions.filter((c) => c.level === 'ERROR'), + (c) => c.metric ); return ( @@ -97,7 +97,7 @@ export class PullRequestOverview extends React.PureComponent { fetchBranchStatusData = () => { const { branchLike, - component: { key } + component: { key }, } = this.props; this.props.fetchBranchStatus(branchLike, key); }; @@ -106,7 +106,7 @@ export class PullRequestOverview extends React.PureComponent { const { branchLike, component: { key }, - conditions + conditions, } = this.props; this.setState({ loading: true }); @@ -114,7 +114,7 @@ export class PullRequestOverview extends React.PureComponent { const metricKeys = conditions !== undefined ? // Also load metrics that apply to failing QG conditions. - uniq([...PR_METRICS, ...conditions.filter(c => c.level !== 'OK').map(c => c.metric)]) + uniq([...PR_METRICS, ...conditions.filter((c) => c.level !== 'OK').map((c) => c.metric)]) : PR_METRICS; getMeasuresWithMetrics(key, metricKeys, getBranchLikeQuery(branchLike)).then( @@ -122,7 +122,7 @@ export class PullRequestOverview extends React.PureComponent { if (this.mounted && component.measures) { this.setState({ loading: false, - measures: enhanceMeasuresWithMetrics(component.measures || [], metrics) + measures: enhanceMeasuresWithMetrics(component.measures || [], metrics), }); } }, @@ -151,16 +151,17 @@ export class PullRequestOverview extends React.PureComponent { } const failedConditions = conditions - .filter(condition => condition.level === 'ERROR') - .map(c => enhanceConditionWithMeasure(c, measures)) + .filter((condition) => condition.level === 'ERROR') + .map((c) => enhanceConditionWithMeasure(c, measures)) .filter(isDefined); return (
        0 - })}> + 'has-conditions': failedConditions.length > 0, + })} + > {ignoredConditions && ( @@ -214,7 +215,7 @@ export class PullRequestOverview extends React.PureComponent { IssueType.Bug, IssueType.Vulnerability, IssueType.SecurityHotspot, - IssueType.CodeSmell + IssueType.CodeSmell, ].map((type: IssueType) => (
        diff --git a/server/sonar-web/src/main/js/apps/overview/pullRequests/__tests__/AfterMergeEstimate-test.tsx b/server/sonar-web/src/main/js/apps/overview/pullRequests/__tests__/AfterMergeEstimate-test.tsx index 31a99739b19..1e419b7d459 100644 --- a/server/sonar-web/src/main/js/apps/overview/pullRequests/__tests__/AfterMergeEstimate-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/pullRequests/__tests__/AfterMergeEstimate-test.tsx @@ -32,9 +32,9 @@ it('should render correctly for duplications', () => { expect( shallowRender({ measures: [ - mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.duplicated_lines_density }) }) + mockMeasureEnhanced({ metric: mockMetric({ key: MetricKey.duplicated_lines_density }) }), ], - type: MeasurementType.Duplication + type: MeasurementType.Duplication, }) ).toMatchSnapshot(); }); diff --git a/server/sonar-web/src/main/js/apps/overview/pullRequests/__tests__/PullRequestOverview-test.tsx b/server/sonar-web/src/main/js/apps/overview/pullRequests/__tests__/PullRequestOverview-test.tsx index 952f8c37802..e85465511ac 100644 --- a/server/sonar-web/src/main/js/apps/overview/pullRequests/__tests__/PullRequestOverview-test.tsx +++ b/server/sonar-web/src/main/js/apps/overview/pullRequests/__tests__/PullRequestOverview-test.tsx @@ -36,24 +36,24 @@ jest.mock('../../../../api/measures', () => { mockMeasure({ metric: 'new_bugs' }), mockMeasure({ metric: 'new_vulnerabilities' }), mockMeasure({ metric: 'new_code_smells' }), - mockMeasure({ metric: 'new_security_hotspots' }) - ] + mockMeasure({ metric: 'new_security_hotspots' }), + ], }, metrics: [ mockMetric({ key: 'new_bugs', name: 'new_bugs', id: 'new_bugs' }), mockMetric({ key: 'new_vulnerabilities', name: 'new_vulnerabilities', - id: 'new_vulnerabilities' + id: 'new_vulnerabilities', }), mockMetric({ key: 'new_code_smells', name: 'new_code_smells', id: 'new_code_smells' }), mockMetric({ key: 'new_security_hotspots', name: 'new_security_hotspots', - id: 'new_security_hotspots' - }) - ] - }) + id: 'new_security_hotspots', + }), + ], + }), }; }); @@ -91,14 +91,14 @@ it('should render correctly for a failed QG', async () => { error: '1.0', level: 'OK', metric: 'new_bugs', - period: 1 + period: 1, }), mockQualityGateStatusCondition({ error: '1.0', metric: 'new_code_smells', - period: 1 - }) - ] + period: 1, + }), + ], }); await waitAndUpdate(wrapper); expect(wrapper).toMatchSnapshot(); @@ -112,7 +112,7 @@ it('should correctly fetch all required metrics for a passing QG', async () => { it('should correctly fetch all required metrics for a failing QG', async () => { const wrapper = shallowRender({ - conditions: [mockQualityGateStatusCondition({ level: 'ERROR', metric: 'foo' })] + conditions: [mockQualityGateStatusCondition({ level: 'ERROR', metric: 'foo' })], }); await waitAndUpdate(wrapper); expect(getMeasuresWithMetrics).toHaveBeenCalledWith( diff --git a/server/sonar-web/src/main/js/apps/overview/utils.ts b/server/sonar-web/src/main/js/apps/overview/utils.ts index d49a26488bc..f460eb42eb1 100644 --- a/server/sonar-web/src/main/js/apps/overview/utils.ts +++ b/server/sonar-web/src/main/js/apps/overview/utils.ts @@ -77,7 +77,7 @@ export const METRICS: string[] = [ MetricKey.ncloc_language_distribution, MetricKey.projects, MetricKey.lines, - MetricKey.new_lines + MetricKey.new_lines, ]; export const PR_METRICS: string[] = [ @@ -95,7 +95,7 @@ export const PR_METRICS: string[] = [ MetricKey.new_vulnerabilities, MetricKey.new_security_hotspots, MetricKey.new_security_review_rating, - MetricKey.new_security_rating + MetricKey.new_security_rating, ]; export const HISTORY_METRICS_LIST: string[] = [ @@ -104,12 +104,12 @@ export const HISTORY_METRICS_LIST: string[] = [ MetricKey.sqale_index, MetricKey.duplicated_lines_density, MetricKey.ncloc, - MetricKey.coverage + MetricKey.coverage, ]; export enum MeasurementType { Coverage = 'COVERAGE', - Duplication = 'DUPLICATION' + Duplication = 'DUPLICATION', } const MEASUREMENTS_MAP = { @@ -122,7 +122,7 @@ const MEASUREMENTS_MAP = { labelKey: 'metric.coverage.name', expandedLabelKey: 'overview.coverage_on_X_lines', newLinesExpandedLabelKey: 'overview.coverage_on_X_new_lines', - iconClass: CoverageRating + iconClass: CoverageRating, }, [MeasurementType.Duplication]: { metric: MetricKey.duplicated_lines_density, @@ -133,8 +133,8 @@ const MEASUREMENTS_MAP = { labelKey: 'metric.duplicated_lines_density.short_name', expandedLabelKey: 'overview.duplications_on_X_lines', newLinesExpandedLabelKey: 'overview.duplications_on_X_new_lines', - iconClass: DuplicationsRating - } + iconClass: DuplicationsRating, + }, }; export function getIssueRatingName(type: IssueType) { @@ -178,12 +178,12 @@ export function getMeasurementLabelKeys(type: MeasurementType, useDiffMetric: bo expandedLabelKey: useDiffMetric ? MEASUREMENTS_MAP[type].newLinesExpandedLabelKey : MEASUREMENTS_MAP[type].expandedLabelKey, - labelKey: MEASUREMENTS_MAP[type].labelKey + labelKey: MEASUREMENTS_MAP[type].labelKey, }; } export const parseQuery = memoize((urlQuery: RawQuery): { codeScope: string } => { return { - codeScope: parseAsString(urlQuery['code_scope']) + codeScope: parseAsString(urlQuery['code_scope']), }; }); diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/ActionsCell.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/ActionsCell.tsx index da13a3a8d61..2ae8ea5a2ca 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/ActionsCell.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/ActionsCell.tsx @@ -22,7 +22,7 @@ import * as React from 'react'; import { deletePermissionTemplate, setDefaultPermissionTemplate, - updatePermissionTemplate + updatePermissionTemplate, } from '../../../api/permissions'; import ActionsDropdown, { ActionsDropdownItem } from '../../../components/controls/ActionsDropdown'; import { Router, withRouter } from '../../../components/hoc/withRouter'; @@ -125,14 +125,15 @@ export class ActionsCell extends React.PureComponent { className="js-set-default" data-qualifier={qualifier} key={qualifier} - onClick={this.setDefault(qualifier)}> + onClick={this.setDefault(qualifier)} + > {child} ); } renderIfSingleTopQualifier(availableQualifiers: string[]) { - return availableQualifiers.map(qualifier => + return availableQualifiers.map((qualifier) => this.renderSetDefaultLink( qualifier, {translate('permission_templates.set_default')} @@ -141,7 +142,7 @@ export class ActionsCell extends React.PureComponent { } renderIfMultipleTopQualifiers(availableQualifiers: string[]) { - return availableQualifiers.map(qualifier => + return availableQualifiers.map((qualifier) => this.renderSetDefaultLink( qualifier, @@ -162,7 +163,8 @@ export class ActionsCell extends React.PureComponent { {!this.props.fromDetails && ( + to={{ pathname: PERMISSION_TEMPLATES_PATH, search: queryToSearch({ id: t.id }) }} + > {translate('edit_permissions')} )} @@ -175,7 +177,8 @@ export class ActionsCell extends React.PureComponent { + onClick={this.handleDeleteClick} + > {translate('delete')} )} diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/App.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/App.tsx index 649ee420207..fce2ef87a33 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/App.tsx @@ -47,7 +47,7 @@ export class App extends React.PureComponent { state: State = { ready: false, permissions: [], - permissionTemplates: [] + permissionTemplates: [], }; componentDidMount() { @@ -71,7 +71,7 @@ export class App extends React.PureComponent { this.setState({ ready: true, permissionTemplates: permissionTemplatesMerged, - permissions: sortedPerm + permissions: sortedPerm, }); } }; @@ -81,7 +81,7 @@ export class App extends React.PureComponent { return null; } - const template = this.state.permissionTemplates.find(t => t.id === id); + const template = this.state.permissionTemplates.find((t) => t.id === id); if (!template) { return null; } diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/Defaults.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/Defaults.tsx index 02ff003aae4..b47f2592a5e 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/Defaults.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/Defaults.tsx @@ -30,7 +30,7 @@ export default function Defaults({ template }: Props) { const qualifiersToDisplay = template.defaultFor; const qualifiers = sortBy(qualifiersToDisplay) - .map(qualifier => translate('qualifiers', qualifier)) + .map((qualifier) => translate('qualifiers', qualifier)) .join(', '); return ( diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/Form.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/Form.tsx index e302f615198..e2242c8a3b8 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/Form.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/Form.tsx @@ -52,7 +52,7 @@ export default class Form extends React.PureComponent { description: (props.permissionTemplate && props.permissionTemplate.description) || '', name: (props.permissionTemplate && props.permissionTemplate.name) || '', projectKeyPattern: - (props.permissionTemplate && props.permissionTemplate.projectKeyPattern) || '' + (props.permissionTemplate && props.permissionTemplate.projectKeyPattern) || '', }; } @@ -61,7 +61,7 @@ export default class Form extends React.PureComponent { .onSubmit({ description: this.state.description, name: this.state.name, - projectKeyPattern: this.state.projectKeyPattern + projectKeyPattern: this.state.projectKeyPattern, }) .then(this.props.onClose); }; @@ -84,7 +84,8 @@ export default class Form extends React.PureComponent { header={this.props.header} onClose={this.props.onClose} onSubmit={this.handleSubmit} - size="small"> + size="small" + > {({ onCloseClick, onFormSubmit, submitting }) => (
        @@ -147,7 +148,8 @@ export default class Form extends React.PureComponent { + onClick={onCloseClick} + > {translate('cancel')} diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/Header.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/Header.tsx index 7494e4260da..9152371d3f6 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/Header.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/Header.tsx @@ -62,11 +62,11 @@ class Header extends React.PureComponent { name: string; projectKeyPattern: string; }) => { - return createPermissionTemplate({ ...data }).then(response => { + return createPermissionTemplate({ ...data }).then((response) => { this.props.refresh().then(() => { this.props.router.push({ pathname: PERMISSION_TEMPLATES_PATH, - query: { id: response.permissionTemplate.id } + query: { id: response.permissionTemplate.id }, }); }); }); diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/List.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/List.tsx index 226a3f63250..4c34edff7dd 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/List.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/List.tsx @@ -30,7 +30,7 @@ interface Props { } export default function List(props: Props) { - const permissionTemplates = props.permissionTemplates.map(p => ( + const permissionTemplates = props.permissionTemplates.map((p) => ( )); diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/ListHeader.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/ListHeader.tsx index db38452c456..8edbf023f4d 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/ListHeader.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/ListHeader.tsx @@ -43,7 +43,7 @@ export default class ListHeader extends React.PureComponent { } render() { - const cells = this.props.permissions.map(permission => ( + const cells = this.props.permissions.map((permission) => (
    • - {permissions.map(permission => ( + {permissions.map((permission) => ( { {items.length === 0 && !this.props.loading && this.renderEmpty()} - {itemWithPermissions.map(item => this.renderItem(item, permissions))} + {itemWithPermissions.map((item) => this.renderItem(item, permissions))} {itemWithPermissions.length > 0 && itemWithoutPermissions.length > 0 && ( <> @@ -163,7 +163,7 @@ export default class HoldersList extends React.PureComponent { {/* Keep correct zebra colors in the table */} )} - {itemWithoutPermissions.map(item => this.renderItem(item, permissions))} + {itemWithoutPermissions.map((item) => this.renderItem(item, permissions))}
      {translate('projects_role', permission.key)} diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/ListItem.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/ListItem.tsx index 2415db413f0..d796977cb94 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/ListItem.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/ListItem.tsx @@ -30,7 +30,7 @@ interface Props { } export default function ListItem(props: Props) { - const permissions = props.template.permissions.map(p => ( + const permissions = props.template.permissions.map((p) => ( )); diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/Template.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/Template.tsx index a699420452d..7e0ad42157c 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/Template.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/Template.tsx @@ -26,7 +26,7 @@ import HoldersList from '../../permissions/shared/components/HoldersList'; import SearchForm from '../../permissions/shared/components/SearchForm'; import { convertToPermissionDefinitions, - PERMISSIONS_ORDER_FOR_PROJECT_TEMPLATE + PERMISSIONS_ORDER_FOR_PROJECT_TEMPLATE, } from '../../permissions/utils'; import TemplateDetails from './TemplateDetails'; import TemplateHeader from './TemplateHeader'; @@ -53,7 +53,7 @@ export default class Template extends React.PureComponent { groups: [], loading: false, query: '', - users: [] + users: [], }; componentDidMount() { @@ -90,7 +90,7 @@ export default class Template extends React.PureComponent { this.setState({ users, groups, - loading: false + loading: false, }); } }); @@ -105,7 +105,7 @@ export default class Template extends React.PureComponent { const data: { templateId: string; login: string; permission: string } = { templateId: template.id, login: user.login, - permission + permission, }; const request = hasPermission @@ -129,7 +129,7 @@ export default class Template extends React.PureComponent { const data = { templateId: template.id, groupName: group.name, - permission + permission, }; const request = hasPermission ? api.revokeTemplatePermissionFromGroup(data) @@ -176,14 +176,14 @@ export default class Template extends React.PureComponent { const allUsers = [...this.state.users]; const creatorPermissions = this.props.template.permissions - .filter(p => p.withProjectCreator) - .map(p => p.key); + .filter((p) => p.withProjectCreator) + .map((p) => p.key); if (this.shouldDisplayCreator(creatorPermissions)) { const creator = { login: '', name: translate('permission_templates.project_creators'), - permissions: creatorPermissions + permissions: creatorPermissions, }; allUsers.unshift(creator); @@ -210,7 +210,8 @@ export default class Template extends React.PureComponent { permissions={permissions} selectedPermission={this.state.selectedPermission} showPublicProjectsWarning={true} - users={allUsers}> + users={allUsers} + > ) { diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/App-test.tsx index 7dbbdfa0f9f..839206fa0a6 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/App-test.tsx @@ -34,16 +34,16 @@ jest.mock('../../../../api/permissions', () => ({ updatedAt: '2019-02-07T17:23:26+0100', permissions: [ { key: 'admin', usersCount: 0, groupsCount: 1, withProjectCreator: false }, - { key: 'codeviewer', usersCount: 0, groupsCount: 1, withProjectCreator: false } - ] - } + { key: 'codeviewer', usersCount: 0, groupsCount: 1, withProjectCreator: false }, + ], + }, ], defaultTemplates: [{ templateId: '1', qualifier: 'TRK' }], permissions: [ { key: 'admin', name: 'Administer', description: 'Admin permission' }, - { key: 'codeviewer', name: 'See Source Code', description: 'Code viewer permission' } - ] - }) + { key: 'codeviewer', name: 'See Source Code', description: 'Code viewer permission' }, + ], + }), })); it('should render correctly', async () => { diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/Defaults-test.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/Defaults-test.tsx index cc490d629a1..c091c14fe58 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/Defaults-test.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/Defaults-test.tsx @@ -27,7 +27,7 @@ const SAMPLE: PermissionTemplate = { defaultFor: [], id: 'id', name: 'name', - permissions: [] + permissions: [], }; it('should render one qualifier', () => { diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/ListItem-test.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/ListItem-test.tsx index 23f9522b23c..c800e57c9de 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/ListItem-test.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/ListItem-test.tsx @@ -35,7 +35,7 @@ function shallowRender() { createdAt: '2020-01-01', name: 'test', defaultFor: [], - permissions: [] + permissions: [], }} topQualifiers={[]} /> diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/NameCell-test.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/NameCell-test.tsx index 61b817ecbba..7b2c0470689 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/NameCell-test.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/NameCell-test.tsx @@ -33,7 +33,7 @@ function shallowRender() { createdAt: '2020-01-01', name: 'test', defaultFor: ['user'], - permissions: [] + permissions: [], }} /> ); diff --git a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/Template-test.tsx b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/Template-test.tsx index 371492549ba..a06d0fb8bf3 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/Template-test.tsx +++ b/server/sonar-web/src/main/js/apps/permission-templates/components/__tests__/Template-test.tsx @@ -23,7 +23,7 @@ import { grantTemplatePermissionToGroup, grantTemplatePermissionToUser, revokeTemplatePermissionFromGroup, - revokeTemplatePermissionFromUser + revokeTemplatePermissionFromUser, } from '../../../../api/permissions'; import Template from '../Template'; @@ -33,7 +33,7 @@ jest.mock('../../../../api/permissions', () => ({ grantTemplatePermissionToGroup: jest.fn().mockResolvedValue({}), revokeTemplatePermissionFromGroup: jest.fn().mockResolvedValue({}), getPermissionTemplateGroups: jest.fn().mockResolvedValue([]), - getPermissionTemplateUsers: jest.fn().mockResolvedValue([]) + getPermissionTemplateUsers: jest.fn().mockResolvedValue([]), })); it('render correctly', () => { @@ -44,16 +44,16 @@ it('revoke group permission if granted', async () => { const wrapper = shallowRender(); const group = { name: 'foo', - permissions: ['bar'] + permissions: ['bar'], }; wrapper.setState({ - groups: [group] + groups: [group], }); await wrapper.instance().handleToggleGroup(group, 'bar'); expect(revokeTemplatePermissionFromGroup).toHaveBeenCalledWith({ groupName: 'foo', templateId: '1', - permission: 'bar' + permission: 'bar', }); }); @@ -61,16 +61,16 @@ it('grant group permission', async () => { const wrapper = shallowRender(); const group = { name: 'foo', - permissions: [] + permissions: [], }; wrapper.setState({ - groups: [group] + groups: [group], }); await wrapper.instance().handleToggleGroup(group, 'bar'); expect(grantTemplatePermissionToGroup).toHaveBeenCalledWith({ groupName: 'foo', templateId: '1', - permission: 'bar' + permission: 'bar', }); }); @@ -79,16 +79,16 @@ it('revoke user permission if granted', async () => { const user = { login: 'foo', name: 'foo', - permissions: ['bar'] + permissions: ['bar'], }; wrapper.setState({ - users: [user] + users: [user], }); await wrapper.instance().handleToggleUser(user, 'bar'); expect(revokeTemplatePermissionFromUser).toHaveBeenCalledWith({ templateId: '1', login: 'foo', - permission: 'bar' + permission: 'bar', }); }); @@ -97,16 +97,16 @@ it('grant user permission', async () => { const user = { login: 'foo', name: 'foo', - permissions: [] + permissions: [], }; wrapper.setState({ - users: [user] + users: [user], }); await wrapper.instance().handleToggleUser(user, 'bar'); expect(grantTemplatePermissionToUser).toHaveBeenCalledWith({ templateId: '1', login: 'foo', - permission: 'bar' + permission: 'bar', }); }); @@ -119,7 +119,7 @@ function shallowRender() { createdAt: '2020-01-01', name: 'test', defaultFor: [], - permissions: [] + permissions: [], }} topQualifiers={[]} /> diff --git a/server/sonar-web/src/main/js/apps/permission-templates/utils.ts b/server/sonar-web/src/main/js/apps/permission-templates/utils.ts index f94ca1bd315..8e3a3762202 100644 --- a/server/sonar-web/src/main/js/apps/permission-templates/utils.ts +++ b/server/sonar-web/src/main/js/apps/permission-templates/utils.ts @@ -26,25 +26,25 @@ export const PERMISSIONS_ORDER = [ 'issueadmin', 'securityhotspotadmin', 'admin', - 'scan' + 'scan', ]; export const PERMISSION_TEMPLATES_PATH = '/admin/permission_templates'; export function sortPermissions(permissions: Permission[]) { - return sortBy(permissions, p => PERMISSIONS_ORDER.indexOf(p.key)); + return sortBy(permissions, (p) => PERMISSIONS_ORDER.indexOf(p.key)); } export function mergePermissionsToTemplates( permissionTemplates: PermissionTemplate[], basePermissions: Permission[] ): PermissionTemplate[] { - return permissionTemplates.map(permissionTemplate => { + return permissionTemplates.map((permissionTemplate) => { // it's important to keep the order of the permission template's permissions // the same as the order of base permissions - const permissions = basePermissions.map(basePermission => { + const permissions = basePermissions.map((basePermission) => { const projectPermission = permissionTemplate.permissions.find( - p => p.key === basePermission.key + (p) => p.key === basePermission.key ); return { usersCount: 0, groupsCount: 0, ...basePermission, ...projectPermission }; }); @@ -57,10 +57,10 @@ export function mergeDefaultsToTemplates( permissionTemplates: PermissionTemplate[], defaultTemplates: Array<{ templateId: string; qualifier: string }> = [] ): PermissionTemplate[] { - return permissionTemplates.map(permissionTemplate => { + return permissionTemplates.map((permissionTemplate) => { const defaultFor: string[] = []; - defaultTemplates.forEach(defaultTemplate => { + defaultTemplates.forEach((defaultTemplate) => { if (defaultTemplate.templateId === permissionTemplate.id) { defaultFor.push(defaultTemplate.qualifier); } diff --git a/server/sonar-web/src/main/js/apps/permissions/__tests__/utils-test.ts b/server/sonar-web/src/main/js/apps/permissions/__tests__/utils-test.ts index c322579fe2d..6d47dcb1936 100644 --- a/server/sonar-web/src/main/js/apps/permissions/__tests__/utils-test.ts +++ b/server/sonar-web/src/main/js/apps/permissions/__tests__/utils-test.ts @@ -20,7 +20,7 @@ import { convertToPermissionDefinitions } from '../utils'; jest.mock('../../../helpers/l10nBundle', () => ({ - getMessages: jest.fn().mockReturnValue({}) + getMessages: jest.fn().mockReturnValue({}), })); describe('convertToPermissionDefinitions', () => { @@ -30,8 +30,8 @@ describe('convertToPermissionDefinitions', () => { { description: 'global_permissions.admin.desc', key: 'admin', - name: 'global_permissions.admin' - } + name: 'global_permissions.admin', + }, ]; expect(data).toEqual(expected); diff --git a/server/sonar-web/src/main/js/apps/permissions/global/components/AllHoldersList.tsx b/server/sonar-web/src/main/js/apps/permissions/global/components/AllHoldersList.tsx index 630e78f5217..03512413299 100644 --- a/server/sonar-web/src/main/js/apps/permissions/global/components/AllHoldersList.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/global/components/AllHoldersList.tsx @@ -28,7 +28,7 @@ import SearchForm from '../../shared/components/SearchForm'; import { convertToPermissionDefinitions, filterPermissions, - PERMISSIONS_ORDER_GLOBAL + PERMISSIONS_ORDER_GLOBAL, } from '../../utils'; interface StateProps { @@ -73,16 +73,8 @@ export class AllHoldersList extends React.PureComponent { }; render() { - const { - appState, - filter, - groups, - groupsPaging, - users, - usersPaging, - loading, - query - } = this.props; + const { appState, filter, groups, groupsPaging, users, usersPaging, loading, query } = + this.props; const l10nPrefix = 'global_permissions'; const hasPortfoliosEnabled = appState.qualifiers.includes(ComponentQualifier.Portfolio); @@ -113,7 +105,8 @@ export class AllHoldersList extends React.PureComponent { onToggleUser={this.handleToggleUser} permissions={permissions} query={query} - users={users}> + users={users} + > { groups: [], loading: true, query: '', - users: [] + users: [], }; } @@ -68,7 +68,7 @@ export default class App extends React.PureComponent<{}, State> { filter !== 'groups' ? api.getGlobalPermissionsUsers({ q: query || undefined, - p: userPage + p: userPage, }) : Promise.resolve({ paging: undefined, users: [] }); @@ -76,7 +76,7 @@ export default class App extends React.PureComponent<{}, State> { filter !== 'users' ? api.getGlobalPermissionsGroups({ q: query || undefined, - p: groupsPage + p: groupsPage, }) : Promise.resolve({ paging: undefined, groups: [] }); @@ -92,7 +92,7 @@ export default class App extends React.PureComponent<{}, State> { groupsPaging: groupsResponse.paging, loading: false, users: usersResponse.users, - usersPaging: usersResponse.paging + usersPaging: usersResponse.paging, }); } }, this.stopLoading); @@ -111,7 +111,7 @@ export default class App extends React.PureComponent<{}, State> { groupsPaging: groupsResponse.paging, loading: false, users: [...users, ...usersResponse.users], - usersPaging: usersResponse.paging + usersPaging: usersResponse.paging, })); } }, this.stopLoading); @@ -126,7 +126,7 @@ export default class App extends React.PureComponent<{}, State> { }; addPermissionToGroup = (groups: PermissionGroup[], group: string, permission: string) => { - return groups.map(candidate => + return groups.map((candidate) => candidate.name === group ? { ...candidate, permissions: [...candidate.permissions, permission] } : candidate @@ -134,7 +134,7 @@ export default class App extends React.PureComponent<{}, State> { }; addPermissionToUser = (users: PermissionUser[], user: string, permission: string) => { - return users.map(candidate => + return users.map((candidate) => candidate.login === user ? { ...candidate, permissions: [...candidate.permissions, permission] } : candidate @@ -142,7 +142,7 @@ export default class App extends React.PureComponent<{}, State> { }; removePermissionFromGroup = (groups: PermissionGroup[], group: string, permission: string) => { - return groups.map(candidate => + return groups.map((candidate) => candidate.name === group ? { ...candidate, permissions: without(candidate.permissions, permission) } : candidate @@ -150,7 +150,7 @@ export default class App extends React.PureComponent<{}, State> { }; removePermissionFromUser = (users: PermissionUser[], user: string, permission: string) => { - return users.map(candidate => + return users.map((candidate) => candidate.login === user ? { ...candidate, permissions: without(candidate.permissions, permission) } : candidate @@ -160,19 +160,19 @@ export default class App extends React.PureComponent<{}, State> { grantPermissionToGroup = (group: string, permission: string) => { if (this.mounted) { this.setState(({ groups }) => ({ - groups: this.addPermissionToGroup(groups, group, permission) + groups: this.addPermissionToGroup(groups, group, permission), })); return api .grantPermissionToGroup({ groupName: group, - permission + permission, }) .then( () => {}, () => { if (this.mounted) { this.setState(({ groups }) => ({ - groups: this.removePermissionFromGroup(groups, group, permission) + groups: this.removePermissionFromGroup(groups, group, permission), })); } } @@ -184,19 +184,19 @@ export default class App extends React.PureComponent<{}, State> { grantPermissionToUser = (user: string, permission: string) => { if (this.mounted) { this.setState(({ users }) => ({ - users: this.addPermissionToUser(users, user, permission) + users: this.addPermissionToUser(users, user, permission), })); return api .grantPermissionToUser({ login: user, - permission + permission, }) .then( () => {}, () => { if (this.mounted) { this.setState(({ users }) => ({ - users: this.removePermissionFromUser(users, user, permission) + users: this.removePermissionFromUser(users, user, permission), })); } } @@ -208,19 +208,19 @@ export default class App extends React.PureComponent<{}, State> { revokePermissionFromGroup = (group: string, permission: string) => { if (this.mounted) { this.setState(({ groups }) => ({ - groups: this.removePermissionFromGroup(groups, group, permission) + groups: this.removePermissionFromGroup(groups, group, permission), })); return api .revokePermissionFromGroup({ groupName: group, - permission + permission, }) .then( () => {}, () => { if (this.mounted) { this.setState(({ groups }) => ({ - groups: this.addPermissionToGroup(groups, group, permission) + groups: this.addPermissionToGroup(groups, group, permission), })); } } @@ -232,19 +232,19 @@ export default class App extends React.PureComponent<{}, State> { revokePermissionFromUser = (user: string, permission: string) => { if (this.mounted) { this.setState(({ users }) => ({ - users: this.removePermissionFromUser(users, user, permission) + users: this.removePermissionFromUser(users, user, permission), })); return api .revokePermissionFromUser({ login: user, - permission + permission, }) .then( () => {}, () => { if (this.mounted) { this.setState(({ users }) => ({ - users: this.addPermissionToUser(users, user, permission) + users: this.addPermissionToUser(users, user, permission), })); } } diff --git a/server/sonar-web/src/main/js/apps/permissions/global/components/__tests__/AllHoldersList-test.tsx b/server/sonar-web/src/main/js/apps/permissions/global/components/__tests__/AllHoldersList-test.tsx index 08278fe5912..5a2f9686d8c 100644 --- a/server/sonar-web/src/main/js/apps/permissions/global/components/__tests__/AllHoldersList-test.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/global/components/__tests__/AllHoldersList-test.tsx @@ -31,15 +31,15 @@ it('should render correctly', () => { expect( shallowRender({ appState: mockAppState({ - qualifiers: [ComponentQualifier.Project, ComponentQualifier.Application] - }) + qualifiers: [ComponentQualifier.Project, ComponentQualifier.Application], + }), }) ).toMatchSnapshot('applications available'); expect( shallowRender({ appState: mockAppState({ - qualifiers: [ComponentQualifier.Project, ComponentQualifier.Portfolio] - }) + qualifiers: [ComponentQualifier.Project, ComponentQualifier.Portfolio], + }), }) ).toMatchSnapshot('portfolios available'); }); diff --git a/server/sonar-web/src/main/js/apps/permissions/global/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/permissions/global/components/__tests__/App-test.tsx index 02a97b57fd8..fe4450bba7d 100644 --- a/server/sonar-web/src/main/js/apps/permissions/global/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/global/components/__tests__/App-test.tsx @@ -23,7 +23,7 @@ import { grantPermissionToGroup, grantPermissionToUser, revokePermissionFromGroup, - revokePermissionFromUser + revokePermissionFromUser, } from '../../../../../api/permissions'; import { waitAndUpdate } from '../../../../../helpers/testUtils'; import App from '../App'; @@ -33,8 +33,8 @@ jest.mock('../../../../../api/permissions', () => ({ paging: { pageIndex: 1, pageSize: 100, total: 2 }, groups: [ { name: 'Anyone', permissions: ['admin', 'codeviewer', 'issueadmin'] }, - { id: '1', name: 'SonarSource', description: 'SonarSource team', permissions: [] } - ] + { id: '1', name: 'SonarSource', description: 'SonarSource team', permissions: [] }, + ], }), getGlobalPermissionsUsers: jest.fn().mockResolvedValue({ paging: { pageIndex: 1, pageSize: 100, total: 3 }, @@ -44,28 +44,28 @@ jest.mock('../../../../../api/permissions', () => ({ email: 'admin@gmail.com', login: 'admin', name: 'Admin Admin', - permissions: ['admin'] + permissions: ['admin'], }, { avatar: 'user-avatar-1', email: 'user1@gmail.com', login: 'user1', name: 'User Number 1', - permissions: [] + permissions: [], }, { avatar: 'user-avatar-2', email: 'user2@gmail.com', login: 'user2', name: 'User Number 2', - permissions: [] - } - ] + permissions: [], + }, + ], }), grantPermissionToGroup: jest.fn().mockResolvedValue({}), grantPermissionToUser: jest.fn().mockResolvedValue({}), revokePermissionFromGroup: jest.fn().mockResolvedValue({}), - revokePermissionFromUser: jest.fn().mockResolvedValue({}) + revokePermissionFromUser: jest.fn().mockResolvedValue({}), })); beforeEach(() => { diff --git a/server/sonar-web/src/main/js/apps/permissions/project/components/AllHoldersList.tsx b/server/sonar-web/src/main/js/apps/permissions/project/components/AllHoldersList.tsx index 059ea184e17..7e785bac565 100644 --- a/server/sonar-web/src/main/js/apps/permissions/project/components/AllHoldersList.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/project/components/AllHoldersList.tsx @@ -25,7 +25,7 @@ import { Paging, PermissionGroup, PermissionUser, - Visibility + Visibility, } from '../../../../types/types'; import HoldersList from '../../shared/components/HoldersList'; import SearchForm from '../../shared/components/SearchForm'; @@ -106,7 +106,8 @@ export default class AllHoldersList extends React.PureComponent { permissions={permissions} query={this.props.query} selectedPermission={this.props.selectedPermission} - users={this.props.users}> + users={this.props.users} + > { groups: [], loading: true, query: '', - users: [] + users: [], }; } @@ -87,7 +87,7 @@ export class App extends React.PureComponent { projectKey: component.key, q: query || undefined, permission: selectedPermission, - p: userPage + p: userPage, }) : Promise.resolve({ paging: undefined, users: [] }); @@ -97,7 +97,7 @@ export class App extends React.PureComponent { projectKey: component.key, q: query || undefined, permission: selectedPermission, - p: groupsPage + p: groupsPage, }) : Promise.resolve({ paging: undefined, groups: [] }); @@ -113,7 +113,7 @@ export class App extends React.PureComponent { groupsPaging: groupsResponse.paging, loading: false, users: usersResponse.users, - usersPaging: usersResponse.paging + usersPaging: usersResponse.paging, }); } }, this.stopLoading); @@ -132,7 +132,7 @@ export class App extends React.PureComponent { groupsPaging: groupsResponse.paging, loading: false, users: [...users, ...usersResponse.users], - usersPaging: usersResponse.paging + usersPaging: usersResponse.paging, })); } }, this.stopLoading); @@ -155,7 +155,7 @@ export class App extends React.PureComponent { this.setState( (state: State) => ({ selectedPermission: - state.selectedPermission === selectedPermission ? undefined : selectedPermission + state.selectedPermission === selectedPermission ? undefined : selectedPermission, }), this.loadHolders ); @@ -163,7 +163,7 @@ export class App extends React.PureComponent { }; addPermissionToGroup = (group: string, permission: string) => { - return this.state.groups.map(candidate => + return this.state.groups.map((candidate) => candidate.name === group ? { ...candidate, permissions: [...candidate.permissions, permission] } : candidate @@ -171,7 +171,7 @@ export class App extends React.PureComponent { }; addPermissionToUser = (user: string, permission: string) => { - return this.state.users.map(candidate => + return this.state.users.map((candidate) => candidate.login === user ? { ...candidate, permissions: [...candidate.permissions, permission] } : candidate @@ -179,7 +179,7 @@ export class App extends React.PureComponent { }; removePermissionFromGroup = (group: string, permission: string) => { - return this.state.groups.map(candidate => + return this.state.groups.map((candidate) => candidate.name === group ? { ...candidate, permissions: without(candidate.permissions, permission) } : candidate @@ -187,7 +187,7 @@ export class App extends React.PureComponent { }; removePermissionFromUser = (user: string, permission: string) => { - return this.state.users.map(candidate => + return this.state.users.map((candidate) => candidate.login === user ? { ...candidate, permissions: without(candidate.permissions, permission) } : candidate @@ -198,19 +198,19 @@ export class App extends React.PureComponent { if (this.mounted) { this.setState({ loading: true, - groups: this.addPermissionToGroup(group, permission) + groups: this.addPermissionToGroup(group, permission), }); return api .grantPermissionToGroup({ projectKey: this.props.component.key, groupName: group, - permission + permission, }) .then(this.stopLoading, () => { if (this.mounted) { this.setState({ loading: false, - groups: this.removePermissionFromGroup(group, permission) + groups: this.removePermissionFromGroup(group, permission), }); } }); @@ -222,19 +222,19 @@ export class App extends React.PureComponent { if (this.mounted) { this.setState({ loading: true, - users: this.addPermissionToUser(user, permission) + users: this.addPermissionToUser(user, permission), }); return api .grantPermissionToUser({ projectKey: this.props.component.key, login: user, - permission + permission, }) .then(this.stopLoading, () => { if (this.mounted) { this.setState({ loading: false, - users: this.removePermissionFromUser(user, permission) + users: this.removePermissionFromUser(user, permission), }); } }); @@ -246,19 +246,19 @@ export class App extends React.PureComponent { if (this.mounted) { this.setState({ loading: true, - groups: this.removePermissionFromGroup(group, permission) + groups: this.removePermissionFromGroup(group, permission), }); return api .revokePermissionFromGroup({ projectKey: this.props.component.key, groupName: group, - permission + permission, }) .then(this.stopLoading, () => { if (this.mounted) { this.setState({ loading: false, - groups: this.addPermissionToGroup(group, permission) + groups: this.addPermissionToGroup(group, permission), }); } }); @@ -270,19 +270,19 @@ export class App extends React.PureComponent { if (this.mounted) { this.setState({ loading: true, - users: this.removePermissionFromUser(user, permission) + users: this.removePermissionFromUser(user, permission), }); return api .revokePermissionFromUser({ projectKey: this.props.component.key, login: user, - permission + permission, }) .then(this.stopLoading, () => { if (this.mounted) { this.setState({ loading: false, - users: this.addPermissionToUser(user, permission) + users: this.addPermissionToUser(user, permission), }); } }); @@ -306,7 +306,7 @@ export class App extends React.PureComponent { }, () => { this.props.onComponentChange({ - visibility: 'private' + visibility: 'private', }); } ); @@ -320,7 +320,7 @@ export class App extends React.PureComponent { }, () => { this.props.onComponentChange({ - visibility: 'public' + visibility: 'public', }); } ); diff --git a/server/sonar-web/src/main/js/apps/permissions/project/components/ApplyTemplate.tsx b/server/sonar-web/src/main/js/apps/permissions/project/components/ApplyTemplate.tsx index 9ae8fb49949..ceb50e65967 100644 --- a/server/sonar-web/src/main/js/apps/permissions/project/components/ApplyTemplate.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/project/components/ApplyTemplate.tsx @@ -74,7 +74,7 @@ export default class ApplyTemplate extends React.PureComponent { if (this.state.permissionTemplate) { return applyTemplateToProject({ projectKey: this.props.project.key, - templateId: this.state.permissionTemplate + templateId: this.state.permissionTemplate, }).then(() => { if (this.mounted) { if (this.props.onApply) { @@ -99,9 +99,9 @@ export default class ApplyTemplate extends React.PureComponent { ); const options = this.state.permissionTemplates - ? this.state.permissionTemplates.map(permissionTemplate => ({ + ? this.state.permissionTemplates.map((permissionTemplate) => ({ label: permissionTemplate.name, - value: permissionTemplate.id + value: permissionTemplate.id, })) : []; @@ -110,7 +110,8 @@ export default class ApplyTemplate extends React.PureComponent { header={header} onClose={this.props.onClose} onSubmit={this.handleSubmit} - size="small"> + size="small" + > {({ onCloseClick, onFormSubmit, submitting }) => (
      @@ -139,7 +140,7 @@ export default class ApplyTemplate extends React.PureComponent { inputId="project-permissions-template-input" onChange={this.handlePermissionTemplateChange} options={options} - value={options.filter(o => o.value === this.state.permissionTemplate)} + value={options.filter((o) => o.value === this.state.permissionTemplate)} /> )}
      diff --git a/server/sonar-web/src/main/js/apps/permissions/project/components/PublicProjectDisclaimer.tsx b/server/sonar-web/src/main/js/apps/permissions/project/components/PublicProjectDisclaimer.tsx index 032d81dc936..3b198a33e62 100644 --- a/server/sonar-web/src/main/js/apps/permissions/project/components/PublicProjectDisclaimer.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/project/components/PublicProjectDisclaimer.tsx @@ -38,7 +38,8 @@ export default function PublicProjectDisclaimer({ component, onClose, onConfirm confirmButtonText={translate('projects_role.turn_project_to_public', qualifier)} header={translateWithParameters('projects_role.turn_x_to_public', component.name)} onClose={onClose} - onConfirm={onConfirm}> + onConfirm={onConfirm} + > {translate('projects_role.are_you_sure_to_turn_project_to_public.warning', qualifier)} diff --git a/server/sonar-web/src/main/js/apps/permissions/project/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/permissions/project/components/__tests__/App-test.tsx index de0d08d4d63..21592eca11f 100644 --- a/server/sonar-web/src/main/js/apps/permissions/project/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/project/components/__tests__/App-test.tsx @@ -23,7 +23,7 @@ import { grantPermissionToGroup, grantPermissionToUser, revokePermissionFromGroup, - revokePermissionFromUser + revokePermissionFromUser, } from '../../../../../api/permissions'; import { mockComponent } from '../../../../../helpers/mocks/component'; import { waitAndUpdate } from '../../../../../helpers/testUtils'; @@ -34,8 +34,8 @@ jest.mock('../../../../../api/permissions', () => ({ paging: { pageIndex: 1, pageSize: 100, total: 2 }, groups: [ { name: 'Anyone', permissions: ['admin', 'codeviewer', 'issueadmin'] }, - { id: '1', name: 'SonarSource', description: 'SonarSource team', permissions: [] } - ] + { id: '1', name: 'SonarSource', description: 'SonarSource team', permissions: [] }, + ], }), getPermissionsUsersForComponent: jest.fn().mockResolvedValue({ paging: { pageIndex: 1, pageSize: 100, total: 3 }, @@ -45,28 +45,28 @@ jest.mock('../../../../../api/permissions', () => ({ email: 'admin@gmail.com', login: 'admin', name: 'Admin Admin', - permissions: ['admin'] + permissions: ['admin'], }, { avatar: 'user-avatar-1', email: 'user1@gmail.com', login: 'user1', name: 'User Number 1', - permissions: [] + permissions: [], }, { avatar: 'user-avatar-2', email: 'user2@gmail.com', login: 'user2', name: 'User Number 2', - permissions: [] - } - ] + permissions: [], + }, + ], }), grantPermissionToGroup: jest.fn().mockResolvedValue({}), grantPermissionToUser: jest.fn().mockResolvedValue({}), revokePermissionFromGroup: jest.fn().mockResolvedValue({}), - revokePermissionFromUser: jest.fn().mockResolvedValue({}) + revokePermissionFromUser: jest.fn().mockResolvedValue({}), })); beforeEach(() => { @@ -98,7 +98,7 @@ describe('should manage state correctly', () => { const apiPayload = { projectKey: 'my-project', groupName: 'Anyone', - permission: 'foo' + permission: 'foo', }; instance.grantPermissionToGroup('Anyone', 'foo'); @@ -131,7 +131,7 @@ describe('should manage state correctly', () => { const apiPayload = { projectKey: 'my-project', login: 'user1', - permission: 'foo' + permission: 'foo', }; instance.grantPermissionToUser('user1', 'foo'); diff --git a/server/sonar-web/src/main/js/apps/permissions/project/components/__tests__/ApplyTemplate-test.tsx b/server/sonar-web/src/main/js/apps/permissions/project/components/__tests__/ApplyTemplate-test.tsx index 65edfd756ba..927c87b95c5 100644 --- a/server/sonar-web/src/main/js/apps/permissions/project/components/__tests__/ApplyTemplate-test.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/project/components/__tests__/ApplyTemplate-test.tsx @@ -31,16 +31,16 @@ jest.mock('../../../../../api/permissions', () => ({ createdAt: '2015-11-27T15:20:32+0100', permissions: [ { key: 'admin', usersCount: 0, groupsCount: 3 }, - { key: 'codeviewer', usersCount: 0, groupsCount: 6 } - ] - } + { key: 'codeviewer', usersCount: 0, groupsCount: 6 }, + ], + }, ], defaultTemplates: [{ templateId: 'tmp1', qualifier: 'TRK' }], permissions: [ { key: 'admin', name: 'Administer', description: 'Administer access' }, - { key: 'codeviewer', name: 'See Source Code', description: 'View code' } - ] - }) + { key: 'codeviewer', name: 'See Source Code', description: 'View code' }, + ], + }), })); it('render correctly', async () => { diff --git a/server/sonar-web/src/main/js/apps/permissions/shared/components/GroupHolder.tsx b/server/sonar-web/src/main/js/apps/permissions/shared/components/GroupHolder.tsx index 9e1c085abe9..0203577dab6 100644 --- a/server/sonar-web/src/main/js/apps/permissions/shared/components/GroupHolder.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/shared/components/GroupHolder.tsx @@ -49,13 +49,13 @@ export default class GroupHolder extends React.PureComponent { stopLoading = (permission: string) => { if (this.mounted) { - this.setState(state => ({ loading: without(state.loading, permission) })); + this.setState((state) => ({ loading: without(state.loading, permission) })); } }; handleCheck = (_checked: boolean, permission?: string) => { if (permission !== undefined) { - this.setState(state => ({ loading: [...state.loading, permission] })); + this.setState((state) => ({ loading: [...state.loading, permission] })); this.props.onToggle(this.props.group, permission).then( () => this.stopLoading(permission), () => this.stopLoading(permission) @@ -81,7 +81,7 @@ export default class GroupHolder extends React.PureComponent { - {this.props.permissions.map(permission => ( + {this.props.permissions.map((permission) => ( { handleGroupToggle = (group: PermissionGroup, permission: string) => { const key = group.id || group.name; if (this.state.initialPermissionsCount[key] === undefined) { - this.setState(state => ({ + this.setState((state) => ({ initialPermissionsCount: { ...state.initialPermissionsCount, - [key]: group.permissions.length - } + [key]: group.permissions.length, + }, })); } return this.props.onToggleGroup(group, permission); @@ -75,11 +75,11 @@ export default class HoldersList extends React.PureComponent { handleUserToggle = (user: PermissionUser, permission: string) => { if (this.state.initialPermissionsCount[user.login] === undefined) { - this.setState(state => ({ + this.setState((state) => ({ initialPermissionsCount: { ...state.initialPermissionsCount, - [user.login]: user.permissions.length - } + [user.login]: user.permissions.length, + }, })); } return this.props.onToggleUser(user, permission); @@ -123,13 +123,13 @@ export default class HoldersList extends React.PureComponent { render() { const { permissions } = this.props; - const items = sortBy([...this.props.users, ...this.props.groups], item => { + const items = sortBy([...this.props.users, ...this.props.groups], (item) => { if (this.isPermissionUser(item) && item.login === '') { return 0; } return item.name; }); - const [itemWithPermissions, itemWithoutPermissions] = partition(items, item => + const [itemWithPermissions, itemWithoutPermissions] = partition(items, (item) => this.getItemInitialPermissionsCount(item) ); return ( @@ -138,7 +138,7 @@ export default class HoldersList extends React.PureComponent {
      {this.props.children}
      diff --git a/server/sonar-web/src/main/js/apps/permissions/shared/components/PermissionCell.tsx b/server/sonar-web/src/main/js/apps/permissions/shared/components/PermissionCell.tsx index 81efb3ab9e4..af56a283964 100644 --- a/server/sonar-web/src/main/js/apps/permissions/shared/components/PermissionCell.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/shared/components/PermissionCell.tsx @@ -24,7 +24,7 @@ import { PermissionDefinition, PermissionDefinitionGroup, PermissionGroup, - PermissionUser + PermissionUser, } from '../../../../types/types'; import { isPermissionDefinitionGroup } from '../../utils'; @@ -42,13 +42,14 @@ export default class PermissionCell extends React.PureComponent { if (isPermissionDefinitionGroup(permission)) { return ( - {permission.permissions.map(permission => ( + {permission.permissions.map((permission) => (
      + onCheck={onCheck} + > {permission.name}
      @@ -59,8 +60,9 @@ export default class PermissionCell extends React.PureComponent { return ( + selected: permission.key === selectedPermission, + })} + > { const { permission } = this.props; if (isPermissionDefinitionGroup(permission)) { - return permission.permissions.map(permission => ( + return permission.permissions.map((permission) => ( {permission.name}: @@ -81,7 +81,8 @@ export default class PermissionHeader extends React.PureComponent { overlay={translateWithParameters( 'global_permissions.filter_by_x_permission', permission.name - )}> + )} + > {permission.name} @@ -95,8 +96,9 @@ export default class PermissionHeader extends React.PureComponent { className={classNames('permission-column text-center text-middle', { selected: !isPermissionDefinitionGroup(permission) && - permission.key === this.props.selectedPermission - })}> + permission.key === this.props.selectedPermission, + })} + >
      {name} diff --git a/server/sonar-web/src/main/js/apps/permissions/shared/components/SearchForm.tsx b/server/sonar-web/src/main/js/apps/permissions/shared/components/SearchForm.tsx index 05473328be1..e46ed4a4cb6 100644 --- a/server/sonar-web/src/main/js/apps/permissions/shared/components/SearchForm.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/shared/components/SearchForm.tsx @@ -33,7 +33,7 @@ export default function SearchForm(props: Props) { const filterOptions = [ { value: 'all', label: translate('all') }, { value: 'users', label: translate('users.page') }, - { value: 'groups', label: translate('user_groups.page') } + { value: 'groups', label: translate('user_groups.page') }, ]; return ( diff --git a/server/sonar-web/src/main/js/apps/permissions/shared/components/UserHolder.tsx b/server/sonar-web/src/main/js/apps/permissions/shared/components/UserHolder.tsx index d92b6d8ecf1..300ad69ead5 100644 --- a/server/sonar-web/src/main/js/apps/permissions/shared/components/UserHolder.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/shared/components/UserHolder.tsx @@ -50,13 +50,13 @@ export default class UserHolder extends React.PureComponent { stopLoading = (permission: string) => { if (this.mounted) { - this.setState(state => ({ loading: without(state.loading, permission) })); + this.setState((state) => ({ loading: without(state.loading, permission) })); } }; handleCheck = (_checked: boolean, permission?: string) => { if (permission !== undefined) { - this.setState(state => ({ loading: [...state.loading, permission] })); + this.setState((state) => ({ loading: [...state.loading, permission] })); this.props.onToggle(this.props.user, permission).then( () => this.stopLoading(permission), () => this.stopLoading(permission) @@ -66,7 +66,7 @@ export default class UserHolder extends React.PureComponent { render() { const { user } = this.props; - const permissionCells = this.props.permissions.map(permission => ( + const permissionCells = this.props.permissions.map((permission) => ( = {}) { category: 'admin', permissions: [ { key: 'foo', name: 'Foo', description: '' }, - { key: 'bar', name: 'Bar', description: '' } - ] + { key: 'bar', name: 'Bar', description: '' }, + ], }, - { key: 'baz', name: 'Baz', description: '' } + { key: 'baz', name: 'Baz', description: '' }, ]} selectedPermission="bar" {...props} diff --git a/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/HoldersList-test.tsx b/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/HoldersList-test.tsx index 4cd1ce4abfb..a9f6538c553 100644 --- a/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/HoldersList-test.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/HoldersList-test.tsx @@ -27,21 +27,21 @@ const permissions = [ category: 'admin', permissions: [ { key: 'bar', name: 'Bar', description: '' }, - { key: 'baz', name: 'Baz', description: '' } - ] - } + { key: 'baz', name: 'Baz', description: '' }, + ], + }, ]; const groups = [ { id: 'foobar', name: 'Foobar', permissions: ['bar'] }, { id: 'barbaz', name: 'Barbaz', permissions: ['bar'] }, - { id: 'abc', name: 'abc', permissions: [] } + { id: 'abc', name: 'abc', permissions: [] }, ]; const users = [ { login: 'foobar', name: 'Foobar', permissions: ['bar'] }, { login: 'barbaz', name: 'Barbaz', permissions: ['bar'] }, - { login: 'bcd', name: 'bcd', permissions: [] } + { login: 'bcd', name: 'bcd', permissions: [] }, ]; const elementsContainer = ( diff --git a/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/PermissionCell-test.tsx b/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/PermissionCell-test.tsx index 7e99f3b2310..28cadbd40f2 100644 --- a/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/PermissionCell-test.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/PermissionCell-test.tsx @@ -24,7 +24,7 @@ import PermissionCell from '../PermissionCell'; const permissionItem = { id: 'foobar', name: 'Foobar', - permissions: ['bar'] + permissions: ['bar'], }; const permission = { key: 'baz', name: 'Baz', description: '' }; @@ -32,8 +32,8 @@ const permissionGroup = { category: 'admin', permissions: [ { key: 'foo', name: 'Foo', description: '' }, - { key: 'bar', name: 'Bar', description: '' } - ] + { key: 'bar', name: 'Bar', description: '' }, + ], }; it('should display unchecked checkbox', () => { expect( diff --git a/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/UserHolder-test.tsx b/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/UserHolder-test.tsx index 44dfc941c18..cca4b7ff392 100644 --- a/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/UserHolder-test.tsx +++ b/server/sonar-web/src/main/js/apps/permissions/shared/components/__tests__/UserHolder-test.tsx @@ -55,10 +55,10 @@ function shallowRender(props: Partial = {}) { category: 'admin', permissions: [ { key: 'foo', name: 'Foo', description: '' }, - { key: 'bar', name: 'Bar', description: '' } - ] + { key: 'bar', name: 'Bar', description: '' }, + ], }, - { key: 'baz', name: 'Baz', description: '' } + { key: 'baz', name: 'Baz', description: '' }, ]} selectedPermission="bar" user={mockPermissionUser({ email: 'john.doe@sonarsource.com', name: 'John Doe' })} diff --git a/server/sonar-web/src/main/js/apps/permissions/utils.ts b/server/sonar-web/src/main/js/apps/permissions/utils.ts index 2fe4d741417..0de7dfba51e 100644 --- a/server/sonar-web/src/main/js/apps/permissions/utils.ts +++ b/server/sonar-web/src/main/js/apps/permissions/utils.ts @@ -26,14 +26,14 @@ export const PERMISSIONS_ORDER_FOR_PROJECT_TEMPLATE = [ 'issueadmin', 'securityhotspotadmin', 'admin', - 'scan' + 'scan', ]; export const PERMISSIONS_ORDER_GLOBAL = [ 'admin', { category: 'administer', permissions: ['gateadmin', 'profileadmin'] }, 'scan', - { category: 'creator', permissions: ['provisioning', 'applicationcreator', 'portfoliocreator'] } + { category: 'creator', permissions: ['provisioning', 'applicationcreator', 'portfoliocreator'] }, ]; export const PERMISSIONS_ORDER_FOR_VIEW = ['user', 'admin']; @@ -45,7 +45,7 @@ export const PERMISSIONS_ORDER_BY_QUALIFIER: Dict = { VW: PERMISSIONS_ORDER_FOR_VIEW, SVW: PERMISSIONS_ORDER_FOR_VIEW, APP: PERMISSIONS_ORDER_FOR_VIEW, - DEV: PERMISSIONS_ORDER_FOR_DEV + DEV: PERMISSIONS_ORDER_FOR_DEV, }; function convertToPermissionDefinition(permission: string, l10nPrefix: string) { @@ -55,7 +55,7 @@ function convertToPermissionDefinition(permission: string, l10nPrefix: string) { return { key: permission, name, - description + description, }; } @@ -64,17 +64,17 @@ export function filterPermissions( hasApplicationsEnabled: boolean, hasPortfoliosEnabled: boolean ) { - return permissions.map(permission => { + return permissions.map((permission) => { if (typeof permission === 'object' && permission.category === 'creator') { return { ...permission, - permissions: permission.permissions.filter(p => { + permissions: permission.permissions.filter((p) => { return ( p === 'provisioning' || (p === 'portfoliocreator' && hasPortfoliosEnabled) || (p === 'applicationcreator' && hasApplicationsEnabled) ); - }) + }), }; } return permission; @@ -85,13 +85,13 @@ export function convertToPermissionDefinitions( permissions: Array, l10nPrefix: string ): Array { - return permissions.map(permission => { + return permissions.map((permission) => { if (typeof permission === 'object') { return { category: permission.category, - permissions: permission.permissions.map(permission => + permissions: permission.permissions.map((permission) => convertToPermissionDefinition(permission, l10nPrefix) - ) + ), }; } return convertToPermissionDefinition(permission, l10nPrefix); diff --git a/server/sonar-web/src/main/js/apps/projectActivity/__tests__/actions-test.ts b/server/sonar-web/src/main/js/apps/projectActivity/__tests__/actions-test.ts index f25bb180e95..7f16ddc7d5a 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/__tests__/actions-test.ts +++ b/server/sonar-web/src/main/js/apps/projectActivity/__tests__/actions-test.ts @@ -29,14 +29,14 @@ const ANALYSES = [ { key: 'E1', category: 'VERSION', - name: '6.5-SNAPSHOT' - } - ] + name: '6.5-SNAPSHOT', + }, + ], }, { key: 'A2', date: parseDate('2016-10-27T12:21:15+0200'), - events: [] + events: [], }, { key: 'A3', @@ -45,21 +45,21 @@ const ANALYSES = [ { key: 'E2', category: 'OTHER', - name: 'foo' + name: 'foo', }, { key: 'E3', category: 'OTHER', - name: 'foo' - } - ] - } + name: 'foo', + }, + ], + }, ]; const newEvent = { key: 'Enew', name: 'Foo', - category: 'Custom' + category: 'Custom', }; const emptyState = { @@ -70,7 +70,7 @@ const emptyState = { measuresHistory: [], measures: [], metrics: [], - query: { category: '', graph: DEFAULT_GRAPH, project: '', customMetrics: [] } + query: { category: '', graph: DEFAULT_GRAPH, project: '', customMetrics: [] }, }; const state = { ...emptyState, analyses: ANALYSES }; diff --git a/server/sonar-web/src/main/js/apps/projectActivity/__tests__/utils-test.ts b/server/sonar-web/src/main/js/apps/projectActivity/__tests__/utils-test.ts index 14dcde23d9b..8c4787fe9ab 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/__tests__/utils-test.ts +++ b/server/sonar-web/src/main/js/apps/projectActivity/__tests__/utils-test.ts @@ -26,11 +26,11 @@ jest.mock('date-fns', () => { const actual = jest.requireActual('date-fns'); return { ...actual, - startOfDay: jest.fn(date => { + startOfDay: jest.fn((date) => { const startDay = new Date(date); startDay.setUTCHours(0, 0, 0, 0); return startDay; - }) + }), }; }); @@ -38,13 +38,13 @@ const ANALYSES = [ { key: 'AVyMjlK1HjR_PLDzRbB9', date: dates.parseDate('2017-06-09T13:06:10.000Z'), - events: [{ key: 'AVyM9oI1HjR_PLDzRciU', category: 'VERSION', name: '1.1-SNAPSHOT' }] + events: [{ key: 'AVyM9oI1HjR_PLDzRciU', category: 'VERSION', name: '1.1-SNAPSHOT' }], }, { key: 'AVyM9n3cHjR_PLDzRciT', date: dates.parseDate('2017-06-09T11:12:27.000Z'), events: [] }, { key: 'AVyMjlK1HjR_PLDzRbB9', date: dates.parseDate('2017-06-09T11:12:27.000Z'), - events: [{ key: 'AVyM9oI1HjR_PLDzRciU', category: 'VERSION', name: '1.1' }] + events: [{ key: 'AVyM9oI1HjR_PLDzRciU', category: 'VERSION', name: '1.1' }], }, { key: 'AVxZtCpH7841nF4RNEMI', @@ -53,9 +53,9 @@ const ANALYSES = [ { key: 'AVxZtC-N7841nF4RNEMJ', category: 'QUALITY_PROFILE', - name: 'Changes in "Default - SonarSource conventions" (Java)' - } - ] + name: 'Changes in "Default - SonarSource conventions" (Java)', + }, + ], }, { key: 'AVwaa1qkpbBde8B6UhYI', date: dates.parseDate('2017-05-18T07:17:32.000Z'), events: [] }, { @@ -66,11 +66,11 @@ const ANALYSES = [ { key: 'AVwQF7zXl-nNFgFWOJ3W', category: 'QUALITY_PROFILE', - name: 'Changes in "Default - SonarSource conventions" (Java)' - } - ] + name: 'Changes in "Default - SonarSource conventions" (Java)', + }, + ], }, - { key: 'AVvtGF3IY6vCuQNDdwxI', date: dates.parseDate('2017-05-09T12:03:59.000Z'), events: [] } + { key: 'AVvtGF3IY6vCuQNDdwxI', date: dates.parseDate('2017-05-09T12:03:59.000Z'), events: [] }, ]; const QUERY = { @@ -80,21 +80,21 @@ const QUERY = { project: 'foo', to: undefined, selectedDate: undefined, - customMetrics: ['foo', 'bar', 'baz'] + customMetrics: ['foo', 'bar', 'baz'], }; describe('getAnalysesByVersionByDay', () => { it('should correctly map analysis by versions and by days', () => { expect( utils.getAnalysesByVersionByDay(ANALYSES, { - category: '' + category: '', }) ).toMatchSnapshot(); }); it('should also filter analysis based on the query', () => { expect( utils.getAnalysesByVersionByDay(ANALYSES, { - category: 'QUALITY_PROFILE' + category: 'QUALITY_PROFILE', }) ).toMatchSnapshot(); expect( @@ -102,7 +102,7 @@ describe('getAnalysesByVersionByDay', () => { category: '', to: dates.parseDate('2017-06-09T11:12:27.000Z'), - from: dates.parseDate('2017-05-18T14:13:07.000Z') + from: dates.parseDate('2017-05-18T14:13:07.000Z'), }) ).toMatchSnapshot(); }); @@ -113,26 +113,26 @@ describe('getAnalysesByVersionByDay', () => { { key: 'AVyMjlK1HjR_PLDzRbB9', date: dates.parseDate('2017-06-09T13:06:10.000Z'), - events: [] + events: [], }, { key: 'AVyM9n3cHjR_PLDzRciT', date: dates.parseDate('2017-06-09T11:12:27.000Z'), - events: [] + events: [], }, { key: 'AVyMjlK1HjR_PLDzRbB9', date: dates.parseDate('2017-06-09T11:12:27.000Z'), - events: [] + events: [], }, { key: 'AVxZtCpH7841nF4RNEMI', date: dates.parseDate('2017-05-18T14:13:07.000Z'), - events: [] - } + events: [], + }, ], { - category: '' + category: '', } ) ).toMatchSnapshot(); @@ -145,7 +145,7 @@ describe('parseQuery', () => { utils.parseQuery({ from: '2017-04-27T08:21:32.000Z', custom_metrics: 'foo,bar,baz', - id: 'foo' + id: 'foo', }) ).toEqual(QUERY); }); @@ -155,13 +155,13 @@ describe('serializeQuery', () => { it('should serialize query for api request', () => { expect(utils.serializeQuery(QUERY)).toEqual({ from: '2017-04-27T08:21:32+0000', - project: 'foo' + project: 'foo', }); expect(utils.serializeQuery({ ...QUERY, graph: GraphType.coverage, category: 'test' })).toEqual( { from: '2017-04-27T08:21:32+0000', project: 'foo', - category: 'test' + category: 'test', } ); }); @@ -172,20 +172,20 @@ describe('serializeUrlQuery', () => { expect(utils.serializeUrlQuery(QUERY)).toEqual({ from: '2017-04-27T08:21:32+0000', id: 'foo', - custom_metrics: 'foo,bar,baz' + custom_metrics: 'foo,bar,baz', }); expect( utils.serializeUrlQuery({ ...QUERY, graph: GraphType.coverage, category: 'test', - customMetrics: [] + customMetrics: [], }) ).toEqual({ from: '2017-04-27T08:21:32+0000', id: 'foo', graph: GraphType.coverage, - category: 'test' + category: 'test', }); }); }); diff --git a/server/sonar-web/src/main/js/apps/projectActivity/actions.ts b/server/sonar-web/src/main/js/apps/projectActivity/actions.ts index 52b46181dfc..a2e9fa1d5d6 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/actions.ts +++ b/server/sonar-web/src/main/js/apps/projectActivity/actions.ts @@ -22,42 +22,42 @@ import { State } from './components/ProjectActivityApp'; export function addCustomEvent(analysis: string, event: AnalysisEvent) { return (state: State) => ({ - analyses: state.analyses.map(item => { + analyses: state.analyses.map((item) => { if (item.key !== analysis) { return item; } return { ...item, events: [...item.events, event] }; - }) + }), }); } export function deleteEvent(analysis: string, event: string) { return (state: State) => ({ - analyses: state.analyses.map(item => { + analyses: state.analyses.map((item) => { if (item.key !== analysis) { return item; } - return { ...item, events: item.events.filter(eventItem => eventItem.key !== event) }; - }) + return { ...item, events: item.events.filter((eventItem) => eventItem.key !== event) }; + }), }); } export function changeEvent(analysis: string, event: AnalysisEvent) { return (state: State) => ({ - analyses: state.analyses.map(item => { + analyses: state.analyses.map((item) => { if (item.key !== analysis) { return item; } return { ...item, - events: item.events.map(eventItem => + events: item.events.map((eventItem) => eventItem.key === event.key ? { ...eventItem, ...event } : eventItem - ) + ), }; - }) + }), }); } export function deleteAnalysis(analysis: string) { - return (state: State) => ({ analyses: state.analyses.filter(item => item.key !== analysis) }); + return (state: State) => ({ analyses: state.analyses.filter((item) => item.key !== analysis) }); } diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/Events.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/Events.tsx index df33ccca603..e98e2735e64 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/Events.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/Events.tsx @@ -37,14 +37,14 @@ export function Events(props: EventsProps) { const sortedEvents = sortBy( events, // versions last - event => (event.category === 'VERSION' ? 1 : 0), + (event) => (event.category === 'VERSION' ? 1 : 0), // then the rest sorted by category 'category' ); return (
      - {sortedEvents.map(event => ( + {sortedEvents.map((event) => ( (this.scrollContainer = element)} + ref={(element) => (this.scrollContainer = element)} style={{ - paddingTop: this.props.project.qualifier === ComponentQualifier.Project ? 52 : undefined - }}> + paddingTop: this.props.project.qualifier === ComponentQualifier.Project ? 52 : undefined, + }} + > {byVersionByDay.map((version, idx) => { const days = Object.keys(version.byDay); if (days.length <= 0) { @@ -198,23 +199,25 @@ export default class ProjectActivityAnalysesList extends React.PureComponent + overlay={`${translate('version')} ${version.version}`} + >

      {version.version}

      )}
        - {days.map(day => ( + {days.map((day) => (
      • + key={day} + >

          {version.byDay[day] != null && - version.byDay[day].map(analysis => this.renderAnalysis(analysis))} + version.byDay[day].map((analysis) => this.renderAnalysis(analysis))}
      • ))} diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityAnalysis.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityAnalysis.tsx index a38c2459ba2..6623306495a 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityAnalysis.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityAnalysis.tsx @@ -21,7 +21,7 @@ import classNames from 'classnames'; import * as React from 'react'; import ActionsDropdown, { ActionsDropdownDivider, - ActionsDropdownItem + ActionsDropdownItem, } from '../../../components/controls/ActionsDropdown'; import ClickEventBoundary from '../../../components/controls/ClickEventBoundary'; import HelpTooltip from '../../../components/controls/HelpTooltip'; @@ -62,7 +62,7 @@ export function ProjectActivityAnalysis(props: ProjectActivityAnalysisProps) { canAdmin, canCreateVersion, parentScrollContainer, - selected + selected, } = props; React.useEffect(() => { @@ -72,7 +72,7 @@ export function ProjectActivityAnalysis(props: ProjectActivityAnalysisProps) { bottomOffset: height + 20, topOffset: 60, parent: parentScrollContainer, - smooth: false + smooth: false, }); } }); @@ -82,7 +82,7 @@ export function ProjectActivityAnalysis(props: ProjectActivityAnalysisProps) { const [removeAnalysisForm, setRemoveAnalysisForm] = React.useState(false); const parsedDate = parseDate(analysis.date); - const hasVersion = analysis.events.find(event => event.category === 'VERSION') != null; + const hasVersion = analysis.events.find((event) => event.category === 'VERSION') != null; const canAddVersion = canAdmin && !hasVersion && canCreateVersion; const canAddEvent = canAdmin; @@ -92,14 +92,15 @@ export function ProjectActivityAnalysis(props: ProjectActivityAnalysisProps) { return (
      • props.updateSelectedDate(analysis.date)} - ref={ref => (node = ref)}> + ref={(ref) => (node = ref)} + >
        - {formattedTime => ( + {(formattedTime) => ( @@ -122,18 +123,21 @@ export function ProjectActivityAnalysis(props: ProjectActivityAnalysisProps) { + toggleClassName="js-analysis-actions" + > {canAddVersion && ( setAddVersionForm(true)}> + onClick={() => setAddVersionForm(true)} + > {translate('project_activity.add_version')} )} {canAddEvent && ( setAddEventForm(true)}> + onClick={() => setAddEventForm(true)} + > {translate('project_activity.add_custom_event')} )} @@ -142,7 +146,8 @@ export function ProjectActivityAnalysis(props: ProjectActivityAnalysisProps) { setRemoveAnalysisForm(true)}> + onClick={() => setRemoveAnalysisForm(true)} + > {translate('project_activity.delete_analysis')} )} diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityApp.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityApp.tsx index 9d92b92c38a..c442f116bc8 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityApp.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityApp.tsx @@ -26,7 +26,7 @@ import { deleteAnalysis, deleteEvent, getProjectActivity, - ProjectActivityStatuses + ProjectActivityStatuses, } from '../../../api/projectActivity'; import { getAllTimeMachineData } from '../../../api/time-machine'; import withComponentContext from '../../../app/components/componentContext/withComponentContext'; @@ -34,7 +34,7 @@ import { DEFAULT_GRAPH, getActivityGraph, getHistoryMetrics, - isCustomGraph + isCustomGraph, } from '../../../components/activity-graph/utils'; import { Location, Router, withRouter } from '../../../components/hoc/withRouter'; import { getBranchLikeQuery } from '../../../helpers/branch-like'; @@ -50,7 +50,7 @@ import { parseQuery, Query, serializeQuery, - serializeUrlQuery + serializeUrlQuery, } from '../utils'; import ProjectActivityAppRenderer from './ProjectActivityAppRenderer'; @@ -88,7 +88,7 @@ export class ProjectActivityApp extends React.PureComponent { initialized: false, measuresHistory: [], metrics: [], - query: parseQuery(props.location.query) + query: parseQuery(props.location.query), }; } @@ -168,14 +168,14 @@ export class ProjectActivityApp extends React.PureComponent { statuses: serializeStringArray(statuses), p, ps, - ...getBranchLikeQuery(this.props.branchLike) + ...getBranchLikeQuery(this.props.branchLike), }; return getProjectActivity({ ...additional, ...parameters }).then(({ analyses, paging }) => ({ - analyses: analyses.map(analysis => ({ + analyses: analyses.map((analysis) => ({ ...analysis, - date: parseDate(analysis.date) + date: parseDate(analysis.date), })) as ParsedAnalysis[], - paging + paging, })); }; @@ -186,14 +186,14 @@ export class ProjectActivityApp extends React.PureComponent { return getAllTimeMachineData({ component: this.props.component.key, metrics: metrics.join(), - ...getBranchLikeQuery(this.props.branchLike) + ...getBranchLikeQuery(this.props.branchLike), }).then(({ measures }) => - measures.map(measure => ({ + measures.map((measure) => ({ metric: measure.metric, - history: measure.history.map(analysis => ({ + history: measure.history.map((analysis) => ({ date: parseDate(analysis.date), - value: analysis.value - })) + value: analysis.value, + })), })) ); }; @@ -205,7 +205,7 @@ export class ProjectActivityApp extends React.PureComponent { if (this.mounted) { this.setState({ analyses, - analysesLoading: false + analysesLoading: false, }); } }, @@ -232,17 +232,17 @@ export class ProjectActivityApp extends React.PureComponent { project, [ ProjectActivityStatuses.STATUS_PROCESSED, - ProjectActivityStatuses.STATUS_LIVE_MEASURE_COMPUTE + ProjectActivityStatuses.STATUS_LIVE_MEASURE_COMPUTE, ], nextPage, ACTIVITY_PAGE_SIZE - ).then(result => { + ).then((result) => { if (!prevResult) { return this.loadAllActivities(project, result); } return this.loadAllActivities(project, { analyses: prevResult.analyses.concat(result.analyses), - paging: result.paging + paging: result.paging, }); }); }; @@ -260,8 +260,8 @@ export class ProjectActivityApp extends React.PureComponent { filterMetrics({ qualifier }: Component, metrics: Metric[]) { return ['VW', 'SVW'].includes(qualifier) - ? metrics.filter(metric => metric.key !== MetricKey.security_hotspots_reviewed) - : metrics.filter(metric => metric.key !== MetricKey.security_review_rating); + ? metrics.filter((metric) => metric.key !== MetricKey.security_hotspots_reviewed) + : metrics.filter((metric) => metric.key !== MetricKey.security_review_rating); } firstLoadData(query: Query, component: Component) { @@ -272,14 +272,14 @@ export class ProjectActivityApp extends React.PureComponent { topLevelComponent, [ ProjectActivityStatuses.STATUS_PROCESSED, - ProjectActivityStatuses.STATUS_LIVE_MEASURE_COMPUTE + ProjectActivityStatuses.STATUS_LIVE_MEASURE_COMPUTE, ], 1, ACTIVITY_PAGE_SIZE_FIRST_BATCH, serializeQuery(query) ), getAllMetrics(), - this.fetchMeasuresHistory(graphMetrics) + this.fetchMeasuresHistory(graphMetrics), ]).then( ([{ analyses }, metrics, measuresHistory]) => { if (this.mounted) { @@ -288,7 +288,7 @@ export class ProjectActivityApp extends React.PureComponent { graphLoading: false, initialized: true, measuresHistory, - metrics: this.filterMetrics(component, metrics) + metrics: this.filterMetrics(component, metrics), }); this.fetchAllActivities(topLevelComponent); @@ -306,7 +306,7 @@ export class ProjectActivityApp extends React.PureComponent { const graphMetrics = getHistoryMetrics(graph, customMetrics); this.setState({ graphLoading: true }); this.fetchMeasuresHistory(graphMetrics).then( - measuresHistory => { + (measuresHistory) => { if (this.mounted) { this.setState({ graphLoading: false, measuresHistory }); } @@ -322,15 +322,15 @@ export class ProjectActivityApp extends React.PureComponent { updateQuery = (newQuery: Query) => { const query = serializeUrlQuery({ ...this.state.query, - ...newQuery + ...newQuery, }); this.props.router.push({ pathname: this.props.location.pathname, query: { ...query, ...getBranchLikeQuery(this.props.branchLike), - id: this.props.component.key - } + id: this.props.component.key, + }, }); }; diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityDateInput.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityDateInput.tsx index 03fa34586d9..3fa7bbb5fae 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityDateInput.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityDateInput.tsx @@ -48,7 +48,8 @@ export default class ProjectActivityDateInput extends React.PureComponent
        diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityGraphs.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityGraphs.tsx index ed7fa1f675c..aa36ab59749 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityGraphs.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityGraphs.tsx @@ -29,14 +29,14 @@ import { getSeriesMetricType, isCustomGraph, saveActivityGraph, - splitSeriesInGraphs + splitSeriesInGraphs, } from '../../../components/activity-graph/utils'; import { GraphType, MeasureHistory, ParsedAnalysis, Point, - Serie + Serie, } from '../../../types/project-activity'; import { Metric } from '../../../types/types'; import { datesQueryChanged, historyQueryChanged, Query } from '../utils'; @@ -75,7 +75,7 @@ export default class ProjectActivityGraphs extends React.PureComponent { const newDates = { from: props.query.from || undefined, - to: props.query.to || undefined + to: props.query.to || undefined, }; if (!prevProps || datesQueryChanged(prevProps.query, props.query)) { return { graphEndDate: newDates.to, graphStartDate: newDates.from }; @@ -124,16 +124,16 @@ export default class ProjectActivityGraphs extends React.PureComponent serie.data.find(p => Boolean(p.y || p.y === 0))), + newSeries.map((serie) => serie.data.find((p) => Boolean(p.y || p.y === 0))), 'x' ); const lastValid = maxBy( - newSeries.map(serie => findLast(serie.data, p => Boolean(p.y || p.y === 0))!), + newSeries.map((serie) => findLast(serie.data, (p) => Boolean(p.y || p.y === 0))!), 'x' ); return { graphEndDate: lastValid && lastValid.x, - graphStartDate: firstValid && firstValid.x + graphStartDate: firstValid && firstValid.x, }; } return null; @@ -144,8 +144,8 @@ export default class ProjectActivityGraphs extends React.PureComponent graph.length < MAX_SERIES_PER_GRAPH) - .map(graph => graph[0].type); + .filter((graph) => graph.length < MAX_SERIES_PER_GRAPH) + .map((graph) => graph[0].type); }; addCustomMetric = (metric: string) => { @@ -155,7 +155,9 @@ export default class ProjectActivityGraphs extends React.PureComponent { - const customMetrics = this.props.query.customMetrics.filter(metric => metric !== removedMetric); + const customMetrics = this.props.query.customMetrics.filter( + (metric) => metric !== removedMetric + ); saveActivityGraph(PROJECT_ACTIVITY_GRAPH, this.props.project, GraphType.custom, customMetrics); this.props.updateQuery({ customMetrics }); }; diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityPageFilters.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityPageFilters.tsx index 4e6dd15c6f8..e577cec5c2b 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityPageFilters.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/ProjectActivityPageFilters.tsx @@ -38,9 +38,9 @@ export default function ProjectActivityPageFilters(props: ProjectActivityPageFil const isApp = project.qualifier === ComponentQualifier.Application; const eventTypes = isApp ? APPLICATION_EVENT_TYPES : EVENT_TYPES; - const options = eventTypes.map(category => ({ + const options = eventTypes.map((category) => ({ label: translate('event.category', category), - value: category + value: category, })); const handleCategoryChange = React.useCallback( @@ -66,7 +66,7 @@ export default function ProjectActivityPageFilters(props: ProjectActivityPageFil isSearchable={false} onChange={handleCategoryChange} options={options} - value={options.filter(o => o.value === category)} + value={options.filter((o) => o.value === category)} />
        )} diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/Event-test.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/Event-test.tsx index b70d0efbd6b..e366f3462d6 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/Event-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/Event-test.tsx @@ -36,42 +36,26 @@ it('should correctly allow deletion', () => { shallowRender({ canAdmin: true, event: mockAnalysisEvent({ category: 'VERSION' }), - isFirst: true + isFirst: true, }) .find(DeleteButton) .exists() ).toBe(false); expect( - shallowRender({ canAdmin: true, event: mockAnalysisEvent() }) - .find(DeleteButton) - .exists() + shallowRender({ canAdmin: true, event: mockAnalysisEvent() }).find(DeleteButton).exists() ).toBe(false); - expect( - shallowRender({ canAdmin: true }) - .find(DeleteButton) - .exists() - ).toBe(true); + expect(shallowRender({ canAdmin: true }).find(DeleteButton).exists()).toBe(true); }); it('should correctly allow edition', () => { - expect( - shallowRender({ canAdmin: true }) - .find(EditButton) - .exists() - ).toBe(true); + expect(shallowRender({ canAdmin: true }).find(EditButton).exists()).toBe(true); - expect( - shallowRender({ canAdmin: true, isFirst: true }) - .find(EditButton) - .exists() - ).toBe(true); + expect(shallowRender({ canAdmin: true, isFirst: true }).find(EditButton).exists()).toBe(true); expect( - shallowRender({ canAdmin: true, event: mockAnalysisEvent() }) - .find(EditButton) - .exists() + shallowRender({ canAdmin: true, event: mockAnalysisEvent() }).find(EditButton).exists() ).toBe(false); }); diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/Events-test.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/Events-test.tsx index a581ab44e67..9a5166a380b 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/Events-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/Events-test.tsx @@ -33,7 +33,7 @@ function shallowRender(props: Partial = {}) { events={[ mockAnalysisEvent(), mockAnalysisEvent({ category: 'VERSION' }), - mockAnalysisEvent({ category: 'OTHER' }) + mockAnalysisEvent({ category: 'OTHER' }), ]} onChange={jest.fn()} onDelete={jest.fn()} diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAnalysesList-test.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAnalysesList-test.tsx index 7d0397e728e..f02fe2f2788 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAnalysesList-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAnalysesList-test.tsx @@ -33,7 +33,7 @@ jest.mock('date-fns', () => { const startDay = new Date(date); startDay.setUTCHours(0, 0, 0, 0); return startDay; - } + }, }; }); @@ -48,7 +48,7 @@ const DEFAULT_QUERY = { category: '', customMetrics: [], graph: DEFAULT_GRAPH, - project: 'org.sonarsource.sonarqube:sonarqube' + project: 'org.sonarsource.sonarqube:sonarqube', }; it('should render correctly', () => { @@ -72,8 +72,8 @@ it('should correctly filter analyses by date range', () => { query: { ...DEFAULT_QUERY, from: DATE, - to: DATE - } + to: DATE, + }, }); expect(wrapper).toMatchSnapshot(); }); @@ -107,7 +107,7 @@ function shallowRender(props: Partial = {} mockParsedAnalysis({ key: 'A1', date: DATE, - events: [{ key: 'E1', category: 'VERSION', name: '6.5-SNAPSHOT' }] + events: [{ key: 'E1', category: 'VERSION', name: '6.5-SNAPSHOT' }], }), mockParsedAnalysis({ key: 'A2', date: parseDate('2016-10-27T12:21:15+0000') }), mockParsedAnalysis({ @@ -115,14 +115,14 @@ function shallowRender(props: Partial = {} date: parseDate('2016-10-26T12:17:29+0000'), events: [ { key: 'E2', category: 'VERSION', name: '6.4' }, - { key: 'E3', category: 'OTHER', name: 'foo' } - ] + { key: 'E3', category: 'OTHER', name: 'foo' }, + ], }), mockParsedAnalysis({ key: 'A4', date: parseDate('2016-10-24T16:33:50+0000'), - events: [{ key: 'E1', category: 'QUALITY_GATE', name: 'Quality gate changed to red...' }] - }) + events: [{ key: 'E1', category: 'QUALITY_GATE', name: 'Quality gate changed to red...' }], + }), ]} analysesLoading={false} canAdmin={false} diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAnalysis-test.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAnalysis-test.tsx index 45bdc5c08b6..2d118b8a82f 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAnalysis-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAnalysis-test.tsx @@ -31,12 +31,12 @@ import { ProjectActivityAnalysis, ProjectActivityAnalysisProps } from '../Projec jest.mock('../../../../helpers/dates', () => ({ parseDate: () => ({ valueOf: () => 1546333200000, - toISOString: () => '2019-01-01T09:00:00.000Z' - }) + toISOString: () => '2019-01-01T09:00:00.000Z', + }), })); jest.mock('../../../../helpers/scrolling', () => ({ - scrollToElement: jest.fn() + scrollToElement: jest.fn(), })); it('should render correctly', () => { @@ -52,13 +52,11 @@ it('should render correctly', () => { shallowRender({ canAdmin: true, canCreateVersion: true, - canDeleteAnalyses: true + canDeleteAnalyses: true, }) ).toMatchSnapshot('with admin options'); - const timeFormatter = shallowRender() - .find(TimeFormatter) - .prop('children'); + const timeFormatter = shallowRender().find(TimeFormatter).prop('children'); expect(timeFormatter!('formatted_time')).toMatchSnapshot('formatted time'); }); @@ -66,7 +64,7 @@ it('should show the correct admin options', () => { const wrapper = shallowRender({ canAdmin: true, canCreateVersion: true, - canDeleteAnalyses: true + canDeleteAnalyses: true, }); expect(wrapper.find('.js-add-version').exists()).toBe(true); @@ -97,7 +95,7 @@ it('should not allow the first item to be deleted', () => { canAdmin: true, canCreateVersion: true, canDeleteAnalyses: true, - isFirst: true + isFirst: true, }) .find('.js-delete-analysis') .exists() diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityApp-it.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityApp-it.tsx index 377f26c8032..b6ae4b28c23 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityApp-it.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityApp-it.tsx @@ -34,18 +34,18 @@ jest.mock('../../../../api/time-machine', () => { measures: [ { metric: 'bugs', - history: [{ date: '2022-01-01', value: '10' }] - } + history: [{ date: '2022-01-01', value: '10' }], + }, ], - paging: mockPaging({ total: 1 }) - }) + paging: mockPaging({ total: 1 }), + }), }; }); jest.mock('../../../../api/metrics', () => { const { mockMetric } = jest.requireActual('../../../../helpers/testMocks'); return { - getAllMetrics: jest.fn().mockResolvedValue([mockMetric()]) + getAllMetrics: jest.fn().mockResolvedValue([mockMetric()]), }; }); @@ -58,8 +58,8 @@ jest.mock('../../../../api/projectActivity', () => { changeEvent: jest.fn(), getProjectActivity: jest.fn().mockResolvedValue({ analyses: [mockAnalysis({ key: 'foo' })], - paging: mockPaging({ total: 1 }) - }) + paging: mockPaging({ total: 1 }), + }), }; }); @@ -67,14 +67,14 @@ jest.mock('../../../../components/activity-graph/utils', () => { const actual = jest.requireActual('../../../../components/activity-graph/utils'); return { ...actual, - getActivityGraph: jest.fn() + getActivityGraph: jest.fn(), }; }); it('should render default graph', async () => { (getActivityGraph as jest.Mock).mockImplementation(() => { return { - graph: 'issues' + graph: 'issues', }; }); @@ -87,7 +87,7 @@ it('should reload custom graph from local storage', async () => { (getActivityGraph as jest.Mock).mockImplementation(() => { return { graph: 'custom', - customGraphs: ['bugs', 'code_smells'] + customGraphs: ['bugs', 'code_smells'], }; }); @@ -100,9 +100,9 @@ function renderProjectActivityAppContainer( { component, navigateTo }: { component: Component; navigateTo?: string } = { component: mockComponent({ breadcrumbs: [ - { key: 'breadcrumb', name: 'breadcrumb', qualifier: ComponentQualifier.Project } - ] - }) + { key: 'breadcrumb', name: 'breadcrumb', qualifier: ComponentQualifier.Project }, + ], + }), } ) { return renderApp( @@ -112,8 +112,9 @@ function renderProjectActivityAppContainer( branchLikes: [], onBranchesChange: jest.fn(), onComponentChange: jest.fn(), - component - }}> + component, + }} + > , { navigateTo } diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityApp-test.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityApp-test.tsx index 6d5034e75fa..85b58a0f8fc 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityApp-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityApp-test.tsx @@ -29,7 +29,7 @@ import { MetricKey } from '../../../../types/metrics'; import { ProjectActivityApp } from '../ProjectActivityApp'; jest.mock('../../../../helpers/dates', () => ({ - parseDate: jest.fn(date => `PARSED:${date}`) + parseDate: jest.fn((date) => `PARSED:${date}`), })); jest.mock('../../../../api/time-machine', () => { @@ -39,18 +39,18 @@ jest.mock('../../../../api/time-machine', () => { measures: [ { metric: 'bugs', - history: [{ date: '2022-01-01', value: '10' }] - } + history: [{ date: '2022-01-01', value: '10' }], + }, ], - paging: mockPaging({ total: 1 }) - }) + paging: mockPaging({ total: 1 }), + }), }; }); jest.mock('../../../../api/metrics', () => { const { mockMetric } = jest.requireActual('../../../../helpers/testMocks'); return { - getAllMetrics: jest.fn().mockResolvedValue([mockMetric()]) + getAllMetrics: jest.fn().mockResolvedValue([mockMetric()]), }; }); @@ -63,8 +63,8 @@ jest.mock('../../../../api/projectActivity', () => { changeEvent: jest.fn(), getProjectActivity: jest.fn().mockResolvedValue({ analyses: [mockAnalysis({ key: 'foo' })], - paging: mockPaging({ total: 1 }) - }) + paging: mockPaging({ total: 1 }), + }), }; }); @@ -78,14 +78,14 @@ it('should filter metric correctly', () => { .instance() .filterMetrics(mockComponent({ qualifier: ComponentQualifier.Project }), [ mockMetric({ key: MetricKey.bugs }), - mockMetric({ key: MetricKey.security_review_rating }) + mockMetric({ key: MetricKey.security_review_rating }), ]); expect(metrics).toHaveLength(1); metrics = wrapper .instance() .filterMetrics(mockComponent({ qualifier: ComponentQualifier.Portfolio }), [ mockMetric({ key: MetricKey.bugs }), - mockMetric({ key: MetricKey.security_hotspots_reviewed }) + mockMetric({ key: MetricKey.security_hotspots_reviewed }), ]); expect(metrics).toHaveLength(1); }); @@ -99,7 +99,7 @@ it('should correctly create and update custom events', async () => { (changeEvent as jest.Mock).mockResolvedValueOnce({ analysis: analysisKey, ...event, - name: newName + name: newName, }); const wrapper = shallowRender(); diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAppRenderer-test.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAppRenderer-test.tsx index 3cff65f626c..400eff16ecf 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAppRenderer-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityAppRenderer-test.tsx @@ -31,14 +31,14 @@ const ANALYSES = [ { key: 'E1', category: 'VERSION', - name: '6.5-SNAPSHOT' - } - ] + name: '6.5-SNAPSHOT', + }, + ], }, { key: 'A2', date: parseDate('2016-10-27T12:21:15+0200'), - events: [] + events: [], }, { key: 'A3', @@ -47,15 +47,15 @@ const ANALYSES = [ { key: 'E2', category: 'VERSION', - name: '6.4' + name: '6.4', }, { key: 'E3', category: 'OTHER', - name: 'foo' - } - ] - } + name: 'foo', + }, + ], + }, ]; const DEFAULT_PROPS = { @@ -72,7 +72,7 @@ const DEFAULT_PROPS = { project: { key: 'foo', leakPeriodDate: '2017-05-16T13:50:02+0200', - qualifier: 'TRK' + qualifier: 'TRK', }, metrics: [{ id: '1', key: 'code_smells', name: 'Code Smells', type: 'INT' }], measuresHistory: [ @@ -80,17 +80,17 @@ const DEFAULT_PROPS = { metric: 'code_smells', history: [ { date: parseDate('Fri Mar 04 2016 10:40:12 GMT+0100 (CET)'), value: '1749' }, - { date: parseDate('Fri Mar 04 2016 18:40:16 GMT+0100 (CET)'), value: '2286' } - ] - } + { date: parseDate('Fri Mar 04 2016 18:40:16 GMT+0100 (CET)'), value: '2286' }, + ], + }, ], query: { category: '', customMetrics: [], graph: DEFAULT_GRAPH, - project: 'org.sonarsource.sonarqube:sonarqube' + project: 'org.sonarsource.sonarqube:sonarqube', }, - updateQuery: () => {} + updateQuery: () => {}, }; it('should render correctly', () => { diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityGraphs-test.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityGraphs-test.tsx index f7a21453e04..39c26d04817 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityGraphs-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/ProjectActivityGraphs-test.tsx @@ -27,21 +27,21 @@ const ANALYSES = [ { key: 'A1', date: parseDate('2016-10-27T16:33:50+0200'), - events: [{ key: 'E1', category: 'VERSION', name: '6.5-SNAPSHOT' }] + events: [{ key: 'E1', category: 'VERSION', name: '6.5-SNAPSHOT' }], }, { key: 'A2', date: parseDate('2016-10-27T12:21:15+0200'), - events: [] + events: [], }, { key: 'A3', date: parseDate('2016-10-26T12:17:29+0200'), events: [ { key: 'E2', category: 'VERSION', name: '6.4' }, - { key: 'E3', category: 'OTHER', name: 'foo' } - ] - } + { key: 'E3', category: 'OTHER', name: 'foo' }, + ], + }, ]; const METRICS = [{ id: '1', key: 'code_smells', name: 'Code Smells', type: 'INT' }]; @@ -56,9 +56,9 @@ const DEFAULT_PROPS: ProjectActivityGraphs['props'] = { history: [ { date: parseDate('2016-10-26T12:17:29+0200'), value: '2286' }, { date: parseDate('2016-10-27T12:21:15+0200'), value: '1749' }, - { date: parseDate('2016-10-27T16:33:50+0200'), value: '500' } - ] - } + { date: parseDate('2016-10-27T16:33:50+0200'), value: '500' }, + ], + }, ], metrics: METRICS, project: 'foo', @@ -66,9 +66,9 @@ const DEFAULT_PROPS: ProjectActivityGraphs['props'] = { category: '', customMetrics: [], graph: DEFAULT_GRAPH, - project: 'org.sonarsource.sonarqube:sonarqube' + project: 'org.sonarsource.sonarqube:sonarqube', }, - updateQuery: () => {} + updateQuery: () => {}, }; it('should render correctly the graph and legends', () => { diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddEventForm.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddEventForm.tsx index e6e655466bc..374f81c5607 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddEventForm.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/AddEventForm.tsx @@ -52,7 +52,8 @@ export default class AddEventForm extends React.PureComponent { header={translate(this.props.addEventButtonText)} onClose={this.props.onClose} onConfirm={this.handleSubmit} - size="small"> + size="small" + >
        { header={this.props.header} onClose={this.props.onClose} onConfirm={this.handleSubmit} - size="small"> + size="small" + >
        diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveAnalysisForm.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveAnalysisForm.tsx index f8548fd77c8..ab21308a2db 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveAnalysisForm.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveAnalysisForm.tsx @@ -36,7 +36,8 @@ export default function RemoveAnalysisForm({ analysis, deleteAnalysis, onClose } header={translate('project_activity.delete_analysis')} isDestructive={true} onClose={onClose} - onConfirm={deleteAnalysis}> + onConfirm={deleteAnalysis} + > {translate('project_activity.delete_analysis.question')} ); diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveEventForm.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveEventForm.tsx index 947b2ba65cd..f5e2ce33ca9 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveEventForm.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/RemoveEventForm.tsx @@ -39,7 +39,8 @@ export default function RemoveEventForm(props: RemoveEventFormProps) { header={header} isDestructive={true} onClose={props.onClose} - onConfirm={() => props.onConfirm(analysisKey, event.key)}> + onConfirm={() => props.onConfirm(analysisKey, event.key)} + > {removeEventQuestion} ); diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/__tests__/AddEventForm-test.tsx b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/__tests__/AddEventForm-test.tsx index ee87304af6e..a760c88b6f6 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/forms/__tests__/AddEventForm-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/forms/__tests__/AddEventForm-test.tsx @@ -32,7 +32,7 @@ it('should render correctly', () => { date: new Date('2019-01-14T15:44:51.000Z'), events: [{ key: '2', category: 'VERSION', name: '1.0' }], projectVersion: '1.0', - manualNewCodePeriodBaseline: false + manualNewCodePeriodBaseline: false, }} onClose={jest.fn()} /> diff --git a/server/sonar-web/src/main/js/apps/projectActivity/utils.ts b/server/sonar-web/src/main/js/apps/projectActivity/utils.ts index 679b47ac194..52c2f7e5a71 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/utils.ts +++ b/server/sonar-web/src/main/js/apps/projectActivity/utils.ts @@ -28,7 +28,7 @@ import { parseAsString, serializeDate, serializeString, - serializeStringArray + serializeStringArray, } from '../../helpers/query'; import { GraphType, ParsedAnalysis } from '../../types/project-activity'; import { Dict, RawQuery } from '../../types/types'; @@ -78,7 +78,7 @@ export function getAnalysesByVersionByDay( ) { return analyses.reduce((acc, analysis) => { let currentVersion = acc[acc.length - 1]; - const versionEvent = analysis.events.find(event => event.category === 'VERSION'); + const versionEvent = analysis.events.find((event) => event.category === 'VERSION'); if (versionEvent) { const newVersion = { version: versionEvent.name, key: versionEvent.key, byDay: {} }; if (!currentVersion || Object.keys(currentVersion.byDay).length > 0) { @@ -93,16 +93,15 @@ export function getAnalysesByVersionByDay( acc.push(currentVersion); } - const day = startOfDay(parseDate(analysis.date)) - .getTime() - .toString(); + const day = startOfDay(parseDate(analysis.date)).getTime().toString(); let matchFilters = true; if (query.category || query.from || query.to) { const isAfterFrom = !query.from || analysis.date >= query.from; const isBeforeTo = !query.to || analysis.date <= query.to; const hasSelectedCategoryEvents = - !query.category || analysis.events.find(event => event.category === query.category) != null; + !query.category || + analysis.events.find((event) => event.category === query.category) != null; matchFilters = isAfterFrom && isBeforeTo && hasSelectedCategoryEvents; } @@ -124,7 +123,7 @@ export function parseQuery(urlQuery: RawQuery): Query { graph: parseGraph(urlQuery['graph']), project: parseAsString(urlQuery['id']), to: parseAsDate(urlQuery['to']), - selectedDate: parseAsDate(urlQuery['selected_date']) + selectedDate: parseAsDate(urlQuery['selected_date']), }; } @@ -133,7 +132,7 @@ export function serializeQuery(query: Query): RawQuery { category: serializeString(query.category), from: serializeDate(query.from), project: serializeString(query.project), - to: serializeDate(query.to) + to: serializeDate(query.to), }); } @@ -145,7 +144,7 @@ export function serializeUrlQuery(query: Query): RawQuery { graph: serializeGraph(query.graph), id: serializeString(query.project), to: serializeDate(query.to), - selected_date: serializeDate(query.selectedDate) + selected_date: serializeDate(query.selectedDate), }); } diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/App.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/App.tsx index 17f9c960606..602c15185db 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/App.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/App.tsx @@ -23,7 +23,7 @@ import * as React from 'react'; import { getNewCodePeriod, resetNewCodePeriod, setNewCodePeriod } from '../../../api/newCodePeriod'; import withAppStateContext from '../../../app/components/app-state/withAppStateContext'; import withAvailableFeatures, { - WithAvailableFeaturesProps + WithAvailableFeaturesProps, } from '../../../app/components/available-features/withAvailableFeatures'; import withComponentContext from '../../../app/components/componentContext/withComponentContext'; import Suggestions from '../../../components/embed-docs-modal/Suggestions'; @@ -67,7 +67,7 @@ interface State { const DEFAULT_NUMBER_OF_DAYS = '30'; const DEFAULT_GENERAL_SETTING: { type: NewCodePeriodSettingType } = { - type: 'PREVIOUS_VERSION' + type: 'PREVIOUS_VERSION', }; export class App extends React.PureComponent { @@ -76,7 +76,7 @@ export class App extends React.PureComponent { branchList: [], days: DEFAULT_NUMBER_OF_DAYS, loading: true, - saving: false + saving: false, }; // We use debounce as we could have multiple save in less that 3sec. @@ -119,7 +119,7 @@ export class App extends React.PureComponent { days: (currentSetting === 'NUMBER_OF_DAYS' && currentSettingValue) || defaultDays, analysis: (currentSetting === 'SPECIFIC_ANALYSIS' && currentSettingValue) || '', referenceBranch: - (currentSetting === 'REFERENCE_BRANCH' && currentSettingValue) || referenceBranch + (currentSetting === 'REFERENCE_BRANCH' && currentSettingValue) || referenceBranch, }; } @@ -137,8 +137,8 @@ export class App extends React.PureComponent { getNewCodePeriod(), getNewCodePeriod({ branch: this.props.hasFeature(Feature.BranchSupport) ? undefined : branchLike.name, - project: component.key - }) + project: component.key, + }), ]).then( ([generalSetting, setting]) => { if (this.mounted) { @@ -152,7 +152,7 @@ export class App extends React.PureComponent { this.getUpdatedState({ generalSetting, currentSetting, - currentSettingValue + currentSettingValue, }) ); } @@ -171,7 +171,7 @@ export class App extends React.PureComponent { saving: false, currentSetting: undefined, selected: undefined, - success: true + success: true, }); this.resetSuccess(); }, @@ -218,14 +218,14 @@ export class App extends React.PureComponent { setNewCodePeriod({ project: component.key, type, - value + value, }).then( () => { this.setState({ saving: false, currentSetting: type, currentSettingValue: value || undefined, - success: true + success: true, }); this.resetSuccess(); }, @@ -250,7 +250,7 @@ export class App extends React.PureComponent { referenceBranch, saving, selected, - success + success, } = this.state; const branchSupportEnabled = this.props.hasFeature(Feature.BranchSupport); @@ -307,7 +307,7 @@ export class App extends React.PureComponent { currentSetting ? { type: currentSetting, - value: currentSettingValue + value: currentSettingValue, } : generalSetting } diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/AppHeader.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/AppHeader.tsx index b1ca7a8665b..feba6afdb1e 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/AppHeader.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/AppHeader.tsx @@ -42,7 +42,7 @@ export default function AppHeader(props: AppHeaderProps) { {translate('project_baseline.page.description.link')} - ) + ), }} />
        @@ -55,7 +55,7 @@ export default function AppHeader(props: AppHeaderProps) { {translate('project_baseline.page.description2.link')} - ) + ), }} /> )} diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingAnalysis.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingAnalysis.tsx index fc94bb7faaa..b29cf8ccbd7 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingAnalysis.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingAnalysis.tsx @@ -34,7 +34,8 @@ export default function BaselineSettingAnalysis({ disabled, onSelect, selected } disabled={disabled} onClick={() => onSelect('SPECIFIC_ANALYSIS')} selected={selected} - title={translate('baseline.specific_analysis')}> + title={translate('baseline.specific_analysis')} + >

        {translate('baseline.specific_analysis.description')}

        ); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingDays.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingDays.tsx index 1e703700590..b4fa182eca3 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingDays.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingDays.tsx @@ -43,7 +43,8 @@ export default function BaselineSettingDays(props: Props) { disabled={disabled} onClick={() => onSelect('NUMBER_OF_DAYS')} selected={selected} - title={translate('baseline.number_days')}> + title={translate('baseline.number_days')} + > <>

        {translate('baseline.number_days.description')}

        {selected && ( @@ -56,8 +57,13 @@ export default function BaselineSettingDays(props: Props) { isInvalid={isChanged && !isValid} isValid={isChanged && isValid} label={translate('baseline.specify_days')} - required={true}> - onChangeDays(e.currentTarget.value)} type="text" value={days} /> + required={true} + > + onChangeDays(e.currentTarget.value)} + type="text" + value={days} + /> )} diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingPreviousVersion.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingPreviousVersion.tsx index 92d0678d9ea..a0be4c068fe 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingPreviousVersion.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingPreviousVersion.tsx @@ -38,7 +38,8 @@ export default function BaselineSettingPreviousVersion(props: Props) { selected={selected} title={ translate('baseline.previous_version') + (isDefault ? ` (${translate('default')})` : '') - }> + } + >

        {translate('baseline.previous_version.description')}

        ); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingReferenceBranch.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingReferenceBranch.tsx index 7a34d01e6d3..84dccfb3584 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingReferenceBranch.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/BaselineSettingReferenceBranch.tsx @@ -58,7 +58,8 @@ export function renderBranchOption(props: OptionProps) { overlay={translateWithParameters( 'baseline.reference_branch.does_not_exist', option.value - )}> + )} + > {option.value} @@ -70,7 +71,8 @@ export function renderBranchOption(props: OptionProps) { option.isDisabled ? translate('baseline.reference_branch.cannot_be_itself') : undefined - }> + } + > {option.value} {option.isMain && ( @@ -85,11 +87,11 @@ export function renderBranchOption(props: OptionProps) { export default function BaselineSettingReferenceBranch(props: BaselineSettingReferenceBranchProps) { const { branchList, className, disabled, referenceBranch, selected, settingLevel } = props; - const currentBranch = branchList.find(b => b.value === referenceBranch) || { + const currentBranch = branchList.find((b) => b.value === referenceBranch) || { label: referenceBranch, value: referenceBranch, isMain: false, - isInvalid: true + isInvalid: true, }; return ( @@ -98,7 +100,8 @@ export default function BaselineSettingReferenceBranch(props: BaselineSettingRef disabled={disabled} onClick={() => props.onSelect('REFERENCE_BRANCH')} selected={selected} - title={translate('baseline.reference_branch')}> + title={translate('baseline.reference_branch')} + > <>

        {translate('baseline.reference_branch.description')}

        {selected && ( @@ -118,7 +121,7 @@ export default function BaselineSettingReferenceBranch(props: BaselineSettingRef onChange={(option: BranchOption) => props.onChangeReferenceBranch(option.value)} value={currentBranch} components={{ - Option: renderBranchOption + Option: renderBranchOption, }} />
        diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchAnalysisList.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchAnalysisList.tsx index ac39e3d3279..bc59ca60fc4 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchAnalysisList.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchAnalysisList.tsx @@ -51,7 +51,7 @@ export default class BranchAnalysisList extends React.PureComponent { // If the selected analysis wasn't found in the default 30 days range, redo the search - if (initial && analysis && !result.analyses.find(a => a.key === analysis)) { + if (initial && analysis && !result.analyses.find((a) => a.key === analysis)) { this.handleRangeChange({ value: 0 }); return; } this.setState( { - analyses: result.analyses.map(analysis => ({ + analyses: result.analyses.map((analysis) => ({ ...analysis, - date: parseDate(analysis.date) + date: parseDate(analysis.date), })) as ParsedAnalysis[], - loading: false + loading: false, }, () => { this.scrollToSelected(); @@ -150,7 +150,7 @@ export default class BranchAnalysisList extends React.PureComponent { + registerScrollableNode={(el) => { this.scrollableNode = el; }} selectedAnalysisKey={analysis} diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchAnalysisListRenderer.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchAnalysisListRenderer.tsx index 59e9734ab6c..09cb23339ad 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchAnalysisListRenderer.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchAnalysisListRenderer.tsx @@ -54,14 +54,15 @@ function renderAnalysis(args: { return (
      • onSelectAnalysis(analysis)}> + onClick={() => onSelectAnalysis(analysis)} + >
        - {formattedTime => ( + {(formattedTime) => ( @@ -86,7 +87,7 @@ export default function BranchAnalysisListRenderer(props: BranchAnalysisListRend const byVersionByDay = React.useMemo( () => getAnalysesByVersionByDay(analyses, { - category: '' + category: '', }), [analyses] ); @@ -98,12 +99,12 @@ export default function BranchAnalysisListRenderer(props: BranchAnalysisListRend const options = [ { label: translate('baseline.branch_analyses.ranges.30days'), - value: 30 + value: 30, }, { label: translate('baseline.branch_analyses.ranges.allTime'), - value: 0 - } + value: 0, + }, ]; return ( @@ -119,14 +120,15 @@ export default function BranchAnalysisListRenderer(props: BranchAnalysisListRend onChange={props.handleRangeChange} options={options} isSearchable={false} - value={options.filter(o => o.value === range)} + value={options.filter((o) => o.value === range)} />
        + ref={props.registerScrollableNode} + > {loading && } {!loading && !hasFilteredData ? ( @@ -146,33 +148,36 @@ export default function BranchAnalysisListRenderer(props: BranchAnalysisListRend
        + ref={props.registerBadgeNode(version.version)} + > + overlay={`${translate('version')} ${version.version}`} + > {version.version}
        )}
          - {days.map(day => ( + {days.map((day) => (
        • + key={day} + >
            {version.byDay[day] != null && - version.byDay[day].map(analysis => + version.byDay[day].map((analysis) => renderAnalysis({ analysis, selectedAnalysisKey, isFirst: analyses[0].key === analysis.key, - onSelectAnalysis: props.onSelectAnalysis + onSelectAnalysis: props.onSelectAnalysis, }) )}
          diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchBaselineSettingModal.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchBaselineSettingModal.tsx index 30fcb1080c0..5311954db05 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchBaselineSettingModal.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/BranchBaselineSettingModal.tsx @@ -56,7 +56,7 @@ export default class BranchBaselineSettingModal extends React.PureComponent b.name !== props.branch.name); + const otherBranches = props.branchList.filter((b) => b.name !== props.branch.name); const defaultBranch = otherBranches.length > 0 ? otherBranches[0].name : ''; this.state = { @@ -64,7 +64,7 @@ export default class BranchBaselineSettingModal extends React.PureComponent) => { @@ -103,21 +103,21 @@ export default class BranchBaselineSettingModal extends React.PureComponent { this.setState({ - saving: false + saving: false, }); this.props.onClose(branch.name, { type, value, - effectiveValue: analysisDate && toNotSoISOString(analysisDate) + effectiveValue: analysisDate && toNotSoISOString(analysisDate), }); }, () => { this.setState({ - saving: false + saving: false, }); } ); @@ -150,7 +150,7 @@ export default class BranchBaselineSettingModal extends React.PureComponent { mounted = false; state: State = { branches: [], - loading: true + loading: true, }; componentDidMount() { @@ -64,20 +64,20 @@ export default class BranchList extends React.PureComponent { this.setState({ loading: true }); listBranchesNewCodePeriod({ project }).then( - branchSettings => { + (branchSettings) => { const newCodePeriods = branchSettings.newCodePeriods - ? branchSettings.newCodePeriods.filter(ncp => !ncp.inherited) + ? branchSettings.newCodePeriods.filter((ncp) => !ncp.inherited) : []; - const branchesWithBaseline = this.props.branchList.map(b => { - const newCodePeriod = newCodePeriods.find(ncp => ncp.branchKey === b.name); + const branchesWithBaseline = this.props.branchList.map((b) => { + const newCodePeriod = newCodePeriods.find((ncp) => ncp.branchKey === b.name); if (!newCodePeriod) { return b; } const { type = 'PREVIOUS_VERSION', value, effectiveValue } = newCodePeriod; return { ...b, - newCodePeriod: { type, value, effectiveValue } + newCodePeriod: { type, value, effectiveValue }, }; }); @@ -92,7 +92,7 @@ export default class BranchList extends React.PureComponent { updateBranchNewCodePeriod = (branch: string, newSetting: NewCodePeriod | undefined) => { const { branches } = this.state; - const updated = branches.find(b => b.name === branch); + const updated = branches.find((b) => b.name === branch); if (updated) { updated.newCodePeriod = newSetting; } @@ -107,7 +107,7 @@ export default class BranchList extends React.PureComponent { if (branch) { this.setState({ branches: this.updateBranchNewCodePeriod(branch, newSetting), - editedBranch: undefined + editedBranch: undefined, }); } else { this.setState({ editedBranch: undefined }); @@ -117,7 +117,7 @@ export default class BranchList extends React.PureComponent { resetToDefault = (branch: string) => { return resetNewCodePeriod({ project: this.props.component.key, - branch + branch, }).then(() => { this.setState({ branches: this.updateBranchNewCodePeriod(branch, undefined) }); }); @@ -148,10 +148,10 @@ export default class BranchList extends React.PureComponent { - {branches.map(branch => ( + {branches.map((branch) => ( b.name)} + existingBranches={branchList.map((b) => b.name)} inheritedSetting={inheritedSetting} key={branch.name} onOpenEditModal={this.openEditModal} diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/ProjectBaselineSelector.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/ProjectBaselineSelector.tsx index 724d16a6020..40de952e9d4 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/ProjectBaselineSelector.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/ProjectBaselineSelector.tsx @@ -96,7 +96,7 @@ export default function ProjectBaselineSelector(props: ProjectBaselineSelectorPr overrideGeneralSetting, referenceBranch, saving, - selected + selected, } = props; const { isChanged, isValid } = validateSetting({ @@ -106,7 +106,7 @@ export default function ProjectBaselineSelector(props: ProjectBaselineSelectorPr days, overrideGeneralSetting, referenceBranch, - selected + selected, }); return ( @@ -116,7 +116,8 @@ export default function ProjectBaselineSelector(props: ProjectBaselineSelectorPr checked={!overrideGeneralSetting} className="big-spacer-bottom" onCheck={() => props.onToggleSpecificSetting(false)} - value="general"> + value="general" + > {translate('project_baseline.general_setting')}
          {renderGeneralSetting(generalSetting)}
          @@ -125,7 +126,8 @@ export default function ProjectBaselineSelector(props: ProjectBaselineSelectorPr checked={overrideGeneralSetting} className="huge-spacer-top" onCheck={() => props.onToggleSpecificSetting(true)} - value="specific"> + value="specific" + > {translate('project_baseline.specific_setting')}
        diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/App-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/App-test.tsx index cbf4f74058f..36a4ca6fbd1 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/App-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/App-test.tsx @@ -22,7 +22,7 @@ import * as React from 'react'; import { getNewCodePeriod, resetNewCodePeriod, - setNewCodePeriod + setNewCodePeriod, } from '../../../../api/newCodePeriod'; import { mockBranch, mockMainBranch, mockPullRequest } from '../../../../helpers/mocks/branch-like'; import { mockComponent } from '../../../../helpers/mocks/component'; @@ -33,7 +33,7 @@ import { App } from '../App'; jest.mock('../../../../api/newCodePeriod', () => ({ getNewCodePeriod: jest.fn().mockResolvedValue({}), resetNewCodePeriod: jest.fn().mockResolvedValue({}), - setNewCodePeriod: jest.fn().mockResolvedValue({}) + setNewCodePeriod: jest.fn().mockResolvedValue({}), })); it('should render correctly', async () => { @@ -48,7 +48,7 @@ it('should render correctly', async () => { it('should initialize correctly', async () => { const wrapper = shallowRender({ - branchLikes: [mockBranch(), mockPullRequest(), mockMainBranch()] + branchLikes: [mockBranch(), mockPullRequest(), mockMainBranch()], }); await waitAndUpdate(wrapper); @@ -81,7 +81,7 @@ it('should save correctly', async () => { expect(setNewCodePeriod).toHaveBeenCalledWith({ project: component.key, type: 'NUMBER_OF_DAYS', - value: '23' + value: '23', }); expect(wrapper.state('currentSetting')).toEqual(wrapper.state('selected')); }); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingAnalysis-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingAnalysis-test.tsx index 26fc81dba31..27d18c923ad 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingAnalysis-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingAnalysis-test.tsx @@ -29,10 +29,7 @@ it('should callback when clicked', () => { const onSelect = jest.fn(); const wrapper = shallowRender({ onSelect, selected: false }); - wrapper - .find('RadioCard') - .first() - .simulate('click'); + wrapper.find('RadioCard').first().simulate('click'); expect(onSelect).toHaveBeenCalledWith('SPECIFIC_ANALYSIS'); }); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingDays-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingDays-test.tsx index b73d1a144f5..42364a64cbd 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingDays-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingDays-test.tsx @@ -36,10 +36,7 @@ it('should callback when clicked', () => { const onSelect = jest.fn(); const wrapper = shallowRender({ onSelect, selected: false }); - wrapper - .find('RadioCard') - .first() - .simulate('click'); + wrapper.find('RadioCard').first().simulate('click'); expect(onSelect).toHaveBeenCalledWith('NUMBER_OF_DAYS'); }); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingPreviousVersion-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingPreviousVersion-test.tsx index c43565c269e..d484a8d348f 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingPreviousVersion-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingPreviousVersion-test.tsx @@ -30,10 +30,7 @@ it('should callback when clicked', () => { const onSelect = jest.fn(); const wrapper = shallowRender({ onSelect, selected: false }); - wrapper - .find('RadioCard') - .first() - .simulate('click'); + wrapper.find('RadioCard').first().simulate('click'); expect(onSelect).toHaveBeenCalledWith('PREVIOUS_VERSION'); }); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingReferenceBranch-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingReferenceBranch-test.tsx index eba115e93b1..96dc6812eaa 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingReferenceBranch-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BaselineSettingReferenceBranch-test.tsx @@ -25,7 +25,7 @@ import Select from '../../../../components/controls/Select'; import BaselineSettingReferenceBranch, { BaselineSettingReferenceBranchProps, BranchOption, - renderBranchOption + renderBranchOption, } from '../BaselineSettingReferenceBranch'; it('should render correctly', () => { @@ -34,7 +34,7 @@ it('should render correctly', () => { expect( shallowRender({ branchList: [{ label: 'master', value: 'master', isMain: true }], - settingLevel: 'branch' + settingLevel: 'branch', }) ).toMatchSnapshot('Branch level - no other branches'); }); @@ -48,10 +48,7 @@ it('should callback when clicked', () => { const onSelect = jest.fn(); const wrapper = shallowRender({ onSelect, selected: false }); - wrapper - .find(RadioCard) - .first() - .simulate('click'); + wrapper.find(RadioCard).first().simulate('click'); expect(onSelect).toHaveBeenCalledWith('REFERENCE_BRANCH'); }); @@ -59,10 +56,7 @@ it('should callback when changing selection', () => { const onChangeReferenceBranch = jest.fn(); const wrapper = shallowRender({ onChangeReferenceBranch }); - wrapper - .find(Select) - .first() - .simulate('change', { value: 'branch-6.9' }); + wrapper.find(Select).first().simulate('change', { value: 'branch-6.9' }); expect(onChangeReferenceBranch).toHaveBeenCalledWith('branch-6.9'); }); @@ -70,12 +64,12 @@ it('should handle an invalid branch', () => { const unknownBranchName = 'branch-unknown'; const wrapper = shallowRender({ referenceBranch: unknownBranchName }); - expect( - wrapper - .find(Select) - .first() - .props().value - ).toEqual({ label: unknownBranchName, value: unknownBranchName, isMain: false, isInvalid: true }); + expect(wrapper.find(Select).first().props().value).toEqual({ + label: unknownBranchName, + value: unknownBranchName, + isMain: false, + isInvalid: true, + }); }); describe('renderOption', () => { @@ -89,19 +83,19 @@ describe('renderOption', () => { expect( renderBranchOption({ ...props, - data: { label: 'branch-7.4', value: 'branch-7.4', isMain: false } + data: { label: 'branch-7.4', value: 'branch-7.4', isMain: false }, }) ).toMatchSnapshot('branch'); expect( renderBranchOption({ ...props, - data: { label: 'disabled', value: 'disabled', isMain: false, isDisabled: true } + data: { label: 'disabled', value: 'disabled', isMain: false, isDisabled: true }, }) ).toMatchSnapshot('disabled'); expect( renderBranchOption({ ...props, - data: { value: 'branch-nope', isMain: false, isInvalid: true } + data: { value: 'branch-nope', isMain: false, isInvalid: true }, }) ).toMatchSnapshot("branch doesn't exist"); }); @@ -110,7 +104,7 @@ describe('renderOption', () => { function shallowRender(props: Partial = {}) { const branchOptions = [ { label: 'master', value: 'master', isMain: true }, - { label: 'branch-7.9', value: 'branch-7.9', isMain: false } + { label: 'branch-7.9', value: 'branch-7.9', isMain: false }, ]; return shallow( diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchAnalysisList-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchAnalysisList-test.tsx index 1d011ee0d6e..9ac38b13b35 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchAnalysisList-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchAnalysisList-test.tsx @@ -31,20 +31,20 @@ jest.mock('date-fns', () => { return { ...actual, startOfDay: jest.fn(() => ({ - getTime: () => '1488322800000' // 2017-03-02 - })) + getTime: () => '1488322800000', // 2017-03-02 + })), }; }); jest.mock('../../../../helpers/dates', () => ({ parseDate: jest.fn().mockReturnValue('2017-03-02'), - toShortNotSoISOString: jest.fn().mockReturnValue('2017-03-02') + toShortNotSoISOString: jest.fn().mockReturnValue('2017-03-02'), })); jest.mock('../../../../api/projectActivity', () => ({ getProjectActivity: jest.fn().mockResolvedValue({ - analyses: [] - }) + analyses: [], + }), })); beforeEach(() => { @@ -57,25 +57,25 @@ it('should render correctly', async () => { mockAnalysis({ key: '4', date: '2017-03-02T10:36:01', - projectVersion: '4.2' + projectVersion: '4.2', }), mockAnalysis({ key: '3', date: '2017-03-02T09:36:01', events: [mockAnalysisEvent()], - projectVersion: '4.2' + projectVersion: '4.2', }), mockAnalysis({ key: '2', date: '2017-03-02T08:36:01', events: [ mockAnalysisEvent(), - mockAnalysisEvent({ category: 'VERSION', qualityGate: undefined }) + mockAnalysisEvent({ category: 'VERSION', qualityGate: undefined }), ], - projectVersion: '4.1' + projectVersion: '4.1', }), - mockAnalysis({ key: '1', projectVersion: '4.1' }) - ] + mockAnalysis({ key: '1', projectVersion: '4.1' }), + ], }); const wrapper = shallowRender(); @@ -92,7 +92,7 @@ it('should reload analyses after range change', () => { expect(getProjectActivity).toHaveBeenCalledWith({ branch: 'master', project: 'project1', - from: toShortNotSoISOString(subDays(new Date(), 30)) + from: toShortNotSoISOString(subDays(new Date(), 30)), }); }); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchAnalysisListRenderer-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchAnalysisListRenderer-test.tsx index 1fa07679e2c..0883605b2b4 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchAnalysisListRenderer-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchAnalysisListRenderer-test.tsx @@ -21,7 +21,7 @@ import { shallow } from 'enzyme'; import * as React from 'react'; import { mockAnalysisEvent, mockParsedAnalysis } from '../../../../helpers/mocks/project-activity'; import BranchAnalysisListRenderer, { - BranchAnalysisListRendererProps + BranchAnalysisListRendererProps, } from '../BranchAnalysisListRenderer'; jest.mock('date-fns', () => { @@ -32,7 +32,7 @@ jest.mock('date-fns', () => { const startDay = new Date(date); startDay.setUTCHours(0, 0, 0, 0); return startDay; - } + }, }; }); @@ -45,24 +45,24 @@ const analyses = [ mockParsedAnalysis({ key: '4', date: new Date('2017-03-02T10:36:01Z'), - projectVersion: '4.2' + projectVersion: '4.2', }), mockParsedAnalysis({ key: '3', date: new Date('2017-03-02T09:36:01Z'), events: [mockAnalysisEvent()], - projectVersion: '4.2' + projectVersion: '4.2', }), mockParsedAnalysis({ key: '2', date: new Date('2017-03-02T08:36:01Z'), events: [ mockAnalysisEvent(), - mockAnalysisEvent({ category: 'VERSION', qualityGate: undefined }) + mockAnalysisEvent({ category: 'VERSION', qualityGate: undefined }), ], - projectVersion: '4.1' + projectVersion: '4.1', }), - mockParsedAnalysis({ key: '1', projectVersion: '4.1' }) + mockParsedAnalysis({ key: '1', projectVersion: '4.1' }), ]; it('should render correctly', () => { diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchBaselineSettingModal-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchBaselineSettingModal-test.tsx index a01ef87dad6..b21e0a9f741 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchBaselineSettingModal-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchBaselineSettingModal-test.tsx @@ -25,7 +25,7 @@ import { mockEvent, waitAndUpdate } from '../../../../helpers/testUtils'; import BranchBaselineSettingModal from '../BranchBaselineSettingModal'; jest.mock('../../../../api/newCodePeriod', () => ({ - setNewCodePeriod: jest.fn().mockResolvedValue({}) + setNewCodePeriod: jest.fn().mockResolvedValue({}), })); it('should render correctly', () => { @@ -48,7 +48,7 @@ it('should save correctly', async () => { const component = 'compKey'; const wrapper = shallowRender({ branch, - component + component, }); wrapper.setState({ analysis: 'analysis572893', selected: 'SPECIFIC_ANALYSIS' }); @@ -61,7 +61,7 @@ it('should save correctly', async () => { project: component, type: 'SPECIFIC_ANALYSIS', value: 'analysis572893', - branch: 'branchname' + branch: 'branchname', }); }); @@ -70,12 +70,7 @@ it('should disable the save button when saving', () => { wrapper.setState({ saving: true }); - expect( - wrapper - .find('SubmitButton') - .first() - .prop('disabled') - ).toBe(true); + expect(wrapper.find('SubmitButton').first().prop('disabled')).toBe(true); }); it('should disable the save button when date is invalid', () => { @@ -83,12 +78,7 @@ it('should disable the save button when date is invalid', () => { wrapper.setState({ days: 'asdf' }); - expect( - wrapper - .find('SubmitButton') - .first() - .prop('disabled') - ).toBe(true); + expect(wrapper.find('SubmitButton').first().prop('disabled')).toBe(true); }); function shallowRender(props: Partial = {}) { diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchList-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchList-test.tsx index f714c6f23d6..2dc1830af38 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchList-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchList-test.tsx @@ -28,7 +28,7 @@ import BranchList from '../BranchList'; jest.mock('../../../../api/newCodePeriod', () => ({ listBranchesNewCodePeriod: jest.fn().mockResolvedValue({ newCodePeriods: [] }), - resetNewCodePeriod: jest.fn().mockResolvedValue(null) + resetNewCodePeriod: jest.fn().mockResolvedValue(null), })); const newCodePeriods = [ @@ -36,14 +36,14 @@ const newCodePeriods = [ projectKey: '', branchKey: 'master', type: 'NUMBER_OF_DAYS', - value: '27' - } + value: '27', + }, ]; it('should render correctly', async () => { (listBranchesNewCodePeriod as jest.Mock).mockResolvedValueOnce({ newCodePeriods }); const wrapper = shallowRender({ - branchList: [mockMainBranch(), mockBranch(), mockBranch({ name: 'branch-7.0' })] + branchList: [mockMainBranch(), mockBranch(), mockBranch({ name: 'branch-7.0' })], }); await waitAndUpdate(wrapper); expect(wrapper.state().branches).toHaveLength(3); @@ -58,7 +58,7 @@ it('should handle reset', () => { expect(resetNewCodePeriod).toHaveBeenCalledWith({ project: component.key, - branch: 'master' + branch: 'master', }); }); @@ -76,15 +76,15 @@ it('should toggle popup', async () => { wrapper.instance().closeEditModal('master', { type: 'NUMBER_OF_DAYS', value: '23' }); expect(wrapper.find('BranchBaselineSettingModal')).toHaveLength(0); - expect(wrapper.state().branches.find(b => b.name === 'master')).toEqual({ + expect(wrapper.state().branches.find((b) => b.name === 'master')).toEqual({ analysisDate: '2018-01-01', excludedFromPurge: true, isMain: true, name: 'master', newCodePeriod: { type: 'NUMBER_OF_DAYS', - value: '23' - } + value: '23', + }, }); }); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchListRow-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchListRow-test.tsx index 253441842a6..3748b4bf6a0 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchListRow-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/BranchListRow-test.tsx @@ -28,17 +28,17 @@ it('should render correctly', () => { expect( shallowRender({ branch: mockBranch({ name: 'branch-7.3' }), - inheritedSetting: { type: 'REFERENCE_BRANCH', value: 'branch-7.3' } + inheritedSetting: { type: 'REFERENCE_BRANCH', value: 'branch-7.3' }, }) ).toMatchSnapshot('faulty branch'); expect( shallowRender({ - branch: { ...mockBranch(), newCodePeriod: { type: 'NUMBER_OF_DAYS', value: '21' } } + branch: { ...mockBranch(), newCodePeriod: { type: 'NUMBER_OF_DAYS', value: '21' } }, }) ).toMatchSnapshot('branch with number of days'); expect( shallowRender({ - branch: { ...mockBranch(), newCodePeriod: { type: 'PREVIOUS_VERSION' } } + branch: { ...mockBranch(), newCodePeriod: { type: 'PREVIOUS_VERSION' } }, }) ).toMatchSnapshot('branch with previous version'); expect( @@ -48,14 +48,14 @@ it('should render correctly', () => { newCodePeriod: { type: 'SPECIFIC_ANALYSIS', value: 'A85835', - effectiveValue: '2018-12-02T13:01:12' - } - } + effectiveValue: '2018-12-02T13:01:12', + }, + }, }) ).toMatchSnapshot('branch with specific analysis'); expect( shallowRender({ - branch: { ...mockBranch(), newCodePeriod: { type: 'REFERENCE_BRANCH', value: 'master' } } + branch: { ...mockBranch(), newCodePeriod: { type: 'REFERENCE_BRANCH', value: 'master' } }, }) ).toMatchSnapshot('branch with reference branch'); }); @@ -65,10 +65,7 @@ it('should callback to open modal when clicked', () => { const branch = mockBranch(); const wrapper = shallowRender({ branch, onOpenEditModal: openEditModal }); - wrapper - .find(ActionsDropdownItem) - .first() - .simulate('click'); + wrapper.find(ActionsDropdownItem).first().simulate('click'); expect(openEditModal).toHaveBeenCalledWith(branch); }); @@ -78,13 +75,10 @@ it('should callback to reset when clicked', () => { const branchName = 'branch-6.5'; const wrapper = shallowRender({ branch: { ...mockBranch({ name: branchName }), newCodePeriod: { type: 'REFERENCE_BRANCH' } }, - onResetToDefault: resetToDefault + onResetToDefault: resetToDefault, }); - wrapper - .find(ActionsDropdownItem) - .at(1) - .simulate('click'); + wrapper.find(ActionsDropdownItem).at(1).simulate('click'); expect(resetToDefault).toHaveBeenCalledWith(branchName); }); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/ProjectBaselineSelector-test.tsx b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/ProjectBaselineSelector-test.tsx index 4df2277939e..dcd4bea5e08 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/ProjectBaselineSelector-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/ProjectBaselineSelector-test.tsx @@ -27,7 +27,7 @@ it('should render correctly', () => { expect( shallowRender({ branchesEnabled: false, - generalSetting: { type: 'NUMBER_OF_DAYS', value: '23' } + generalSetting: { type: 'NUMBER_OF_DAYS', value: '23' }, }) ).toMatchSnapshot(); expect( @@ -39,21 +39,16 @@ it('should not show save button when unchanged', () => { const wrapper = shallowRender({ currentSetting: 'PREVIOUS_VERSION', selected: 'PREVIOUS_VERSION', - overrideGeneralSetting: true + overrideGeneralSetting: true, }); - expect( - wrapper - .find('SubmitButton') - .parent() - .hasClass('invisible') - ).toBe(true); + expect(wrapper.find('SubmitButton').parent().hasClass('invisible')).toBe(true); }); it('should show save button when changed', () => { const wrapper = shallowRender({ currentSetting: 'PREVIOUS_VERSION', selected: 'NUMBER_OF_DAYS', - overrideGeneralSetting: true + overrideGeneralSetting: true, }); expect(wrapper.find('SubmitButton')).toHaveLength(1); }); @@ -64,7 +59,7 @@ it('should show save button when value changed', () => { currentSettingValue: '23', days: '25', selected: 'NUMBER_OF_DAYS', - overrideGeneralSetting: true + overrideGeneralSetting: true, }); expect(wrapper.find('SubmitButton')).toHaveLength(1); }); @@ -75,15 +70,10 @@ it('should disable the save button when saving', () => { currentSettingValue: '25', saving: true, selected: 'PREVIOUS_VERSION', - overrideGeneralSetting: true + overrideGeneralSetting: true, }); - expect( - wrapper - .find('SubmitButton') - .first() - .prop('disabled') - ).toBe(true); + expect(wrapper.find('SubmitButton').first().prop('disabled')).toBe(true); }); it('should disable the save button when date is invalid', () => { @@ -91,15 +81,10 @@ it('should disable the save button when date is invalid', () => { currentSetting: 'PREVIOUS_VERSION', days: 'hello', selected: 'NUMBER_OF_DAYS', - overrideGeneralSetting: true + overrideGeneralSetting: true, }); - expect( - wrapper - .find('SubmitButton') - .first() - .prop('disabled') - ).toBe(true); + expect(wrapper.find('SubmitButton').first().prop('disabled')).toBe(true); }); function shallowRender(props: Partial = {}) { diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/utils-test.ts b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/utils-test.ts index ddcbd6f6384..07a8272d2ed 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/utils-test.ts +++ b/server/sonar-web/src/main/js/apps/projectBaseline/components/__tests__/utils-test.ts @@ -23,7 +23,7 @@ describe('getSettingValue', () => { const state = { analysis: 'analysis', days: '35', - referenceBranch: 'branch-4.2' + referenceBranch: 'branch-4.2', }; it('should work for Days', () => { @@ -50,14 +50,14 @@ describe('validateSettings', () => { validateSetting({ currentSetting: 'PREVIOUS_VERSION', days: '12', - selected: 'NUMBER_OF_DAYS' + selected: 'NUMBER_OF_DAYS', }) ).toEqual({ isChanged: true, isValid: true }); expect( validateSetting({ currentSetting: 'PREVIOUS_VERSION', days: 'nope', - selected: 'NUMBER_OF_DAYS' + selected: 'NUMBER_OF_DAYS', }) ).toEqual({ isChanged: true, isValid: false }); expect( @@ -65,7 +65,7 @@ describe('validateSettings', () => { currentSetting: 'NUMBER_OF_DAYS', currentSettingValue: '15', days: '15', - selected: 'NUMBER_OF_DAYS' + selected: 'NUMBER_OF_DAYS', }) ).toEqual({ isChanged: false, isValid: true }); expect( @@ -73,7 +73,7 @@ describe('validateSettings', () => { currentSetting: 'NUMBER_OF_DAYS', currentSettingValue: '15', days: '13', - selected: 'NUMBER_OF_DAYS' + selected: 'NUMBER_OF_DAYS', }) ).toEqual({ isChanged: true, isValid: true }); expect( @@ -82,7 +82,7 @@ describe('validateSettings', () => { currentSetting: 'SPECIFIC_ANALYSIS', currentSettingValue: 'analysis1', days: '', - selected: 'SPECIFIC_ANALYSIS' + selected: 'SPECIFIC_ANALYSIS', }) ).toEqual({ isChanged: false, isValid: true }); expect( @@ -91,7 +91,7 @@ describe('validateSettings', () => { currentSetting: 'SPECIFIC_ANALYSIS', currentSettingValue: 'analysis1', days: '', - selected: 'SPECIFIC_ANALYSIS' + selected: 'SPECIFIC_ANALYSIS', }) ).toEqual({ isChanged: true, isValid: true }); expect( @@ -100,7 +100,7 @@ describe('validateSettings', () => { currentSettingValue: 'master', days: '', referenceBranch: 'master', - selected: 'REFERENCE_BRANCH' + selected: 'REFERENCE_BRANCH', }) ).toEqual({ isChanged: false, isValid: true }); expect( @@ -109,7 +109,7 @@ describe('validateSettings', () => { currentSettingValue: 'master', days: '', referenceBranch: '', - selected: 'REFERENCE_BRANCH' + selected: 'REFERENCE_BRANCH', }) ).toEqual({ isChanged: true, isValid: false }); }); @@ -117,21 +117,21 @@ describe('validateSettings', () => { it('should validate at project level', () => { expect(validateSetting({ days: '', overrideGeneralSetting: false })).toEqual({ isChanged: false, - isValid: true + isValid: true, }); expect(validateSetting({ days: '', overrideGeneralSetting: true })).toEqual({ isChanged: true, - isValid: false + isValid: false, }); expect( validateSetting({ currentSetting: 'PREVIOUS_VERSION', days: '', - overrideGeneralSetting: false + overrideGeneralSetting: false, }) ).toEqual({ isChanged: true, - isValid: true + isValid: true, }); }); }); diff --git a/server/sonar-web/src/main/js/apps/projectBaseline/utils.ts b/server/sonar-web/src/main/js/apps/projectBaseline/utils.ts index 4374e6812e4..672e9f9e07b 100644 --- a/server/sonar-web/src/main/js/apps/projectBaseline/utils.ts +++ b/server/sonar-web/src/main/js/apps/projectBaseline/utils.ts @@ -29,7 +29,7 @@ export function getSettingValue({ analysis, days, referenceBranch, - type + type, }: { analysis?: string; days?: string; @@ -64,7 +64,7 @@ export function validateSetting(state: { days, overrideGeneralSetting, referenceBranch = '', - selected + selected, } = state; let isChanged; diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/BranchLikeRow.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/BranchLikeRow.tsx index 50aa2dc36d9..c30df8a45cb 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/BranchLikeRow.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/BranchLikeRow.tsx @@ -26,7 +26,7 @@ import { getBranchLikeDisplayName, isBranch, isMainBranch, - isPullRequest + isPullRequest, } from '../../../helpers/branch-like'; import { translate } from '../../../helpers/l10n'; import { BranchLike } from '../../../types/branch-like'; diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/BranchLikeTable.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/BranchLikeTable.tsx index a9cb25fe99a..06cbbaef865 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/BranchLikeTable.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/BranchLikeTable.tsx @@ -73,7 +73,7 @@ export function BranchLikeTable(props: BranchLikeTableProps) { - {branchLikes.map(branchLike => ( + {branchLikes.map((branchLike) => ( - ) + ), }, { key: Tabs.PullRequest, @@ -73,8 +73,8 @@ const TABS = [ {translate('project_branch_pull_request.tabs.pull_requests')} - ) - } + ), + }, ]; export default class BranchLikeTabs extends React.PureComponent { diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/BranchPurgeSetting.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/BranchPurgeSetting.tsx index e692fa46a03..5d45e70e427 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/BranchPurgeSetting.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/BranchPurgeSetting.tsx @@ -67,7 +67,7 @@ export default class BranchPurgeSetting extends React.PureComponent const request = isPullRequest(this.props.branchLike) ? deletePullRequest({ project: this.props.component.key, - pullRequest: this.props.branchLike.key + pullRequest: this.props.branchLike.key, }) : deleteBranch({ branch: this.props.branchLike.name, - project: this.props.component.key + project: this.props.component.key, }); request.then( () => { diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/LifetimeInformation.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/LifetimeInformation.tsx index a6a0de260a4..04269fbd518 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/LifetimeInformation.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/LifetimeInformation.tsx @@ -48,11 +48,11 @@ export class LifetimeInformation extends React.PureComponent { fetchBranchAndPullRequestLifetimeSetting() { getValue({ key: SettingsKey.DaysBeforeDeletingInactiveBranchesAndPRs }).then( - settings => { + (settings) => { if (this.mounted) { this.setState({ loading: false, - branchAndPullRequestLifeTimeInDays: settings?.value + branchAndPullRequestLifeTimeInDays: settings?.value, }); } }, @@ -66,7 +66,7 @@ export class LifetimeInformation extends React.PureComponent { render() { const { - appState: { canAdmin } + appState: { canAdmin }, } = this.props; const { branchAndPullRequestLifeTimeInDays, loading } = this.state; diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/LifetimeInformationRenderer.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/LifetimeInformationRenderer.tsx index efda55587f4..5c19bb1290a 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/LifetimeInformationRenderer.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/LifetimeInformationRenderer.tsx @@ -47,7 +47,7 @@ export function LifetimeInformationRenderer(props: LifetimeInformationRendererPr defaultMessage={translate('project_branch_pull_request.lifetime_information.admin')} id="project_branch_pull_request.lifetime_information.admin" values={{ - settings: {translate('settings.page')} + settings: {translate('settings.page')}, }} /> )} diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchLikeTable-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchLikeTable-test.tsx index cfec0e87bc5..477c37b62bc 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchLikeTable-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchLikeTable-test.tsx @@ -38,11 +38,7 @@ it('should properly propagate delete event', () => { const onDelete = jest.fn(); const wrapper = shallowRender({ onDelete }); - wrapper - .find(BranchLikeRow) - .first() - .props() - .onDelete(); + wrapper.find(BranchLikeRow).first().props().onDelete(); expect(onDelete).toHaveBeenCalled(); }); @@ -52,11 +48,7 @@ it('should properly propagate rename event', () => { const onRename = jest.fn(); const wrapper = shallowRender({ onDelete, onRename }); - wrapper - .find(BranchLikeRow) - .first() - .props() - .onRename(); + wrapper.find(BranchLikeRow).first().props().onRename(); expect(onRename).toHaveBeenCalled(); }); diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchLikeTabs-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchLikeTabs-test.tsx index 7216b07cb1a..25336ae5754 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchLikeTabs-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchLikeTabs-test.tsx @@ -23,7 +23,7 @@ import BoxedTabs from '../../../../components/controls/BoxedTabs'; import { mockMainBranch, mockPullRequest, - mockSetOfBranchAndPullRequest + mockSetOfBranchAndPullRequest, } from '../../../../helpers/mocks/branch-like'; import { mockComponent } from '../../../../helpers/mocks/component'; import { BranchLikeTable } from '../BranchLikeTable'; @@ -48,28 +48,16 @@ it('should render deletion modal correctly', () => { const onBranchesChange = jest.fn(); const wrapper = shallowRender({ onBranchesChange }); - wrapper - .find(BranchLikeTable) - .props() - .onDelete(mockPullRequest()); + wrapper.find(BranchLikeTable).props().onDelete(mockPullRequest()); expect(wrapper.state().deleting).toBeDefined(); expect(wrapper.find(DeleteBranchModal)).toMatchSnapshot(); - wrapper - .find(DeleteBranchModal) - .props() - .onClose(); + wrapper.find(DeleteBranchModal).props().onClose(); expect(wrapper.state().deleting).toBeUndefined(); expect(wrapper.find(DeleteBranchModal).exists()).toBe(false); - wrapper - .find(BranchLikeTable) - .props() - .onDelete(mockPullRequest()); - wrapper - .find(DeleteBranchModal) - .props() - .onDelete(); + wrapper.find(BranchLikeTable).props().onDelete(mockPullRequest()); + wrapper.find(DeleteBranchModal).props().onDelete(); expect(wrapper.state().deleting).toBeUndefined(); expect(wrapper.find(DeleteBranchModal).exists()).toBe(false); expect(onBranchesChange).toHaveBeenCalled(); @@ -79,28 +67,16 @@ it('should render renaming modal correctly', () => { const onBranchesChange = jest.fn(); const wrapper = shallowRender({ onBranchesChange }); - wrapper - .find(BranchLikeTable) - .props() - .onRename(mockMainBranch()); + wrapper.find(BranchLikeTable).props().onRename(mockMainBranch()); expect(wrapper.state().renaming).toBeDefined(); expect(wrapper.find(RenameBranchModal)).toMatchSnapshot(); - wrapper - .find(RenameBranchModal) - .props() - .onClose(); + wrapper.find(RenameBranchModal).props().onClose(); expect(wrapper.state().renaming).toBeUndefined(); expect(wrapper.find(RenameBranchModal).exists()).toBe(false); - wrapper - .find(BranchLikeTable) - .props() - .onRename(mockMainBranch()); - wrapper - .find(RenameBranchModal) - .props() - .onRename(); + wrapper.find(BranchLikeTable).props().onRename(mockMainBranch()); + wrapper.find(RenameBranchModal).props().onRename(); expect(wrapper.state().renaming).toBeUndefined(); expect(wrapper.find(RenameBranchModal).exists()).toBe(false); expect(onBranchesChange).toHaveBeenCalled(); @@ -109,10 +85,7 @@ it('should render renaming modal correctly', () => { it('should NOT render renaming modal for non-main branch', () => { const wrapper = shallowRender(); - wrapper - .find(BranchLikeTable) - .props() - .onRename(mockPullRequest()); + wrapper.find(BranchLikeTable).props().onRename(mockPullRequest()); expect(wrapper.state().renaming).toBeDefined(); expect(wrapper.find(RenameBranchModal).exists()).toBe(false); }); @@ -121,10 +94,7 @@ it('should correctly propagate an update of purge settings', () => { const onBranchesChange = jest.fn(); const wrapper = shallowRender({ onBranchesChange }); - wrapper - .find(BranchLikeTable) - .props() - .onUpdatePurgeSetting(); + wrapper.find(BranchLikeTable).props().onUpdatePurgeSetting(); expect(onBranchesChange).toHaveBeenCalled(); }); diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchPurgeSetting-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchPurgeSetting-test.tsx index 7d0cef9078a..7184b8ce365 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchPurgeSetting-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/BranchPurgeSetting-test.tsx @@ -27,7 +27,7 @@ import { waitAndUpdate } from '../../../../helpers/testUtils'; import BranchPurgeSetting from '../BranchPurgeSetting'; jest.mock('../../../../api/branches', () => ({ - excludeBranchFromPurge: jest.fn().mockResolvedValue({}) + excludeBranchFromPurge: jest.fn().mockResolvedValue({}), })); beforeEach(() => jest.clearAllMocks()); diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx index a7f1c58ea07..698d3daeca3 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/DeleteBranchModal-test.tsx @@ -28,7 +28,7 @@ import DeleteBranchModal from '../DeleteBranchModal'; jest.mock('../../../../api/branches', () => ({ deleteBranch: jest.fn(), - deletePullRequest: jest.fn() + deletePullRequest: jest.fn(), })); const branch = mockBranch({ name: 'feature/foo' }); diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LifetimeInformation-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LifetimeInformation-test.tsx index 17d4bd8d3ad..1b9cc4c59ff 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LifetimeInformation-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LifetimeInformation-test.tsx @@ -26,7 +26,7 @@ import { SettingsKey } from '../../../../types/settings'; import { LifetimeInformation } from '../LifetimeInformation'; jest.mock('../../../../api/settings', () => ({ - getValue: jest.fn().mockResolvedValue({ value: '45' }) + getValue: jest.fn().mockResolvedValue({ value: '45' }), })); it('should render correctly', async () => { @@ -36,7 +36,7 @@ it('should render correctly', async () => { await waitAndUpdate(wrapper); expect(getValue).toHaveBeenCalledWith({ - key: SettingsKey.DaysBeforeDeletingInactiveBranchesAndPRs + key: SettingsKey.DaysBeforeDeletingInactiveBranchesAndPRs, }); expect(wrapper).toMatchSnapshot('after_fetching_data'); }); diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LifetimeInformationRenderer-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LifetimeInformationRenderer-test.tsx index 74a06dc478d..0c4a8edda71 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LifetimeInformationRenderer-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/LifetimeInformationRenderer-test.tsx @@ -21,7 +21,7 @@ import { shallow } from 'enzyme'; import * as React from 'react'; import { LifetimeInformationRenderer, - LifetimeInformationRendererProps + LifetimeInformationRendererProps, } from '../LifetimeInformationRenderer'; it('should render correctly', () => { diff --git a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/ProjectBranchesApp-test.tsx b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/ProjectBranchesApp-test.tsx index e06c159cfe1..cba7e8c2440 100644 --- a/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/ProjectBranchesApp-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectBranches/components/__tests__/ProjectBranchesApp-test.tsx @@ -33,10 +33,7 @@ it('should properly notify that a branch or a pr has been changed/deleted', () = const onBranchesChange = jest.fn(); const wrapper = shallowRender({ onBranchesChange }); - wrapper - .find(BranchLikeTabs) - .props() - .onBranchesChange(); + wrapper.find(BranchLikeTabs).props().onBranchesChange(); expect(onBranchesChange).toHaveBeenCalled(); }); diff --git a/server/sonar-web/src/main/js/apps/projectDeletion/Form.tsx b/server/sonar-web/src/main/js/apps/projectDeletion/Form.tsx index c087dddab94..9dee6a5a1e0 100644 --- a/server/sonar-web/src/main/js/apps/projectDeletion/Form.tsx +++ b/server/sonar-web/src/main/js/apps/projectDeletion/Form.tsx @@ -64,7 +64,8 @@ export class Form extends React.PureComponent { component.name )} modalHeader={translate('qualifier.delete', component.qualifier)} - onConfirm={this.handleDelete}> + onConfirm={this.handleDelete} + > {({ onClick }) => (
        diff --git a/server/sonar-web/src/main/js/apps/projectKey/__tests__/Key-test.tsx b/server/sonar-web/src/main/js/apps/projectKey/__tests__/Key-test.tsx index d7273ccb654..1f4ae76ad92 100644 --- a/server/sonar-web/src/main/js/apps/projectKey/__tests__/Key-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectKey/__tests__/Key-test.tsx @@ -24,7 +24,7 @@ import { mockComponent } from '../../../helpers/mocks/component'; import { Key } from '../Key'; jest.mock('../../../api/components', () => ({ - changeKey: jest.fn().mockResolvedValue(undefined) + changeKey: jest.fn().mockResolvedValue(undefined), })); it('should render and change key', async () => { @@ -39,6 +39,6 @@ it('should render and change key', async () => { expect(changeKey).toHaveBeenCalledWith({ from: 'foo', to: 'bar' }); expect(withRouterProps.router.replace).toHaveBeenCalledWith({ pathname: '/project/key', - query: { id: 'bar' } + query: { id: 'bar' }, }); }); diff --git a/server/sonar-web/src/main/js/apps/projectKey/__tests__/UpdateForm-test.tsx b/server/sonar-web/src/main/js/apps/projectKey/__tests__/UpdateForm-test.tsx index d34022f1cda..1204ecffe31 100644 --- a/server/sonar-web/src/main/js/apps/projectKey/__tests__/UpdateForm-test.tsx +++ b/server/sonar-web/src/main/js/apps/projectKey/__tests__/UpdateForm-test.tsx @@ -69,20 +69,12 @@ function expectButtonDisabled( button: React.ComponentType<{ disabled?: boolean }> ) { // eslint-disable-next-line jest/valid-expect - return expect( - getForm(wrapper) - .find(button) - .props().disabled - ); + return expect(getForm(wrapper).find(button).props().disabled); } function expectProjectKeyInputValue(wrapper: ShallowWrapper) { // eslint-disable-next-line jest/valid-expect - return expect( - getForm(wrapper) - .find(ProjectKeyInput) - .props().projectKey - ); + return expect(getForm(wrapper).find(ProjectKeyInput).props().projectKey); } function changeInput(wrapper: ShallowWrapper, value: string) { diff --git a/server/sonar-web/src/main/js/apps/projectLinks/App.tsx b/server/sonar-web/src/main/js/apps/projectLinks/App.tsx index c70f6a1648e..0663c9a24cf 100644 --- a/server/sonar-web/src/main/js/apps/projectLinks/App.tsx +++ b/server/sonar-web/src/main/js/apps/projectLinks/App.tsx @@ -58,7 +58,7 @@ export class App extends React.PureComponent { fetchLinks = () => { this.setState({ loading: true }); getProjectLinks(this.props.component.key).then( - links => { + (links) => { if (this.mounted) { this.setState({ links, loading: false }); } @@ -72,10 +72,10 @@ export class App extends React.PureComponent { }; handleCreateLink = (name: string, url: string) => { - return createLink({ name, projectKey: this.props.component.key, url }).then(link => { + return createLink({ name, projectKey: this.props.component.key, url }).then((link) => { if (this.mounted) { this.setState(({ links = [] }) => ({ - links: [...links, link] + links: [...links, link], })); } }); @@ -85,7 +85,7 @@ export class App extends React.PureComponent { return deleteLink(linkId).then(() => { if (this.mounted) { this.setState(({ links = [] }) => ({ - links: links.filter(link => link.id !== linkId) + links: links.filter((link) => link.id !== linkId), })); } }); diff --git a/server/sonar-web/src/main/js/apps/projectLinks/CreationModal.tsx b/server/sonar-web/src/main/js/apps/projectLinks/CreationModal.tsx index 86680aa647d..864073f25e9 100644 --- a/server/sonar-web/src/main/js/apps/projectLinks/CreationModal.tsx +++ b/server/sonar-web/src/main/js/apps/projectLinks/CreationModal.tsx @@ -58,7 +58,8 @@ export default class CreationModal extends React.PureComponent { header={header} onClose={this.props.onClose} onSubmit={this.handleSubmit} - size="small"> + size="small" + > {({ onCloseClick, onFormSubmit, submitting }) => (
        diff --git a/server/sonar-web/src/main/js/apps/projectLinks/LinkRow.tsx b/server/sonar-web/src/main/js/apps/projectLinks/LinkRow.tsx index 92ffdfe5690..9f26caa517f 100644 --- a/server/sonar-web/src/main/js/apps/projectLinks/LinkRow.tsx +++ b/server/sonar-web/src/main/js/apps/projectLinks/LinkRow.tsx @@ -76,7 +76,8 @@ export default class LinkRow extends React.PureComponent { link.name! )} modalHeader={translate('project_links.delete_project_link')} - onConfirm={this.props.onDelete}> + onConfirm={this.props.onDelete} + > {({ onClick }) => (