Browse Source

update main dependencies & fix autofixable eslint warnings (#601)

tags/7.5
Stas Vilchik 5 years ago
parent
commit
d3530ff000
100 changed files with 766 additions and 973 deletions
  1. 0
    1
      server/sonar-bitbucketcloud/.babelrc
  2. 13
    12
      server/sonar-bitbucketcloud/package.json
  3. 2
    1
      server/sonar-bitbucketcloud/src/main/ts/components/ProjectCardHeader.tsx
  4. 2
    1
      server/sonar-bitbucketcloud/src/main/ts/components/RepoWidgetNotConfigured.tsx
  5. 134
    231
      server/sonar-bitbucketcloud/yarn.lock
  6. 0
    1
      server/sonar-vsts/.babelrc
  7. 12
    12
      server/sonar-vsts/package.json
  8. 263
    453
      server/sonar-vsts/yarn.lock
  9. 0
    1
      server/sonar-web/.babelrc
  10. 2
    1
      server/sonar-web/.eslintrc
  11. 17
    17
      server/sonar-web/package.json
  12. 4
    3
      server/sonar-web/src/main/js/app/components/AdminContainer.tsx
  13. 4
    1
      server/sonar-web/src/main/js/app/components/App.tsx
  14. 12
    3
      server/sonar-web/src/main/js/app/components/ComponentContainer.tsx
  15. 2
    1
      server/sonar-web/src/main/js/app/components/GlobalFooterBranding.js
  16. 5
    2
      server/sonar-web/src/main/js/app/components/GlobalMessagesContainer.tsx
  17. 21
    11
      server/sonar-web/src/main/js/app/components/MarkdownHelp.js
  18. 6
    5
      server/sonar-web/src/main/js/app/components/StartupModal.tsx
  19. 1
    1
      server/sonar-web/src/main/js/app/components/embed-docs-modal/SuggestionsProvider.tsx
  20. 2
    4
      server/sonar-web/src/main/js/app/components/embed-docs-modal/__tests__/SuggestionsProvider-test.tsx
  21. 4
    1
      server/sonar-web/src/main/js/app/components/extensions/ExtensionContainer.tsx
  22. 4
    3
      server/sonar-web/src/main/js/app/components/extensions/OrganizationPageExtension.tsx
  23. 4
    1
      server/sonar-web/src/main/js/app/components/extensions/ProjectAdminPageExtension.js
  24. 30
    30
      server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx
  25. 1
    1
      server/sonar-web/src/main/js/app/components/nav/global/GlobalNavMenu.tsx
  26. 1
    1
      server/sonar-web/src/main/js/app/components/nav/global/GlobalNavPlus.tsx
  27. 3
    3
      server/sonar-web/src/main/js/app/components/nav/settings/SettingsNav.tsx
  28. 1
    1
      server/sonar-web/src/main/js/app/components/search/SearchShowMore.js
  29. 2
    2
      server/sonar-web/src/main/js/app/styles/components/boxed-group.css
  30. 4
    1
      server/sonar-web/src/main/js/apps/about/components/AboutApp.js
  31. 1
    1
      server/sonar-web/src/main/js/apps/about/components/AboutProjects.js
  32. 3
    3
      server/sonar-web/src/main/js/apps/about/components/AboutScanners.js
  33. 6
    6
      server/sonar-web/src/main/js/apps/about/components/EntryIssueTypes.js
  34. 2
    2
      server/sonar-web/src/main/js/apps/about/sonarcloud/AsAService.tsx
  35. 4
    3
      server/sonar-web/src/main/js/apps/about/sonarcloud/BranchAnalysis.tsx
  36. 6
    3
      server/sonar-web/src/main/js/apps/about/sonarcloud/Footer.tsx
  37. 4
    4
      server/sonar-web/src/main/js/apps/about/sonarcloud/Home.tsx
  38. 2
    1
      server/sonar-web/src/main/js/apps/about/sonarcloud/Pricing.tsx
  39. 4
    2
      server/sonar-web/src/main/js/apps/about/sonarcloud/SQHome.tsx
  40. 2
    2
      server/sonar-web/src/main/js/apps/about/sonarcloud/SonarLintIntegration.tsx
  41. 1
    1
      server/sonar-web/src/main/js/apps/account/components/Account.js
  42. 5
    5
      server/sonar-web/src/main/js/apps/account/components/Nav.js
  43. 2
    2
      server/sonar-web/src/main/js/apps/account/components/UserCard.js
  44. 4
    1
      server/sonar-web/src/main/js/apps/account/notifications/NotificationsContainer.tsx
  45. 4
    1
      server/sonar-web/src/main/js/apps/account/organizations/CreateOrganizationForm.tsx
  46. 1
    1
      server/sonar-web/src/main/js/apps/account/organizations/OrganizationCard.tsx
  47. 4
    1
      server/sonar-web/src/main/js/apps/account/organizations/UserOrganizations.tsx
  48. 2
    2
      server/sonar-web/src/main/js/apps/account/profile/Profile.js
  49. 2
    2
      server/sonar-web/src/main/js/apps/account/profile/UserExternalIdentity.js
  50. 1
    1
      server/sonar-web/src/main/js/apps/account/profile/UserGroups.js
  51. 1
    1
      server/sonar-web/src/main/js/apps/account/profile/UserScmAccounts.js
  52. 5
    5
      server/sonar-web/src/main/js/apps/background-tasks/__tests__/background-tasks-test.js
  53. 4
    1
      server/sonar-web/src/main/js/apps/background-tasks/components/BackgroundTasksApp.js
  54. 1
    1
      server/sonar-web/src/main/js/apps/background-tasks/components/ScannerContext.tsx
  55. 1
    1
      server/sonar-web/src/main/js/apps/background-tasks/components/Stacktrace.tsx
  56. 2
    2
      server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskDate-test.tsx
  57. 2
    2
      server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskDay-test.tsx
  58. 1
    1
      server/sonar-web/src/main/js/apps/code/components/App.tsx
  59. 1
    1
      server/sonar-web/src/main/js/apps/code/components/Search.tsx
  60. 5
    3
      server/sonar-web/src/main/js/apps/coding-rules/components/App.tsx
  61. 4
    7
      server/sonar-web/src/main/js/apps/coding-rules/components/CustomRuleFormModal.tsx
  62. 7
    2
      server/sonar-web/src/main/js/apps/coding-rules/components/RuleDetails.tsx
  63. 4
    1
      server/sonar-web/src/main/js/apps/component-measures/components/AppContainer.js
  64. 2
    2
      server/sonar-web/src/main/js/apps/component-measures/components/Breadcrumbs.js
  65. 2
    2
      server/sonar-web/src/main/js/apps/component-measures/components/MeasureContent.js
  66. 1
    1
      server/sonar-web/src/main/js/apps/component-measures/components/MeasureContentContainer.js
  67. 4
    1
      server/sonar-web/src/main/js/apps/component-measures/components/MeasureFavoriteContainer.js
  68. 2
    2
      server/sonar-web/src/main/js/apps/component-measures/components/MeasureViewSelect.js
  69. 2
    2
      server/sonar-web/src/main/js/apps/component-measures/components/__tests__/Breadcrumb-test.js
  70. 1
    1
      server/sonar-web/src/main/js/apps/component-measures/components/__tests__/MeasureViewSelect-test.js
  71. 1
    1
      server/sonar-web/src/main/js/apps/component-measures/drilldown/MeasureCell.js
  72. 1
    1
      server/sonar-web/src/main/js/apps/component-measures/drilldown/TreeMapView.js
  73. 5
    5
      server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetMeasureValue.js
  74. 4
    4
      server/sonar-web/src/main/js/apps/explore/Explore.tsx
  75. 1
    1
      server/sonar-web/src/main/js/apps/groups/components/List.tsx
  76. 4
    4
      server/sonar-web/src/main/js/apps/groups/components/__tests__/__snapshots__/EditMembers-test.tsx.snap
  77. 14
    14
      server/sonar-web/src/main/js/apps/issues/actions.ts
  78. 4
    3
      server/sonar-web/src/main/js/apps/issues/components/AppContainer.tsx
  79. 3
    1
      server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueBox.tsx
  80. 1
    1
      server/sonar-web/src/main/js/apps/marketplace/components/PluginAvailable.tsx
  81. 1
    1
      server/sonar-web/src/main/js/apps/marketplace/components/PluginInstalled.tsx
  82. 1
    1
      server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateItem.tsx
  83. 12
    9
      server/sonar-web/src/main/js/apps/marketplace/utils.ts
  84. 4
    3
      server/sonar-web/src/main/js/apps/organizations/components/OrganizationDelete.tsx
  85. 4
    1
      server/sonar-web/src/main/js/apps/organizations/components/OrganizationEdit.tsx
  86. 6
    5
      server/sonar-web/src/main/js/apps/organizations/components/OrganizationMembersContainer.tsx
  87. 4
    3
      server/sonar-web/src/main/js/apps/organizations/components/OrganizationPage.tsx
  88. 3
    1
      server/sonar-web/src/main/js/apps/overview/events/Analysis.tsx
  89. 1
    1
      server/sonar-web/src/main/js/apps/overview/meta/MetaKey.tsx
  90. 3
    1
      server/sonar-web/src/main/js/apps/overview/meta/MetaLinks.tsx
  91. 1
    1
      server/sonar-web/src/main/js/apps/overview/meta/MetaOrganizationKey.tsx
  92. 1
    1
      server/sonar-web/src/main/js/apps/overview/meta/MetaSize.tsx
  93. 7
    9
      server/sonar-web/src/main/js/apps/overview/qualityGate/ApplicationQualityGate.tsx
  94. 3
    3
      server/sonar-web/src/main/js/apps/overview/qualityGate/QualityGateCondition.js
  95. 3
    3
      server/sonar-web/src/main/js/apps/permission-templates/components/App.js
  96. 2
    2
      server/sonar-web/src/main/js/apps/permission-templates/components/Home.js
  97. 2
    2
      server/sonar-web/src/main/js/apps/permission-templates/components/List.js
  98. 1
    1
      server/sonar-web/src/main/js/apps/permission-templates/components/ListItem.js
  99. 1
    1
      server/sonar-web/src/main/js/apps/permission-templates/components/NameCell.js
  100. 0
    0
      server/sonar-web/src/main/js/apps/permission-templates/components/TemplateDetails.js

+ 0
- 1
server/sonar-bitbucketcloud/.babelrc View File

@@ -20,7 +20,6 @@
],
"plugins": [
"transform-class-properties",
// use built-in `Object.assign`
["transform-object-rest-spread", { "useBuiltIns": true }],
"lodash"
],

+ 13
- 12
server/sonar-bitbucketcloud/package.json View File

