mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 17:59:23 -04:00
[Search][Onboarding] Add telemetry for Start Page code view (#193099)
## Summary Added telemetry tracking events for the start page code view. Specifically tracking when user selects a language and copies the example code snippets.
This commit is contained in:
parent
090d9a2adf
commit
f01f68e059
3 changed files with 65 additions and 18 deletions
|
@ -10,4 +10,7 @@ export enum AnalyticsEvents {
|
|||
startPageShowCodeClick = 'start_page_show_code',
|
||||
startPageShowCreateIndexUIClick = 'start_page_show_create_index_ui',
|
||||
startCreateIndexClick = 'start_create_index',
|
||||
startCreateIndexLanguageSelect = 'start_code_lang_select',
|
||||
startCreateIndexCodeCopyInstall = 'start_code_copy_install',
|
||||
startCreateIndexCodeCopy = 'start_code_copy',
|
||||
}
|
||||
|
|
|
@ -4,6 +4,8 @@
|
|||
* 2.0; you may not use this file except in compliance with the Elastic License
|
||||
* 2.0.
|
||||
*/
|
||||
// Disabled so we can track the on copy event by adding an onClick to a div
|
||||
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
||||
|
||||
import React from 'react';
|
||||
import {
|
||||
|
@ -19,9 +21,22 @@ export interface CodeSampleProps {
|
|||
title: string;
|
||||
language: string;
|
||||
code: string;
|
||||
onCodeCopyClick?: React.MouseEventHandler<HTMLElement>;
|
||||
}
|
||||
|
||||
export const CodeSample = ({ title, language, code }: CodeSampleProps) => {
|
||||
export const CodeSample = ({ title, language, code, onCodeCopyClick }: CodeSampleProps) => {
|
||||
const onCodeClick = React.useCallback(
|
||||
(e: React.MouseEvent<HTMLElement, MouseEvent>) => {
|
||||
if (onCodeCopyClick === undefined) return;
|
||||
if (e.target instanceof HTMLElement) {
|
||||
if (e.target.dataset?.testSubj === 'euiCodeBlockCopy') {
|
||||
onCodeCopyClick(e);
|
||||
}
|
||||
}
|
||||
},
|
||||
[onCodeCopyClick]
|
||||
);
|
||||
|
||||
return (
|
||||
<EuiFlexItem>
|
||||
<EuiText size="s">
|
||||
|
@ -30,15 +45,17 @@ export const CodeSample = ({ title, language, code }: CodeSampleProps) => {
|
|||
<EuiSpacer size="s" />
|
||||
<EuiThemeProvider colorMode="dark">
|
||||
<EuiPanel color="subdued" paddingSize="none" hasShadow={false}>
|
||||
<EuiCodeBlock
|
||||
language={language}
|
||||
fontSize="m"
|
||||
paddingSize="m"
|
||||
isCopyable
|
||||
transparentBackground
|
||||
>
|
||||
{code}
|
||||
</EuiCodeBlock>
|
||||
<div onClick={onCodeClick}>
|
||||
<EuiCodeBlock
|
||||
language={language}
|
||||
fontSize="m"
|
||||
paddingSize="m"
|
||||
isCopyable
|
||||
transparentBackground
|
||||
>
|
||||
{code}
|
||||
</EuiCodeBlock>
|
||||
</div>
|
||||
</EuiPanel>
|
||||
</EuiThemeProvider>
|
||||
</EuiFlexItem>
|
||||
|
|
|
@ -4,20 +4,22 @@
|
|||
* 2.0; you may not use this file except in compliance with the Elastic License
|
||||
* 2.0.
|
||||
*/
|
||||
import React, { useMemo, useState } from 'react';
|
||||
import React, { useCallback, useMemo, useState } from 'react';
|
||||
import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
|
||||
import { i18n } from '@kbn/i18n';
|
||||
import { TryInConsoleButton } from '@kbn/try-in-console';
|
||||
|
||||
import { useKibana } from '../../hooks/use_kibana';
|
||||
import { CodeSample } from './code_sample';
|
||||
import { CreateIndexFormState } from './types';
|
||||
|
||||
import { AnalyticsEvents } from '../../analytics/constants';
|
||||
import { Languages, AvailableLanguages, LanguageOptions } from '../../code_examples';
|
||||
import { DenseVectorSeverlessCodeExamples } from '../../code_examples/create_index';
|
||||
import { useUsageTracker } from '../../hooks/use_usage_tracker';
|
||||
import { useKibana } from '../../hooks/use_kibana';
|
||||
import { useElasticsearchUrl } from '../../hooks/use_elasticsearch_url';
|
||||
|
||||
import { LanguageSelector } from '../shared/language_selector';
|
||||
import { useElasticsearchUrl } from '../../hooks/use_elasticsearch_url';
|
||||
|
||||
import { CodeSample } from './code_sample';
|
||||
import { CreateIndexFormState } from './types';
|
||||
|
||||
export interface CreateIndexCodeViewProps {
|
||||
createIndexForm: CreateIndexFormState;
|
||||
|
@ -28,10 +30,21 @@ const SelectedCodeExamples = DenseVectorSeverlessCodeExamples;
|
|||
|
||||
export const CreateIndexCodeView = ({ createIndexForm }: CreateIndexCodeViewProps) => {
|
||||
const { application, share, console: consolePlugin } = useKibana().services;
|
||||
const usageTracker = useUsageTracker();
|
||||
|
||||
// TODO: initing this should be dynamic and possibly saved in the form state
|
||||
const [selectedLanguage, setSelectedLanguage] = useState<AvailableLanguages>('python');
|
||||
const onSelectLanguage = useCallback(
|
||||
(value: AvailableLanguages) => {
|
||||
setSelectedLanguage(value);
|
||||
usageTracker.count([
|
||||
AnalyticsEvents.startCreateIndexLanguageSelect,
|
||||
`${AnalyticsEvents.startCreateIndexLanguageSelect}_${value}`,
|
||||
]);
|
||||
},
|
||||
[usageTracker]
|
||||
);
|
||||
const elasticsearchUrl = useElasticsearchUrl();
|
||||
|
||||
const codeParams = useMemo(() => {
|
||||
return {
|
||||
indexName: createIndexForm.indexName || undefined,
|
||||
|
@ -49,7 +62,7 @@ export const CreateIndexCodeView = ({ createIndexForm }: CreateIndexCodeViewProp
|
|||
<LanguageSelector
|
||||
options={LanguageOptions}
|
||||
selectedLanguage={selectedLanguage}
|
||||
onSelectLanguage={(value) => setSelectedLanguage(value)}
|
||||
onSelectLanguage={onSelectLanguage}
|
||||
/>
|
||||
</EuiFlexItem>
|
||||
{selectedLanguage === 'curl' && (
|
||||
|
@ -70,6 +83,12 @@ export const CreateIndexCodeView = ({ createIndexForm }: CreateIndexCodeViewProp
|
|||
})}
|
||||
language="shell"
|
||||
code={selectedCodeExample.installCommand}
|
||||
onCodeCopyClick={() => {
|
||||
usageTracker.click([
|
||||
AnalyticsEvents.startCreateIndexCodeCopyInstall,
|
||||
`${AnalyticsEvents.startCreateIndexCodeCopyInstall}_${selectedLanguage}`,
|
||||
]);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
<CodeSample
|
||||
|
@ -78,6 +97,14 @@ export const CreateIndexCodeView = ({ createIndexForm }: CreateIndexCodeViewProp
|
|||
})}
|
||||
language={Languages[selectedLanguage].codeBlockLanguage}
|
||||
code={selectedCodeExample.createIndex(codeParams)}
|
||||
onCodeCopyClick={() => {
|
||||
usageTracker.click([
|
||||
AnalyticsEvents.startCreateIndexCodeCopy,
|
||||
`${AnalyticsEvents.startCreateIndexCodeCopy}_${selectedLanguage}`,
|
||||
// TODO: vector should be a parameter when have multiple options
|
||||
`${AnalyticsEvents.startCreateIndexCodeCopy}_${selectedLanguage}_vector`,
|
||||
]);
|
||||
}}
|
||||
/>
|
||||
</EuiFlexGroup>
|
||||
);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue