kibana/examples/embeddable_explorer/public/todo_embeddable_example.tsx
Tyler Smalley baf56d80c4
[7.x] Updating the License (#88343) (#88745)
* Updating the Licenses, except for applying eslint, building

* Applying ESLint rules,building @kbn/pm, regenerating api docs

Co-authored-by: kobelb <brandon.kobel@elastic.co>
2021-01-19 17:54:11 -08:00

127 lines
3.8 KiB
TypeScript

/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* and the Server Side Public License, v 1; you may not use this file except in
* compliance with, at your election, the Elastic License or the Server Side
* Public License, v 1.
*/
import React from 'react';
import {
EuiButton,
EuiFieldText,
EuiFlexGroup,
EuiFlexItem,
EuiFormRow,
EuiPageBody,
EuiPageContent,
EuiPageContentBody,
EuiPageHeader,
EuiPageHeaderSection,
EuiPanel,
EuiText,
EuiTextArea,
EuiTitle,
} from '@elastic/eui';
import { TodoInput } from '../../../examples/embeddable_examples/public/todo';
import { TodoEmbeddableFactory } from '../../../examples/embeddable_examples/public';
import { EmbeddableRenderer } from '../../../src/plugins/embeddable/public';
interface Props {
todoEmbeddableFactory: TodoEmbeddableFactory;
}
interface State {
task?: string;
title?: string;
icon?: string;
loading: boolean;
input: TodoInput;
}
export class TodoEmbeddableExample extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
loading: true,
input: {
id: '1',
task: 'Take out the trash',
icon: 'broom',
title: 'Trash',
},
};
}
private onUpdateEmbeddableInput = () => {
const { task, title, icon, input } = this.state;
this.setState({ input: { ...input, task: task ?? '', title, icon } });
};
public render() {
return (
<EuiPageBody>
<EuiPageHeader>
<EuiPageHeaderSection>
<EuiTitle size="l">
<h1>Todo example</h1>
</EuiTitle>
</EuiPageHeaderSection>
</EuiPageHeader>
<EuiPageContent>
<EuiPageContentBody>
<EuiText>
This embeddable takes input parameters, task, title and icon. You can update them
using this form. Input changes will be passed inside `EmbeddableRenderer` as a prop
</EuiText>
<EuiFlexGroup>
<EuiFlexItem grow={true}>
<EuiFormRow label="Title">
<EuiFieldText
data-test-subj="titleTodo"
onChange={(ev) => this.setState({ title: ev.target.value })}
/>
</EuiFormRow>
</EuiFlexItem>
<EuiFlexItem grow={true}>
<EuiFormRow label="Icon">
<EuiFieldText
data-test-subj="iconTodo"
onChange={(ev) => this.setState({ icon: ev.target.value })}
/>
</EuiFormRow>
</EuiFlexItem>
<EuiFlexItem>
<EuiFormRow label="Task">
<EuiTextArea
fullWidth
resize="horizontal"
data-test-subj="taskTodo"
onChange={(ev) => this.setState({ task: ev.target.value })}
/>
</EuiFormRow>
</EuiFlexItem>
<EuiFlexItem grow={false}>
<EuiFormRow hasEmptyLabelSpace>
<EuiButton
data-test-subj="updateTodoButton"
onClick={this.onUpdateEmbeddableInput}
>
Update
</EuiButton>
</EuiFormRow>
</EuiFlexItem>
</EuiFlexGroup>
<EuiPanel data-test-subj="todoEmbeddable" paddingSize="none" role="figure">
<EmbeddableRenderer
factory={this.props.todoEmbeddableFactory}
input={this.state.input}
/>
</EuiPanel>
</EuiPageContentBody>
</EuiPageContent>
</EuiPageBody>
);
}
}