[Console] Improve text in Welcome screen (#149569)

This commit is contained in:
Muhammad Ibragimov 2023-02-06 20:01:42 +05:00 committed by GitHub
parent 8968b74762
commit 447de664fa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 187 additions and 98 deletions

View file

@ -0,0 +1,60 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
export const kibanaApiExample = `
# retrieve sets of saved objects
POST kbn:api/saved_objects/_export
`;
export const multipleRequestsExample = `
# POST test_index/_doc/test_doc 200 OK
{
"_index": "test_index",
"_id": "test_doc",
"_version": 3,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}
# POST notAnEndpoint 405 Method Not Allowed
{
"error": "Incorrect HTTP method for uri [/notAnEndpoint?pretty=true] and method [POST], allowed: [HEAD, GET, PUT, DELETE]",
"status": 405
}
`;
export const commentsExample = `
# This request searches all of your indices.
GET _search
{
// The query parameter indicates query context.
"query": {
// Matches all documents.
/*"match_all": {
"boost": 1.2
}*/
"match_none": {} // Matches no document.
}
}
`;
export const variablesExample = `
GET $\{pathVariable}
{
"query": {
"match": {
"$\{bodyNameVariable}": "$\{bodyValueVariable}"
}
}
}
`;

View file

@ -6,30 +6,40 @@
* Side Public License, v 1.
*/
import { EuiScreenReaderOnly } from '@elastic/eui';
import { EuiScreenReaderOnly, withEuiTheme } from '@elastic/eui';
import type { WithEuiThemeProps } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import React, { useEffect, useRef } from 'react';
import { createReadOnlyAceEditor, CustomAceEditor } from '../models/sense_editor';
// @ts-ignore
import { Mode } from '../models/legacy_core_editor/mode/input';
import { Mode as InputMode } from '../models/legacy_core_editor/mode/input';
import { Mode as OutputMode } from '../models/legacy_core_editor/mode/output';
interface EditorExampleProps {
panel: string;
example?: string;
theme: WithEuiThemeProps['theme'];
linesOfExampleCode?: number;
mode?: string;
}
const exampleText = `
# index a doc
PUT index/_doc/1
GET _search
{
"body": "here"
"query": {
"match_all": {}
}
}
# and get it ...
GET index/_doc/1
`;
export function EditorExample(props: EditorExampleProps) {
const inputId = `help-example-${props.panel}-input`;
const EditorExample = ({
panel,
example,
theme,
linesOfExampleCode = 6,
mode = 'input',
}: EditorExampleProps) => {
const inputId = `help-example-${panel}-input`;
const wrapperDivRef = useRef<HTMLDivElement | null>(null);
const editorRef = useRef<CustomAceEditor>();
@ -38,8 +48,8 @@ export function EditorExample(props: EditorExampleProps) {
editorRef.current = createReadOnlyAceEditor(wrapperDivRef.current);
const editor = editorRef.current;
editor.update(exampleText.trim());
editor.session.setMode(new Mode());
const editorMode = mode === 'input' ? new InputMode() : new OutputMode();
editor.update((example || exampleText).trim(), editorMode);
editor.session.setUseWorker(false);
editor.setHighlightActiveLine(false);
@ -55,7 +65,12 @@ export function EditorExample(props: EditorExampleProps) {
editorRef.current.destroy();
}
};
}, [inputId]);
}, [example, inputId, mode]);
const wrapperDivStyle = {
height: `${parseInt(theme.euiTheme.size.base, 10) * linesOfExampleCode}px`,
margin: `${theme.euiTheme.size.base} 0`,
};
return (
<>
@ -66,7 +81,10 @@ export function EditorExample(props: EditorExampleProps) {
})}
</label>
</EuiScreenReaderOnly>
<div ref={wrapperDivRef} className="conHelp__example" />
<div ref={wrapperDivRef} className="conApp_example" css={wrapperDivStyle} />
</>
);
}
};
// eslint-disable-next-line import/no-default-export
export default withEuiTheme(EditorExample);

View file

