]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-16207 Share code with Governance extension at build time
authorWouter Admiraal <wouter.admiraal@sonarsource.com>
Thu, 5 May 2022 13:51:02 +0000 (15:51 +0200)
committersonartech <sonartech@sonarsource.com>
Tue, 10 May 2022 20:02:48 +0000 (20:02 +0000)
server/sonar-web/src/main/js/api/time-machine.ts
server/sonar-web/src/main/js/app/components/extensions/Extension.tsx
server/sonar-web/src/main/js/app/components/extensions/__tests__/Extension-test.tsx
server/sonar-web/src/main/js/app/components/extensions/__tests__/__snapshots__/Extension-test.tsx.snap
server/sonar-web/src/main/js/components/charts/DonutChart.tsx
server/sonar-web/src/main/js/helpers/testUtils.ts
server/sonar-web/src/main/js/types/extension.ts

index f6e7ee3da68662fa3be14b9689178211b7b866d4..0f9f592cd7105aa4328219c2672c2a163dcca0ce 100644 (file)
@@ -22,7 +22,7 @@ import { getJSON } from '../helpers/request';
 import { BranchParameters } from '../types/branch-like';
 import { Paging } from '../types/types';
 
-interface TimeMachineResponse {
+export interface TimeMachineResponse {
   measures: {
     metric: string;
     history: Array<{ date: string; value?: string }>;
index e13e596fd832e28bfd4f83c8169ff95b2eaca62a..e7fc3f0a96208394e066a6f746b4784b886b89ed 100644 (file)
@@ -29,7 +29,7 @@ import { getBaseUrl } from '../../../helpers/system';
 import { AppState } from '../../../types/appstate';
 import { ExtensionStartMethod } from '../../../types/extension';
 import { Dict, Extension as TypeExtension } from '../../../types/types';
-import { CurrentUser } from '../../../types/users';
+import { CurrentUser, HomePage } from '../../../types/users';
 import * as theme from '../../theme';
 import withAppStateContext from '../app-state/withAppStateContext';
 import withCurrentUserContext from '../current-user/withCurrentUserContext';
@@ -41,6 +41,7 @@ interface Props extends WrappedComponentProps {
   location: Location;
   options?: Dict<any>;
   router: Router;
+  updateCurrentUserHomepage: (homepage: HomePage) => void;
 }
 
 interface State {
@@ -80,6 +81,9 @@ export class Extension extends React.PureComponent<Props, State> {
       theme,
       baseUrl: getBaseUrl(),
       l10nBundle: getCurrentL10nBundle(),
+      // See SONAR-16207 and core-extension-governance/src/main/js/portfolios/components/Header.tsx
+      // for more information on why we're passing this as a prop to an extension.
+      updateCurrentUserHomepage: this.props.updateCurrentUserHomepage,
       ...this.props.options
     });
 
index 3001705b90514b9e02cb55f008e4fda1fdd3391e..7f2166da2bee7505776dc7ca7137780dbc8ae119 100644 (file)
@@ -97,6 +97,7 @@ function shallowRender(props: Partial<Extension['props']> = {}) {
       intl={{} as IntlShape}
       location={mockLocation()}
       router={mockRouter()}
+      updateCurrentUserHomepage={jest.fn()}
       {...props}
     />
   );
index 4821cb22c5668a307e580ed01609045a1c3b9f70..183e24e1dfca3aa02055b12259dd00d2532cc0ae 100644 (file)
@@ -49,6 +49,7 @@ exports[`should render React extensions correctly 1`] = `
       "setRouteLeaveHook": [MockFunction],
     }
   }
+  updateCurrentUserHomepage={[MockFunction]}
 >
   <div>
     <Helmet
@@ -108,6 +109,7 @@ exports[`should render React extensions correctly 2`] = `
       "setRouteLeaveHook": [MockFunction],
     }
   }
+  updateCurrentUserHomepage={[MockFunction]}
 >
   <div>
     <Helmet
index 546f24479bb41616b8b70cb9e9ab242f44154ef5..df0345b515f3f3c610b3d0dc1bd09162292a063e 100644 (file)
@@ -20,7 +20,7 @@
 import { arc as d3Arc, pie as d3Pie, PieArcDatum } from 'd3-shape';
 import * as React from 'react';
 
-interface DataPoint {
+export interface DataPoint {
   fill: string;
   value: number;
 }
index fb85521b28e168c71ffe1f2a9ac04ae3ff30c9f2..e43030383a44c6f8bca51e27e0765acf309083c3 100644 (file)
@@ -54,7 +54,11 @@ export function submit(element: ShallowWrapper | ReactWrapper): void {
   });
 }
 
-export function change(element: ShallowWrapper | ReactWrapper, value: string, event = {}): void {
+export function change(
+  element: ShallowWrapper | ReactWrapper,
+  value: string | object,
+  event = {}
+): void {
   // `type()` returns a component constructor for a composite element and string for DOM nodes
   if (typeof element.type() === 'function') {
     element.prop<Function>('onChange')(value);
index 3defc91892da4405a8a56773eb64ddfad80c62c7..ccc7c6656c35d80f2875172fc39b2e5fd2c58c1d 100644 (file)
@@ -22,7 +22,7 @@ import { Location, Router } from '../components/hoc/withRouter';
 import { AppState } from './appstate';
 import { L10nBundle } from './l10nBundle';
 import { Component, Dict } from './types';
-import { CurrentUser } from './users';
+import { CurrentUser, HomePage } from './users';
 
 export enum AdminPageExtension {
   GovernanceConsole = 'governance/views_console'
@@ -55,6 +55,9 @@ export interface ExtensionStartMethodParameter {
   };
   baseUrl: string;
   l10nBundle: L10nBundle;
+  // See SONAR-16207 and core-extension-governance/src/main/js/portfolios/components/Header.tsx
+  // for more information on why we're passing this as a prop to an extension.
+  updateCurrentUserHomepage: (homepage: HomePage) => void;
 }
 
 export type ExtensionStartMethodReturnType = React.ReactNode | Function | void | undefined | null;