@@ -18,8 +18,9 @@
"babel-polyfill": "6.26.0",
"classnames": "2.2.6",
"lodash": "4.17.10",
"react": "16.2.0",
"react-dom": "16.2.0",
"prop-types": "15.6.1",
"react": "16.4.2",
"react-dom": "16.4.2",
"react-intl": "2.4.0",
"styled-components": "3.3.3",
"whatwg-fetch": "2.0.4"
@@ -27,14 +28,14 @@
"devDependencies": {
"@types/classnames": "2.2.4",
"@types/enzyme": "3.1.11",
"@types/jest": "23.1.5",
"@types/jest": "23.3.1",
"@types/lodash": "4.14.111",
"@types/react": "16.0.29",
"@types/react-dom": "16.0.3",
"@types/react": "16.4.8",
"@types/react-dom": "16.0.7",
"@types/react-intl": "2.3.8",
"autoprefixer": "7.1.6",
"babel-core": "6.26.3",
"babel-jest": "23.4.0",
"babel-jest": "23.4.2",
"babel-loader": "7.1.5",
"babel-plugin-dynamic-import-node": "1.2.0",
"babel-plugin-lodash": "3.3.4",
@@ -62,20 +63,20 @@
"eslint-plugin-react": "7.7.0",
"eslint-plugin-sonarjs": "0.1.0",
"html-webpack-plugin": "3.0.6",
"jest": "23.4.0",
"jest": "23.4.2",
"postcss-calc": "6.0.1",
"postcss-custom-properties": "6.2.0",
"postcss-loader": "2.1.6",
"prettier": "1.13.7",
"prettier": "1.14.0",
"react-dev-utils": "5.0.1",
"react-error-overlay": "1.0.7",
"react-test-renderer": "16.2.0",
"react-test-renderer": "16.4.2",
"request": "2.87.0",
"style-loader": "0.21.0",
"ts-jest": "23.0.0",
"ts-jest": "23.1.3",
"ts-loader": "4.4.2",
"typescript": "2.8.3",
"typescript-eslint-parser": "15.0.0",
"typescript": "3.0.1",
"typescript-eslint-parser": "18.0.0",
"webpack": "4.16.0",
"webpack-bundle-analyzer": "2.13.1",
"webpack-dev-server": "3.1.4"

+ 2
- 1
server/sonar-bitbucketcloud/src/main/ts/components/ProjectCardHeader.tsx View File

@@ -48,7 +48,8 @@ export default function ProjectCardHeader({ project }: Props) {
<DateTimeFormatter date={project.analysisDate}>
{formattedDate => (
<small className="project-card-analysis-date">
Last analysis:<br className="hidden-big" />
Last analysis:
<br className="hidden-big" />
<span className="little-spacer-left">{formattedDate}</span>
</small>
)}

+ 2
- 1
server/sonar-bitbucketcloud/src/main/ts/components/RepoWidgetNotConfigured.tsx View File

@@ -61,7 +61,8 @@ export default class RepoWidgetNotConfigured extends React.PureComponent<{}, Sta
</a>
) : (
'repository settings'
)}.
)}
.
</>
);
} else {

+ 134
- 231
server/sonar-bitbucketcloud/yarn.lock View File

@@ -205,9 +205,9 @@
"@types/cheerio" "*"
"@types/react" "*"

"@types/jest@23.1.5":
version "23.1.5"
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.1.5.tgz#e31be003956e1fa8c860124d99bea9ae327ae37b"
"@types/jest@23.3.1":
version "23.3.1"
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.1.tgz#a4319aedb071d478e6f407d1c4578ec8156829cf"

"@types/lodash@4.14.111":
version "4.14.111"
@@ -217,9 +217,15 @@
version "9.6.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.0.tgz#d3480ee666df9784b1001a1872a2f6ccefb6c2d7"

"@types/react-dom@16.0.3":
version "16.0.3"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.3.tgz#8accad7eabdab4cca3e1a56f5ccb57de2da0ff64"
"@types/prop-types@*":
version "15.5.5"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.5.tgz#17038dd322c2325f5da650a94d5f9974943625e3"
dependencies:
"@types/react" "*"

"@types/react-dom@16.0.7":
version "16.0.7"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.0.7.tgz#54d0f867a76b90597e8432030d297982f25c20ba"
dependencies:
"@types/node" "*"
"@types/react" "*"
@@ -232,9 +238,12 @@
version "16.0.41"
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.41.tgz#72146737f4d439dc95a53315de4bfb43ac8542ca"

"@types/react@16.0.29":
version "16.0.29"
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.29.tgz#4eea6a8de9f40ca71d580ae7a9f3b4b77b368de8"
"@types/react@16.4.8":
version "16.4.8"
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.8.tgz#ff0440429783df0927bdcd430fa1225f7c08cf36"
dependencies:
"@types/prop-types" "*"
csstype "^2.2.0"

"@webassemblyjs/ast@1.5.13":
version "1.5.13"
@@ -508,13 +517,6 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"

anymatch@^1.3.0:
version "1.3.2"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
dependencies:
micromatch "^2.1.5"
normalize-path "^2.0.0"

anymatch@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@@ -921,9 +923,9 @@ babel-helpers@^6.24.1:
babel-runtime "^6.22.0"
babel-template "^6.24.1"

babel-jest@23.4.0, babel-jest@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.0.tgz#22c34c392e2176f6a4c367992a7fcff69d2e8557"
babel-jest@23.4.2, babel-jest@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.4.2.tgz#f276de67798a5d68f2d6e87ff518c2f6e1609877"
dependencies:
babel-plugin-istanbul "^4.1.6"
babel-preset-jest "^23.2.0"
@@ -1329,7 +1331,7 @@ babel-preset-env@1.6.1:
invariant "^2.2.2"
semver "^5.3.0"

babel-preset-jest@^23.0.0, babel-preset-jest@^23.2.0:
babel-preset-jest@^23.2.0:
version "23.2.0"
resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
dependencies:
@@ -1367,7 +1369,7 @@ babel-runtime@6.23.0:
core-js "^2.4.0"
regenerator-runtime "^0.10.0"

babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2:
babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
dependencies:
@@ -1829,21 +1831,6 @@ cheerio@^1.0.0-rc.2:
lodash "^4.15.0"
parse5 "^3.0.1"

chokidar@^1.6.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
dependencies:
anymatch "^1.3.0"
async-each "^1.0.0"
glob-parent "^2.0.0"
inherits "^2.0.1"
is-binary-path "^1.0.0"
is-glob "^2.0.0"
path-is-absolute "^1.0.0"
readdirp "^2.0.0"
optionalDependencies:
fsevents "^1.0.0"

chokidar@^2.0.0, chokidar@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176"
@@ -1956,6 +1943,10 @@ clorox@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/clorox/-/clorox-1.0.3.tgz#6fa63653f280c33d69f548fb14d239ddcfa1590d"

closest-file-data@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/closest-file-data/-/closest-file-data-0.1.4.tgz#975f87c132f299d24a0375b9f63ca3fb88f72b3a"

co@^4.6.0:
version "4.6.0"
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -2169,22 +2160,6 @@ cosmiconfig@^4.0.0:
parse-json "^4.0.0"
require-from-string "^2.0.1"

cpx@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f"
dependencies:
babel-runtime "^6.9.2"
chokidar "^1.6.0"
duplexer "^0.1.1"
glob "^7.0.5"
glob2base "^0.0.12"
minimatch "^3.0.2"
mkdirp "^0.5.1"
resolve "^1.1.7"
safe-buffer "^5.0.1"
shell-quote "^1.6.1"
subarg "^1.0.0"

create-ecdh@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
@@ -2385,6 +2360,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
dependencies:
cssom "0.3.x"

csstype@^2.2.0:
version "2.5.6"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.6.tgz#2ae1db2319642d8b80a668d2d025c6196071e788"

csstype@^2.5.2:
version "2.5.5"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.5.5.tgz#4125484a3d42189a863943f23b9e4b80fedfa106"
@@ -2429,12 +2408,6 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"

decamelize@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7"
dependencies:
xregexp "4.0.0"

decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -3352,10 +3325,6 @@ find-cache-dir@^1.0.0:
make-dir "^1.0.0"
pkg-dir "^2.0.0"

find-index@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4"

find-root@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
@@ -3373,12 +3342,6 @@ find-up@^2.0.0, find-up@^2.1.0:
dependencies:
locate-path "^2.0.0"

find-up@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
dependencies:
locate-path "^3.0.0"

flat-cache@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
@@ -3485,7 +3448,7 @@ fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"

fsevents@^1.0.0, fsevents@^1.1.1, fsevents@^1.1.2:
fsevents@^1.1.1, fsevents@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8"
dependencies:
@@ -3580,12 +3543,6 @@ glob-parent@^3.1.0:
is-glob "^3.1.0"
path-dirname "^1.0.0"

glob2base@^0.0.12:
version "0.0.12"
resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56"
dependencies:
find-index "^0.1.1"

glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
@@ -4510,15 +4467,15 @@ istanbul-reports@^1.3.0:
dependencies:
handlebars "^4.0.3"

jest-changed-files@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.0.tgz#f1b304f98c235af5d9a31ec524262c5e4de3c6ff"
jest-changed-files@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-23.4.2.tgz#1eed688370cd5eebafe4ae93d34bb3b64968fe83"
dependencies:
throat "^4.0.0"

jest-cli@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.4.0.tgz#d1fdd1dbc41d69ae8bd43d0070ce23988eacd86f"
jest-cli@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-23.4.2.tgz#49d56bcfe6cf01871bfcc4a0494e08edaf2b61d0"
dependencies:
ansi-escapes "^3.0.0"
chalk "^2.0.1"
@@ -4531,17 +4488,17 @@ jest-cli@^23.4.0:
istanbul-lib-coverage "^1.2.0"
istanbul-lib-instrument "^1.10.1"
istanbul-lib-source-maps "^1.2.4"
jest-changed-files "^23.4.0"
jest-config "^23.4.0"
jest-changed-files "^23.4.2"
jest-config "^23.4.2"
jest-environment-jsdom "^23.4.0"
jest-get-type "^22.1.0"
jest-haste-map "^23.4.0"
jest-haste-map "^23.4.1"
jest-message-util "^23.4.0"
jest-regex-util "^23.3.0"
jest-resolve-dependencies "^23.4.0"
jest-runner "^23.4.0"
jest-runtime "^23.4.0"
jest-snapshot "^23.4.0"
jest-resolve-dependencies "^23.4.2"
jest-runner "^23.4.2"
jest-runtime "^23.4.2"
jest-snapshot "^23.4.2"
jest-util "^23.4.0"
jest-validate "^23.4.0"
jest-watcher "^23.4.0"
@@ -4557,20 +4514,20 @@ jest-cli@^23.4.0:
which "^1.2.12"
yargs "^11.0.0"

jest-config@^23.0.0, jest-config@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.4.0.tgz#79ccf8d68aa0e48f9e3beb81b83aa5875c63fa3f"
jest-config@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.4.2.tgz#62a105e14b8266458f2bf4d32403b2c44418fa77"
dependencies:
babel-core "^6.0.0"
babel-jest "^23.4.0"
babel-jest "^23.4.2"
chalk "^2.0.1"
glob "^7.1.1"
jest-environment-jsdom "^23.4.0"
jest-environment-node "^23.4.0"
jest-get-type "^22.1.0"
jest-jasmine2 "^23.4.0"
jest-jasmine2 "^23.4.2"
jest-regex-util "^23.3.0"
jest-resolve "^23.4.0"
jest-resolve "^23.4.1"
jest-util "^23.4.0"
jest-validate "^23.4.0"
pretty-format "^23.2.0"
@@ -4616,9 +4573,9 @@ jest-get-type@^22.1.0:
version "22.4.3"
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4"

jest-haste-map@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.4.0.tgz#f2a0eaa41af766cd5101e6c291fdc6435c93ee1c"
jest-haste-map@^23.4.1:
version "23.4.1"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-23.4.1.tgz#43a174ba7ac079ae1dd74eaf5a5fe78989474dd2"
dependencies:
fb-watchman "^2.0.0"
graceful-fs "^4.1.11"
@@ -4628,10 +4585,11 @@ jest-haste-map@^23.4.0:
micromatch "^2.3.11"
sane "^2.0.0"

jest-jasmine2@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.4.0.tgz#17ce539fe608ef898d6986518144acf270beca8f"
jest-jasmine2@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.4.2.tgz#2fbf52f93e43ed4c5e7326a90bb1d785be4321ac"
dependencies:
babel-traverse "^6.0.0"
chalk "^2.0.1"
co "^4.6.0"
expect "^23.4.0"
@@ -4640,7 +4598,7 @@ jest-jasmine2@^23.4.0:
jest-each "^23.4.0"
jest-matcher-utils "^23.2.0"
jest-message-util "^23.4.0"
jest-snapshot "^23.4.0"
jest-snapshot "^23.4.2"
jest-util "^23.4.0"
pretty-format "^23.2.0"

@@ -4676,42 +4634,42 @@ jest-regex-util@^23.3.0:
version "23.3.0"
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5"

jest-resolve-dependencies@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.0.tgz#e73efce70262a6e2bf5263d0b23009a098678620"
jest-resolve-dependencies@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-23.4.2.tgz#0675ba876a5b819deffc449ad72e9985c2592048"
dependencies:
jest-regex-util "^23.3.0"
jest-snapshot "^23.4.0"
jest-snapshot "^23.4.2"

jest-resolve@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.4.0.tgz#b4061dbcd6391b5e445d5fd84c9dad5ff1ff5662"
jest-resolve@^23.4.1:
version "23.4.1"
resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.4.1.tgz#7f3c17104732a2c0c940a01256025ed745814982"
dependencies:
browser-resolve "^1.11.3"
chalk "^2.0.1"
realpath-native "^1.0.0"

jest-runner@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.4.0.tgz#1859b211a264ea5a43b7a3022e1199067c4dfe57"
jest-runner@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-23.4.2.tgz#579a88524ac52c846075b0129a21c7b483e75a7e"
dependencies:
exit "^0.1.2"
graceful-fs "^4.1.11"
jest-config "^23.4.0"
jest-config "^23.4.2"
jest-docblock "^23.2.0"
jest-haste-map "^23.4.0"
jest-jasmine2 "^23.4.0"
jest-haste-map "^23.4.1"
jest-jasmine2 "^23.4.2"
jest-leak-detector "^23.2.0"
jest-message-util "^23.4.0"
jest-runtime "^23.4.0"
jest-runtime "^23.4.2"
jest-util "^23.4.0"
jest-worker "^23.2.0"
source-map-support "^0.5.6"
throat "^4.0.0"

jest-runtime@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.4.0.tgz#c30ef619def587b93bad4a4938da9accb9936b4d"
jest-runtime@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-23.4.2.tgz#00c3bb8385253d401a394a27d1112d3615e5a65c"
dependencies:
babel-core "^6.0.0"
babel-plugin-istanbul "^4.1.6"
@@ -4720,12 +4678,12 @@ jest-runtime@^23.4.0:
exit "^0.1.2"
fast-json-stable-stringify "^2.0.0"
graceful-fs "^4.1.11"
jest-config "^23.4.0"
jest-haste-map "^23.4.0"
jest-config "^23.4.2"
jest-haste-map "^23.4.1"
jest-message-util "^23.4.0"
jest-regex-util "^23.3.0"
jest-resolve "^23.4.0"
jest-snapshot "^23.4.0"
jest-resolve "^23.4.1"
jest-snapshot "^23.4.2"
jest-util "^23.4.0"
jest-validate "^23.4.0"
micromatch "^2.3.11"
@@ -4739,17 +4697,16 @@ jest-serializer@^23.0.1:
version "23.0.1"
resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-23.0.1.tgz#a3776aeb311e90fe83fab9e533e85102bd164165"

jest-snapshot@^23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.4.0.tgz#7463d0357cabdfe1c63994d5e32f707d1033d616"
jest-snapshot@^23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.4.2.tgz#8fa6130feb5a527dac73e5fa80d86f29f7c42ab6"
dependencies:
babel-traverse "^6.0.0"
babel-types "^6.0.0"
chalk "^2.0.1"
jest-diff "^23.2.0"
jest-matcher-utils "^23.2.0"
jest-message-util "^23.4.0"
jest-resolve "^23.4.0"
jest-resolve "^23.4.1"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
pretty-format "^23.2.0"
@@ -4791,12 +4748,12 @@ jest-worker@^23.2.0:
dependencies:
merge-stream "^1.0.1"

jest@23.4.0:
version "23.4.0"
resolved "https://registry.yarnpkg.com/jest/-/jest-23.4.0.tgz#ebce63f6529c27c646d80c610866f0306f66dcbf"
jest@23.4.2:
version "23.4.2"
resolved "https://registry.yarnpkg.com/jest/-/jest-23.4.2.tgz#1fae3ed832192143070ae85156b25cea891a1260"
dependencies:
import-local "^1.0.0"
jest-cli "^23.4.0"
jest-cli "^23.4.2"

js-base64@^2.1.9:
version "2.4.3"
@@ -5025,13 +4982,6 @@ locate-path@^2.0.0:
p-locate "^2.0.0"
path-exists "^3.0.0"

locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
dependencies:
p-locate "^3.0.0"
path-exists "^3.0.0"

lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
@@ -5213,7 +5163,7 @@ methods@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"

micromatch@^2.1.5, micromatch@^2.3.11:
micromatch@^2.3.11:
version "2.3.11"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
dependencies:
@@ -5302,7 +5252,7 @@ minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"

minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"

@@ -5519,7 +5469,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
semver "2 || 3 || 4 || 5"
validate-npm-package-license "^3.0.1"

normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
normalize-path@^2.0.1, normalize-path@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
dependencies:
@@ -5761,24 +5711,12 @@ p-limit@^1.0.0, p-limit@^1.1.0:
dependencies:
p-try "^1.0.0"

p-limit@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec"
dependencies:
p-try "^2.0.0"

p-locate@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
dependencies:
p-limit "^1.1.0"

p-locate@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
dependencies:
p-limit "^2.0.0"

p-map@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
@@ -5787,10 +5725,6 @@ p-try@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"

p-try@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"

pako@~1.0.5:
version "1.0.6"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
@@ -5969,12 +5903,6 @@ pkg-dir@^2.0.0:
dependencies:
find-up "^2.1.0"

pkg-dir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
dependencies:
find-up "^3.0.0"

pluralize@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
@@ -6289,9 +6217,9 @@ preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"

prettier@1.13.7:
version "1.13.7"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281"
prettier@1.14.0:
version "1.14.0"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.0.tgz#847c235522035fd988100f1f43cf20a7d24f9372"

pretty-error@^2.0.2:
version "2.1.1"
@@ -6340,18 +6268,18 @@ prompts@^0.1.9:
clorox "^1.0.3"
sisteransi "^0.1.1"

prop-types@^15.0.0, prop-types@^15.5.4, prop-types@^15.6.1:
version "15.6.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
prop-types@15.6.1, prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0:
version "15.6.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
dependencies:
fbjs "^0.8.16"
loose-envify "^1.3.1"
object-assign "^4.1.1"

prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0:
version "15.6.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca"
prop-types@^15.0.0, prop-types@^15.5.4, prop-types@^15.6.1:
version "15.6.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
dependencies:
fbjs "^0.8.16"
loose-envify "^1.3.1"
object-assign "^4.1.1"

@@ -6552,9 +6480,9 @@ react-dev-utils@^3.0.0:
strip-ansi "3.0.1"
text-table "0.2.0"

react-dom@16.2.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.2.0.tgz#69003178601c0ca19b709b33a83369fe6124c044"
react-dom@16.4.2:
version "16.4.2"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.2.tgz#4afed569689f2c561d2b8da0b819669c38a0bda4"
dependencies:
fbjs "^0.8.16"
loose-envify "^1.1.0"
@@ -6607,6 +6535,10 @@ react-is@^16.3.1:
version "16.4.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.1.tgz#d624c4650d2c65dbd52c72622bbf389435d9776e"

react-is@^16.4.2:
version "16.4.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.4.2.tgz#84891b56c2b6d9efdee577cc83501dfc5ecead88"

react-node-resolver@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/react-node-resolver/-/react-node-resolver-1.0.1.tgz#1798a729c0e218bf2f0e8ddf79c550d4af61d83a"
@@ -6655,7 +6587,16 @@ react-side-effect@^1.1.3:
exenv "^1.2.1"
shallowequal "^1.0.1"

react-test-renderer@16.2.0, react-test-renderer@^16.0.0-0:
react-test-renderer@16.4.2:
version "16.4.2"
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.4.2.tgz#4e03eca9359bb3210d4373f7547d1364218ef74e"
dependencies:
fbjs "^0.8.16"
object-assign "^4.1.1"
prop-types "^15.6.0"
react-is "^16.4.2"

react-test-renderer@^16.0.0-0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.2.0.tgz#bddf259a6b8fcd8555f012afc8eacc238872a211"
dependencies:
@@ -6674,9 +6615,9 @@ react-transition-group@^2.2.1:
prop-types "^15.5.8"
warning "^3.0.0"

react@16.2.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"
react@16.4.2:
version "16.4.2"
resolved "https://registry.yarnpkg.com/react/-/react-16.4.2.tgz#2cd90154e3a9d9dd8da2991149fdca3c260e129f"
dependencies:
fbjs "^0.8.16"
loose-envify "^1.1.0"
@@ -7023,7 +6964,7 @@ resolve@1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"

resolve@^1.1.7, resolve@^1.5.0:
resolve@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c"
dependencies:
@@ -7249,7 +7190,7 @@ shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"

shell-quote@1.6.1, shell-quote@^1.6.1:
shell-quote@1.6.1:
version "1.6.1"
resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
dependencies:
@@ -7630,12 +7571,6 @@ stylis@^3.5.0:
version "3.5.1"
resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.1.tgz#fd341d59f57f9aeb412bc14c9d8a8670b438e03b"

subarg@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
dependencies:
minimist "^1.1.0"

supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -7825,18 +7760,13 @@ tryer@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.0.tgz#027b69fa823225e551cace3ef03b11f6ab37c1d7"

ts-jest@23.0.0:
version "23.0.0"
resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.0.0.tgz#3216310fb51e40789c6e4aa20bfe80198d250e9b"
ts-jest@23.1.3:
version "23.1.3"
resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.1.3.tgz#33e3187d3ef0d42adada6347acf2c3539ac56107"
dependencies:
babel-plugin-istanbul "^4.1.6"
babel-preset-jest "^23.0.0"
cpx "^1.5.0"
closest-file-data "^0.1.4"
fs-extra "6.0.1"
jest-config "^23.0.0"
lodash "^4.17.10"
pkg-dir "^3.0.0"
yargs "^12.0.1"

ts-loader@4.4.2:
version "4.4.2"
@@ -7887,16 +7817,16 @@ typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"

typescript-eslint-parser@15.0.0:
version "15.0.0"
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-15.0.0.tgz#882fd3d7aabffbab0a7f98d2a59fb9a989c2b37f"
typescript-eslint-parser@18.0.0:
version "18.0.0"
resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-18.0.0.tgz#3e5055a44980d69e4154350fc5d8b1ab4e2332a8"
dependencies:
lodash.unescape "4.0.1"
semver "5.5.0"

typescript@2.8.3:
version "2.8.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.8.3.tgz#5d817f9b6f31bb871835f4edf0089f21abe6c170"
typescript@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb"

ua-parser-js@^0.7.18:
version "0.7.18"
@@ -8381,10 +8311,6 @@ xml-name-validator@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"

xregexp@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"

xtend@^4.0.0, xtend@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
@@ -8393,7 +8319,7 @@ y18n@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"

"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
y18n@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"

@@ -8401,12 +8327,6 @@ yallist@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"

yargs-parser@^10.1.0:
version "10.1.0"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8"
dependencies:
camelcase "^4.1.0"

yargs-parser@^9.0.2:
version "9.0.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
@@ -8447,23 +8367,6 @@ yargs@^11.0.0:
y18n "^3.2.1"
yargs-parser "^9.0.2"

yargs@^12.0.1:
version "12.0.1"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2"
dependencies:
cliui "^4.0.0"
decamelize "^2.0.0"
find-up "^3.0.0"
get-caller-file "^1.0.1"
os-locale "^2.0.0"
require-directory "^2.1.1"
require-main-filename "^1.0.1"
set-blocking "^2.0.0"
string-width "^2.0.0"
which-module "^2.0.0"
y18n "^3.2.1 || ^4.0.0"
yargs-parser "^10.1.0"

yargs@~3.10.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"

+ 0
- 1
server/sonar-vsts/.babelrc View File

@@ -20,7 +20,6 @@
],
"plugins": [
"transform-class-properties",
// use built-in `Object.assign`
["transform-object-rest-spread", { "useBuiltIns": true }],
"lodash"
],

