From 8914b61c624d59cb1a489cf7e9b63247ab1e4b2d Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Tue, 23 Jul 2019 17:03:23 +0300 Subject: [PATCH 01/31] refactor opt_in_message --- .../home/components/telemetry_opt_in/index.ts | 24 +++ .../telemetry_opt_in_checkbox.tsx | 33 ++++ .../kibana/public/home/components/welcome.js | 8 +- .../kibana/public/home/kibana_services.js | 10 ++ .../public/components/{index.js => index.ts} | 7 + .../components/opt_in_banner_component.js | 76 +++++++++ .../components/opt_in_checkbox_component.tsx | 57 +++++++ .../public/components/opt_in_message.tsx | 109 +++++++++++++ .../welcome_banner/opt_in_banner_component.js | 147 ------------------ .../hacks/welcome_banner/render_banner.js | 2 +- 10 files changed, 322 insertions(+), 151 deletions(-) create mode 100644 src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts create mode 100644 src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_checkbox.tsx rename x-pack/legacy/plugins/telemetry/public/components/{index.js => index.ts} (63%) create mode 100644 x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.js create mode 100644 x-pack/legacy/plugins/telemetry/public/components/opt_in_checkbox_component.tsx create mode 100644 x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx delete mode 100644 x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/opt_in_banner_component.js diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts new file mode 100644 index 0000000000000..c0b73138e251d --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts @@ -0,0 +1,24 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { renderTelemetryOptInCheckbox } from './telemetry_opt_in_checkbox'; + +export const TelemetryOptIn = () => { + return renderTelemetryOptInCheckbox(); +} diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_checkbox.tsx b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_checkbox.tsx new file mode 100644 index 0000000000000..93ff662b7d41b --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_checkbox.tsx @@ -0,0 +1,33 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +// import { i18n } from '@kbn/i18n'; + +//@ts-ignore +import { OptInCheckbox } from '../../../../../../../../x-pack/legacy/plugins/telemetry/public/components' + +export function renderTelemetryOptInCheckbox() { + return ( + {}} + optInClick={() => {}} + /> + ) +} diff --git a/src/legacy/core_plugins/kibana/public/home/components/welcome.js b/src/legacy/core_plugins/kibana/public/home/components/welcome.js index 98560b748ec0d..e0117713efe85 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/welcome.js +++ b/src/legacy/core_plugins/kibana/public/home/components/welcome.js @@ -39,7 +39,7 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; - +import { TelemetryOptIn } from './telemetry_opt_in'; /** * Shows a full-screen welcome page that gives helpful quick links to beginners. */ @@ -66,7 +66,7 @@ export class Welcome extends React.Component {
- + @@ -80,7 +80,7 @@ export class Welcome extends React.Component {

- +
@@ -115,6 +115,8 @@ export class Welcome extends React.Component { } /> + +
diff --git a/src/legacy/core_plugins/kibana/public/home/kibana_services.js b/src/legacy/core_plugins/kibana/public/home/kibana_services.js index fc06a61ae343d..a5d01c6152b2a 100644 --- a/src/legacy/core_plugins/kibana/public/home/kibana_services.js +++ b/src/legacy/core_plugins/kibana/public/home/kibana_services.js @@ -18,9 +18,19 @@ */ import { uiModules } from 'ui/modules'; +import { npStart } from 'ui/new_platform'; +import { TelemetryOptInProvider } from '../../../../../../x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in' export let indexPatternService; +export const telemetryService = {}; uiModules.get('kibana').run(($injector) => { indexPatternService = $injector.get('indexPatterns'); + const Private = $injector.get('Private'); + const telemetryOptInProvider = Private(TelemetryOptInProvider); + const telemetryEnabled = npStart.core.injectedMetadata.getInjectedVar('telemetryEnabled'); + const telemetryBanner = npStart.core.injectedMetadata.getInjectedVar('telemetryBanner'); + telemetryService.telemetryEnabled = telemetryEnabled; + telemetryService.telemetryBanner = telemetryBanner; + telemetryService.telemetryOptInProvider = telemetryOptInProvider; }); diff --git a/x-pack/legacy/plugins/telemetry/public/components/index.js b/x-pack/legacy/plugins/telemetry/public/components/index.ts similarity index 63% rename from x-pack/legacy/plugins/telemetry/public/components/index.js rename to x-pack/legacy/plugins/telemetry/public/components/index.ts index 3461da4fdcaca..358f6515e8df9 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/index.js +++ b/x-pack/legacy/plugins/telemetry/public/components/index.ts @@ -4,5 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ +//@ts-ignore export { TelemetryForm } from './telemetry_form'; +//@ts-ignore. export { OptInExampleFlyout } from './opt_in_details_component'; +//@ts-ignore. +export { OptInBanner } from './opt_in_banner_component'; +export { OptInCheckbox } from './opt_in_checkbox_component'; + +export { OptInMessage } from './opt_in_message'; diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.js b/x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.js new file mode 100644 index 0000000000000..24bc4ddf0b4ee --- /dev/null +++ b/x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.js @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { Component } from 'react'; +import PropTypes from 'prop-types'; + +import { + EuiButton, + EuiCallOut, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { OptInMessage } from './opt_in_message'; + +/** + * React component for displaying the Telemetry opt-in banner. + * + * TODO: When Jest tests become available in X-Pack, we should add one for this component. + */ +export class OptInBanner extends Component { + static propTypes = { + /** + * Callback function with no parameters that returns a {@code Promise} containing the + * telemetry data (expected to be an array). + */ + fetchTelemetry: PropTypes.func.isRequired, + /** + * Callback function passed a boolean to opt in ({@code true}) or out ({@code false}). + */ + optInClick: PropTypes.func.isRequired, + }; + + render() { + const title = ( + + ); + return ( + + + + + + this.props.optInClick(true)} + > + + + + + this.props.optInClick(false)} + > + + + + + + ); + } +} diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_checkbox_component.tsx b/x-pack/legacy/plugins/telemetry/public/components/opt_in_checkbox_component.tsx new file mode 100644 index 0000000000000..046b945e6508d --- /dev/null +++ b/x-pack/legacy/plugins/telemetry/public/components/opt_in_checkbox_component.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as React from 'react'; + +import { + EuiButton, + EuiCallOut, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiCheckbox, + makeId, +} from '@elastic/eui'; +import { OptInMessage } from './opt_in_message'; + +interface Props { + fetchTelemetry: () => {}; + optInClick: () => {}; +} +interface State { + checked: boolean; +} + +export class OptInCheckbox extends React.PureComponent { + constructor(props: Props) { + super(props); + this.state = { + checked: false, + } + } + onChange = (e: any) => { + this.setState({ + checked: e.target.checked, + }); + }; + + render() { + + const label = ; + return ( + + + + ) + } +} diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx b/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx new file mode 100644 index 0000000000000..113b934a0f713 --- /dev/null +++ b/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as React from 'react'; + +type Props = { + fetchTelemetry: () => {}, +} + +interface State { + showDetails: boolean; + showExample: boolean; +} + +import { + EuiLink, + EuiText, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { getConfigTelemetryDesc, PRIVACY_STATEMENT_URL } from '../../common/constants'; + +//@ts-ignore +import { OptInExampleFlyout } from './opt_in_details_component'; + + +export class OptInMessage extends React.PureComponent { + constructor(props: Props) { + super(props); + + this.state = { + showDetails: false, + showExample: false, + }; + } + + toggleShowExample = () => { + this.setState((prevState) => ({ + showExample: !prevState.showExample + })); + } + + render() { + const { + showDetails, + showExample, + } = this.state; + + const getDetails = () => ( + +

+ + + + ), + telemetryPrivacyStatementLink: ( + + + + ) + }} + /> +

