From 361d9c3e6c2f2dbf10b1412789bed2095f25edcc Mon Sep 17 00:00:00 2001 From: Stas Vilchik Date: Tue, 29 Aug 2017 13:05:49 +0200 Subject: [PATCH] rewrite projects app --- .../js/app/components/search/SearchResult.js | 2 +- .../GraphsTooltipsContentIssues-test.js.snap | 1 - .../js/apps/projects/__tests__/utils-test.ts | 40 ++ .../{AllProjects.js => AllProjects.tsx} | 83 +-- ...tsContainer.js => AllProjectsContainer.ts} | 3 +- ...ageSelector.js => DefaultPageSelector.tsx} | 50 +- .../{EmptyInstance.js => EmptyInstance.tsx} | 2 +- .../{FavoriteFilter.js => FavoriteFilter.tsx} | 23 +- ...ntainer.js => FavoriteFilterContainer.tsx} | 4 +- ...tainer.js => FavoriteProjectsContainer.ts} | 5 +- ...riteProjects.js => NoFavoriteProjects.tsx} | 2 +- .../{PageHeader.js => PageHeader.tsx} | 93 ++- ...derContainer.js => PageHeaderContainer.ts} | 4 +- .../{PageSidebar.js => PageSidebar.tsx} | 29 +- ...pectiveSelect.js => PerspectiveSelect.tsx} | 58 +- ...tOption.js => PerspectiveSelectOption.tsx} | 36 +- ...dContainer.js => ProjectCardContainer.tsx} | 26 +- .../components/ProjectCardLanguages.js | 75 --- .../components/ProjectCardLanguages.tsx | 73 +++ .../ProjectCardLanguagesContainer.ts | 28 + ...ProjectCardLeak.js => ProjectCardLeak.tsx} | 51 +- ...easures.js => ProjectCardLeakMeasures.tsx} | 15 +- ...tCardOverall.js => ProjectCardOverall.tsx} | 49 +- ...ures.js => ProjectCardOverallMeasures.tsx} | 21 +- ...lityGate.js => ProjectCardQualityGate.tsx} | 9 +- .../{ProjectsList.js => ProjectsList.tsx} | 25 +- ...tContainer.js => ProjectsListContainer.ts} | 6 +- ...iner.js => ProjectsListFooterContainer.ts} | 8 +- ...ingSelect.js => ProjectsSortingSelect.tsx} | 80 +-- ...ion.js => ProjectsSortingSelectOption.tsx} | 39 +- .../components/__tests__/AllProjects-test.tsx | 180 ++++++ .../__tests__/DefaultPageSelector-test.tsx | 89 +++ .../__tests__/EmptyInstance-test.tsx | 26 + .../__tests__/FavoriteFilter-test.tsx | 69 ++ .../__tests__/NoFavoriteProjects-test.tsx | 26 + ...PageHeader-test.js => PageHeader-test.tsx} | 79 ++- ...geSidebar-test.js => PageSidebar-test.tsx} | 2 +- ...ect-test.js => PerspectiveSelect-test.tsx} | 16 +- .../PerspectiveSelectOption-test.tsx | 80 +++ .../__tests__/ProjectCardLanguages-test.tsx | 53 ++ ...dLeak-test.js => ProjectCardLeak-test.tsx} | 20 +- ...st.js => ProjectCardLeakMeasures-test.tsx} | 47 +- ...ll-test.js => ProjectCardOverall-test.tsx} | 10 +- ...js => ProjectCardOverallMeasures-test.tsx} | 2 +- .../__tests__/ProjectCardQualityGate-test.tsx | 30 + .../__tests__/ProjectsList-test.tsx | 48 ++ ...test.js => ProjectsSortingSelect-test.tsx} | 50 +- .../ProjectsSortingSelectOption-test.tsx | 80 +++ .../__snapshots__/AllProjects-test.tsx.snap | 155 +++++ .../__snapshots__/EmptyInstance-test.tsx.snap | 11 + .../FavoriteFilter-test.tsx.snap | 93 +++ .../NoFavoriteProjects-test.tsx.snap | 28 + ...-test.js.snap => PageHeader-test.tsx.snap} | 31 +- ...test.js.snap => PageSidebar-test.tsx.snap} | 12 +- ...s.snap => PerspectiveSelect-test.tsx.snap} | 0 ... => PerspectiveSelectOption-test.tsx.snap} | 0 .../ProjectCardLanguages-test.tsx.snap | 107 ++++ ....js.snap => ProjectCardLeak-test.tsx.snap} | 2 +- ... => ProjectCardLeakMeasures-test.tsx.snap} | 12 - ....snap => ProjectCardOverall-test.tsx.snap} | 2 +- ... ProjectCardOverallMeasures-test.tsx.snap} | 14 - .../ProjectCardQualityGate-test.tsx.snap | 23 + .../__snapshots__/ProjectsList-test.tsx.snap | 42 ++ ...ap => ProjectsSortingSelect-test.tsx.snap} | 0 .../ProjectsSortingSelectOption-test.tsx.snap | 25 + .../apps/projects/filters/CoverageFilter.js | 84 --- .../apps/projects/filters/CoverageFilter.tsx | 80 +++ .../projects/filters/DuplicationsFilter.js | 87 --- .../projects/filters/DuplicationsFilter.tsx | 82 +++ .../filters/{Filter.js => Filter.tsx} | 86 +-- ...{FilterContainer.js => FilterContainer.ts} | 5 +- .../js/apps/projects/filters/FilterHeader.tsx | 34 + .../js/apps/projects/filters/IssuesFilter.js | 72 --- .../js/apps/projects/filters/IssuesFilter.tsx | 70 ++ ...LanguagesFilter.js => LanguagesFilter.tsx} | 71 +-- ...ntainer.js => LanguagesFilterContainer.ts} | 5 +- ...ityFilter.js => MaintainabilityFilter.tsx} | 12 +- ...overageFilter.js => NewCoverageFilter.tsx} | 6 +- ...onsFilter.js => NewDuplicationsFilter.tsx} | 6 +- .../apps/projects/filters/NewLinesFilter.js | 71 --- .../apps/projects/filters/NewLinesFilter.tsx | 61 ++ ...Filter.js => NewMaintainabilityFilter.tsx} | 11 +- ...lityFilter.js => NewReliabilityFilter.tsx} | 11 +- ...ecurityFilter.js => NewSecurityFilter.tsx} | 11 +- ...ityGateFilter.js => QualityGateFilter.tsx} | 55 +- ...abilityFilter.js => ReliabilityFilter.tsx} | 12 +- .../{SearchFilter.js => SearchFilter.tsx} | 49 +- ...Container.js => SearchFilterContainer.tsx} | 41 +- ...erFooter.js => SearchableFilterFooter.tsx} | 47 +- .../filters/SearchableFilterOption.js | 34 - ...erHeader.js => SearchableFilterOption.tsx} | 28 +- .../{SecurityFilter.js => SecurityFilter.tsx} | 12 +- .../js/apps/projects/filters/SizeFilter.js | 77 --- .../js/apps/projects/filters/SizeFilter.tsx | 67 ++ .../filters/{TagsFilter.js => TagsFilter.tsx} | 99 ++- ...terContainer.js => TagsFilterContainer.ts} | 5 +- .../filters/__tests__/CoverageFilter-test.tsx | 38 ++ .../__tests__/DuplicationsFilter-test.tsx | 39 ++ .../filters/__tests__/Filter-test.tsx | 73 +++ .../filters/__tests__/FilterHeader-test.tsx | 36 ++ .../filters/__tests__/IssuesFilter-test.tsx | 33 + ...ilter-test.js => LanguagesFilter-test.tsx} | 43 +- .../__tests__/MaintainabilityFilter-test.tsx | 26 + .../__tests__/NewCoverageFilter-test.tsx | 26 + .../__tests__/NewDuplicationsFilter-test.tsx | 26 + .../filters/__tests__/NewLinesFilter-test.tsx | 44 ++ .../NewMaintainabilityFilter-test.tsx | 26 + .../__tests__/NewReliabilityFilter-test.tsx | 26 + .../__tests__/NewSecurityFilter-test.tsx | 26 + .../__tests__/QualityGateFilter-test.tsx | 33 + .../__tests__/ReliabilityFilter-test.tsx | 26 + ...chFilter-test.js => SearchFilter-test.tsx} | 27 +- .../__tests__/SearchFilterContainer-test.tsx | 37 ++ ...est.js => SearchableFilterFooter-test.tsx} | 47 +- .../__tests__/SearchableFilterOption-test.tsx | 29 + .../filters/__tests__/SecurityFilter-test.tsx | 26 + .../filters/__tests__/SizeFilter-test.tsx | 44 ++ ...TagsFilter-test.js => TagsFilter-test.tsx} | 9 +- .../CoverageFilter-test.tsx.snap | 42 ++ .../DuplicationsFilter-test.tsx.snap | 56 ++ .../__snapshots__/Filter-test.tsx.snap | 596 ++++++++++++++++++ .../__snapshots__/FilterHeader-test.tsx.snap | 18 + .../__snapshots__/IssuesFilter-test.tsx.snap | 39 ++ ....js.snap => LanguagesFilter-test.tsx.snap} | 23 - .../MaintainabilityFilter-test.tsx.snap | 9 + .../NewCoverageFilter-test.tsx.snap | 9 + .../NewDuplicationsFilter-test.tsx.snap | 9 + .../NewLinesFilter-test.tsx.snap | 32 + .../NewMaintainabilityFilter-test.tsx.snap | 22 + .../NewReliabilityFilter-test.tsx.snap | 22 + .../NewSecurityFilter-test.tsx.snap | 22 + .../QualityGateFilter-test.tsx.snap | 30 + .../ReliabilityFilter-test.tsx.snap | 9 + ...est.js.snap => SearchFilter-test.tsx.snap} | 0 .../SearchFilterContainer-test.tsx.snap | 8 + .../SearchableFilterFooter-test.js.snap | 131 ---- .../SearchableFilterFooter-test.tsx.snap | 18 + .../SearchableFilterOption-test.tsx.snap | 13 + .../SecurityFilter-test.tsx.snap | 9 + .../__snapshots__/SizeFilter-test.tsx.snap | 40 ++ ...-test.js.snap => TagsFilter-test.tsx.snap} | 29 - .../projects/filters/__tests__/utils-test.ts | 54 ++ .../projects/filters/{utils.js => utils.ts} | 13 +- .../src/main/js/apps/projects/types.ts | 25 + .../js/apps/projects/{utils.js => utils.ts} | 18 +- .../{Duplications.js => Coverage.tsx} | 30 +- .../{Coverage.js => Duplications.tsx} | 30 +- ...Maintainability.js => Maintainability.tsx} | 31 +- .../{Reliability.js => Reliability.tsx} | 31 +- .../visualizations/{Risk.js => Risk.tsx} | 58 +- .../apps/projects/visualizations/Security.tsx | 39 ++ ...leBubbleChart.js => SimpleBubbleChart.tsx} | 65 +- .../{Visualizations.js => Visualizations.tsx} | 28 +- ...ontainer.js => VisualizationsContainer.ts} | 6 +- .../__tests__/Coverage-test.tsx | 26 + .../__tests__/Duplications-test.tsx | 26 + .../__tests__/Maintainability-test.tsx | 26 + .../__tests__/Reliability-test.tsx | 26 + .../visualizations/__tests__/Risk-test.tsx | 31 + .../__tests__/Security-test.tsx | 26 + .../SimpleBubbleChart-test.tsx} | 36 +- .../__tests__/Visualizations-test.tsx} | 28 +- .../__snapshots__/Coverage-test.tsx.snap | 32 + .../__snapshots__/Duplications-test.tsx.snap | 26 + .../Maintainability-test.tsx.snap | 27 + .../__snapshots__/Reliability-test.tsx.snap | 27 + .../__snapshots__/Risk-test.tsx.snap | 77 +++ .../__snapshots__/Security-test.tsx.snap | 27 + .../SimpleBubbleChart-test.tsx.snap | 71 +++ .../Visualizations-test.tsx.snap | 50 ++ .../charts/BubbleChart.d.ts} | 44 +- .../{EmptySearch.js => EmptySearch.tsx} | 19 +- .../common/__tests__/EmptySearch-test.tsx | 26 + .../__snapshots__/EmptySearch-test.tsx.snap | 16 + .../js/components/controls/FavoriteBase.js | 2 +- ...Stateless.js => FavoriteBaseStateless.tsx} | 25 +- ...oriteContainer.js => FavoriteContainer.ts} | 8 +- .../__tests__/FavoriteBaseStateless-test.tsx | 53 ++ .../FavoriteBaseStateless-test.tsx.snap | 13 + .../FavoriteIcon.tsx} | 33 +- .../measure/{Measure.js => Measure.tsx} | 28 +- .../measure/__tests__/Measure-test.tsx | 65 ++ .../__snapshots__/Measure-test.tsx.snap | 38 ++ .../components/measure/{utils.js => utils.ts} | 36 +- .../{Organization.js => Organization.tsx} | 72 +-- ...nization-test.js => Organization-test.tsx} | 2 +- ...est.js.snap => Organization-test.tsx.snap} | 0 .../src/main/js/components/tags/TagsList.js | 53 -- .../src/main/js/components/tags/TagsList.tsx | 41 ++ .../{TagsList-test.js => TagsList-test.tsx} | 8 +- .../main/js/components/ui/CoverageRating.js | 70 -- .../main/js/components/ui/CoverageRating.tsx | 48 ++ .../js/components/ui/DuplicationsRating.js | 55 -- .../js/components/ui/DuplicationsRating.tsx | 45 ++ ...ganizationLink.js => OrganizationLink.tsx} | 18 +- .../src/main/js/components/ui/Rating.js | 58 -- .../src/main/js/components/ui/Rating.tsx | 45 ++ .../src/main/js/components/ui/SizeRating.js | 66 -- .../src/main/js/components/ui/SizeRating.tsx | 55 ++ .../ui/__tests__/OrganizationLink-test.tsx | 26 + .../OrganizationLink-test.tsx.snap | 9 + 201 files changed, 5591 insertions(+), 2197 deletions(-) create mode 100644 server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts rename server/sonar-web/src/main/js/apps/projects/components/{AllProjects.js => AllProjects.tsx} (79%) rename server/sonar-web/src/main/js/apps/projects/components/{AllProjectsContainer.js => AllProjectsContainer.ts} (89%) rename server/sonar-web/src/main/js/apps/projects/components/{DefaultPageSelector.js => DefaultPageSelector.tsx} (80%) rename server/sonar-web/src/main/js/apps/projects/components/{EmptyInstance.js => EmptyInstance.tsx} (97%) rename server/sonar-web/src/main/js/apps/projects/components/{FavoriteFilter.js => FavoriteFilter.tsx} (88%) rename server/sonar-web/src/main/js/apps/projects/components/{FavoriteFilterContainer.js => FavoriteFilterContainer.tsx} (89%) rename server/sonar-web/src/main/js/apps/projects/components/{FavoriteProjectsContainer.js => FavoriteProjectsContainer.ts} (86%) rename server/sonar-web/src/main/js/apps/projects/components/{NoFavoriteProjects.js => NoFavoriteProjects.tsx} (97%) rename server/sonar-web/src/main/js/apps/projects/components/{PageHeader.js => PageHeader.tsx} (65%) rename server/sonar-web/src/main/js/apps/projects/components/{PageHeaderContainer.js => PageHeaderContainer.ts} (90%) rename server/sonar-web/src/main/js/apps/projects/components/{PageSidebar.js => PageSidebar.tsx} (90%) rename server/sonar-web/src/main/js/apps/projects/components/{PerspectiveSelect.js => PerspectiveSelect.tsx} (77%) rename server/sonar-web/src/main/js/apps/projects/components/{PerspectiveSelectOption.js => PerspectiveSelectOption.tsx} (75%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectCardContainer.js => ProjectCardContainer.tsx} (71%) delete mode 100644 server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguages.js create mode 100644 server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguages.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/components/ProjectCardLanguagesContainer.ts rename server/sonar-web/src/main/js/apps/projects/components/{ProjectCardLeak.js => ProjectCardLeak.tsx} (83%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectCardLeakMeasures.js => ProjectCardLeakMeasures.tsx} (96%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectCardOverall.js => ProjectCardOverall.tsx} (82%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectCardOverallMeasures.js => ProjectCardOverallMeasures.tsx} (92%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectCardQualityGate.js => ProjectCardQualityGate.tsx} (91%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectsList.js => ProjectsList.tsx} (85%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectsListContainer.js => ProjectsListContainer.ts} (90%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectsListFooterContainer.js => ProjectsListFooterContainer.ts} (84%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectsSortingSelect.js => ProjectsSortingSelect.tsx} (61%) rename server/sonar-web/src/main/js/apps/projects/components/{ProjectsSortingSelectOption.js => ProjectsSortingSelectOption.tsx} (70%) create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/AllProjects-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/DefaultPageSelector-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/EmptyInstance-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/FavoriteFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/NoFavoriteProjects-test.tsx rename server/sonar-web/src/main/js/apps/projects/components/__tests__/{PageHeader-test.js => PageHeader-test.tsx} (57%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/{PageSidebar-test.js => PageSidebar-test.tsx} (98%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/{PerspectiveSelect-test.js => PerspectiveSelect-test.tsx} (71%) create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/PerspectiveSelectOption-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardLanguages-test.tsx rename server/sonar-web/src/main/js/apps/projects/components/__tests__/{ProjectCardLeak-test.js => ProjectCardLeak-test.tsx} (78%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/{ProjectCardLeakMeasures-test.js => ProjectCardLeakMeasures-test.tsx} (65%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/{ProjectCardOverall-test.js => ProjectCardOverall-test.tsx} (90%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/{ProjectCardOverallMeasures-test.js => ProjectCardOverallMeasures-test.tsx} (98%) create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectCardQualityGate-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectsList-test.tsx rename server/sonar-web/src/main/js/apps/projects/components/__tests__/{ProjectsSortingSelect-test.js => ProjectsSortingSelect-test.tsx} (54%) create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/ProjectsSortingSelectOption-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/AllProjects-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/EmptyInstance-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/FavoriteFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/NoFavoriteProjects-test.tsx.snap rename server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/{PageHeader-test.js.snap => PageHeader-test.tsx.snap} (82%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/{PageSidebar-test.js.snap => PageSidebar-test.tsx.snap} (93%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/{PerspectiveSelect-test.js.snap => PerspectiveSelect-test.tsx.snap} (100%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/{PerspectiveSelectOption-test.js.snap => PerspectiveSelectOption-test.tsx.snap} (100%) create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardLanguages-test.tsx.snap rename server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/{ProjectCardLeak-test.js.snap => ProjectCardLeak-test.tsx.snap} (97%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/{ProjectCardLeakMeasures-test.js.snap => ProjectCardLeakMeasures-test.tsx.snap} (96%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/{ProjectCardOverall-test.js.snap => ProjectCardOverall-test.tsx.snap} (97%) rename server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/{ProjectCardOverallMeasures-test.js.snap => ProjectCardOverallMeasures-test.tsx.snap} (94%) create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectCardQualityGate-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectsList-test.tsx.snap rename server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/{ProjectsSortingSelect-test.js.snap => ProjectsSortingSelect-test.tsx.snap} (100%) create mode 100644 server/sonar-web/src/main/js/apps/projects/components/__tests__/__snapshots__/ProjectsSortingSelectOption-test.tsx.snap delete mode 100644 server/sonar-web/src/main/js/apps/projects/filters/CoverageFilter.js create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/CoverageFilter.tsx delete mode 100644 server/sonar-web/src/main/js/apps/projects/filters/DuplicationsFilter.js create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/DuplicationsFilter.tsx rename server/sonar-web/src/main/js/apps/projects/filters/{Filter.js => Filter.tsx} (76%) rename server/sonar-web/src/main/js/apps/projects/filters/{FilterContainer.js => FilterContainer.ts} (90%) create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/FilterHeader.tsx delete mode 100644 server/sonar-web/src/main/js/apps/projects/filters/IssuesFilter.js create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/IssuesFilter.tsx rename server/sonar-web/src/main/js/apps/projects/filters/{LanguagesFilter.js => LanguagesFilter.tsx} (64%) rename server/sonar-web/src/main/js/apps/projects/filters/{LanguagesFilterContainer.js => LanguagesFilterContainer.ts} (88%) rename server/sonar-web/src/main/js/apps/projects/filters/{MaintainabilityFilter.js => MaintainabilityFilter.tsx} (78%) rename server/sonar-web/src/main/js/apps/projects/filters/{NewCoverageFilter.js => NewCoverageFilter.tsx} (86%) rename server/sonar-web/src/main/js/apps/projects/filters/{NewDuplicationsFilter.js => NewDuplicationsFilter.tsx} (85%) delete mode 100644 server/sonar-web/src/main/js/apps/projects/filters/NewLinesFilter.js create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/NewLinesFilter.tsx rename server/sonar-web/src/main/js/apps/projects/filters/{NewMaintainabilityFilter.js => NewMaintainabilityFilter.tsx} (86%) rename server/sonar-web/src/main/js/apps/projects/filters/{NewReliabilityFilter.js => NewReliabilityFilter.tsx} (85%) rename server/sonar-web/src/main/js/apps/projects/filters/{NewSecurityFilter.js => NewSecurityFilter.tsx} (86%) rename server/sonar-web/src/main/js/apps/projects/filters/{QualityGateFilter.js => QualityGateFilter.tsx} (53%) rename server/sonar-web/src/main/js/apps/projects/filters/{ReliabilityFilter.js => ReliabilityFilter.tsx} (79%) rename server/sonar-web/src/main/js/apps/projects/filters/{SearchFilter.js => SearchFilter.tsx} (68%) rename server/sonar-web/src/main/js/apps/projects/filters/{SearchFilterContainer.js => SearchFilterContainer.tsx} (62%) rename server/sonar-web/src/main/js/apps/projects/filters/{SearchableFilterFooter.js => SearchableFilterFooter.tsx} (75%) delete mode 100644 server/sonar-web/src/main/js/apps/projects/filters/SearchableFilterOption.js rename server/sonar-web/src/main/js/apps/projects/filters/{FilterHeader.js => SearchableFilterOption.tsx} (69%) rename server/sonar-web/src/main/js/apps/projects/filters/{SecurityFilter.js => SecurityFilter.tsx} (79%) delete mode 100644 server/sonar-web/src/main/js/apps/projects/filters/SizeFilter.js create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/SizeFilter.tsx rename server/sonar-web/src/main/js/apps/projects/filters/{TagsFilter.js => TagsFilter.tsx} (63%) rename server/sonar-web/src/main/js/apps/projects/filters/{TagsFilterContainer.js => TagsFilterContainer.ts} (88%) create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/CoverageFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/DuplicationsFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/Filter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/FilterHeader-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/IssuesFilter-test.tsx rename server/sonar-web/src/main/js/apps/projects/filters/__tests__/{LanguagesFilter-test.js => LanguagesFilter-test.tsx} (80%) create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/MaintainabilityFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/NewCoverageFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/NewDuplicationsFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/NewLinesFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/NewMaintainabilityFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/NewReliabilityFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/NewSecurityFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/QualityGateFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/ReliabilityFilter-test.tsx rename server/sonar-web/src/main/js/apps/projects/filters/__tests__/{SearchFilter-test.js => SearchFilter-test.tsx} (57%) create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/SearchFilterContainer-test.tsx rename server/sonar-web/src/main/js/apps/projects/filters/__tests__/{SearchableFilterFooter-test.js => SearchableFilterFooter-test.tsx} (57%) create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/SearchableFilterOption-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/SecurityFilter-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/SizeFilter-test.tsx rename server/sonar-web/src/main/js/apps/projects/filters/__tests__/{TagsFilter-test.js => TagsFilter-test.tsx} (89%) create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/CoverageFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/DuplicationsFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/Filter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/FilterHeader-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/IssuesFilter-test.tsx.snap rename server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/{LanguagesFilter-test.js.snap => LanguagesFilter-test.tsx.snap} (94%) create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/MaintainabilityFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/NewCoverageFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/NewDuplicationsFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/NewLinesFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/NewMaintainabilityFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/NewReliabilityFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/NewSecurityFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/QualityGateFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/ReliabilityFilter-test.tsx.snap rename server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/{SearchFilter-test.js.snap => SearchFilter-test.tsx.snap} (100%) create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/SearchFilterContainer-test.tsx.snap delete mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/SearchableFilterFooter-test.js.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/SearchableFilterFooter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/SearchableFilterOption-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/SecurityFilter-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/SizeFilter-test.tsx.snap rename server/sonar-web/src/main/js/apps/projects/filters/__tests__/__snapshots__/{TagsFilter-test.js.snap => TagsFilter-test.tsx.snap} (93%) create mode 100644 server/sonar-web/src/main/js/apps/projects/filters/__tests__/utils-test.ts rename server/sonar-web/src/main/js/apps/projects/filters/{utils.js => utils.ts} (80%) create mode 100644 server/sonar-web/src/main/js/apps/projects/types.ts rename server/sonar-web/src/main/js/apps/projects/{utils.js => utils.ts} (86%) rename server/sonar-web/src/main/js/apps/projects/visualizations/{Duplications.js => Coverage.tsx} (66%) rename server/sonar-web/src/main/js/apps/projects/visualizations/{Coverage.js => Duplications.tsx} (67%) rename server/sonar-web/src/main/js/apps/projects/visualizations/{Maintainability.js => Maintainability.tsx} (65%) rename server/sonar-web/src/main/js/apps/projects/visualizations/{Reliability.js => Reliability.tsx} (64%) rename server/sonar-web/src/main/js/apps/projects/visualizations/{Risk.js => Risk.tsx} (81%) create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/Security.tsx rename server/sonar-web/src/main/js/apps/projects/visualizations/{SimpleBubbleChart.js => SimpleBubbleChart.tsx} (80%) rename server/sonar-web/src/main/js/apps/projects/visualizations/{Visualizations.js => Visualizations.tsx} (85%) rename server/sonar-web/src/main/js/apps/projects/visualizations/{VisualizationsContainer.js => VisualizationsContainer.ts} (89%) create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/Coverage-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/Duplications-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/Maintainability-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/Reliability-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/Risk-test.tsx create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/Security-test.tsx rename server/sonar-web/src/main/js/apps/projects/visualizations/{Security.js => __tests__/SimpleBubbleChart-test.tsx} (56%) rename server/sonar-web/src/main/js/apps/projects/{components/__tests__/PerspectiveSelectOption-test.js => visualizations/__tests__/Visualizations-test.tsx} (59%) create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/__snapshots__/Coverage-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/__snapshots__/Duplications-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/__snapshots__/Maintainability-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/__snapshots__/Reliability-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/__snapshots__/Risk-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/__snapshots__/Security-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/__snapshots__/SimpleBubbleChart-test.tsx.snap create mode 100644 server/sonar-web/src/main/js/apps/projects/visualizations/__tests__/__snapshots__/Visualizations-test.tsx.snap rename server/sonar-web/src/main/js/{apps/projects/components/ProjectsListFooter.js => components/charts/BubbleChart.d.ts} (51%) rename server/sonar-web/src/main/js/components/common/{EmptySearch.js => EmptySearch.tsx} (78%) create mode 100644 server/sonar-web/src/main/js/components/common/__tests__/EmptySearch-test.tsx create mode 100644 server/sonar-web/src/main/js/components/common/__tests__/__snapshots__/EmptySearch-test.tsx.snap rename server/sonar-web/src/main/js/components/controls/{FavoriteBaseStateless.js => FavoriteBaseStateless.tsx} (76%) rename server/sonar-web/src/main/js/components/controls/{FavoriteContainer.js => FavoriteContainer.ts} (88%) create mode 100644 server/sonar-web/src/main/js/components/controls/__tests__/FavoriteBaseStateless-test.tsx create mode 100644 server/sonar-web/src/main/js/components/controls/__tests__/__snapshots__/FavoriteBaseStateless-test.tsx.snap rename server/sonar-web/src/main/js/components/{common/FavoriteIcon.js => icons-components/FavoriteIcon.tsx} (77%) rename server/sonar-web/src/main/js/components/measure/{Measure.js => Measure.tsx} (81%) create mode 100644 server/sonar-web/src/main/js/components/measure/__tests__/Measure-test.tsx create mode 100644 server/sonar-web/src/main/js/components/measure/__tests__/__snapshots__/Measure-test.tsx.snap rename server/sonar-web/src/main/js/components/measure/{utils.js => utils.ts} (69%) rename server/sonar-web/src/main/js/components/shared/{Organization.js => Organization.tsx} (55%) rename server/sonar-web/src/main/js/components/shared/__tests__/{Organization-test.js => Organization-test.tsx} (97%) rename server/sonar-web/src/main/js/components/shared/__tests__/__snapshots__/{Organization-test.js.snap => Organization-test.tsx.snap} (100%) delete mode 100644 server/sonar-web/src/main/js/components/tags/TagsList.js create mode 100644 server/sonar-web/src/main/js/components/tags/TagsList.tsx rename server/sonar-web/src/main/js/components/tags/__tests__/{TagsList-test.js => TagsList-test.tsx} (91%) delete mode 100644 server/sonar-web/src/main/js/components/ui/CoverageRating.js create mode 100644 server/sonar-web/src/main/js/components/ui/CoverageRating.tsx delete mode 100644 server/sonar-web/src/main/js/components/ui/DuplicationsRating.js create mode 100644 server/sonar-web/src/main/js/components/ui/DuplicationsRating.tsx rename server/sonar-web/src/main/js/components/ui/{OrganizationLink.js => OrganizationLink.tsx} (84%) delete mode 100644 server/sonar-web/src/main/js/components/ui/Rating.js create mode 100644 server/sonar-web/src/main/js/components/ui/Rating.tsx delete mode 100644 server/sonar-web/src/main/js/components/ui/SizeRating.js create mode 100644 server/sonar-web/src/main/js/components/ui/SizeRating.tsx create mode 100644 server/sonar-web/src/main/js/components/ui/__tests__/OrganizationLink-test.tsx create mode 100644 server/sonar-web/src/main/js/components/ui/__tests__/__snapshots__/OrganizationLink-test.tsx.snap diff --git a/server/sonar-web/src/main/js/app/components/search/SearchResult.js b/server/sonar-web/src/main/js/app/components/search/SearchResult.js index 7b91a192bc9..0070873b0a9 100644 --- a/server/sonar-web/src/main/js/app/components/search/SearchResult.js +++ b/server/sonar-web/src/main/js/app/components/search/SearchResult.js @@ -21,7 +21,7 @@ import React from 'react'; import { Link } from 'react-router'; /*:: import type { Component } from './utils'; */ -import FavoriteIcon from '../../../components/common/FavoriteIcon'; +import FavoriteIcon from '../../../components/icons-components/FavoriteIcon'; import QualifierIcon from '../../../components/shared/QualifierIcon'; import ClockIcon from '../../../components/common/ClockIcon'; import Tooltip from '../../../components/controls/Tooltip'; diff --git a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/__snapshots__/GraphsTooltipsContentIssues-test.js.snap b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/__snapshots__/GraphsTooltipsContentIssues-test.js.snap index 3372a582f53..91f9b47f6f5 100644 --- a/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/__snapshots__/GraphsTooltipsContentIssues-test.js.snap +++ b/server/sonar-web/src/main/js/apps/projectActivity/components/__tests__/__snapshots__/GraphsTooltipsContentIssues-test.js.snap @@ -21,7 +21,6 @@ exports[`should render correctly 1`] = ` diff --git a/server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts b/server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts new file mode 100644 index 00000000000..d48601e76ba --- /dev/null +++ b/server/sonar-web/src/main/js/apps/projects/__tests__/utils-test.ts @@ -0,0 +1,40 @@ +/* + * SonarQube + * Copyright (C) 2009-2016 SonarSource SA + * mailto:contact AT sonarsource DOT com + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ +import * as utils from '../utils'; + +describe('localizeSorting', () => { + it('localizes default sorting', () => { + expect(utils.localizeSorting()).toBe('projects.sort.name'); + }); + + it('localizes custom sorting', () => { + expect(utils.localizeSorting('size')).toBe('projects.sort.size'); + }); +}); + +describe('parseSorting', () => { + it('parses ascending', () => { + expect(utils.parseSorting('size')).toEqual({ sortDesc: false, sortValue: 'size' }); + }); + + it('parses descending', () => { + expect(utils.parseSorting('-size')).toEqual({ sortDesc: true, sortValue: 'size' }); + }); +}); diff --git a/server/sonar-web/src/main/js/apps/projects/components/AllProjects.js b/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx similarity index 79% rename from server/sonar-web/src/main/js/apps/projects/components/AllProjects.js rename to server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx index b87bf26551d..bca7874cba0 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/AllProjects.js +++ b/server/sonar-web/src/main/js/apps/projects/components/AllProjects.tsx @@ -17,8 +17,8 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -//@flow -import React from 'react'; +import * as React from 'react'; +import * as PropTypes from 'prop-types'; import Helmet from 'react-helmet'; import PageHeaderContainer from './PageHeaderContainer'; import ProjectsListContainer from './ProjectsListContainer'; @@ -29,32 +29,27 @@ import { parseUrlQuery } from '../store/utils'; import { translate } from '../../../helpers/l10n'; import * as utils from '../utils'; import * as storage from '../../../helpers/storage'; -/*:: import type { RawQuery } from '../../../helpers/query'; */ +import { RawQuery } from '../../../helpers/query'; import '../styles.css'; -/*:: -type Props = {| - isFavorite: boolean, - location: { pathname: string, query: RawQuery }, - fetchProjects: (query: string, isFavorite: boolean, organization?: {}) => Promise<*>, - organization?: { key: string }, - router: { - push: ({ pathname: string, query?: {} }) => void, - replace: ({ pathname: string, query?: {} }) => void - }, - currentUser?: { isLoggedIn: boolean } -|}; -*/ - -/*:: -type State = { - query: RawQuery -}; -*/ - -export default class AllProjects extends React.PureComponent { - /*:: props: Props; */ - state /*: State */ = { query: {} }; +interface Props { + isFavorite: boolean; + location: { pathname: string; query: RawQuery }; + fetchProjects: (query: RawQuery, isFavorite: boolean, organization?: {}) => Promise; + organization?: { key: string }; + currentUser?: { isLoggedIn: boolean }; +} + +interface State { + query: RawQuery; +} + +export default class AllProjects extends React.PureComponent { + state: State = { query: {} }; + + static contextTypes = { + router: PropTypes.object.isRequired + }; componentDidMount() { this.handleQueryChange(true); @@ -62,7 +57,7 @@ export default class AllProjects extends React.PureComponent { footer && footer.classList.add('page-footer-with-sidebar'); } - componentDidUpdate(prevProps /*: Props */) { + componentDidUpdate(prevProps: Props) { if (prevProps.location.query !== this.props.location.query) { this.handleQueryChange(false); } @@ -82,23 +77,29 @@ export default class AllProjects extends React.PureComponent { isFiltered = () => Object.keys(this.state.query).some(key => this.state.query[key] != null); getSavedOptions = () => { - const options = {}; + const options: { + sort?: string; + view?: string; + visualization?: string; + } = {}; if (storage.getSort()) { - options.sort = storage.getSort(); + options.sort = storage.getSort() || undefined; } if (storage.getView()) { - options.view = storage.getView(); + options.view = storage.getView() || undefined; } if (storage.getVisualization()) { - options.visualization = storage.getVisualization(); + options.visualization = storage.getVisualization() || undefined; } return options; }; - handlePerspectiveChange = ( - { view, visualization } /*: { view: string, visualization?: string } */ - ) => { - const query /*: { view: ?string, visualization: ?string, sort?: ?string } */ = { + handlePerspectiveChange = ({ view, visualization }: { view: string; visualization?: string }) => { + const query: { + view: string | undefined; + visualization: string | undefined; + sort?: string | undefined; + } = { view: view === 'overall' ? undefined : view, visualization }; @@ -110,7 +111,7 @@ export default class AllProjects extends React.PureComponent { query.sort = (sort.sortDesc ? '-' : '') + utils.SORTING_SWITCH[sort.sortValue]; } } - this.props.router.push({ pathname: this.props.location.pathname, query }); + this.context.router.push({ pathname: this.props.location.pathname, query }); } else { this.updateLocationQuery(query); } @@ -120,28 +121,28 @@ export default class AllProjects extends React.PureComponent { storage.saveVisualization(visualization); }; - handleSortChange = (sort /*: string */, desc /*: boolean */) => { + handleSortChange = (sort: string, desc: boolean) => { const asString = (desc ? '-' : '') + sort; this.updateLocationQuery({ sort: asString }); storage.saveSort(asString); }; - handleQueryChange(initialMount /*: boolean */) { + handleQueryChange(initialMount: boolean) { const query = parseUrlQuery(this.props.location.query); const savedOptions = this.getSavedOptions(); const savedOptionsSet = savedOptions.sort || savedOptions.view || savedOptions.visualization; // if there is no filter, but there are saved preferences in the localStorage if (initialMount && !this.isFiltered() && savedOptionsSet) { - this.props.router.replace({ pathname: this.props.location.pathname, query: savedOptions }); + this.context.router.replace({ pathname: this.props.location.pathname, query: savedOptions }); } else { this.setState({ query }); this.props.fetchProjects(query, this.props.isFavorite, this.props.organization); } } - updateLocationQuery = (newQuery /*: { [string]: ?string } */) => { - this.props.router.push({ + updateLocationQuery = (newQuery: RawQuery) => { + this.context.router.push({ pathname: this.props.location.pathname, query: { ...this.props.location.query, diff --git a/server/sonar-web/src/main/js/apps/projects/components/AllProjectsContainer.js b/server/sonar-web/src/main/js/apps/projects/components/AllProjectsContainer.ts similarity index 89% rename from server/sonar-web/src/main/js/apps/projects/components/AllProjectsContainer.js rename to server/sonar-web/src/main/js/apps/projects/components/AllProjectsContainer.ts index f2fa86a3f2a..83d5f49ba66 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/AllProjectsContainer.js +++ b/server/sonar-web/src/main/js/apps/projects/components/AllProjectsContainer.ts @@ -18,8 +18,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import { connect } from 'react-redux'; -import { withRouter } from 'react-router'; import AllProjects from './AllProjects'; import { fetchProjects } from '../store/actions'; -export default connect(null, { fetchProjects })(withRouter(AllProjects)); +export default connect(null, { fetchProjects })(AllProjects); diff --git a/server/sonar-web/src/main/js/apps/projects/components/DefaultPageSelector.js b/server/sonar-web/src/main/js/apps/projects/components/DefaultPageSelector.tsx similarity index 80% rename from server/sonar-web/src/main/js/apps/projects/components/DefaultPageSelector.js rename to server/sonar-web/src/main/js/apps/projects/components/DefaultPageSelector.tsx index d040e9e7330..f8e73ba7fad 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/DefaultPageSelector.js +++ b/server/sonar-web/src/main/js/apps/projects/components/DefaultPageSelector.tsx @@ -17,38 +17,30 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -// @flow -import React from 'react'; +import * as React from 'react'; import { connect } from 'react-redux'; -import { withRouter } from 'react-router'; +import * as PropTypes from 'prop-types'; import AllProjectsContainer from './AllProjectsContainer'; import { getCurrentUser } from '../../../store/rootReducer'; import { isFavoriteSet, isAllSet } from '../../../helpers/storage'; import { searchProjects } from '../../../api/components'; -/*:: import type { RawQuery } from '../../../helpers/query'; */ -/*:: -type Props = { - currentUser: { isLoggedIn: boolean }, - location: { query: {} }, - router: { - replace: (location: { pathname?: string, query?: RawQuery }) => void - } -}; -*/ +interface Props { + currentUser: { isLoggedIn: boolean }; + location: { query: { [x: string]: string } }; +} -/*:: -type State = { - shouldBeRedirected?: boolean, - shouldForceSorting?: string -}; -*/ +interface State { + shouldBeRedirected?: boolean; + shouldForceSorting?: string; +} -class DefaultPageSelector extends React.PureComponent { - /*:: props: Props; */ - /*:: state: State; */ +class DefaultPageSelector extends React.PureComponent { + static contextTypes = { + router: PropTypes.object.isRequired + }; - constructor(props /*: Props */) { + constructor(props: Props) { super(props); this.state = {}; } @@ -57,13 +49,13 @@ class DefaultPageSelector extends React.PureComponent { this.defineIfShouldBeRedirected(); } - componentDidUpdate(prevProps /*: Props */) { + componentDidUpdate(prevProps: Props) { if (prevProps.location !== this.props.location) { this.defineIfShouldBeRedirected(); } else if (this.state.shouldBeRedirected === true) { - this.props.router.replace({ ...this.props.location, pathname: '/projects/favorite' }); + this.context.router.replace({ ...this.props.location, pathname: '/projects/favorite' }); } else if (this.state.shouldForceSorting != null) { - this.props.router.replace({ + this.context.router.replace({ ...this.props.location, query: { ...this.props.location.query, @@ -117,8 +109,10 @@ class DefaultPageSelector extends React.PureComponent { } } -const mapStateToProps = state => ({ +const mapStateToProps = (state: any) => ({ currentUser: getCurrentUser(state) }); -export default connect(mapStateToProps)(withRouter(DefaultPageSelector)); +export default connect(mapStateToProps)(DefaultPageSelector); + +export const UnconnectedDefaultPageSelector = DefaultPageSelector; diff --git a/server/sonar-web/src/main/js/apps/projects/components/EmptyInstance.js b/server/sonar-web/src/main/js/apps/projects/components/EmptyInstance.tsx similarity index 97% rename from server/sonar-web/src/main/js/apps/projects/components/EmptyInstance.js rename to server/sonar-web/src/main/js/apps/projects/components/EmptyInstance.tsx index 1eb2241cfb1..d83a4fb3e5e 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/EmptyInstance.js +++ b/server/sonar-web/src/main/js/apps/projects/components/EmptyInstance.tsx @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import React from 'react'; +import * as React from 'react'; import { translate } from '../../../helpers/l10n'; export default function EmptyInstance() { diff --git a/server/sonar-web/src/main/js/apps/projects/components/FavoriteFilter.js b/server/sonar-web/src/main/js/apps/projects/components/FavoriteFilter.tsx similarity index 88% rename from server/sonar-web/src/main/js/apps/projects/components/FavoriteFilter.js rename to server/sonar-web/src/main/js/apps/projects/components/FavoriteFilter.tsx index b2e9de9b6e4..372d0613c3e 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/FavoriteFilter.js +++ b/server/sonar-web/src/main/js/apps/projects/components/FavoriteFilter.tsx @@ -17,26 +17,19 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -// @flow -import React from 'react'; +import * as React from 'react'; import { IndexLink, Link } from 'react-router'; import { translate } from '../../../helpers/l10n'; import { saveAll, saveFavorite } from '../../../helpers/storage'; -/*:: import type { RawQuery } from '../../../helpers/query'; */ +import { RawQuery } from '../../../helpers/query'; -/*:: -type Props = { - user: { - isLoggedIn?: boolean - }, - organization?: { key: string }, - query: RawQuery -}; -*/ - -export default class FavoriteFilter extends React.PureComponent { - /*:: props: Props; */ +interface Props { + user: { isLoggedIn?: boolean }; + organization?: { key: string }; + query: RawQuery; +} +export default class FavoriteFilter extends React.PureComponent { handleSaveFavorite = () => { if (!this.props.organization) { saveFavorite(); diff --git a/server/sonar-web/src/main/js/apps/projects/components/FavoriteFilterContainer.js b/server/sonar-web/src/main/js/apps/projects/components/FavoriteFilterContainer.tsx similarity index 89% rename from server/sonar-web/src/main/js/apps/projects/components/FavoriteFilterContainer.js rename to server/sonar-web/src/main/js/apps/projects/components/FavoriteFilterContainer.tsx index d3994b39bdb..515fbf0ae8c 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/FavoriteFilterContainer.js +++ b/server/sonar-web/src/main/js/apps/projects/components/FavoriteFilterContainer.tsx @@ -21,8 +21,8 @@ import { connect } from 'react-redux'; import FavoriteFilter from './FavoriteFilter'; import { getCurrentUser } from '../../../store/rootReducer'; -const mapStateToProps = state => ({ +const mapStateToProps = (state: any) => ({ user: getCurrentUser(state) }); -export default connect(mapStateToProps)(FavoriteFilter); +export default connect(mapStateToProps)(FavoriteFilter); diff --git a/server/sonar-web/src/main/js/apps/projects/components/FavoriteProjectsContainer.js b/server/sonar-web/src/main/js/apps/projects/components/FavoriteProjectsContainer.ts similarity index 86% rename from server/sonar-web/src/main/js/apps/projects/components/FavoriteProjectsContainer.js rename to server/sonar-web/src/main/js/apps/projects/components/FavoriteProjectsContainer.ts index bf2a030408b..fc3ad9992c6 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/FavoriteProjectsContainer.js +++ b/server/sonar-web/src/main/js/apps/projects/components/FavoriteProjectsContainer.ts @@ -18,14 +18,13 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import { connect } from 'react-redux'; -import { withRouter } from 'react-router'; import AllProjects from './AllProjects'; import { getCurrentUser } from '../../../store/rootReducer'; import { fetchProjects } from '../store/actions'; -const mapStateToProps = state => ({ +const mapStateToProps = (state: any) => ({ isFavorite: true, currentUser: getCurrentUser(state) }); -export default connect(mapStateToProps, { fetchProjects })(withRouter(AllProjects)); +export default connect(mapStateToProps, { fetchProjects })(AllProjects); diff --git a/server/sonar-web/src/main/js/apps/projects/components/NoFavoriteProjects.js b/server/sonar-web/src/main/js/apps/projects/components/NoFavoriteProjects.tsx similarity index 97% rename from server/sonar-web/src/main/js/apps/projects/components/NoFavoriteProjects.js rename to server/sonar-web/src/main/js/apps/projects/components/NoFavoriteProjects.tsx index f69fbebc834..effc6ad0dbb 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/NoFavoriteProjects.js +++ b/server/sonar-web/src/main/js/apps/projects/components/NoFavoriteProjects.tsx @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -import React from 'react'; +import * as React from 'react'; import { Link } from 'react-router'; import { translate } from '../../../helpers/l10n'; diff --git a/server/sonar-web/src/main/js/apps/projects/components/PageHeader.js b/server/sonar-web/src/main/js/apps/projects/components/PageHeader.tsx similarity index 65% rename from server/sonar-web/src/main/js/apps/projects/components/PageHeader.js rename to server/sonar-web/src/main/js/apps/projects/components/PageHeader.tsx index f4a616dc52b..f9fd94bd3dd 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/PageHeader.js +++ b/server/sonar-web/src/main/js/apps/projects/components/PageHeader.tsx @@ -17,42 +17,45 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -// @flow -import React from 'react'; -import classNames from 'classnames'; +import * as React from 'react'; +import * as classNames from 'classnames'; import SearchFilterContainer from '../filters/SearchFilterContainer'; import Tooltip from '../../../components/controls/Tooltip'; import PerspectiveSelect from './PerspectiveSelect'; import ProjectsSortingSelect from './ProjectsSortingSelect'; import { translate } from '../../../helpers/l10n'; -/*:: import type { RawQuery } from '../../../helpers/query'; */ +import { RawQuery } from '../../../helpers/query'; -/*:: -type Props = {| - currentUser?: { isLoggedIn: boolean }, - isFavorite?: boolean, - onPerspectiveChange: ({ view: string, visualization?: string }) => void, - organization?: { key: string }, - projects: Array<*>, - projectsAppState: { loading: boolean, total?: number }, - query: RawQuery, - onSortChange: (sort: string, desc: boolean) => void, - selectedSort: string, - view: string, - visualization?: string -|}; -*/ +interface Props { + currentUser?: { isLoggedIn: boolean }; + isFavorite?: boolean; + onPerspectiveChange: (x: { view: string; visualization?: string }) => void; + organization?: { key: string }; + projects: Array; + projectsAppState: { loading: boolean; total?: number }; + query: RawQuery; + onSortChange: (sort: string, desc: boolean) => void; + selectedSort: string; + view: string; + visualization?: string; +} + +export default function PageHeader(props: Props) { + const { projectsAppState, projects, currentUser, view } = props; + const limitReached = + projects != null && projectsAppState.total != null && projects.length < projectsAppState.total; + const defaultOption = currentUser && currentUser.isLoggedIn ? 'name' : 'analysis_date'; + + return ( +
+ -export default function PageHeader(props /*: Props */) { - const renderSortingSelect = () => { - const { projectsAppState, projects, currentUser, view } = props; - const limitReached = - projects != null && - projectsAppState.total != null && - projects.length < projectsAppState.total; - const defaultOption = currentUser && currentUser.isLoggedIn ? 'name' : 'analysis_date'; - if (view === 'visualizations' && !limitReached) { - return ( + {view === 'visualizations' && !limitReached ? (
- ); - } - return ( - - ); - }; - - return ( -
- - - {renderSortingSelect()} + ) : ( + + )} ({ +const mapStateToProps = (state: any) => ({ projects: getProjects(state), projectsAppState: getProjectsAppState(state) }); -export default connect(mapStateToProps)(PageHeader); +export default connect(mapStateToProps)(PageHeader); diff --git a/server/sonar-web/src/main/js/apps/projects/components/PageSidebar.js b/server/sonar-web/src/main/js/apps/projects/components/PageSidebar.tsx similarity index 90% rename from server/sonar-web/src/main/js/apps/projects/components/PageSidebar.js rename to server/sonar-web/src/main/js/apps/projects/components/PageSidebar.tsx index 34c923669db..e1d6e6dddb0 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/PageSidebar.js +++ b/server/sonar-web/src/main/js/apps/projects/components/PageSidebar.tsx @@ -17,8 +17,7 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -//@flow -import React from 'react'; +import * as React from 'react'; import { Link } from 'react-router'; import FavoriteFilterContainer from './FavoriteFilterContainer'; import LanguagesFilterContainer from '../filters/LanguagesFilterContainer'; @@ -37,21 +36,18 @@ import SecurityFilter from '../filters/SecurityFilter'; import SizeFilter from '../filters/SizeFilter'; import TagsFilterContainer from '../filters/TagsFilterContainer'; import { translate } from '../../../helpers/l10n'; -/*:: import type { RawQuery } from '../../../helpers/query'; */ +import { RawQuery } from '../../../helpers/query'; -/*:: -type Props = { - isFavorite: boolean, - organization?: { key: string }, - query: RawQuery, - view: string, - visualization: string -}; -*/ +interface Props { + isFavorite: boolean; + organization?: { key: string }; + query: RawQuery; + view: string; + visualization: string; +} -export default function PageSidebar( - { query, isFavorite, organization, view, visualization } /*: Props */ -) { +export default function PageSidebar(props: Props) { + const { query, isFavorite, organization, view, visualization } = props; const isFiltered = Object.keys(query) .filter(key => !['view', 'visualization', 'sort'].includes(key)) .some(key => query[key] != null); @@ -60,12 +56,11 @@ export default function PageSidebar( const pathname = basePathName + (isFavorite ? '/favorite' : ''); const facetProps = { query, isFavorite, organization }; - let linkQuery; + let linkQuery: RawQuery | undefined = undefined; if (view !== 'overall') { linkQuery = { view }; if (view === 'visualizations') { - // $FlowFixMe linkQuery.visualization = visualization; } } diff --git a/server/sonar-web/src/main/js/apps/projects/components/PerspectiveSelect.js b/server/sonar-web/src/main/js/apps/projects/components/PerspectiveSelect.tsx similarity index 77% rename from server/sonar-web/src/main/js/apps/projects/components/PerspectiveSelect.js rename to server/sonar-web/src/main/js/apps/projects/components/PerspectiveSelect.tsx index 2ed398b6e60..c27d1fce861 100644 --- a/server/sonar-web/src/main/js/apps/projects/components/PerspectiveSelect.js +++ b/server/sonar-web/src/main/js/apps/projects/components/PerspectiveSelect.tsx @@ -17,33 +17,32 @@ * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -// @flow -import React from 'react'; -import Select from 'react-select'; -import PerspectiveSelectOption from './PerspectiveSelectOption'; +import * as React from 'react'; +import * as Select from 'react-select'; +import PerspectiveSelectOption, { Option } from './PerspectiveSelectOption'; import { translate } from '../../../helpers/l10n'; import { VIEWS, VISUALIZATIONS } from '../utils'; -/*:: -export type Option = { label: string, type: string, value: string }; -*/ - -/*:: -type Props = {| - className?: string, - onChange: ({ view: string, visualization?: string }) => void, - view: string, - visualization?: string -|}; -*/ +interface Props { + className?: string; + onChange: (x: { view: string; visualization?: string }) => void; + view: string; + visualization?: string; +} -export default class PerspectiveSelect extends React.PureComponent { - /*:: options: Array