+ 12
- 12
server/sonar-vsts/package.json View File

@@ -9,20 +9,20 @@
"babel-polyfill": "6.26.0",
"classnames": "2.2.5",
"lodash": "4.17.4",
"react": "16.2.0",
"react-dom": "16.2.0",
"react": "16.4.2",
"react-dom": "16.4.2",
"whatwg-fetch": "2.0.3"
},
"devDependencies": {
"@types/classnames": "2.2.3",
"@types/enzyme": "3.1.10",
"@types/jest": "22.2.3",
"@types/jest": "23.3.1",
"@types/lodash": "4.14.102",
"@types/react": "16.0.29",
"@types/react-dom": "16.0.3",
"@types/react": "16.4.8",
"@types/react-dom": "16.0.7",
"autoprefixer": "7.1.6",
"babel-core": "6.26.0",
"babel-jest": "23.0.1",
"babel-jest": "23.4.2",
"babel-loader": "7.1.4",
"babel-plugin-dynamic-import-node": "1.1.0",
"babel-plugin-lodash": "3.3.2",
@@ -50,19 +50,19 @@
"eslint-plugin-react": "7.7.0",
"eslint-plugin-sonarjs": "0.1.0",
"html-webpack-plugin": "3.0.6",
"jest": "23.1.0",
"jest": "23.4.2",
"postcss-calc": "6.0.1",
"postcss-custom-properties": "6.2.0",
"postcss-loader": "2.1.1",
"prettier": "1.11.1",
"prettier": "1.14.0",
"react-dev-utils": "5.0.0",
"react-error-overlay": "1.0.7",
"react-test-renderer": "16.2.0",
"react-test-renderer": "16.4.2",
"style-loader": "0.20.3",
"ts-jest": "22.4.6",
"ts-jest": "23.1.3",
"ts-loader": "4.3.0",
"typescript": "2.8.4",
"typescript-eslint-parser": "15.0.0",
"typescript": "3.0.1",
"typescript-eslint-parser": "18.0.0",
"webpack": "4.1.1",
"webpack-bundle-analyzer": "2.11.1",
"webpack-dev-server": "3.1.1"

+ 263
- 453
server/sonar-vsts/yarn.lock
File diff suppressed because it is too large
View File


+ 0
- 1
server/sonar-web/.babelrc View File

@@ -73,7 +73,6 @@
],
"plugins": [
"transform-class-properties",
// use built-in `Object.assign`
["transform-object-rest-spread", { "useBuiltIns": true }],
"lodash"
],

+ 2
- 1
server/sonar-web/.eslintrc View File

@@ -2,6 +2,7 @@
"extends": "sonarqube",

"rules": {
"import/extensions": ["error", "never", { "json": "always", "md": "always" }]
"import/extensions": ["error", "never", { "json": "always", "md": "always" }],
"jsx-a11y/accessible-emoji": "off"
}
}

+ 17
- 17
server/sonar-web/package.json View File