@ -17,7 +17,7 @@ import {
EuiSpacer,
EuiLink,
} from '@elastic/eui';
import { EditorExample } from './editor_example';
import EditorExample from './editor_example';
import { useServicesContext } from '../contexts';
interface Props {

View file

@ -18,8 +18,10 @@ import {
EuiButton,
EuiText,
EuiFlyoutFooter,
EuiCode,
} from '@elastic/eui';
import { EditorExample } from './editor_example';
import EditorExample from './editor_example';
import * as examples from '../../../common/constants/welcome_panel';
interface Props {
onDismiss: () => void;
@ -27,85 +29,127 @@ interface Props {
export function WelcomePanel(props: Props) {
return (
<EuiFlyout onClose={props.onDismiss} data-test-subj="welcomePanel" size="s" ownFocus={false}>
<EuiFlyout
onClose={props.onDismiss}
data-test-subj="welcomePanel"
size="m"
maxWidth={0}
ownFocus={false}
>
<EuiFlyoutHeader hasBorder>
<EuiTitle size="m">
<h2>
<FormattedMessage
id="console.welcomePage.pageTitle"
defaultMessage="Welcome to Console"
defaultMessage="Send requests with Console"
/>
</h2>
</EuiTitle>
</EuiFlyoutHeader>
<EuiFlyoutBody>
<EuiText>
<h4>
<FormattedMessage
id="console.welcomePage.quickIntroTitle"
defaultMessage="Quick intro to the UI"
/>
</h4>
<p>
<FormattedMessage
id="console.welcomePage.quickIntroDescription"
defaultMessage="The Console UI is split into two panes: an editor pane (left) and a response pane (right).
Use the editor to type requests and submit them to Elasticsearch. The results will be displayed in
the response pane on the right side."
defaultMessage="Console understands commands in a cURL-like syntax. Here is a request to the Elasticsearch _search API."
/>
</p>
<EditorExample panel="welcome-example-1" />
<p>
<FormattedMessage
id="console.welcomePage.supportedRequestFormatTitle"
defaultMessage="Console understands requests in a compact format, similar to cURL:"
/>
</p>
<EditorExample panel="welcome" />
<p>
<FormattedMessage
id="console.welcomePage.supportedRequestFormatDescription"
defaultMessage="While typing a request, Console will make suggestions which you can then accept by hitting Enter/Tab.
These suggestions are made based on the request structure as well as your indices and types."
id="console.welcomePage.kibanaAPIsDescription"
defaultMessage="To send a request to a Kibana API, prefix the path with {kibanaApiPrefix}."
values={{
kibanaApiPrefix: <EuiCode>kbn:</EuiCode>,
}}
/>
</p>
<EditorExample
panel="welcome-example-2"
example={examples.kibanaApiExample}
linesOfExampleCode={2}
/>
<h4>
<FormattedMessage
id="console.welcomePage.quickTipsTitle"
defaultMessage="A few quick tips, while I have your attention"
id="console.welcomePage.sendMultipleRequestsTitle"
defaultMessage="Send multiple requests"
/>
</h4>
<ul>
<p>
<FormattedMessage
id="console.welcomePage.sendMultipleRequestsDescription"
defaultMessage="Select multiple requests and send them together. You'll get responses to all your requests, regardless of whether they succeed or fail."
/>
</p>
<EditorExample
panel="welcome-example-3"
example={examples.multipleRequestsExample}
linesOfExampleCode={22}
mode="output"
/>
<h4>
<FormattedMessage
id="console.welcomePage.addCommentsTitle"
defaultMessage="Add comments in request bodies"
/>
</h4>
<p>
<FormattedMessage
id="console.welcomePage.addCommentsDescription"
defaultMessage="To add a single-line comment, use {hash} or {doubleSlash}. For a multiline comment, mark the beginning with {slashAsterisk} and the end with {asteriskSlash}."
values={{
hash: <EuiCode>#</EuiCode>,
doubleSlash: <EuiCode>//</EuiCode>,
slashAsterisk: <EuiCode>/*</EuiCode>,
asteriskSlash: <EuiCode>*/</EuiCode>,
}}
/>
</p>
<EditorExample
panel="welcome-example-4"
example={examples.commentsExample}
linesOfExampleCode={14}
/>
<h4>
<FormattedMessage
id="console.welcomePage.useVariablesTitle"
defaultMessage="Reuse values with variables"
/>
</h4>
<p>
<FormattedMessage
id="console.welcomePage.useVariablesDescription"
defaultMessage="Define variables in Console, and then use them in your requests in the form of {variableName}."
values={{
// use html tags to render the curly braces
variableName: <EuiCode>$&#123;variableName&#125;</EuiCode>,
}}
/>
</p>
<ol>
<li>
<FormattedMessage
id="console.welcomePage.quickTips.submitRequestDescription"
defaultMessage="Submit requests to ES using the green triangle button."
id="console.welcomePage.useVariables.step1"
defaultMessage="Click {variableText}, and then enter the variable name and value."
values={{
variableText: <strong>Variables</strong>,
}}
/>
</li>
<li>
<FormattedMessage
id="console.welcomePage.quickTips.useWrenchMenuDescription"
defaultMessage="Use the wrench menu for other useful things."
id="console.welcomePage.useVariables.step2"
defaultMessage="Refer to variables in the paths and bodies of your requests as many times as you like."
/>
</li>
<li>
<FormattedMessage
id="console.welcomePage.quickTips.cUrlFormatForRequestsDescription"
defaultMessage="You can paste requests in cURL format and they will be translated to the Console syntax."
/>
</li>
<li>
<FormattedMessage
id="console.welcomePage.quickTips.resizeEditorDescription"
defaultMessage="You can resize the editor and output panes by dragging the separator between them."
/>
</li>
<li>
<FormattedMessage
id="console.welcomePage.quickTips.keyboardShortcutsDescription"
defaultMessage="Study the keyboard shortcuts under the Help button. Good stuff in there!"
/>
</li>
</ul>
</ol>
<EditorExample
panel="welcome-example-5"
example={examples.variablesExample}
linesOfExampleCode={9}
/>
</EuiText>
</EuiFlyoutBody>
<EuiFlyoutFooter>

View file

@ -30,7 +30,7 @@
}
}
.conApp__output {
.conApp__output, .conApp_example {
display: flex;
flex: 1 1 1px;

View file

@ -1,5 +0,0 @@
.conHelp__example {
display: block;
height: $euiSize * 8; // 8 lines of code
margin: $euiSize 0;
}

View file

@ -1,2 +1 @@
@import 'help';
@import 'history';

View file

@ -316,15 +316,6 @@
"console.welcomePage.closeButtonLabel": "Rejeter",
"console.welcomePage.pageTitle": "Bienvenue dans la console",
"console.welcomePage.quickIntroDescription": "L'interface utilisateur de la console est divisée en deux volets : un volet éditeur (à gauche) et un volet de réponse (à droite). L'éditeur permet de saisir des requêtes et de les envoyer à Elasticsearch, tandis que le volet de réponse affiche les résultats.",
"console.welcomePage.quickIntroTitle": "Introduction rapide à l'interface utilisateur",
"console.welcomePage.quickTips.cUrlFormatForRequestsDescription": "Vous pouvez coller des requêtes au format cURL ; elles seront automatiquement traduites dans la syntaxe de la console.",
"console.welcomePage.quickTips.keyboardShortcutsDescription": "Nhésitez pas à jeter un œil aux raccourcis clavier sous le bouton Aide. Vous pourriez y trouver des choses utiles.",
"console.welcomePage.quickTips.resizeEditorDescription": "Vous pouvez redimensionner les volets de l'éditeur et de réponse en faisant glisser le séparateur situé entre les deux.",
"console.welcomePage.quickTips.submitRequestDescription": "Utilisez licône de triangle vert pour envoyer vos requêtes à ES.",
"console.welcomePage.quickTips.useWrenchMenuDescription": "Cliquez sur licône en forme de clé pour découvrir d'autres éléments utiles.",
"console.welcomePage.quickTipsTitle": "Quelques brèves astuces, pendant que j'ai toute votre attention :",
"console.welcomePage.supportedRequestFormatDescription": "Lors de la saisie d'une requête, la console fera des suggestions que vous pourrez accepter en appuyant sur Entrée/Tab. Ces suggestions sont faites en fonction de la structure de la requête, des index et des types.",
"console.welcomePage.supportedRequestFormatTitle": "La console prend en charge les requêtes dans un format compact, tel que le format cURL :",
"contentManagement.inspector.metadataForm.unableToSaveDangerMessage": "Impossible d'enregistrer {entityName}",
"contentManagement.tableList.listing.createNewItemButtonLabel": "Créer {entityName}",
"contentManagement.tableList.listing.deleteButtonMessage": "Supprimer {itemCount} {entityName}",

View file

@ -316,15 +316,6 @@
"console.welcomePage.closeButtonLabel": "閉じる",
"console.welcomePage.pageTitle": "コンソールへようこそ",
"console.welcomePage.quickIntroDescription": "コンソール UI は、エディターペイン(左)と応答ペイン(右)の 2 つのペインに分かれています。エディターでリクエストを入力し、Elasticsearch に送信します。結果が右側の応答ペインに表示されます。",
"console.welcomePage.quickIntroTitle": "UI の簡単な説明",
"console.welcomePage.quickTips.cUrlFormatForRequestsDescription": "cURL フォーマットのリクエストを貼り付けると、Console 構文に変換されます。",
"console.welcomePage.quickTips.keyboardShortcutsDescription": "ヘルプボタンでキーボードショートカットが学べます。便利な情報が揃っています!",
"console.welcomePage.quickTips.resizeEditorDescription": "間の区切りをドラッグすることで、エディターとアウトプットペインのサイズを変更できます。",
"console.welcomePage.quickTips.submitRequestDescription": "緑の三角形のボタンをクリックして ES にリクエストを送信します。",
"console.welcomePage.quickTips.useWrenchMenuDescription": "レンチメニューで他の便利な機能が使えます。",
"console.welcomePage.quickTipsTitle": "今のうちにいくつか簡単なコツをお教えします",
"console.welcomePage.supportedRequestFormatDescription": "リクエストの入力中、コンソールが候補を提案するので、Enter/Tabを押して確定できます。これらの候補はリクエストの構造、およびインデックス、タイプに基づくものです。",
"console.welcomePage.supportedRequestFormatTitle": "コンソールは cURL と同様に、コンパクトなフォーマットのリクエストを理解できます。",
"contentManagement.inspector.metadataForm.unableToSaveDangerMessage": "{entityName}を保存できません",
"contentManagement.tableList.listing.createNewItemButtonLabel": "Create {entityName}",
"contentManagement.tableList.listing.deleteButtonMessage": "{itemCount} 件の {entityName} を削除",

View file

@ -316,15 +316,6 @@
"console.welcomePage.closeButtonLabel": "关闭",
"console.welcomePage.pageTitle": "欢迎使用 Console",
"console.welcomePage.quickIntroDescription": "Console UI 分为两个窗格:编辑器窗格(左)和响应窗格(右)。使用编辑器键入请求并将它们提交到 Elasticsearch。结果将显示在右侧的响应窗格中。",
"console.welcomePage.quickIntroTitle": "UI 简介",
"console.welcomePage.quickTips.cUrlFormatForRequestsDescription": "您可以粘贴 cURL 格式的请求,这些请求将转换成 Console 语法格式。",
"console.welcomePage.quickTips.keyboardShortcutsDescription": "学习“帮助”按钮下的键盘快捷方式。那里有非常实用的信息!",
"console.welcomePage.quickTips.resizeEditorDescription": "您可以通过拖动编辑器和输出窗格之间的分隔条来调整它们的大小。",
"console.welcomePage.quickTips.submitRequestDescription": "使用绿色三角按钮将请求提交到 ES。",
"console.welcomePage.quickTips.useWrenchMenuDescription": "使用扳手菜单执行其他有用的操作。",
"console.welcomePage.quickTipsTitle": "有几个需要您注意的有用提示",
"console.welcomePage.supportedRequestFormatDescription": "键入请求时,控制台将提供建议,您可以通过按 Enter/Tab 键来接受建议。这些建议基于请求结构以及索引和类型进行提供。",
"console.welcomePage.supportedRequestFormatTitle": "Console 理解紧凑格式的请求,类似于 cURL",
"contentManagement.inspector.metadataForm.unableToSaveDangerMessage": "无法保存 {entityName}",
"contentManagement.tableList.listing.createNewItemButtonLabel": "创建 {entityName}",
"contentManagement.tableList.listing.deleteButtonMessage": "删除 {itemCount} 个 {entityName}",