+
+ ); + + const getFlyoutDetails = () => ( + this.setState({ showExample: false })} + fetchTelemetry={this.props.fetchTelemetry} + /> + ); + + const getReadMore = () => ( + this.setState({ showDetails: true })}> + + + ); + + return ( + + +

{ getConfigTelemetryDesc() } { !showDetails && getReadMore() }

+
+ { showDetails && getDetails() } + { showDetails && showExample && getFlyoutDetails() } +
+ ); + } +} diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/opt_in_banner_component.js b/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/opt_in_banner_component.js deleted file mode 100644 index 75ec89b309dec..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/opt_in_banner_component.js +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { Component, Fragment } from 'react'; -import PropTypes from 'prop-types'; - -import { - EuiButton, - EuiCallOut, - EuiFlexGroup, - EuiFlexItem, - EuiLink, - EuiSpacer, - EuiText, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; - -import { getConfigTelemetryDesc, PRIVACY_STATEMENT_URL } from '../../../common/constants'; -import { OptInExampleFlyout } from '../../components'; - -/** - * React component for displaying the Telemetry opt-in banner. - * - * TODO: When Jest tests become available in X-Pack, we should add one for this component. - */ -export class OptInBanner extends Component { - static propTypes = { - /** - * Callback function with no parameters that returns a {@code Promise} containing the - * telemetry data (expected to be an array). - */ - fetchTelemetry: PropTypes.func.isRequired, - /** - * Callback function passed a boolean to opt in ({@code true}) or out ({@code false}). - */ - optInClick: PropTypes.func.isRequired, - }; - - constructor(props) { - super(props); - - this.state = { - showDetails: false, - showExample: false, - }; - } - - render() { - let title = getConfigTelemetryDesc(); - let details; - let flyoutDetails; - - if (this.state.showDetails) { - details = ( - -

- this.setState({ showExample: !this.state.showExample })}> - - - ), - telemetryPrivacyStatementLink: ( - - - - ) - }} - /> -

-
- ); - - if (this.state.showExample) { - flyoutDetails = ( - this.setState({ showExample: false })} - fetchTelemetry={this.props.fetchTelemetry} - /> - ); - } - } else { - title = ( - - {getConfigTelemetryDesc()} {( - this.setState({ showDetails: true })}> - - - )} - - ); - } - - const titleNode = ( - {title} - ); - - return ( - - { details } - { flyoutDetails } - - - - this.props.optInClick(true)} - > - - - - - this.props.optInClick(false)} - > - - - - - - ); - } -} diff --git a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.js b/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.js index 1fa1287cc2d98..4668e17e7dd3a 100644 --- a/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.js +++ b/x-pack/legacy/plugins/telemetry/public/hacks/welcome_banner/render_banner.js @@ -9,7 +9,7 @@ import React from 'react'; import { banners } from 'ui/notify'; import { clickBanner } from './click_banner'; -import { OptInBanner } from './opt_in_banner_component'; +import { OptInBanner } from '../../components/opt_in_banner_component'; /** * Render the Telemetry Opt-in banner. From 0f2261b0a3c09d9432f1df595d8d9f9401a2e16f Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Sat, 27 Jul 2019 11:35:34 +0300 Subject: [PATCH 02/31] welcome optin card --- .../home/components/sample_data/index.tsx | 72 ++++++++++++++ .../home/components/telemetry_opt_in/index.ts | 8 +- .../telemetry_opt_in_card.tsx | 73 ++++++++++++++ .../components/{welcome.js => welcome.tsx} | 98 +++++++++++-------- .../components/opt_in_welcome_component.tsx | 57 +++++++++++ 5 files changed, 263 insertions(+), 45 deletions(-) create mode 100644 src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx create mode 100644 src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx rename src/legacy/core_plugins/kibana/public/home/components/{welcome.js => welcome.tsx} (59%) create mode 100644 x-pack/legacy/plugins/telemetry/public/components/opt_in_welcome_component.tsx diff --git a/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx b/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx new file mode 100644 index 0000000000000..466b63b8da130 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx @@ -0,0 +1,72 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/* + * The UI and related logic for the welcome screen that *should* show only + * when it is enabled (the default) and there is no Kibana-consumed data + * in Elasticsearch. + */ + +import React from 'react'; +import { + EuiCard, + EuiButton, + EuiButtonEmpty, +} from '@elastic/eui'; + +import { FormattedMessage } from '@kbn/i18n/react'; + +interface Props { + urlBasePath: string; + onDecline: () => {}; +} + +export function SampleDataCard({urlBasePath, onDecline} : Props) { + return ( + } + description={ + } + footer={ +
+ + + + + + +
+ } + /> + ) +} diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts index c0b73138e251d..0fcccdef00a2d 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts @@ -17,8 +17,10 @@ * under the License. */ -import { renderTelemetryOptInCheckbox } from './telemetry_opt_in_checkbox'; +// import { renderTelemetryOptInCheckbox } from './telemetry_opt_in_checkbox'; +import { renderTelemetryOptInCard, Props } from './telemetry_opt_in_card'; -export const TelemetryOptIn = () => { - return renderTelemetryOptInCheckbox(); +export const TelemetryOptInCard = (props: Props) => { + return renderTelemetryOptInCard(props); + // return renderTelemetryOptInCheckbox(); } diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx new file mode 100644 index 0000000000000..18293bd69c1e9 --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx @@ -0,0 +1,73 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { + EuiCard, + EuiTitle, + EuiSpacer, + EuiFlexGroup, + EuiFlexItem, + EuiText, + EuiIcon, + EuiButton, + EuiButtonEmpty, + EuiPortal, +} from '@elastic/eui'; + +import { OptInMessage } from '../../../../../../../../x-pack/legacy/plugins/telemetry/public/components' +export interface Props { + urlBasePath: string; + onConfirm: () => {}; + onDecline: () => {}; +} + +export function renderTelemetryOptInCard({ urlBasePath, onConfirm, onDecline }: Props) { + const fetchTelemetry = () => {}; + + return ( + } + description={ } + footer={ +
+ + + + + + +
+ } + /> + ) +} diff --git a/src/legacy/core_plugins/kibana/public/home/components/welcome.js b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx similarity index 59% rename from src/legacy/core_plugins/kibana/public/home/components/welcome.js rename to src/legacy/core_plugins/kibana/public/home/components/welcome.tsx index e0117713efe85..136fd1edfeab0 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/welcome.js +++ b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx @@ -24,7 +24,6 @@ */ import React from 'react'; -import PropTypes from 'prop-types'; import { EuiCard, EuiTitle, @@ -39,17 +38,55 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { TelemetryOptIn } from './telemetry_opt_in'; +import { SampleDataCard } from './sample_data'; +import { TelemetryOptInCard } from './telemetry_opt_in'; +import chrome from 'ui/chrome'; + +interface Props { + urlBasePath: string; + onSkip: () => {}; +} +interface State { + step: number; + trySampleData: boolean; +} + /** * Shows a full-screen welcome page that gives helpful quick links to beginners. */ -export class Welcome extends React.Component { - hideOnEsc = e => { +export class Welcome extends React.PureComponent { + public readonly state: State = { + step: 0, + trySampleData: false, + }; + + hideOnEsc = (e: KeyboardEvent) => { if (e.key === 'Escape') { + this.props.onSkip(); } }; + onTelemetryOptInDecline = () => { + const { trySampleData } = this.state; + if (trySampleData) { + chrome.addBasePath() + // getRouteHref: (obj, route) => $scope.kbnUrl.getRouteHref(obj, route), + } else { + this.props.onSkip(); + } + } + onTelemetryOptInConfirm = () => { + + } + + onSampleDataDecline = () => { + this.setState(() => ({ step: 1, trySampleData: false })) + } + onSampleDataConfirm = () => { + this.setState(() => ({ step: 1, trySampleData: true })) + } + componentDidMount() { document.addEventListener('keydown', this.hideOnEsc); } @@ -59,7 +96,8 @@ export class Welcome extends React.Component { } render() { - const { urlBasePath, onSkip } = this.props; + const { urlBasePath } = this.props; + const { step } = this.state; return ( @@ -85,39 +123,20 @@ export class Welcome extends React.Component {
- - } - description={ - } - footer={ -
- - - - - - -
- } + {step === 0 && + - - - +
} + {step === 1 && + + }
@@ -125,8 +144,3 @@ export class Welcome extends React.Component { ); } } - -Welcome.propTypes = { - urlBasePath: PropTypes.string.isRequired, - onSkip: PropTypes.func.isRequired, -}; diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_welcome_component.tsx b/x-pack/legacy/plugins/telemetry/public/components/opt_in_welcome_component.tsx new file mode 100644 index 0000000000000..046b945e6508d --- /dev/null +++ b/x-pack/legacy/plugins/telemetry/public/components/opt_in_welcome_component.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as React from 'react'; + +import { + EuiButton, + EuiCallOut, + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiCheckbox, + makeId, +} from '@elastic/eui'; +import { OptInMessage } from './opt_in_message'; + +interface Props { + fetchTelemetry: () => {}; + optInClick: () => {}; +} +interface State { + checked: boolean; +} + +export class OptInCheckbox extends React.PureComponent { + constructor(props: Props) { + super(props); + this.state = { + checked: false, + } + } + onChange = (e: any) => { + this.setState({ + checked: e.target.checked, + }); + }; + + render() { + + const label = ; + return ( + + + + ) + } +} From d1e779484961291752f73181af30f6628d45948e Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Sun, 28 Jul 2019 11:15:06 +0300 Subject: [PATCH 03/31] finish optin in welcome screen --- .../kibana/public/assets/illo_telemetry.png | Bin 0 -> 97736 bytes .../public/home/components/_welcome.scss | 3 +- .../kibana/public/home/components/home.js | 1 + .../kibana/public/home/components/home_app.js | 8 +- .../home/components/sample_data/index.tsx | 28 ++--- .../telemetry_opt_in_card.tsx | 50 ++++----- .../kibana/public/home/components/welcome.tsx | 77 ++++++++------ src/legacy/ui/public/styles/_mixins.scss | 4 +- .../telemetry/public/components/index.ts | 5 +- ...mponent.js => opt_in_banner_component.tsx} | 43 ++------ .../components/opt_in_checkbox_component.tsx | 37 ++----- ...t.js => opt_in_details_component.test.tsx} | 9 +- ...ponent.js => opt_in_details_component.tsx} | 96 ++++++++---------- .../public/components/opt_in_message.tsx | 56 ++++------ .../components/opt_in_welcome_component.tsx | 57 ----------- 15 files changed, 182 insertions(+), 292 deletions(-) create mode 100644 src/legacy/core_plugins/kibana/public/assets/illo_telemetry.png rename x-pack/legacy/plugins/telemetry/public/components/{opt_in_banner_component.js => opt_in_banner_component.tsx} (59%) rename x-pack/legacy/plugins/telemetry/public/components/{opt_in_details_component.test.js => opt_in_details_component.test.tsx} (74%) rename x-pack/legacy/plugins/telemetry/public/components/{opt_in_details_component.js => opt_in_details_component.tsx} (65%) delete mode 100644 x-pack/legacy/plugins/telemetry/public/components/opt_in_welcome_component.tsx diff --git a/src/legacy/core_plugins/kibana/public/assets/illo_telemetry.png b/src/legacy/core_plugins/kibana/public/assets/illo_telemetry.png new file mode 100644 index 0000000000000000000000000000000000000000..96a442dce466e3e645bc3b0dd099a4ec258eff7c GIT binary patch literal 97736 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 ); } diff --git a/src/legacy/core_plugins/kibana/public/home/components/home_app.js b/src/legacy/core_plugins/kibana/public/home/components/home_app.js index fc24eeaa0f451..9b73a80e2aa4b 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/home_app.js +++ b/src/legacy/core_plugins/kibana/public/home/components/home_app.js @@ -30,16 +30,15 @@ import { } from 'react-router-dom'; import { getTutorial } from '../load_tutorials'; import { replaceTemplateStrings } from './tutorial/replace_template_strings'; +import { telemetryService } from '../kibana_services'; import chrome from 'ui/chrome'; -export function HomeApp({ - directories, -}) { - +export function HomeApp({ directories }) { const isCloudEnabled = chrome.getInjected('isCloudEnabled', false); const apmUiEnabled = chrome.getInjected('apmUiEnabled', true); const mlEnabled = chrome.getInjected('mlEnabled', false); const savedObjectsClient = chrome.getSavedObjectsClient(); + const fetchTelemetry = telemetryService.telemetryOptInProvider.fetchExample; const renderTutorialDirectory = (props) => { return ( @@ -94,6 +93,7 @@ export function HomeApp({ find={savedObjectsClient.find} localStorage={localStorage} urlBasePath={chrome.getBasePath()} + fetchTelemetry={fetchTelemetry} /> diff --git a/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx b/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx index 466b63b8da130..edd31bad545ea 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx @@ -24,49 +24,43 @@ */ import React from 'react'; -import { - EuiCard, - EuiButton, - EuiButtonEmpty, -} from '@elastic/eui'; +import { EuiCard, EuiButton, EuiButtonEmpty } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; interface Props { urlBasePath: string; - onDecline: () => {}; + onDecline: () => void; + onConfirm: () => void; } -export function SampleDataCard({urlBasePath, onDecline} : Props) { +export function SampleDataCard({ urlBasePath, onDecline, onConfirm }: Props) { return ( } + title={} description={ } + /> + } footer={
- - + + - +
} /> - ) + ); } diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx index 18293bd69c1e9..6d70a82ef0b4e 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx @@ -20,35 +20,33 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { - EuiCard, - EuiTitle, - EuiSpacer, - EuiFlexGroup, - EuiFlexItem, - EuiText, - EuiIcon, - EuiButton, - EuiButtonEmpty, - EuiPortal, -} from '@elastic/eui'; +import { EuiCard, EuiButton, EuiButtonEmpty } from '@elastic/eui'; -import { OptInMessage } from '../../../../../../../../x-pack/legacy/plugins/telemetry/public/components' +import { OptInMessage } from '../../../../../../../../x-pack/legacy/plugins/telemetry/public/components'; export interface Props { urlBasePath: string; - onConfirm: () => {}; - onDecline: () => {}; + fetchTelemetry: () => Promise; + onConfirm: () => void; + onDecline: () => void; } -export function renderTelemetryOptInCard({ urlBasePath, onConfirm, onDecline }: Props) { - const fetchTelemetry = () => {}; - +export function renderTelemetryOptInCard({ + urlBasePath, + onConfirm, + onDecline, + fetchTelemetry, +}: Props) { return ( } - description={ } + title={ + + } + description={} footer={
- + - +
} /> - ) + ); } diff --git a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx index 136fd1edfeab0..1c5948b4acd50 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx @@ -25,26 +25,24 @@ import React from 'react'; import { - EuiCard, EuiTitle, EuiSpacer, EuiFlexGroup, EuiFlexItem, EuiText, EuiIcon, - EuiButton, - EuiButtonEmpty, EuiPortal, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; +import chrome from 'ui/chrome'; import { SampleDataCard } from './sample_data'; import { TelemetryOptInCard } from './telemetry_opt_in'; -import chrome from 'ui/chrome'; interface Props { urlBasePath: string; onSkip: () => {}; + fetchTelemetry: () => Promise; } interface State { step: number; @@ -62,30 +60,35 @@ export class Welcome extends React.PureComponent { hideOnEsc = (e: KeyboardEvent) => { if (e.key === 'Escape') { - this.props.onSkip(); } }; + private redirecToSampleData() { + const path = chrome.addBasePath('#/home/tutorial_directory/sampleData'); + window.location.href = path; + } onTelemetryOptInDecline = () => { const { trySampleData } = this.state; if (trySampleData) { - chrome.addBasePath() - // getRouteHref: (obj, route) => $scope.kbnUrl.getRouteHref(obj, route), - } else { - this.props.onSkip(); + return this.redirecToSampleData(); } - } + this.props.onSkip(); + }; onTelemetryOptInConfirm = () => { - - } + const { trySampleData } = this.state; + if (trySampleData) { + return this.redirecToSampleData(); + } + this.props.onSkip(); + }; onSampleDataDecline = () => { - this.setState(() => ({ step: 1, trySampleData: false })) - } + this.setState(() => ({ step: 1, trySampleData: false })); + }; onSampleDataConfirm = () => { - this.setState(() => ({ step: 1, trySampleData: true })) - } + this.setState(() => ({ step: 1, trySampleData: true })); + }; componentDidMount() { document.addEventListener('keydown', this.hideOnEsc); @@ -96,7 +99,7 @@ export class Welcome extends React.PureComponent { } render() { - const { urlBasePath } = this.props; + const { urlBasePath, fetchTelemetry } = this.props; const { step } = this.state; return ( @@ -110,12 +113,15 @@ export class Welcome extends React.PureComponent {

- +

- +

@@ -123,20 +129,25 @@ export class Welcome extends React.PureComponent {
- {step === 0 && - - } - {step === 1 && - - } + {step === 0 && ( + + + + )} + {step === 1 && ( + + + + )}
diff --git a/src/legacy/ui/public/styles/_mixins.scss b/src/legacy/ui/public/styles/_mixins.scss index cb027ee684a17..ae529a4678d5d 100644 --- a/src/legacy/ui/public/styles/_mixins.scss +++ b/src/legacy/ui/public/styles/_mixins.scss @@ -55,13 +55,13 @@ } } -@mixin kibanaFullScreenGraphics() { +@mixin kibanaFullScreenGraphics($euiZLevel: $euiZLevel9) { position: fixed; top: 0; left: 0; right: 0; bottom: 0; - z-index: $euiZLevel9 + 1000; + z-index: $euiZLevel + 1000; background: inherit; background-image: linear-gradient(0deg, $euiColorLightestShade 0%, $euiColorEmptyShade 100%); opacity: 0; diff --git a/x-pack/legacy/plugins/telemetry/public/components/index.ts b/x-pack/legacy/plugins/telemetry/public/components/index.ts index 358f6515e8df9..94f808071eb60 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/index.ts +++ b/x-pack/legacy/plugins/telemetry/public/components/index.ts @@ -4,12 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -//@ts-ignore +// @ts-ignore export { TelemetryForm } from './telemetry_form'; -//@ts-ignore. export { OptInExampleFlyout } from './opt_in_details_component'; -//@ts-ignore. export { OptInBanner } from './opt_in_banner_component'; export { OptInCheckbox } from './opt_in_checkbox_component'; - export { OptInMessage } from './opt_in_message'; diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.js b/x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.tsx similarity index 59% rename from x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.js rename to x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.tsx index 24bc4ddf0b4ee..19754504c081e 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.js +++ b/x-pack/legacy/plugins/telemetry/public/components/opt_in_banner_component.tsx @@ -4,37 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; - -import { - EuiButton, - EuiCallOut, - EuiFlexGroup, - EuiFlexItem, - EuiSpacer, -} from '@elastic/eui'; +import * as React from 'react'; +import { EuiButton, EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { OptInMessage } from './opt_in_message'; +interface Props { + fetchTelemetry: () => Promise; + optInClick: (optIn: boolean) => void; +} + /** * React component for displaying the Telemetry opt-in banner. - * - * TODO: When Jest tests become available in X-Pack, we should add one for this component. */ -export class OptInBanner extends Component { - static propTypes = { - /** - * Callback function with no parameters that returns a {@code Promise} containing the - * telemetry data (expected to be an array). - */ - fetchTelemetry: PropTypes.func.isRequired, - /** - * Callback function passed a boolean to opt in ({@code true}) or out ({@code false}). - */ - optInClick: PropTypes.func.isRequired, - }; - +export class OptInBanner extends React.PureComponent { render() { const title = ( - this.props.optInClick(true)} - > + this.props.optInClick(true)}> - this.props.optInClick(false)} - > + this.props.optInClick(false)}> {}; + fetchTelemetry: () => Promise; optInClick: () => {}; } interface State { @@ -26,32 +17,24 @@ interface State { } export class OptInCheckbox extends React.PureComponent { - constructor(props: Props) { - super(props); - this.state = { - checked: false, - } - } - onChange = (e: any) => { - this.setState({ - checked: e.target.checked, - }); + public readonly state: State = { + checked: false, }; - render() { + onChange = (e: React.ChangeEvent) => { + this.setState({ checked: e.target.checked }); + }; - const label = ; + render() { return ( } checked={this.state.checked} onChange={this.onChange} /> - ) + ); } } diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.test.js b/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.test.tsx similarity index 74% rename from x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.test.js rename to x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.test.tsx index 358735ff95c8f..c58927c66756b 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.test.js +++ b/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.test.tsx @@ -9,8 +9,13 @@ import { OptInExampleFlyout } from './opt_in_details_component'; describe('OptInDetailsComponent', () => { it('renders as expected', () => { - expect(shallowWithIntl( - ({ data: [] }))} onClose={jest.fn()} />) + expect( + shallowWithIntl( + ({ data: [] }))} + onClose={jest.fn()} + /> + ) ).toMatchSnapshot(); }); }); diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.js b/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.tsx similarity index 65% rename from x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.js rename to x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.tsx index aac7ebf1b625b..9cfb55af1dab3 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.js +++ b/x-pack/legacy/plugins/telemetry/public/components/opt_in_details_component.tsx @@ -4,8 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; +import * as React from 'react'; import { EuiCallOut, @@ -24,39 +23,37 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; +interface Props { + fetchTelemetry: () => Promise; + onClose: () => void; +} + +interface State { + isLoading: boolean; + hasPrivilegeToRead: boolean; + data: any[] | null; +} + /** * React component for displaying the example data associated with the Telemetry opt-in banner. */ -export class OptInExampleFlyout extends Component { - - static propTypes = { - /** - * Callback function with no parameters that returns a {@code Promise} containing the - * telemetry data (expected to be an array). - */ - fetchTelemetry: PropTypes.func.isRequired, - /** - * Callback function with no parameters that closes this flyout. - */ - onClose: PropTypes.func.isRequired, - } - - constructor(props) { - super(props); - this.state = { - data: null, - isLoading: true, - hasPrivilegeToRead: false, - }; - } +export class OptInExampleFlyout extends React.PureComponent { + public readonly state: State = { + data: null, + isLoading: true, + hasPrivilegeToRead: false, + }; componentDidMount() { - this.props.fetchTelemetry() - .then(response => this.setState({ - data: Array.isArray(response.data) ? response.data : null, - isLoading: false, - hasPrivilegeToRead: true, - })) + this.props + .fetchTelemetry() + .then(response => + this.setState({ + data: Array.isArray(response.data) ? response.data : null, + isLoading: false, + hasPrivilegeToRead: true, + }) + ) .catch(err => { this.setState({ isLoading: false, @@ -65,7 +62,7 @@ export class OptInExampleFlyout extends Component { }); } - renderBody({ data, isLoading, hasPrivilegeToRead }) { + renderBody({ data, isLoading, hasPrivilegeToRead }: State) { if (isLoading) { return ( @@ -79,10 +76,12 @@ export class OptInExampleFlyout extends Component { if (!hasPrivilegeToRead) { return ( } + title={ + + } color="danger" iconType="cross" > @@ -97,10 +96,12 @@ export class OptInExampleFlyout extends Component { if (data === null) { return ( } + title={ + + } color="danger" iconType="cross" > @@ -114,21 +115,13 @@ export class OptInExampleFlyout extends Component { ); } - return ( - - {JSON.stringify(data, null, 2)} - - ); + return {JSON.stringify(data, null, 2)}; } render() { return ( - +

@@ -149,12 +142,9 @@ export class OptInExampleFlyout extends Component { - - {this.renderBody(this.state)} - + {this.renderBody(this.state)} ); } - } diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx b/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx index 113b934a0f713..5be20f8de32c1 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx +++ b/x-pack/legacy/plugins/telemetry/public/components/opt_in_message.tsx @@ -5,9 +5,14 @@ */ import * as React from 'react'; +import { EuiLink, EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { getConfigTelemetryDesc, PRIVACY_STATEMENT_URL } from '../../common/constants'; +import { OptInExampleFlyout } from './opt_in_details_component'; -type Props = { - fetchTelemetry: () => {}, +interface Props { + fetchTelemetry: () => Promise; } interface State { @@ -15,39 +20,20 @@ interface State { showExample: boolean; } -import { - EuiLink, - EuiText, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; - -import { getConfigTelemetryDesc, PRIVACY_STATEMENT_URL } from '../../common/constants'; - -//@ts-ignore -import { OptInExampleFlyout } from './opt_in_details_component'; - - export class OptInMessage extends React.PureComponent { - constructor(props: Props) { - super(props); - - this.state = { - showDetails: false, - showExample: false, - }; - } + public readonly state: State = { + showDetails: false, + showExample: false, + }; toggleShowExample = () => { - this.setState((prevState) => ({ - showExample: !prevState.showExample + this.setState(prevState => ({ + showExample: !prevState.showExample, })); - } + }; render() { - const { - showDetails, - showExample, - } = this.state; + const { showDetails, showExample } = this.state; const getDetails = () => ( @@ -67,13 +53,13 @@ export class OptInMessage extends React.PureComponent { ), telemetryPrivacyStatementLink: ( - + - ) + ), }} />

@@ -99,10 +85,12 @@ export class OptInMessage extends React.PureComponent { return ( -

{ getConfigTelemetryDesc() } { !showDetails && getReadMore() }

+

+ {getConfigTelemetryDesc()} {!showDetails && getReadMore()} +

- { showDetails && getDetails() } - { showDetails && showExample && getFlyoutDetails() } + {showDetails && getDetails()} + {showDetails && showExample && getFlyoutDetails()}
); } diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_welcome_component.tsx b/x-pack/legacy/plugins/telemetry/public/components/opt_in_welcome_component.tsx deleted file mode 100644 index 046b945e6508d..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_welcome_component.tsx +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import * as React from 'react'; - -import { - EuiButton, - EuiCallOut, - EuiFlexGroup, - EuiFlexItem, - EuiSpacer, - EuiCheckbox, - makeId, -} from '@elastic/eui'; -import { OptInMessage } from './opt_in_message'; - -interface Props { - fetchTelemetry: () => {}; - optInClick: () => {}; -} -interface State { - checked: boolean; -} - -export class OptInCheckbox extends React.PureComponent { - constructor(props: Props) { - super(props); - this.state = { - checked: false, - } - } - onChange = (e: any) => { - this.setState({ - checked: e.target.checked, - }); - }; - - render() { - - const label = ; - return ( - - - - ) - } -} From d7f7a0724ad20c08f3d4f9360f545626d0eac02b Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Sun, 28 Jul 2019 15:47:23 +0300 Subject: [PATCH 04/31] add steps --- .../telemetry_opt_in_card.tsx | 8 +++-- .../kibana/public/home/components/welcome.tsx | 30 ++++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx index 6d70a82ef0b4e..3e7b8e4d6e09f 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx @@ -20,7 +20,7 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiCard, EuiButton, EuiButtonEmpty } from '@elastic/eui'; +import { EuiCard, EuiButton } from '@elastic/eui'; import { OptInMessage } from '../../../../../../../../x-pack/legacy/plugins/telemetry/public/components'; export interface Props { @@ -53,21 +53,23 @@ export function renderTelemetryOptInCard({ onClick={onConfirm} className="homWelcome__footerAction" data-test-subj="WelcomeScreenOptInConfirm" + size="s" fill > - - + } /> diff --git a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx index 1c5948b4acd50..b456e5237d32b 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx @@ -31,6 +31,7 @@ import { EuiFlexItem, EuiText, EuiIcon, + EuiButtonIcon, EuiPortal, } from '@elastic/eui'; @@ -64,6 +65,10 @@ export class Welcome extends React.PureComponent { } }; + goToStep = (step: number) => () => { + this.setState(() => ({ step })); + }; + private redirecToSampleData() { const path = chrome.addBasePath('#/home/tutorial_directory/sampleData'); window.location.href = path; @@ -129,25 +134,36 @@ export class Welcome extends React.PureComponent {
- {step === 0 && ( - + + {step === 0 && ( - - )} - {step === 1 && ( - + )} + {step === 1 && ( + )} + + + + + {[0, 1].map(stepOpt => ( + + - )} + ))}
From 25b45777d98bc75bab636606422a813372514ac9 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Sun, 28 Jul 2019 15:49:36 +0300 Subject: [PATCH 05/31] disable current step --- .../core_plugins/kibana/public/home/components/welcome.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx index b456e5237d32b..8de71e7eb0c60 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx @@ -160,7 +160,7 @@ export class Welcome extends React.PureComponent { iconType="dot" onClick={this.goToStep(stepOpt)} size="s" - fill-opacity={step === stepOpt ? 1 : 0.5} + disabled={step === stepOpt} /> ))} From 11d9e822d5d257f182f05c312dcbbd7e2627639b Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Sun, 28 Jul 2019 15:52:35 +0300 Subject: [PATCH 06/31] remove checkbox option --- .../home/components/telemetry_opt_in/index.ts | 7 +--- .../telemetry_opt_in_checkbox.tsx | 33 --------------- .../components/opt_in_checkbox_component.tsx | 40 ------------------- 3 files changed, 2 insertions(+), 78 deletions(-) delete mode 100644 src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_checkbox.tsx delete mode 100644 x-pack/legacy/plugins/telemetry/public/components/opt_in_checkbox_component.tsx diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts index 0fcccdef00a2d..94c184080fd75 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts @@ -16,11 +16,8 @@ * specific language governing permissions and limitations * under the License. */ - -// import { renderTelemetryOptInCheckbox } from './telemetry_opt_in_checkbox'; import { renderTelemetryOptInCard, Props } from './telemetry_opt_in_card'; export const TelemetryOptInCard = (props: Props) => { - return renderTelemetryOptInCard(props); - // return renderTelemetryOptInCheckbox(); -} + return renderTelemetryOptInCheckbox(props); +}; diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_checkbox.tsx b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_checkbox.tsx deleted file mode 100644 index 93ff662b7d41b..0000000000000 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_checkbox.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import React from 'react'; -// import { i18n } from '@kbn/i18n'; - -//@ts-ignore -import { OptInCheckbox } from '../../../../../../../../x-pack/legacy/plugins/telemetry/public/components' - -export function renderTelemetryOptInCheckbox() { - return ( - {}} - optInClick={() => {}} - /> - ) -} diff --git a/x-pack/legacy/plugins/telemetry/public/components/opt_in_checkbox_component.tsx b/x-pack/legacy/plugins/telemetry/public/components/opt_in_checkbox_component.tsx deleted file mode 100644 index 8152308e275e6..0000000000000 --- a/x-pack/legacy/plugins/telemetry/public/components/opt_in_checkbox_component.tsx +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import * as React from 'react'; -import { EuiCheckbox } from '@elastic/eui'; -import { OptInMessage } from './opt_in_message'; - -interface Props { - fetchTelemetry: () => Promise; - optInClick: () => {}; -} -interface State { - checked: boolean; -} - -export class OptInCheckbox extends React.PureComponent { - public readonly state: State = { - checked: false, - }; - - onChange = (e: React.ChangeEvent) => { - this.setState({ checked: e.target.checked }); - }; - - render() { - return ( - - } - checked={this.state.checked} - onChange={this.onChange} - /> - - ); - } -} From a3338dbe9cd8c8c5e4e1bf5f8dd8bc92608a5be5 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Sun, 28 Jul 2019 18:13:17 +0300 Subject: [PATCH 07/31] add metrics --- .../kibana/public/home/components/home.js | 1 + .../kibana/public/home/components/home_app.js | 10 ++++- .../home/components/telemetry_opt_in/index.ts | 2 +- .../kibana/public/home/components/welcome.tsx | 39 ++++++++++++------- .../kibana/public/home/kibana_services.js | 7 +++- .../telemetry/public/components/index.ts | 1 - 6 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/home/components/home.js b/src/legacy/core_plugins/kibana/public/home/components/home.js index a2ed5cff42c86..0831c6b866f23 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/home.js +++ b/src/legacy/core_plugins/kibana/public/home/components/home.js @@ -226,6 +226,7 @@ export class Home extends Component { onSkip={this.skipWelcome} urlBasePath={this.props.urlBasePath} fetchTelemetry={this.props.fetchTelemetry} + showTelemetryOptIn={this.props.showTelemetryOptIn} /> ); } diff --git a/src/legacy/core_plugins/kibana/public/home/components/home_app.js b/src/legacy/core_plugins/kibana/public/home/components/home_app.js index 9b73a80e2aa4b..ed1afb1a98081 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/home_app.js +++ b/src/legacy/core_plugins/kibana/public/home/components/home_app.js @@ -37,8 +37,15 @@ export function HomeApp({ directories }) { const isCloudEnabled = chrome.getInjected('isCloudEnabled', false); const apmUiEnabled = chrome.getInjected('apmUiEnabled', true); const mlEnabled = chrome.getInjected('mlEnabled', false); + const { + telemetryBanner, + telemetryEnabled, + telemetryOptInProvide, + } = telemetryService; + + const showTelemetryOptIn = telemetryEnabled && telemetryBanner && telemetryOptInProvide.getOptIn() !== true; const savedObjectsClient = chrome.getSavedObjectsClient(); - const fetchTelemetry = telemetryService.telemetryOptInProvider.fetchExample; + const fetchTelemetry = telemetryOptInProvide.fetchExample; const renderTutorialDirectory = (props) => { return ( @@ -94,6 +101,7 @@ export function HomeApp({ directories }) { localStorage={localStorage} urlBasePath={chrome.getBasePath()} fetchTelemetry={fetchTelemetry} + showTelemetryOptIn={showTelemetryOptIn} /> diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts index 94c184080fd75..63636433bc00b 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/index.ts @@ -19,5 +19,5 @@ import { renderTelemetryOptInCard, Props } from './telemetry_opt_in_card'; export const TelemetryOptInCard = (props: Props) => { - return renderTelemetryOptInCheckbox(props); + return renderTelemetryOptInCard(props); }; diff --git a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx index 8de71e7eb0c60..d2760934736a6 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx @@ -39,11 +39,14 @@ import { FormattedMessage } from '@kbn/i18n/react'; import chrome from 'ui/chrome'; import { SampleDataCard } from './sample_data'; import { TelemetryOptInCard } from './telemetry_opt_in'; +// @ts-ignore +import { trackUiMetric, METRIC_TYPE } from '../kibana_services'; interface Props { urlBasePath: string; onSkip: () => {}; fetchTelemetry: () => Promise; + showTelemetryOptIn: boolean; } interface State { step: number; @@ -66,6 +69,7 @@ export class Welcome extends React.PureComponent { }; goToStep = (step: number) => () => { + trackUiMetric(METRIC_TYPE.CLICK, `welcomeScreenNavigate_${step}`); this.setState(() => ({ step })); }; @@ -75,6 +79,7 @@ export class Welcome extends React.PureComponent { } onTelemetryOptInDecline = () => { const { trySampleData } = this.state; + trackUiMetric(METRIC_TYPE.CLICK, 'telemetryOptInDecline'); if (trySampleData) { return this.redirecToSampleData(); } @@ -82,16 +87,20 @@ export class Welcome extends React.PureComponent { }; onTelemetryOptInConfirm = () => { const { trySampleData } = this.state; + trackUiMetric(METRIC_TYPE.CLICK, 'telemetryOptInConfirm'); if (trySampleData) { return this.redirecToSampleData(); } + this.props.onSkip(); }; onSampleDataDecline = () => { + trackUiMetric(METRIC_TYPE.CLICK, 'sampleDataDecline'); this.setState(() => ({ step: 1, trySampleData: false })); }; onSampleDataConfirm = () => { + trackUiMetric(METRIC_TYPE.CLICK, 'sampleDataConfirm'); this.setState(() => ({ step: 1, trySampleData: true })); }; @@ -104,7 +113,7 @@ export class Welcome extends React.PureComponent { } render() { - const { urlBasePath, fetchTelemetry } = this.props; + const { urlBasePath, fetchTelemetry, showTelemetryOptIn } = this.props; const { step } = this.state; return ( @@ -142,7 +151,7 @@ export class Welcome extends React.PureComponent { onDecline={this.onSampleDataDecline} /> )} - {step === 1 && ( + {showTelemetryOptIn && step === 1 && ( { - - {[0, 1].map(stepOpt => ( - - - - ))} - + {showTelemetryOptIn && ( + + {[0, 1].map(stepOpt => ( + + + + ))} + + )} diff --git a/src/legacy/core_plugins/kibana/public/home/kibana_services.js b/src/legacy/core_plugins/kibana/public/home/kibana_services.js index a5d01c6152b2a..bdd7a65d3de1a 100644 --- a/src/legacy/core_plugins/kibana/public/home/kibana_services.js +++ b/src/legacy/core_plugins/kibana/public/home/kibana_services.js @@ -19,11 +19,14 @@ import { uiModules } from 'ui/modules'; import { npStart } from 'ui/new_platform'; -import { TelemetryOptInProvider } from '../../../../../../x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in' - +import { TelemetryOptInProvider } from '../../../../../../x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in'; +import { createUiStatsReporter, METRIC_TYPE } from '../../../ui_metric/public'; export let indexPatternService; export const telemetryService = {}; +export const trackUiMetric = createUiStatsReporter('Kibana_home'); +export { METRIC_TYPE }; + uiModules.get('kibana').run(($injector) => { indexPatternService = $injector.get('indexPatterns'); const Private = $injector.get('Private'); diff --git a/x-pack/legacy/plugins/telemetry/public/components/index.ts b/x-pack/legacy/plugins/telemetry/public/components/index.ts index 94f808071eb60..9675bd997b183 100644 --- a/x-pack/legacy/plugins/telemetry/public/components/index.ts +++ b/x-pack/legacy/plugins/telemetry/public/components/index.ts @@ -8,5 +8,4 @@ export { TelemetryForm } from './telemetry_form'; export { OptInExampleFlyout } from './opt_in_details_component'; export { OptInBanner } from './opt_in_banner_component'; -export { OptInCheckbox } from './opt_in_checkbox_component'; export { OptInMessage } from './opt_in_message'; From 2812b0fc0c1dd9132fca885ef6865954a32adaf4 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Sun, 28 Jul 2019 19:12:08 +0300 Subject: [PATCH 08/31] fix typescript checks --- .../kibana/public/home/components/sample_data/index.tsx | 7 ++++++- .../components/telemetry_opt_in/telemetry_opt_in_card.tsx | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx b/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx index edd31bad545ea..1bb8bd214d2cb 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/sample_data/index.tsx @@ -24,7 +24,12 @@ */ import React from 'react'; -import { EuiCard, EuiButton, EuiButtonEmpty } from '@elastic/eui'; +import { + // @ts-ignore + EuiCard, + EuiButton, + EuiButtonEmpty, +} from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx index 3e7b8e4d6e09f..2db4e10b7bc97 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx @@ -20,7 +20,11 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { EuiCard, EuiButton } from '@elastic/eui'; +import { + // @ts-ignore + EuiCard, + EuiButton, +} from '@elastic/eui'; import { OptInMessage } from '../../../../../../../../x-pack/legacy/plugins/telemetry/public/components'; export interface Props { From 5135a14a7e1444cfe17cf2f5abdbd9e8eb7ec5da Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Mon, 29 Jul 2019 09:34:16 +0300 Subject: [PATCH 09/31] hide in oss --- .../public/home/components/home.test.js | 20 +-------- .../public/home/components/home.test.mocks.ts | 45 +++++++++++++++++++ .../kibana/public/home/components/home_app.js | 6 +-- .../kibana/public/home/components/welcome.tsx | 4 ++ .../kibana/public/home/kibana_services.js | 2 +- 5 files changed, 55 insertions(+), 22 deletions(-) create mode 100644 src/legacy/core_plugins/kibana/public/home/components/home.test.mocks.ts diff --git a/src/legacy/core_plugins/kibana/public/home/components/home.test.js b/src/legacy/core_plugins/kibana/public/home/components/home.test.js index c10aa3f0b1e32..6cb82f01ee96e 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/home.test.js +++ b/src/legacy/core_plugins/kibana/public/home/components/home.test.js @@ -17,30 +17,14 @@ * under the License. */ +import './home.test.mocks'; + import React from 'react'; import sinon from 'sinon'; import { shallow } from 'enzyme'; import { Home } from './home'; import { FeatureCatalogueCategory } from 'ui/registry/feature_catalogue'; -jest.mock( - 'ui/chrome', - () => ({ - getBasePath: jest.fn(() => 'path'), - getInjected: jest.fn(() => ''), - }), - { virtual: true } -); - -jest.mock( - 'ui/capabilities', - () => ({ - catalogue: {}, - management: {}, - navLinks: {} - }) -); - describe('home', () => { let defaultProps; diff --git a/src/legacy/core_plugins/kibana/public/home/components/home.test.mocks.ts b/src/legacy/core_plugins/kibana/public/home/components/home.test.mocks.ts new file mode 100644 index 0000000000000..1eed597a90a4b --- /dev/null +++ b/src/legacy/core_plugins/kibana/public/home/components/home.test.mocks.ts @@ -0,0 +1,45 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { notificationServiceMock } from '../../../../../../core/public/mocks'; + +jest.doMock('ui/new_platform', () => { + return { + npSetup: { + core: { + notifications: notificationServiceMock.createSetupContract(), + }, + }, + }; +}); + +jest.doMock( + 'ui/chrome', + () => ({ + getBasePath: jest.fn(() => 'path'), + getInjected: jest.fn(() => ''), + }), + { virtual: true } +); + +jest.doMock('ui/capabilities', () => ({ + catalogue: {}, + management: {}, + navLinks: {}, +})); diff --git a/src/legacy/core_plugins/kibana/public/home/components/home_app.js b/src/legacy/core_plugins/kibana/public/home/components/home_app.js index ed1afb1a98081..9c01f13202f89 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/home_app.js +++ b/src/legacy/core_plugins/kibana/public/home/components/home_app.js @@ -40,12 +40,12 @@ export function HomeApp({ directories }) { const { telemetryBanner, telemetryEnabled, - telemetryOptInProvide, + telemetryOptInProvider, } = telemetryService; - const showTelemetryOptIn = telemetryEnabled && telemetryBanner && telemetryOptInProvide.getOptIn() !== true; + const showTelemetryOptIn = telemetryEnabled && telemetryBanner && telemetryOptInProvider.getOptIn() !== true; const savedObjectsClient = chrome.getSavedObjectsClient(); - const fetchTelemetry = telemetryOptInProvide.fetchExample; + const fetchTelemetry = telemetryOptInProvider.fetchExample; const renderTutorialDirectory = (props) => { return ( diff --git a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx index d2760934736a6..e13f9405c9b84 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/welcome.tsx @@ -105,6 +105,10 @@ export class Welcome extends React.PureComponent { }; componentDidMount() { + trackUiMetric(METRIC_TYPE.LOADED, 'welcomeScreenMount'); + if (this.props.showTelemetryOptIn) { + trackUiMetric(METRIC_TYPE.COUNT, 'welcomeScreenWithTelemetryOptIn'); + } document.addEventListener('keydown', this.hideOnEsc); } diff --git a/src/legacy/core_plugins/kibana/public/home/kibana_services.js b/src/legacy/core_plugins/kibana/public/home/kibana_services.js index bdd7a65d3de1a..435301fbb161e 100644 --- a/src/legacy/core_plugins/kibana/public/home/kibana_services.js +++ b/src/legacy/core_plugins/kibana/public/home/kibana_services.js @@ -30,9 +30,9 @@ export { METRIC_TYPE }; uiModules.get('kibana').run(($injector) => { indexPatternService = $injector.get('indexPatterns'); const Private = $injector.get('Private'); - const telemetryOptInProvider = Private(TelemetryOptInProvider); const telemetryEnabled = npStart.core.injectedMetadata.getInjectedVar('telemetryEnabled'); const telemetryBanner = npStart.core.injectedMetadata.getInjectedVar('telemetryBanner'); + const telemetryOptInProvider = telemetryEnabled ? Private(TelemetryOptInProvider) : {}; telemetryService.telemetryEnabled = telemetryEnabled; telemetryService.telemetryBanner = telemetryBanner; telemetryService.telemetryOptInProvider = telemetryOptInProvider; From d2bdffa4f8d41fa87afbafdcc657713be9c52081 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Mon, 29 Jul 2019 10:56:43 +0300 Subject: [PATCH 10/31] update snapshots --- ...ponent.test.js.snap => opt_in_details_component.test.tsx.snap} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename x-pack/legacy/plugins/telemetry/public/components/__snapshots__/{opt_in_details_component.test.js.snap => opt_in_details_component.test.tsx.snap} (100%) diff --git a/x-pack/legacy/plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.js.snap b/x-pack/legacy/plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.tsx.snap similarity index 100% rename from x-pack/legacy/plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.js.snap rename to x-pack/legacy/plugins/telemetry/public/components/__snapshots__/opt_in_details_component.test.tsx.snap From d69c996c8d6b56ab4c7a84b0e467f3a7e7cec296 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Mon, 29 Jul 2019 11:43:19 +0300 Subject: [PATCH 11/31] only require TelemetryOptInProvider if telemetry is enabled --- .../kibana/public/home/kibana_services.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/home/kibana_services.js b/src/legacy/core_plugins/kibana/public/home/kibana_services.js index 435301fbb161e..e0f64fde478ce 100644 --- a/src/legacy/core_plugins/kibana/public/home/kibana_services.js +++ b/src/legacy/core_plugins/kibana/public/home/kibana_services.js @@ -19,7 +19,6 @@ import { uiModules } from 'ui/modules'; import { npStart } from 'ui/new_platform'; -import { TelemetryOptInProvider } from '../../../../../../x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in'; import { createUiStatsReporter, METRIC_TYPE } from '../../../ui_metric/public'; export let indexPatternService; export const telemetryService = {}; @@ -29,11 +28,15 @@ export { METRIC_TYPE }; uiModules.get('kibana').run(($injector) => { indexPatternService = $injector.get('indexPatterns'); - const Private = $injector.get('Private'); const telemetryEnabled = npStart.core.injectedMetadata.getInjectedVar('telemetryEnabled'); const telemetryBanner = npStart.core.injectedMetadata.getInjectedVar('telemetryBanner'); - const telemetryOptInProvider = telemetryEnabled ? Private(TelemetryOptInProvider) : {}; - telemetryService.telemetryEnabled = telemetryEnabled; - telemetryService.telemetryBanner = telemetryBanner; - telemetryService.telemetryOptInProvider = telemetryOptInProvider; + if (telemetryEnabled) { + const { TelemetryOptInProvider } = require('../../../../../../x-pack/legacy/plugins/telemetry/public/services/telemetry_opt_in'); + const Private = $injector.get('Private'); + const telemetryOptInProvider = Private(TelemetryOptInProvider); + telemetryService.telemetryOptInProvider = telemetryOptInProvider; + } + telemetryService.telemetryEnabled = telemetryEnabled || false; + telemetryService.telemetryBanner = telemetryBanner || false; + telemetryService.telemetryOptInProvider = {}; }); From 150e7f1e68e60c42ec24dc4b15f774213c0d4a04 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Mon, 29 Jul 2019 12:18:31 +0300 Subject: [PATCH 12/31] pass telemetry description from service --- .../kibana/public/home/components/home.js | 4 +++- .../kibana/public/home/components/home_app.js | 11 ++--------- .../telemetry_opt_in_card.tsx | 7 +++---- .../kibana/public/home/components/welcome.tsx | 6 +++--- .../kibana/public/home/kibana_services.js | 19 +++++++++++++------ .../public/components/opt_in_message.tsx | 1 + 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/home/components/home.js b/src/legacy/core_plugins/kibana/public/home/components/home.js index 0831c6b866f23..2c7fb79535be6 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/home.js +++ b/src/legacy/core_plugins/kibana/public/home/components/home.js @@ -225,7 +225,7 @@ export class Home extends Component { ); @@ -249,6 +249,8 @@ export class Home extends Component { Home.propTypes = { addBasePath: PropTypes.func.isRequired, + optInDescription: PropTypes.element, + showTelemetryOptIn: PropTypes.bool.isRequired, directories: PropTypes.arrayOf( PropTypes.shape({ id: PropTypes.string.isRequired, diff --git a/src/legacy/core_plugins/kibana/public/home/components/home_app.js b/src/legacy/core_plugins/kibana/public/home/components/home_app.js index 9c01f13202f89..25ca338514ab6 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/home_app.js +++ b/src/legacy/core_plugins/kibana/public/home/components/home_app.js @@ -37,15 +37,8 @@ export function HomeApp({ directories }) { const isCloudEnabled = chrome.getInjected('isCloudEnabled', false); const apmUiEnabled = chrome.getInjected('apmUiEnabled', true); const mlEnabled = chrome.getInjected('mlEnabled', false); - const { - telemetryBanner, - telemetryEnabled, - telemetryOptInProvider, - } = telemetryService; - - const showTelemetryOptIn = telemetryEnabled && telemetryBanner && telemetryOptInProvider.getOptIn() !== true; + const { optInDescription, showTelemetryOptIn } = telemetryService; const savedObjectsClient = chrome.getSavedObjectsClient(); - const fetchTelemetry = telemetryOptInProvider.fetchExample; const renderTutorialDirectory = (props) => { return ( @@ -100,7 +93,7 @@ export function HomeApp({ directories }) { find={savedObjectsClient.find} localStorage={localStorage} urlBasePath={chrome.getBasePath()} - fetchTelemetry={fetchTelemetry} + optInDescription={optInDescription} showTelemetryOptIn={showTelemetryOptIn} /> diff --git a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx index 2db4e10b7bc97..2a9d23ba7e681 100644 --- a/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx +++ b/src/legacy/core_plugins/kibana/public/home/components/telemetry_opt_in/telemetry_opt_in_card.tsx @@ -26,10 +26,9 @@ import { EuiButton, } from '@elastic/eui'; -import { OptInMessage } from '../../../../../../../../x-pack/legacy/plugins/telemetry/public/components'; export interface Props { + optInDescription: string | React.Component; urlBasePath: string; - fetchTelemetry: () => Promise; onConfirm: () => void; onDecline: () => void; } @@ -38,7 +37,7 @@ export function renderTelemetryOptInCard({ urlBasePath, onConfirm, onDecline, - fetchTelemetry, + optInDescription, }: Props) { return ( } - description={} + description={optInDescription} footer={