@@ -24,9 +24,9 @@
"lunr": "2.3.0",
"mdast-util-toc": "2.0.1",
"prop-types": "15.6.1",
"react": "16.2.0",
"react": "16.4.2",
"react-day-picker": "7.1.8",
"react-dom": "16.2.0",
"react-dom": "16.4.2",
"react-draggable": "3.0.5",
"react-ga": "2.5.3",
"react-helmet": "5.2.0",
@@ -40,9 +40,9 @@
"redux-logger": "3.0.6",
"redux-thunk": "2.2.0",
"remark-custom-blocks": "2.2.0",
"remark-slug": "5.0.0",
"remark-toc": "5.0.0",
"unist-util-visit": "1.3.1",
"remark-slug": "5.0.0",
"whatwg-fetch": "2.0.4"
},
"devDependencies": {
@@ -55,22 +55,22 @@
"@types/d3-shape": "1.2.2",
"@types/d3-zoom": "1.7.1",
"@types/enzyme": "3.1.10",
"@types/jest": "22.2.3",
"@types/jest": "23.3.1",
"@types/keymaster": "1.6.28",
"@types/lodash": "4.14.108",
"@types/prop-types": "15.5.2",
"@types/react": "16.0.29",
"@types/react-dom": "16.0.3",
"@types/prop-types": "15.5.4",
"@types/react": "16.4.8",
"@types/react-dom": "16.0.7",
"@types/react-helmet": "5.0.6",
"@types/react-intl": "2.3.8",
"@types/react-modal": "3.1.2",
"@types/react-redux": "5.0.12",
"@types/react-redux": "6.0.6",
"@types/react-router": "3.0.13",
"@types/react-select": "1.2.6",
"@types/react-virtualized": "9.18.3",
"autoprefixer": "8.4.1",
"babel-core": "6.26.3",
"babel-jest": "23.0.1",
"babel-jest": "23.4.2",
"babel-loader": "7.1.4",
"babel-plugin-dynamic-import-node": "1.2.0",
"babel-plugin-lodash": "3.3.2",
@@ -102,25 +102,25 @@
"glob": "7.1.2",
"glob-promise": "3.4.0",
"html-webpack-plugin": "3.2.0",
"jest": "23.1.0",
"jest": "23.4.2",
"lint-staged": "4.3.0",
"lodash-webpack-plugin": "0.11.5",
"mini-css-extract-plugin": "0.4.0",
"postcss-calc": "6.0.1",
"postcss-custom-properties": "6.2.0",
"postcss-loader": "2.1.5",
"prettier": "1.11.1",
"prettier": "1.14.0",
"raw-loader": "0.5.1",
"react-dev-utils": "5.0.1",
"react-error-overlay": "1.0.7",
"react-test-renderer": "16.2.0",
"react-test-renderer": "16.4.2",
"remark": "9.0.0",
"remark-react": "4.0.3",
"style-loader": "0.21.0",
"ts-jest": "22.4.6",
"ts-jest": "23.1.3",
"ts-loader": "4.3.0",
"typescript": "2.8.3",
"typescript-eslint-parser": "15.0.0",
"typescript": "3.0.1",
"typescript-eslint-parser": "18.0.0",
"webpack": "4.15.1",
"webpack-bundle-analyzer": "2.11.2",
"webpack-dev-server": "3.1.4"
@@ -179,8 +179,8 @@
],
"testRegex": "(/__tests__/.*|\\-test)\\.(ts|tsx|js)$",
"transform": {
"^.+\\.js$": "<rootDir>/node_modules/babel-jest",
".(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
"\\.js$": "babel-jest",
"\\.(ts|tsx)$": "ts-jest"
}
},
"prettier": {

+ 4
- 3
server/sonar-web/src/main/js/app/components/AdminContainer.tsx View File

@@ -104,6 +104,7 @@ const mapDispatchToProps: DispatchToProps = {
setAdminPages
};

export default connect<StateProps, DispatchToProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
AdminContainer
);
export default connect<StateProps, DispatchToProps, OwnProps>(
mapStateToProps,
mapDispatchToProps
)(AdminContainer);

+ 4
- 1
server/sonar-web/src/main/js/app/components/App.tsx View File

@@ -100,4 +100,7 @@ const mapDispatchToProps = ({
fetchMyOrganizations
} as any) as DispatchProps;

export default connect(mapStateToProps, mapDispatchToProps)(App);
export default connect(
mapStateToProps,
mapDispatchToProps
)(App);

+ 12
- 3
server/sonar-web/src/main/js/app/components/ComponentContainer.tsx View File

@@ -244,9 +244,15 @@ export class ComponentContainer extends React.PureComponent<Props, State> {
return !task.branch && !task.pullRequest;
};

