1
import React, { Component, ChangeEvent } from 'react';
2
import { Modal, ModalBody, ModalHeader, Input } from 'reactstrap';
3
import { Fuzzy, FuzzyResult } from '@nexucis/fuzzy';
5
const fuz = new Fuzzy({ pre: '<strong>', post: '</strong>', shouldSort: true });
7
interface MetricsExplorerProps {
9
updateShow(show: boolean): void;
11
insertAtCursor(value: string): void;
14
type MetricsExplorerState = {
18
class MetricsExplorer extends Component<MetricsExplorerProps, MetricsExplorerState> {
19
constructor(props: MetricsExplorerProps) {
21
this.state = { searchTerm: '' };
23
handleSearchTerm = (event: ChangeEvent<HTMLInputElement>): void => {
24
this.setState({ searchTerm: event.target.value });
26
handleMetricClick = (query: string): void => {
27
this.props.insertAtCursor(query);
28
this.props.updateShow(false);
29
this.setState({ searchTerm: '' });
32
toggle = (): void => {
33
this.props.updateShow(!this.props.show);
35
render(): JSX.Element {
37
<Modal isOpen={this.props.show} toggle={this.toggle} className="metrics-explorer" scrollable>
38
<ModalHeader toggle={this.toggle}>Metrics Explorer</ModalHeader>
40
<Input placeholder="Search" value={this.state.searchTerm} type="text" onChange={this.handleSearchTerm} />
41
{this.state.searchTerm.length > 0 &&
43
.filter(this.state.searchTerm, this.props.metrics)
44
.map((result: FuzzyResult) => (
48
onClick={this.handleMetricClick.bind(this, result.original)}
49
dangerouslySetInnerHTML={{ __html: result.rendered }}
52
{this.state.searchTerm.length === 0 &&
53
this.props.metrics.map((metric) => (
54
<p key={metric} className="metric" onClick={this.handleMetricClick.bind(this, metric)}>
64
export default MetricsExplorer;