handleComponentChange = (changes: {}) => {
handleComponentChange = (changes: Partial<Component>) => {
if (this.mounted) {
this.setState(state => ({ component: { ...state.component, ...changes } }));
this.setState(state => {
if (state.component) {
const newComponent: Component = { ...state.component, ...changes };
return { component: newComponent };
}
return null;
});
}
};

@@ -309,4 +315,7 @@ export class ComponentContainer extends React.PureComponent<Props, State> {

const mapDispatchToProps = { fetchOrganizations };

export default connect<any, any, any>(null, mapDispatchToProps)(ComponentContainer);
export default connect<any, any, any>(
null,
mapDispatchToProps
)(ComponentContainer);

+ 2
- 1
server/sonar-web/src/main/js/app/components/GlobalFooterBranding.js View File

@@ -30,7 +30,8 @@ export default function GlobalFooterBranding() {
but is <strong>not</strong> an official version provided by{' '}
<a href="http://www.sonarsource.com" title="SonarSource SA">
SonarSource SA
</a>.
</a>
.
</div>
);
}

server/sonar-web/src/main/js/app/components/GlobalMessagesContainer.js → server/sonar-web/src/main/js/app/components/GlobalMessagesContainer.tsx View File

@@ -22,10 +22,13 @@ import GlobalMessages from '../../components/controls/GlobalMessages';
import { getGlobalMessages } from '../../store/rootReducer';
import { closeGlobalMessage } from '../../store/globalMessages/duck';

const mapStateToProps = state => ({
const mapStateToProps = (state: any) => ({
messages: getGlobalMessages(state)
});

const mapDispatchToProps = { closeGlobalMessage };

export default connect(mapStateToProps, mapDispatchToProps)(GlobalMessages);
export default connect(
mapStateToProps,
mapDispatchToProps
)(GlobalMessages);

+ 21
- 11
server/sonar-web/src/main/js/app/components/MarkdownHelp.js View File

@@ -54,8 +54,8 @@ export default function MarkdownHelp() {
</tr>
<tr>
<td className="text-top">
* first item<br />
* second item
* first item
<br />* second item
</td>
<td className="markdown">
<ul>
@@ -66,7 +66,8 @@ export default function MarkdownHelp() {
</tr>
<tr>
<td className="text-top">
1. first item<br />
1. first item
<br />
1. second item
</td>
<td className="markdown text-top">
@@ -102,11 +103,15 @@ export default function MarkdownHelp() {
</tr>
<tr>
<td className="text-top">
``<br />
// code on multiple lines<br />
``
{/* eslint-disable-next-line react/jsx-no-comment-textnodes */}
<br />
// code on multiple lines
<br />
{'public void foo() {'}
<br />
&nbsp;&nbsp;{'// do some logic here'}
&nbsp;&nbsp;
{'// do some logic here'}
<br />
{'}'}
<br />
@@ -120,15 +125,20 @@ export default function MarkdownHelp() {
</tr>
<tr>
<td className="text-top">
Standard text<br />
&gt; Blockquoted text<br />
&gt; that spans multiple lines<br />
Standard text
<br />
&gt; Blockquoted text
<br />
&gt; that spans multiple lines
<br />
</td>
<td className="markdown text-top">
<p>Standard text</p>
<blockquote>
Blockquoted text<br />
that spans multiple lines<br />
Blockquoted text
<br />
that spans multiple lines
<br />
</blockquote>
</td>
</tr>

+ 6
- 5
server/sonar-web/src/main/js/app/components/StartupModal.tsx View File

@@ -106,7 +106,7 @@ export class StartupModal extends React.PureComponent<Props, State> {
this.props.skipOnboardingAction();
return { automatic: false, modal: undefined };
}
return undefined;
return null;
});
};

@@ -115,7 +115,7 @@ export class StartupModal extends React.PureComponent<Props, State> {
if (state.modal === ModalKey.license) {
return { automatic: false, modal: undefined };
}
return undefined;
return null;
});
};

@@ -223,6 +223,7 @@ const mapStateToProps = (state: any): StateProps => ({

const mapDispatchToProps: DispatchProps = { skipOnboardingAction };

export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
StartupModal
);
export default connect<StateProps, DispatchProps, OwnProps>(
mapStateToProps,
mapDispatchToProps
)(StartupModal);

+ 1
- 1
server/sonar-web/src/main/js/app/components/embed-docs-modal/SuggestionsProvider.tsx View File

@@ -20,7 +20,7 @@
import * as React from 'react';
import * as PropTypes from 'prop-types';
// eslint-disable-next-line import/no-extraneous-dependencies
import suggestionsJson from 'Docs/EmbedDocsSuggestions.json';
import * as suggestionsJson from 'Docs/EmbedDocsSuggestions.json';
import { SuggestionsContext } from './SuggestionsContext';
import { isSonarCloud } from '../../../helpers/system';


+ 2
- 4
server/sonar-web/src/main/js/app/components/embed-docs-modal/__tests__/SuggestionsProvider-test.tsx View File

@@ -25,10 +25,8 @@ import { isSonarCloud } from '../../../../helpers/system';
jest.mock(
'Docs/EmbedDocsSuggestions.json',
() => ({
default: {
pageA: [{ link: '/foo', text: 'Foo' }, { link: '/bar', text: 'Bar', scope: 'sonarcloud' }],
pageB: [{ link: '/qux', text: 'Qux' }]
}
pageA: [{ link: '/foo', text: 'Foo' }, { link: '/bar', text: 'Bar', scope: 'sonarcloud' }],
pageB: [{ link: '/qux', text: 'Qux' }]
}),
{ virtual: true }
);

+ 4
- 1
server/sonar-web/src/main/js/app/components/extensions/ExtensionContainer.tsx View File

@@ -28,4 +28,7 @@ const mapStateToProps = (state: any) => ({

const mapDispatchToProps = { onFail: addGlobalErrorMessage };

export default connect<any, any, any>(mapStateToProps, mapDispatchToProps)(Extension);
export default connect<any, any, any>(
mapStateToProps,
mapDispatchToProps
)(Extension);

+ 4
- 3
server/sonar-web/src/main/js/app/components/extensions/OrganizationPageExtension.tsx View File

@@ -80,6 +80,7 @@ const mapStateToProps = (state: any, ownProps: OwnProps) => ({

const mapDispatchToProps = { fetchOrganization };

export default connect<StateToProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
OrganizationPageExtension
);
export default connect<StateToProps, DispatchProps, OwnProps>(
mapStateToProps,
mapDispatchToProps
)(OrganizationPageExtension);

+ 4
- 1
server/sonar-web/src/main/js/app/components/extensions/ProjectAdminPageExtension.js View File

@@ -54,4 +54,7 @@ function ProjectAdminPageExtension(props /*: Props */) {

const mapDispatchToProps = { onFail: addGlobalErrorMessage };

export default connect(null, mapDispatchToProps)(ProjectAdminPageExtension);
export default connect(
null,
mapDispatchToProps
)(ProjectAdminPageExtension);

+ 30
- 30
server/sonar-web/src/main/js/app/components/nav/component/ComponentNavMenu.tsx View File

@@ -109,7 +109,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {

return (
<li>
<Link to={{ pathname: '/code', query: this.getQuery() }} activeClassName="active">
<Link activeClassName="active" to={{ pathname: '/code', query: this.getQuery() }}>
{this.isPortfolio() || this.isApplication()
? translate('view_projects.page')
: translate('code.page')}
@@ -128,8 +128,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li>
<Link
to={{ pathname: '/project/activity', query: this.getQuery() }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/activity', query: this.getQuery() }}>
{translate('project_activity.page')}
</Link>
</li>
@@ -161,8 +161,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li>
<Link
to={{ pathname: '/component_measures', query: this.getQuery() }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/component_measures', query: this.getQuery() }}>
{translate('layout.measures')}
</Link>
</li>
@@ -206,7 +206,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
<Dropdown overlay={this.renderSecurityReportsLink()} tagName="li">
{({ onToggleClick, open }) => (
<a
aria-expanded={String(open)}
aria-expanded={open}
aria-haspopup="true"
className={classNames('dropdown-toggle', { active: isActive || open })}
href="#"
@@ -240,7 +240,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
tagName="li">
{({ onToggleClick, open }) => (
<a
aria-expanded={String(open)}
aria-expanded={open}
aria-haspopup="true"
className={classNames('dropdown-toggle', { active: isSettingsActive || open })}
href="#"
@@ -278,8 +278,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="settings">
<Link
to={{ pathname: '/project/settings', query: this.getQuery() }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/settings', query: this.getQuery() }}>
{translate('project_settings.page')}
</Link>
</li>
@@ -298,8 +298,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="branches">
<Link
to={{ pathname: '/project/branches', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/branches', query: { id: this.props.component.key } }}>
{translate('project_branches.page')}
</Link>
</li>
@@ -313,8 +313,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="profiles">
<Link
to={{ pathname: '/project/quality_profiles', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/quality_profiles', query: { id: this.props.component.key } }}>
{translate('project_quality_profiles.page')}
</Link>
</li>
@@ -328,8 +328,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="quality_gate">
<Link
to={{ pathname: '/project/quality_gate', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/quality_gate', query: { id: this.props.component.key } }}>
{translate('project_quality_gate.page')}
</Link>
</li>
@@ -343,8 +343,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="custom_measures">
<Link
to={{ pathname: '/custom_measures', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/custom_measures', query: { id: this.props.component.key } }}>
{translate('custom_measures.page')}
</Link>
</li>
@@ -358,8 +358,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="links">
<Link
to={{ pathname: '/project/links', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/links', query: { id: this.props.component.key } }}>
{translate('project_links.page')}
</Link>
</li>
@@ -373,8 +373,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="permissions">
<Link
to={{ pathname: '/project_roles', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project_roles', query: { id: this.props.component.key } }}>
{translate('permissions.page')}
</Link>
</li>
@@ -388,8 +388,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="background_tasks">
<Link
to={{ pathname: '/project/background_tasks', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/background_tasks', query: { id: this.props.component.key } }}>
{translate('background_tasks.page')}
</Link>
</li>
@@ -403,8 +403,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="update_key">
<Link
to={{ pathname: '/project/key', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/key', query: { id: this.props.component.key } }}>
{translate('update_key.page')}
</Link>
</li>
@@ -418,8 +418,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="webhooks">
<Link
to={{ pathname: '/project/webhooks', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/webhooks', query: { id: this.props.component.key } }}>
{translate('webhooks.page')}
</Link>
</li>
@@ -440,8 +440,8 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
return (
<li key="project_delete">
<Link
to={{ pathname: '/project/deletion', query: { id: this.props.component.key } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/project/deletion', query: { id: this.props.component.key } }}>
{translate('deletion.page')}
</Link>
</li>
@@ -481,7 +481,7 @@ export default class ComponentNavMenu extends React.PureComponent<Props> {
tagName="li">
{({ onToggleClick, open }) => (
<a
aria-expanded={String(open)}
aria-expanded={open}
aria-haspopup="true"
className={classNames('dropdown-toggle', { active: open })}
href="#"

+ 1
- 1
server/sonar-web/src/main/js/app/components/nav/global/GlobalNavMenu.tsx View File

@@ -163,7 +163,7 @@ export default class GlobalNavMenu extends React.PureComponent<Props> {
tagName="li">
{({ onToggleClick, open }) => (
<a
aria-expanded={String(open)}
aria-expanded={open}
aria-haspopup="true"
className={classNames('dropdown-toggle', { active: open })}
href="#"

+ 1
- 1
server/sonar-web/src/main/js/app/components/nav/global/GlobalNavPlus.tsx View File

@@ -84,7 +84,7 @@ export default class GlobalNavPlus extends React.PureComponent<Props, State> {
{({ onToggleClick, open }) => (
<>
<a
aria-expanded={String(open)}
aria-expanded={open}
aria-haspopup="true"
className="navbar-plus"
href="#"

+ 3
- 3
server/sonar-web/src/main/js/app/components/nav/settings/SettingsNav.tsx View File

@@ -120,7 +120,7 @@ export default class SettingsNav extends React.PureComponent<Props> {
tagName="li">
{({ onToggleClick, open }) => (
<a
aria-expanded={String(open)}
aria-expanded={open}
aria-haspopup="true"
className={classNames('dropdown-toggle', {
active:
@@ -165,7 +165,7 @@ export default class SettingsNav extends React.PureComponent<Props> {
tagName="li">
{({ onToggleClick, open }) => (
<a
aria-expanded={String(open)}
aria-expanded={open}
aria-haspopup="true"
className={classNames('dropdown-toggle', { active: open || this.isProjectsActive() })}
href="#"
@@ -215,7 +215,7 @@ export default class SettingsNav extends React.PureComponent<Props> {
tagName="li">
{({ onToggleClick, open }) => (
<a
aria-expanded={String(open)}
aria-expanded={open}
aria-haspopup="true"
className={classNames('dropdown-toggle', { active: open || this.isSecurityActive() })}
href="#"

+ 1
- 1
server/sonar-web/src/main/js/app/components/search/SearchShowMore.js View File

@@ -54,7 +54,7 @@ export default class SearchShowMore extends React.PureComponent {
const { loadingMore, qualifier, selected } = this.props;

return (
<li key={`more-${qualifier}`} className={classNames('menu-footer', { active: selected })}>
<li className={classNames('menu-footer', { active: selected })} key={`more-${qualifier}`}>
<DeferredSpinner className="navbar-search-icon" loading={loadingMore === qualifier}>
<a
className={classNames({ 'cursor-not-allowed': !this.props.allowMore })}

+ 2
- 2
server/sonar-web/src/main/js/app/styles/components/boxed-group.css View File

@@ -64,8 +64,8 @@
}

.boxed-group-list {
margin-top: - var(--gridSize);
margin-bottom: - var(--gridSize);
margin-top: -var(--gridSize);
margin-bottom: -var(--gridSize);
}

.boxed-group-list > li {

+ 4
- 1
server/sonar-web/src/main/js/apps/about/components/AboutApp.js View File

@@ -219,4 +219,7 @@ const mapStateToProps = state => ({

const mapDispatchToProps = { fetchAboutPageSettings };

export default connect(mapStateToProps, mapDispatchToProps)(AboutApp);
export default connect(
mapStateToProps,
mapDispatchToProps
)(AboutApp);

+ 1
- 1
server/sonar-web/src/main/js/apps/about/components/AboutProjects.js View File

@@ -37,7 +37,7 @@ export default function AboutProjects({ count, loading } /*: Props */) {
{!loading && (
<div>
<div>
<Link to="/projects" className="about-page-projects-link">
<Link className="about-page-projects-link" to="/projects">
{formatMeasure(count, 'INT')}
</Link>
</div>

+ 3
- 3
server/sonar-web/src/main/js/apps/about/components/AboutScanners.js View File

@@ -55,11 +55,11 @@ export default function AboutScanners() {
<p className="about-page-text">{translate('about_page.scanners.text')}</p>
<div className="about-page-analyzers">
{scanners.map(scanner => (
<a key={scanner.key} className="about-page-analyzer-box" href={scanner.link}>
<a className="about-page-analyzer-box" href={scanner.link} key={scanner.key}>
<img
src={`${window.baseUrl}/images/scanner-logos/${scanner.key}.svg`}
height={60}
alt={translate('about_page.scanners', scanner.key)}
height={60}
src={`${window.baseUrl}/images/scanner-logos/${scanner.key}.svg`}
/>
</a>
))}

+ 6
- 6
server/sonar-web/src/main/js/apps/about/components/EntryIssueTypes.js View File

@@ -48,8 +48,8 @@ export default function EntryIssueTypes(
<tr>
<td className="about-page-issue-type-number">
<Link
to={getIssuesUrl({ resolved: 'false', types: 'BUG', s: 'CREATION_DATE' })}
className="about-page-issue-type-link">
className="about-page-issue-type-link"
to={getIssuesUrl({ resolved: 'false', types: 'BUG', s: 'CREATION_DATE' })}>
{formatMeasure(bugs, 'SHORT_INT')}
</Link>
</td>
@@ -63,12 +63,12 @@ export default function EntryIssueTypes(
<tr>
<td className="about-page-issue-type-number">
<Link
className="about-page-issue-type-link"
to={getIssuesUrl({
resolved: 'false',
types: 'VULNERABILITY',
s: 'CREATION_DATE'
})}
className="about-page-issue-type-link">
})}>
{formatMeasure(vulnerabilities, 'SHORT_INT')}
</Link>
</td>
@@ -82,8 +82,8 @@ export default function EntryIssueTypes(
<tr>
<td className="about-page-issue-type-number">
<Link
to={getIssuesUrl({ resolved: 'false', types: 'CODE_SMELL', s: 'CREATION_DATE' })}
className="about-page-issue-type-link">
className="about-page-issue-type-link"
to={getIssuesUrl({ resolved: 'false', types: 'CODE_SMELL', s: 'CREATION_DATE' })}>
{formatMeasure(codeSmells, 'SHORT_INT')}
</Link>
</td>

+ 2
- 2
server/sonar-web/src/main/js/apps/about/sonarcloud/AsAService.tsx View File

@@ -36,8 +36,8 @@ export default function AsAService() {
<img alt="" height="34" src={`${getBaseUrl()}/images/sonarcloud/as-a-service.svg`} />
<h1 className="sc-child-title">As a Service</h1>
<p className="sc-child-lead">
We fully operate the SonarQube base service, <br />which is hosted in Frankfurt,
Germany.
We fully operate the SonarQube base service, <br />
which is hosted in Frankfurt, Germany.
</p>
<img
alt=""

+ 4
- 3
server/sonar-web/src/main/js/apps/about/sonarcloud/BranchAnalysis.tsx View File

@@ -35,11 +35,12 @@ export default function BranchAnalysis() {
<div className="sc-child-header">
<img alt="" height="34" src={`${getBaseUrl()}/images/sonarcloud/branch-analysis.svg`} />
<h1 className="sc-child-title">
Branch analysis & <br />pull request decoration
Branch analysis & <br />
pull request decoration
</h1>
<p className="sc-child-lead">
SonarCloud comes with a built-in feature to automatically analyze <br />project
branches and pull requests as soon as they get created.
SonarCloud comes with a built-in feature to automatically analyze <br />
project branches and pull requests as soon as they get created.
</p>
</div>


+ 6
- 3
server/sonar-web/src/main/js/apps/about/sonarcloud/Footer.tsx View File

@@ -137,14 +137,16 @@ export default function Footer() {
rel="noopener noreferrer"
target="_blank">
SonarSource SA
</a>. All rights reserved. SonarCloud is a service operated by{' '}
</a>
. All rights reserved. SonarCloud is a service operated by{' '}
<a
className="sc-footer-link sc-footer-copy-link"
href="https://www.sonarsource.com"
rel="noopener noreferrer"
target="_blank">
SonarSource
</a>, the company that develops and promotes open source{' '}
</a>
, the company that develops and promotes open source{' '}
<a
className="sc-footer-link sc-footer-copy-link"
href="http://sonarqube.org"
@@ -159,7 +161,8 @@ export default function Footer() {
rel="noopener noreferrer"
target="_blank">
SonarLint
</a>.
</a>
.
</div>
</div>
</footer>

+ 4
- 4
server/sonar-web/src/main/js/apps/about/sonarcloud/Home.tsx View File

@@ -33,8 +33,8 @@ export default function Home() {
<div className="page page-limited sc-page">
<h1 className="sc-page-title">Continuous Code Quality Online</h1>
<p className="sc-page-subtitle">
Analyze the quality of your source code to detect bugs, vulnerabilities <br />and code
smells throughout the development process.
Analyze the quality of your source code to detect bugs, vulnerabilities <br />
and code smells throughout the development process.
</p>

<ul className="sc-features-list">
@@ -91,8 +91,8 @@ export default function Home() {
<div className="sc-narrow-container text-center">
<h2 className="sc-feature-title">Explore open source projects on SonarCloud</h2>
<p className="sc-feature-description">
SonarCloud offers free analysis for open source projects. <br />It is public and open
to anyone who wants to browse the service.
SonarCloud offers free analysis for open source projects. <br />
It is public and open to anyone who wants to browse the service.
</p>
</div>


+ 2
- 1
server/sonar-web/src/main/js/apps/about/sonarcloud/Pricing.tsx View File

@@ -33,7 +33,8 @@ export default function Pricing() {
<h3 className="sc-pricing-title">Private Projects</h3>
<span className="sc-pricing-small">14 days free trial</span>
<strong>
From <span className="sc-pricing-price">10€</span>/mo
From <span className="sc-pricing-price">10€</span>
/mo
</strong>
<Link className="sc-news-link" to="/documentation/sonarcloud-pricing">
see prices

+ 4
- 2
server/sonar-web/src/main/js/apps/about/sonarcloud/SQHome.tsx View File

@@ -52,12 +52,14 @@ function Jumbotron() {
<div className="sc-sq-jumbotron">
<div className="sc-sq-jumbotron-left">
<h1 className="sc-sq-jumbotron-title">
Use SonarQube<br />
Use SonarQube
<br />
<span className="sc-sq-jumbotron-title-orange">as a Service</span>
</h1>
<div className="sc-sq-jumbotron-login">
{'—'}
<br />Log in or sign up with
<br />
Log in or sign up with
</div>
<div>
<a

+ 2
- 2
server/sonar-web/src/main/js/apps/about/sonarcloud/SonarLintIntegration.tsx View File

@@ -44,8 +44,8 @@ export default function SonarLintIntegration() {
<a className="sc-child-lead-link" href="https://www.sonarlint.org/">
SonarLint
</a>{' '}
to provide developers maximum insight <br />in their IDEs on code quality and make
sure they do not introduce new issues.
to provide developers maximum insight <br />
in their IDEs on code quality and make sure they do not introduce new issues.
</p>
<img
alt=""

+ 1
- 1
server/sonar-web/src/main/js/apps/account/components/Account.js View File

@@ -50,7 +50,7 @@ class Account extends React.PureComponent {
<header className="account-header">
<div className="account-container clearfix">
<UserCard user={currentUser} />
<Nav user={currentUser} customOrganizations={this.props.customOrganizations} />
<Nav customOrganizations={this.props.customOrganizations} user={currentUser} />
</div>
</header>


+ 5
- 5
server/sonar-web/src/main/js/apps/account/components/Nav.js View File

@@ -34,30 +34,30 @@ export default function Nav({ customOrganizations } /*: Props */) {
<nav className="account-nav">
<NavBarTabs>
<li>
<IndexLink to="/account/" activeClassName="active">
<IndexLink activeClassName="active" to="/account/">
{translate('my_account.profile')}
</IndexLink>
</li>
<li>
<Link to="/account/security/" activeClassName="active">
<Link activeClassName="active" to="/account/security/">
{translate('my_account.security')}
</Link>
</li>
<li>
<Link to="/account/notifications" activeClassName="active">
<Link activeClassName="active" to="/account/notifications">
{translate('my_account.notifications')}
</Link>
</li>
{!customOrganizations && (
<li>
<Link to="/account/projects/" activeClassName="active">
<Link activeClassName="active" to="/account/projects/">
{translate('my_account.projects')}
</Link>
</li>
)}
{customOrganizations && (
<li>
<Link to="/account/organizations" activeClassName="active">
<Link activeClassName="active" to="/account/organizations">
{translate('my_account.organizations')}
</Link>
</li>

+ 2
- 2
server/sonar-web/src/main/js/apps/account/components/UserCard.js View File

@@ -31,10 +31,10 @@ export default class UserCard extends React.PureComponent {

return (
<div className="account-user">
<div id="avatar" className="pull-left account-user-avatar">
<div className="pull-left account-user-avatar" id="avatar">
<Avatar hash={user.avatar} name={user.name} size={60} />
</div>
<h1 id="name" className="pull-left">
<h1 className="pull-left" id="name">
{user.name}
</h1>
</div>

+ 4
- 1
server/sonar-web/src/main/js/apps/account/notifications/NotificationsContainer.tsx View File

@@ -23,4 +23,7 @@ import { fetchOrganizations } from '../../../store/rootActions';

const mapDispatchToProps = { fetchOrganizations } as Pick<Props, 'fetchOrganizations'>;

export default connect(null, mapDispatchToProps)(Notifications);
export default connect(
null,
mapDispatchToProps
)(Notifications);

+ 4
- 1
server/sonar-web/src/main/js/apps/account/organizations/CreateOrganizationForm.tsx View File

@@ -246,4 +246,7 @@ class CreateOrganizationForm extends React.PureComponent<Props, State> {

const mapDispatchToProps: DispatchProps = { createOrganization: createOrganization as any };

export default connect(null, mapDispatchToProps)(CreateOrganizationForm);
export default connect(
null,
mapDispatchToProps
)(CreateOrganizationForm);

+ 1
- 1
server/sonar-web/src/main/js/apps/account/organizations/OrganizationCard.tsx View File

@@ -50,7 +50,7 @@ export default function OrganizationCard({ organization }: Props) {

{!!organization.url && (
<div className="markdown spacer-top">
<a href={organization.url} title={organization.url} rel="nofollow">
<a href={organization.url} rel="nofollow" title={organization.url}>
{organization.url}
</a>
</div>

+ 4
- 1
server/sonar-web/src/main/js/apps/account/organizations/UserOrganizations.tsx View File

@@ -120,4 +120,7 @@ const mapDispatchToProps = {
fetchIfAnyoneCanCreateOrganizations: fetchIfAnyoneCanCreateOrganizations as any
} as DispatchProps;

export default connect(mapStateToProps, mapDispatchToProps)(UserOrganizations);
export default connect(
mapStateToProps,
mapDispatchToProps
)(UserOrganizations);

+ 2
- 2
server/sonar-web/src/main/js/apps/account/profile/Profile.js View File

@@ -52,7 +52,7 @@ function Profile(props /*: Props */) {

{!user.local &&
user.externalProvider !== 'sonarqube' && (
<div id="identity-provider" className="spacer-bottom">
<div className="spacer-bottom" id="identity-provider">
<UserExternalIdentity user={user} />
</div>
)}
@@ -68,7 +68,7 @@ function Profile(props /*: Props */) {

<hr />

<UserScmAccounts user={user} scmAccounts={user.scmAccounts} />
<UserScmAccounts scmAccounts={user.scmAccounts} user={user} />
</div>
</div>
);

+ 2
- 2
server/sonar-web/src/main/js/apps/account/profile/UserExternalIdentity.js View File

@@ -87,11 +87,11 @@ export default class UserExternalIdentity extends React.PureComponent {
color: getTextColor(identityProvider.backgroundColor, theme.secondFontColor)
}}>
<img
alt={identityProvider.name}
className="little-spacer-right"
height="14"
src={window.baseUrl + identityProvider.iconPath}
width="14"
height="14"
alt={identityProvider.name}
/>{' '}
{user.externalIdentity}
</div>

+ 1
- 1
server/sonar-web/src/main/js/apps/account/profile/UserGroups.js View File

@@ -34,7 +34,7 @@ export default class UserGroups extends React.PureComponent {
<h2 className="spacer-bottom">{translate('my_profile.groups')}</h2>
<ul id="groups">
{groups.map(group => (
<li key={group} className="little-spacer-bottom" title={group}>
<li className="little-spacer-bottom" key={group} title={group}>
{group}
</li>
))}

+ 1
- 1
server/sonar-web/src/main/js/apps/account/profile/UserScmAccounts.js View File

@@ -45,7 +45,7 @@ export default class UserScmAccounts extends React.PureComponent {
)}

{scmAccounts.map(scmAccount => (
<li key={scmAccount} className="little-spacer-bottom" title={scmAccount}>
<li className="little-spacer-bottom" key={scmAccount} title={scmAccount}>
{scmAccount}
</li>
))}

+ 5
- 5
server/sonar-web/src/main/js/apps/background-tasks/__tests__/background-tasks-test.js View File

@@ -81,21 +81,21 @@ describe('Stats', () => {
describe('Pending', () => {
it('should show zero pending', () => {
const result = shallow(
<Stats pendingCount={0} onCancelAllPending={stub} onShowFailing={stub} />
<Stats onCancelAllPending={stub} onShowFailing={stub} pendingCount={0} />
);
expect(result.find('.js-pending-count').text()).toContain('0');
});

it('should show 5 pending', () => {
const result = shallow(
<Stats pendingCount={5} onCancelAllPending={stub} onShowFailing={stub} />
<Stats onCancelAllPending={stub} onShowFailing={stub} pendingCount={5} />
);
expect(result.find('.js-pending-count').text()).toContain('5');
});

it('should not show cancel pending button', () => {
const result = shallow(
<Stats pendingCount={0} onCancelAllPending={stub} onShowFailing={stub} />
<Stats onCancelAllPending={stub} onShowFailing={stub} pendingCount={0} />
);
expect(result.find('.js-cancel-pending').length).toBe(0);
});
@@ -104,9 +104,9 @@ describe('Stats', () => {
const result = shallow(
<Stats
isSystemAdmin={true}
pendingCount={5}
onCancelAllPending={stub}
onShowFailing={stub}
pendingCount={5}
/>
);
expect(result.find('.js-cancel-pending').length).toBe(1);
@@ -117,9 +117,9 @@ describe('Stats', () => {
const result = shallow(
<Stats
isSystemAdmin={true}
pendingCount={5}
onCancelAllPending={spy}
onShowFailing={stub}
pendingCount={5}
/>
);
expect(spy).not.toBeCalled();

+ 4
- 1
server/sonar-web/src/main/js/apps/background-tasks/components/BackgroundTasksApp.js View File

@@ -270,4 +270,7 @@ class BackgroundTasksApp extends React.PureComponent {

const mapDispatchToProps = { fetchOrganizations };

export default connect(null, mapDispatchToProps)(BackgroundTasksApp);
export default connect(
null,
mapDispatchToProps
)(BackgroundTasksApp);

+ 1
- 1
server/sonar-web/src/main/js/apps/background-tasks/components/ScannerContext.tsx View File

@@ -84,7 +84,7 @@ export default class ScannerContext extends React.PureComponent<Props, State> {
</div>

<div className="modal-foot">
<a href="#" className="js-modal-close" onClick={this.handleCloseClick}>
<a className="js-modal-close" href="#" onClick={this.handleCloseClick}>
{translate('close')}
</a>
</div>

+ 1
- 1
server/sonar-web/src/main/js/apps/background-tasks/components/Stacktrace.tsx View File

@@ -100,7 +100,7 @@ export default class Stacktrace extends React.PureComponent<Props, State> {
</div>

<div className="modal-foot">
<a href="#" className="js-modal-close" onClick={this.handleCloseClick}>
<a className="js-modal-close" href="#" onClick={this.handleCloseClick}>
{translate('close')}
</a>
</div>

+ 2
- 2
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskDate-test.tsx View File

@@ -25,9 +25,9 @@ it('renders', () => {
expect(shallow(<TaskDate />)).toMatchSnapshot();
expect(shallow(<TaskDate date="2017-01-01T00:00:00.000Z" />)).toMatchSnapshot();
expect(
shallow(<TaskDate date="2017-01-01T00:00:00.000Z" baseDate="2017-01-01T00:00:00.000Z" />)
shallow(<TaskDate baseDate="2017-01-01T00:00:00.000Z" date="2017-01-01T00:00:00.000Z" />)
).toMatchSnapshot();
expect(
shallow(<TaskDate date="2017-01-05T00:00:00.000Z" baseDate="2017-01-01T00:00:00.000Z" />)
shallow(<TaskDate baseDate="2017-01-01T00:00:00.000Z" date="2017-01-05T00:00:00.000Z" />)
).toMatchSnapshot();
});

+ 2
- 2
server/sonar-web/src/main/js/apps/background-tasks/components/__tests__/TaskDay-test.tsx View File

@@ -24,13 +24,13 @@ import TaskDay from '../TaskDay';
it('renders', () => {
expect(
shallow(
<TaskDay submittedAt="2017-01-02T00:00:00.000Z" prevSubmittedAt="2017-01-01T00:00:00.000Z" />
<TaskDay prevSubmittedAt="2017-01-01T00:00:00.000Z" submittedAt="2017-01-02T00:00:00.000Z" />
)
).toMatchSnapshot();

expect(
shallow(
<TaskDay submittedAt="2017-01-01T00:00:00.000Z" prevSubmittedAt="2017-01-01T00:00:00.000Z" />
<TaskDay prevSubmittedAt="2017-01-01T00:00:00.000Z" submittedAt="2017-01-01T00:00:00.000Z" />
)
).toMatchSnapshot();
});

+ 1
- 1
server/sonar-web/src/main/js/apps/code/components/App.tsx View File

@@ -239,7 +239,7 @@ export default class App extends React.PureComponent<Props, State> {

{sourceViewer === undefined &&
components !== undefined && (
<ListFooter count={components.length} total={total} loadMore={this.handleLoadMore} />
<ListFooter count={components.length} loadMore={this.handleLoadMore} total={total} />
)}

{sourceViewer !== undefined && (

+ 1
- 1
server/sonar-web/src/main/js/apps/code/components/Search.tsx View File

@@ -176,7 +176,7 @@ export default class Search extends React.PureComponent<Props, State> {
const isPortfolio = ['VW', 'SVW', 'APP'].includes(component.qualifier);

return (
<div id="code-search" className={containerClassName}>
<div className={containerClassName} id="code-search">
<SearchBox
minLength={3}
onChange={this.handleQueryChange}

+ 5
- 3
server/sonar-web/src/main/js/apps/coding-rules/components/App.tsx View File

@@ -467,12 +467,14 @@ export class App extends React.PureComponent<Props, State> {
});

handleRuleDeactivate = (profile: string, rule: string) =>
this.setState((state: State) => {
this.setState(state => {
const { actives } = state;
if (actives && actives[rule]) {
return { actives: { ...actives, [rule]: { ...actives[rule], [profile]: undefined } } };
const newRule = { ...actives[rule] };
delete newRule[profile];
return { actives: { ...actives, [rule]: newRule } };
}
return {};
return null;
});

handleSearch = (searchQuery: string) => this.handleFilterChange({ searchQuery });

+ 4
- 7
server/sonar-web/src/main/js/apps/coding-rules/components/CustomRuleFormModal.tsx View File

@@ -131,13 +131,10 @@ export default class CustomRuleFormModal extends React.PureComponent<Props, Stat

handleNameChange = (event: React.SyntheticEvent<HTMLInputElement>) => {
const { value: name } = event.currentTarget;
this.setState((state: State) => {
const change: Partial<State> = { name };
if (!state.keyModifiedByUser) {
change.key = latinize(name).replace(/[^A-Za-z0-9]/g, '_');
}
return change;
});
this.setState(state => ({
name,
key: state.keyModifiedByUser ? state.key : latinize(name).replace(/[^A-Za-z0-9]/g, '_')
}));
};

handleKeyChange = (event: React.SyntheticEvent<HTMLInputElement>) =>

+ 7
- 2
server/sonar-web/src/main/js/apps/coding-rules/components/RuleDetails.tsx View File

@@ -104,14 +104,19 @@ export default class RuleDetails extends React.PureComponent<Props, State> {
handleTagsChange = (tags: string[]) => {
// optimistic update
const oldTags = this.state.ruleDetails && this.state.ruleDetails.tags;
this.setState(state => ({ ruleDetails: { ...state.ruleDetails, tags } }));
this.setState(
state => (state.ruleDetails ? { ruleDetails: { ...state.ruleDetails, tags } } : null)
);
updateRule({
key: this.props.ruleKey,
organization: this.props.organization,
tags: tags.join()
}).catch(() => {
if (this.mounted) {
this.setState(state => ({ ruleDetails: { ...state.ruleDetails, tags: oldTags } }));
this.setState(
state =>
state.ruleDetails ? { ruleDetails: { ...state.ruleDetails, tags: oldTags } } : null
);
}
});
};

+ 4
- 1
server/sonar-web/src/main/js/apps/component-measures/components/AppContainer.js View File

@@ -74,4 +74,7 @@ const fetchMeasures = (

const mapDispatchToProps = { fetchMeasures, fetchMetrics };

export default connect(mapStateToProps, mapDispatchToProps)(withRouter(App));
export default connect(
mapStateToProps,
mapDispatchToProps
)(withRouter(App));

+ 2
- 2
server/sonar-web/src/main/js/apps/component-measures/components/Breadcrumbs.js View File

@@ -104,11 +104,11 @@ export default class Breadcrumbs extends React.PureComponent {
<div className={this.props.className}>
{breadcrumbs.map(component => (
<Breadcrumb
key={component.key}
canBrowse={component.key !== lastItem.key}
component={component}
isLast={component.key === lastItem.key}
handleSelect={this.props.handleSelect}
isLast={component.key === lastItem.key}
key={component.key}
/>
))}
</div>

+ 2
- 2
server/sonar-web/src/main/js/apps/component-measures/components/MeasureContent.js View File

@@ -306,15 +306,15 @@ export default class MeasureContent extends React.PureComponent {
isLoggedIn && (
<MeasureFavoriteContainer
branchLike={branchLike}
component={component.key}
className="measure-favorite spacer-right"
component={component.key}
/>
)}
{!isFile && (
<MeasureViewSelect
className="measure-view-select"
metric={metric}
handleViewChange={this.props.updateView}
metric={metric}
view={view}
/>
)}

+ 1
- 1
server/sonar-web/src/main/js/apps/component-measures/components/MeasureContentContainer.js View File

@@ -134,8 +134,8 @@ export default class MeasureContentContainer extends React.PureComponent {
className={this.props.className}
component={this.state.component}
currentUser={this.props.currentUser}
loading={this.state.loading.measure || this.state.loading.components}
leakPeriod={this.props.leakPeriod}
loading={this.state.loading.measure || this.state.loading.components}
measure={this.state.measure}
metric={this.props.metric}
metrics={this.props.metrics}

+ 4
- 1
server/sonar-web/src/main/js/apps/component-measures/components/MeasureFavoriteContainer.js View File

@@ -97,4 +97,7 @@ const mapDispatchToProps = {
}
};

export default connect(mapStateToProps, mapDispatchToProps)(MeasureFavoriteContainer);
export default connect(
mapStateToProps,
mapDispatchToProps
)(MeasureFavoriteContainer);

+ 2
- 2
server/sonar-web/src/main/js/apps/component-measures/components/MeasureViewSelect.js View File

@@ -89,11 +89,11 @@ export default class MeasureViewSelect extends React.PureComponent {
autoBlur={true}
className={this.props.className}
clearable={false}
onChange={this.handleChange}
options={this.getOptions()}
searchable={false}
value={this.props.view}
valueRenderer={this.renderValue}
options={this.getOptions()}
onChange={this.handleChange}
/>
);
}

+ 2
- 2
server/sonar-web/src/main/js/apps/component-measures/components/__tests__/Breadcrumb-test.js View File

@@ -31,8 +31,8 @@ it('should show the last element without clickable link', () => {
name: 'Foo',
qualifier: 'TRK'
}}
isLast={true}
handleSelect={() => {}}
isLast={true}
/>
)
).toMatchSnapshot();
@@ -48,8 +48,8 @@ it('should correctly show a middle element', () => {
name: 'Foo',
qualifier: 'TRK'
}}
isLast={false}
handleSelect={() => {}}
isLast={false}
/>
)
).toMatchSnapshot();

+ 1
- 1
server/sonar-web/src/main/js/apps/component-measures/components/__tests__/MeasureViewSelect-test.js View File

@@ -24,7 +24,7 @@ import MeasureViewSelect from '../MeasureViewSelect';
it('should display correctly with treemap option', () => {
expect(
shallow(
<MeasureViewSelect metric={{ type: 'PERCENT' }} handleViewChange={() => {}} view="tree" />
<MeasureViewSelect handleViewChange={() => {}} metric={{ type: 'PERCENT' }} view="tree" />
)
).toMatchSnapshot();
});

+ 1
- 1
server/sonar-web/src/main/js/apps/component-measures/drilldown/MeasureCell.js View File

@@ -40,7 +40,7 @@ export default function MeasureCell({ component, measure, metric } /*: Props */)
return (
<td className="thin nowrap text-right">
<span id={`component-measures-component-measure-${component.key}-${metric.key}`}>
<Measure value={value} metricKey={metric.key} metricType={metric.type} />
<Measure metricKey={metric.key} metricType={metric.type} value={value} />
</span>
</td>
);

+ 1
- 1
server/sonar-web/src/main/js/apps/component-measures/drilldown/TreeMapView.js View File

@@ -162,8 +162,8 @@ export default class TreeMapView extends React.PureComponent {
return (
<ColorGradientLegend
className="measure-details-treemap-legend"
colorScale={colorScale}
colorNA={theme.secondFontColor}
colorScale={colorScale}
direction={metric.direction}
height={20}
width={200}

+ 5
- 5
server/sonar-web/src/main/js/apps/component-measures/sidebar/FacetMeasureValue.js View File

@@ -27,23 +27,23 @@ export default function FacetMeasureValue({ measure } /*: { measure: MeasureEnha
if (isDiffMetric(measure.metric.key)) {
return (
<div
id={`measure-${measure.metric.key}-leak`}
className="domain-measures-value domain-measures-leak">
className="domain-measures-value domain-measures-leak"
id={`measure-${measure.metric.key}-leak`}>
<Measure
value={measure.leak}
metricKey={measure.metric.key}
metricType={measure.metric.type}
value={measure.leak}
/>
</div>
);
}

return (
<div id={`measure-${measure.metric.key}-value`} className="domain-measures-value">
<div className="domain-measures-value" id={`measure-${measure.metric.key}-value`}>
<Measure
value={measure.value}
metricKey={measure.metric.key}
metricType={measure.metric.type}
value={measure.value}
/>
</div>
);

+ 4
- 4
server/sonar-web/src/main/js/apps/explore/Explore.tsx View File

@@ -31,21 +31,21 @@ interface Props {
export default function Explore(props: Props) {
return (
<div id="explore">
<ContextNavBar id="explore-navigation" height={theme.contextNavHeightRaw}>
<ContextNavBar height={theme.contextNavHeightRaw} id="explore-navigation">
<header className="navbar-context-header">
<h1>{translate('explore')}</h1>
</header>

<NavBarTabs>
<li>
<Link to="/explore/projects" activeClassName="active">
<Link activeClassName="active" to="/explore/projects">
{translate('projects.page')}
</Link>
</li>
<li>
<Link
to={{ pathname: '/explore/issues', query: { resolved: 'false' } }}
activeClassName="active">
activeClassName="active"
to={{ pathname: '/explore/issues', query: { resolved: 'false' } }}>
{translate('issues.page')}
</Link>
</li>

+ 1
- 1
server/sonar-web/src/main/js/apps/groups/components/List.tsx View File

@@ -35,7 +35,7 @@ interface Props {
export default function List(props: Props) {
return (
<div className="boxed-group boxed-group-inner">
<table id="groups-list" className="data zebra zebra-hover">
<table className="data zebra zebra-hover" id="groups-list">
<thead>
<tr>
<th />

+ 4
- 4
server/sonar-web/src/main/js/apps/groups/components/__tests__/__snapshots__/EditMembers-test.tsx.snap View File

@@ -45,7 +45,7 @@ exports[`should edit members 1`] = `
"clipRule": "evenodd",
"fillRule": "evenodd",
"strokeLinejoin": "round",
"strokeMiterlimit": "1.41421",
"strokeMiterlimit": 1.41421,
}
}
version="1.1"
@@ -116,7 +116,7 @@ exports[`should edit members 2`] = `
"clipRule": "evenodd",
"fillRule": "evenodd",
"strokeLinejoin": "round",
"strokeMiterlimit": "1.41421",
"strokeMiterlimit": 1.41421,
}
}
version="1.1"
@@ -393,7 +393,7 @@ exports[`should edit members 2`] = `
"clipRule": "evenodd",
"fillRule": "evenodd",
"strokeLinejoin": "round",
"strokeMiterlimit": "1.41421",
"strokeMiterlimit": 1.41421,
}
}
version="1.1"
@@ -525,7 +525,7 @@ exports[`should edit members 3`] = `
"clipRule": "evenodd",
"fillRule": "evenodd",
"strokeLinejoin": "round",
"strokeMiterlimit": "1.41421",
"strokeMiterlimit": 1.41421,
}
}
version="1.1"

+ 14
- 14
server/sonar-web/src/main/js/apps/issues/actions.ts View File

@@ -20,7 +20,7 @@
import { State } from './components/App';
import { allLocationsEmpty } from './utils';

export function enableLocationsNavigator(state: State): Partial<State> | undefined {
export function enableLocationsNavigator(state: State) {
const { openIssue, selectedLocationIndex } = state;
if (openIssue && (openIssue.secondaryLocations.length > 0 || openIssue.flows.length > 0)) {
const selectedFlowIndex =
@@ -36,15 +36,15 @@ export function enableLocationsNavigator(state: State): Partial<State> | undefin
};
}
}
return undefined;
return null;
}

export function disableLocationsNavigator(): Partial<State> {
export function disableLocationsNavigator() {
return { locationsNavigator: false };
}

export function selectLocation(nextIndex: number | undefined) {
return (state: State): Partial<State> | undefined => {
return (state: State) => {
const { selectedLocationIndex: index, openIssue } = state;
if (openIssue) {
if (!state.locationsNavigator) {
@@ -59,11 +59,11 @@ export function selectLocation(nextIndex: number | undefined) {
};
}
}
return undefined;
return null;
};
}

export function selectNextLocation(state: State): Partial<State> | undefined {
export function selectNextLocation(state: State) {
const { selectedFlowIndex, selectedLocationIndex: index, openIssue } = state;
if (openIssue) {
const locations =
@@ -79,10 +79,10 @@ export function selectNextLocation(state: State): Partial<State> | undefined {
selectedLocationIndex: index !== undefined && index < lastLocationIdx ? index + 1 : index
};
}
return undefined;
return null;
}

export function selectPreviousLocation(state: State): Partial<State> | undefined {
export function selectPreviousLocation(state: State) {
const { selectedFlowIndex, selectedLocationIndex: index, openIssue } = state;
if (openIssue) {
if (index === -1) {
@@ -95,16 +95,16 @@ export function selectPreviousLocation(state: State): Partial<State> | undefined
}
return { selectedLocationIndex: index !== undefined && index > 0 ? index - 1 : index };
}
return undefined;
return null;
}

export function selectFlow(nextIndex?: number) {
return (): Partial<State> => {
return () => {
return { selectedFlowIndex: nextIndex, selectedLocationIndex: 0 };
};
}

export function selectNextFlow(state: State): Partial<State> | undefined {
export function selectNextFlow(state: State) {
const { openIssue, selectedFlowIndex } = state;
if (
openIssue &&
@@ -113,13 +113,13 @@ export function selectNextFlow(state: State): Partial<State> | undefined {
) {
return { selectedFlowIndex: selectedFlowIndex + 1, selectedLocationIndex: 0 };
}
return undefined;
return null;
}

export function selectPreviousFlow(state: State): Partial<State> | undefined {
export function selectPreviousFlow(state: State) {
const { openIssue, selectedFlowIndex } = state;
if (openIssue && selectedFlowIndex !== undefined && selectedFlowIndex > 0) {
return { selectedFlowIndex: selectedFlowIndex - 1, selectedLocationIndex: 0 };
}
return undefined;
return null;
}

+ 4
- 3
server/sonar-web/src/main/js/apps/issues/components/AppContainer.tsx View File

@@ -93,6 +93,7 @@ interface OwnProps {
myIssues?: boolean;
}

export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
lazyLoad(() => import('./App'))
);
export default connect<StateProps, DispatchProps, OwnProps>(
mapStateToProps,
mapDispatchToProps
)(lazyLoad(() => import('./App')));

+ 3
- 1
server/sonar-web/src/main/js/apps/issues/conciseIssuesList/ConciseIssueBox.tsx View File

@@ -59,7 +59,9 @@ export default class ConciseIssueBox extends React.PureComponent<Props> {
const locations =
selectedFlowIndex !== undefined
? flows[selectedFlowIndex]
: flows.length > 0 ? flows[0] : secondaryLocations;
: flows.length > 0
? flows[0]
: secondaryLocations;

if (!locations || locations.length < 15) {
// if there are no locations, or there are just few

+ 1
- 1
server/sonar-web/src/main/js/apps/marketplace/components/PluginAvailable.tsx View File

@@ -71,7 +71,7 @@ export default function PluginAvailable({ plugin, readOnly, refreshPending, stat
</td>

{!readOnly && (
<PluginStatus plugin={plugin} status={status} refreshPending={refreshPending} />
<PluginStatus plugin={plugin} refreshPending={refreshPending} status={status} />
)}
</tr>
);

+ 1
- 1
server/sonar-web/src/main/js/apps/marketplace/components/PluginInstalled.tsx View File

@@ -59,7 +59,7 @@ export default function PluginInstalled({ plugin, readOnly, refreshPending, stat
</td>

{!readOnly && (
<PluginStatus plugin={plugin} status={status} refreshPending={refreshPending} />
<PluginStatus plugin={plugin} refreshPending={refreshPending} status={status} />
)}
</tr>
);

+ 1
- 1
server/sonar-web/src/main/js/apps/marketplace/components/PluginUpdateItem.tsx View File

@@ -52,7 +52,7 @@ export default class PluginUpdateItem extends React.PureComponent<Props, State>
render() {
const { release, update } = this.props;
return (
<li key={release.version} className="display-flex-row little-spacer-bottom">
<li className="display-flex-row little-spacer-bottom" key={release.version}>
<div className="pull-left spacer-right">
{update.status === 'COMPATIBLE' ? (
<span className="js-update-version badge badge-success">{release.version}</span>

+ 12
- 9
server/sonar-web/src/main/js/apps/marketplace/utils.ts View File

@@ -113,14 +113,17 @@ export function isPluginPending(plugin: Plugin): plugin is PluginPending {
}

export const DEFAULT_FILTER = 'all';
export const parseQuery = memoize((urlQuery: RawQuery): Query => ({
filter: parseAsString(urlQuery['filter']) || DEFAULT_FILTER,
search: parseAsString(urlQuery['search'])
}));

export const serializeQuery = memoize((query: Query): RawQuery =>
cleanQuery({
filter: query.filter === DEFAULT_FILTER ? undefined : serializeString(query.filter),
search: query.search ? serializeString(query.search) : undefined
export const parseQuery = memoize(
(urlQuery: RawQuery): Query => ({
filter: parseAsString(urlQuery['filter']) || DEFAULT_FILTER,
search: parseAsString(urlQuery['search'])
})
);

export const serializeQuery = memoize(
(query: Query): RawQuery =>
cleanQuery({
filter: query.filter === DEFAULT_FILTER ? undefined : serializeString(query.filter),
search: query.search ? serializeString(query.search) : undefined
})
);

+ 4
- 3
server/sonar-web/src/main/js/apps/organizations/components/OrganizationDelete.tsx View File

@@ -128,6 +128,7 @@ export class OrganizationDelete extends React.PureComponent<Props, State> {

const mapDispatchToProps: DispatchToProps = { deleteOrganization: deleteOrganization as any };

export default connect<null, DispatchToProps, OwnProps>(null, mapDispatchToProps)(
OrganizationDelete
);
export default connect<null, DispatchToProps, OwnProps>(
null,
mapDispatchToProps
)(OrganizationDelete);

+ 4
- 1
server/sonar-web/src/main/js/apps/organizations/components/OrganizationEdit.tsx View File

@@ -197,4 +197,7 @@ export class OrganizationEdit extends React.PureComponent<Props, State> {

const mapDispatchToProps = { updateOrganization: updateOrganization as any };

export default connect<{}, DispatchProps, OwnProps>(null, mapDispatchToProps)(OrganizationEdit);
export default connect<{}, DispatchProps, OwnProps>(
null,
mapDispatchToProps
)(OrganizationEdit);

+ 6
- 5
server/sonar-web/src/main/js/apps/organizations/components/OrganizationMembersContainer.tsx View File

@@ -43,7 +43,7 @@ interface OwnProps {
interface StateProps {
memberLogins: string[];
members: OrganizationMember[];
organization?: Organization;
organization: Organization;
organizationGroups: Group[];
status: { loading?: boolean; total?: number; pageIndex?: number; query?: string };
}
@@ -68,7 +68,7 @@ const mapStateToProps = (state: any, ownProps: OwnProps): StateProps => {
return {
memberLogins,
members: getUsersByLogins(state, memberLogins),
organization: getOrganizationByKey(state, organizationKey),
organization: getOrganizationByKey(state, organizationKey)!,
organizationGroups: getOrganizationGroupsByKey(state, organizationKey),
status: getOrganizationMembersState(state, organizationKey)
};
@@ -83,6 +83,7 @@ const mapDispatchToProps = {
updateOrganizationMemberGroups
};

export default connect<StateProps, DispatchProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
OrganizationMembers
);
export default connect<StateProps, DispatchProps, OwnProps>(
mapStateToProps,
mapDispatchToProps
)(OrganizationMembers);

+ 4
- 3
server/sonar-web/src/main/js/apps/organizations/components/OrganizationPage.tsx View File

@@ -118,6 +118,7 @@ const mapStateToProps = (state: any, ownProps: OwnProps) => ({

const mapDispatchToProps = { fetchOrganization: fetchOrganization as any };

export default connect<StateProps, DispatchToProps, OwnProps>(mapStateToProps, mapDispatchToProps)(
OrganizationPage
);
export default connect<StateProps, DispatchToProps, OwnProps>(
mapStateToProps,
mapDispatchToProps
)(OrganizationPage);

+ 3
- 1
server/sonar-web/src/main/js/apps/overview/events/Analysis.tsx View File

@@ -51,7 +51,9 @@ export default function Analysis({ analysis, ...props }: Props) {

{sortedEvents.length > 0 ? (
<div className="overview-activity-events">
{sortedEvents.map(event => <Event event={event} key={event.key} />)}
{sortedEvents.map(event => (
<Event event={event} key={event.key} />
))}
</div>
) : (
<span className="note">{translate('project_activity.analyzed', qualifier)}</span>

+ 1
- 1
server/sonar-web/src/main/js/apps/overview/meta/MetaKey.tsx View File

@@ -31,7 +31,7 @@ export default function MetaKey({ componentKey, qualifier }: Props) {
<>
<h4 className="overview-meta-header">{translate('overview.project_key', qualifier)}</h4>
<div className="display-flex-center">
<input className="overview-key" type="text" value={componentKey} readOnly={true} />
<input className="overview-key" readOnly={true} type="text" value={componentKey} />
<ClipboardButton className="little-spacer-left" copyValue={componentKey} />
</div>
</>

+ 3
- 1
server/sonar-web/src/main/js/apps/overview/meta/MetaLinks.tsx View File

@@ -74,7 +74,9 @@ export default class MetaLinks extends React.PureComponent<Props, State> {
<div className="overview-meta-card">
<h4 className="overview-meta-header">{translate('overview.external_links')}</h4>
<ul className="overview-meta-list">
{orderedLinks.map(link => <MetaLink key={link.id} link={link} />)}
{orderedLinks.map(link => (
<MetaLink key={link.id} link={link} />
))}
</ul>
</div>
);

+ 1
- 1
server/sonar-web/src/main/js/apps/overview/meta/MetaOrganizationKey.tsx View File

@@ -30,7 +30,7 @@ export default function MetaOrganizationKey({ organization }: Props) {
<>
<h4 className="overview-meta-header big-spacer-top">{translate('organization_key')}</h4>
<div className="display-flex-center">
<input className="overview-key" type="text" value={organization} readOnly={true} />
<input className="overview-key" readOnly={true} type="text" value={organization} />
<ClipboardButton className="little-spacer-left" copyValue={organization} />
</div>
</>

+ 1
- 1
server/sonar-web/src/main/js/apps/overview/meta/MetaSize.tsx View File

@@ -68,7 +68,7 @@ export default class MetaSize extends React.PureComponent<Props> {
this.props.component.qualifier === 'TRK' ? 'overview-meta-size-lang-dist' : 'big-spacer-top';

return languageDistribution ? (
<div id="overview-language-distribution" className={className}>
<div className={className} id="overview-language-distribution">
<LanguageDistributionContainer distribution={languageDistribution.value} width={160} />
</div>
) : null;

+ 7
- 9
server/sonar-web/src/main/js/apps/overview/qualityGate/ApplicationQualityGate.tsx View File

@@ -103,15 +103,13 @@ export default class ApplicationQualityGate extends React.PureComponent<Props, S
<div
className="overview-quality-gate-conditions-list clearfix"
id="overview-quality-gate-conditions-list">
{projects
.filter(project => project.status !== 'OK')
.map(project => (
<ApplicationQualityGateProject
key={project.key}
metrics={metrics}
project={project}
/>
))}
{projects.filter(project => project.status !== 'OK').map(project => (
<ApplicationQualityGateProject
key={project.key}
metrics={metrics}
project={project}
/>
))}
</div>
)}
</div>

+ 3
- 3
server/sonar-web/src/main/js/apps/overview/qualityGate/QualityGateCondition.js View File

@@ -114,7 +114,7 @@ export default class QualityGateCondition extends React.PureComponent {
};

return RATING_METRICS_MAPPING[metricKey] ? (
<Link to={this.getUrlForType(...RATING_METRICS_MAPPING[metricKey])} className={className}>
<Link className={className} to={this.getUrlForType(...RATING_METRICS_MAPPING[metricKey])}>
{children}
</Link>
) : (
@@ -153,15 +153,15 @@ export default class QualityGateCondition extends React.PureComponent {
<div className="overview-quality-gate-condition-value">
<Measure
decimals={decimals}
value={actual}
metricKey={measure.metric.key}
metricType={measure.metric.type}
value={actual}
/>
</div>

<div>
<div className="overview-quality-gate-condition-metric">
<IssueTypeIcon query={metric.key} className="little-spacer-right" />
<IssueTypeIcon className="little-spacer-right" query={metric.key} />
{metric.name}
</div>
{!isDiff &&

+ 3
- 3
server/sonar-web/src/main/js/apps/permission-templates/components/App.js View File

@@ -80,8 +80,8 @@ export default class App extends React.PureComponent {
return (
<Template
organization={this.props.organization}
template={template}
refresh={this.requestPermissions}
template={template}
topQualifiers={this.props.topQualifiers}
/>
);
@@ -91,11 +91,11 @@ export default class App extends React.PureComponent {
return (
<Home
organization={this.props.organization}
topQualifiers={this.props.topQualifiers}
permissions={this.state.permissions}
permissionTemplates={this.state.permissionTemplates}
ready={this.state.ready}
refresh={this.requestPermissions}
topQualifiers={this.props.topQualifiers}
/>
);
}
@@ -106,8 +106,8 @@ export default class App extends React.PureComponent {
<div>
<Suggestions suggestions="permission_templates" />
<OrganizationHelmet
title={translate('permission_templates.page')}
organization={this.props.organization}
title={translate('permission_templates.page')}
/>

{id && this.renderTemplate(id)}

+ 2
- 2
server/sonar-web/src/main/js/apps/permission-templates/components/Home.js View File

@@ -47,10 +47,10 @@ export default class Home extends React.PureComponent {

<List
organization={this.props.organization}
permissionTemplates={this.props.permissionTemplates}
permissions={this.props.permissions}
topQualifiers={this.props.topQualifiers}
permissionTemplates={this.props.permissionTemplates}
refresh={this.props.refresh}
topQualifiers={this.props.topQualifiers}
/>
</div>
);

+ 2
- 2
server/sonar-web/src/main/js/apps/permission-templates/components/List.js View File

@@ -38,14 +38,14 @@ export default class List extends React.PureComponent {
key={p.id}
organization={this.props.organization}
permissionTemplate={p}
topQualifiers={this.props.topQualifiers}
refresh={this.props.refresh}
topQualifiers={this.props.topQualifiers}
/>
));

return (
<div className="boxed-group boxed-group-inner">
<table id="permission-templates" className="data zebra permissions-table">
<table className="data zebra permissions-table" id="permission-templates">
<ListHeader organization={this.props.organization} permissions={this.props.permissions} />
<tbody>{permissionTemplates}</tbody>
</table>

+ 1
- 1
server/sonar-web/src/main/js/apps/permission-templates/components/ListItem.js View File

@@ -51,8 +51,8 @@ export default class ListItem extends React.PureComponent {
<ActionsCell
organization={this.props.organization}
permissionTemplate={this.props.permissionTemplate}
topQualifiers={this.props.topQualifiers}
refresh={this.props.refresh}
topQualifiers={this.props.topQualifiers}
/>
</td>
</tr>

+ 1
- 1
server/sonar-web/src/main/js/apps/permission-templates/components/NameCell.js View File

@@ -45,8 +45,8 @@ export default class NameCell extends React.PureComponent {
{t.defaultFor.length > 0 && (
<div className="spacer-top js-defaults">
<Defaults
permissionTemplate={this.props.permissionTemplate}
organization={organization}
permissionTemplate={this.props.permissionTemplate}
/>
</div>
)}

+ 0
- 0
server/sonar-web/src/main/js/apps/permission-templates/components/TemplateDetails.js View File


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save