fix(ui): add filter list and input to scrapers/collectors (#11443)

pull/11473/head
Delmer 2019-01-22 16:46:54 -08:00 committed by GitHub
parent 5291faaff2
commit 4e5b956426
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 114 additions and 27 deletions

View File

@ -1,5 +1,6 @@
// Libraries // Libraries
import React, {PureComponent} from 'react' import _ from 'lodash'
import React, {PureComponent, ChangeEvent} from 'react'
// Utils // Utils
import {downloadTextFile} from 'src/shared/utils/download' import {downloadTextFile} from 'src/shared/utils/download'
@ -16,8 +17,11 @@ import {
EmptyState, EmptyState,
Grid, Grid,
Columns, Columns,
Input,
InputType,
} from 'src/clockface' } from 'src/clockface'
import DataLoadersWizard from 'src/dataLoaders/components/DataLoadersWizard' import DataLoadersWizard from 'src/dataLoaders/components/DataLoadersWizard'
import FilterList from 'src/shared/components/Filter'
// APIS // APIS
import { import {
@ -50,6 +54,7 @@ interface Props {
interface State { interface State {
overlayState: OverlayState overlayState: OverlayState
searchTerm: string
} }
@ErrorHandling @ErrorHandling
@ -57,26 +62,47 @@ export default class Collectors extends PureComponent<Props, State> {
constructor(props: Props) { constructor(props: Props) {
super(props) super(props)
this.state = {overlayState: OverlayState.Closed} this.state = {
overlayState: OverlayState.Closed,
searchTerm: '',
}
} }
public render() { public render() {
const {collectors, buckets} = this.props const {collectors, buckets} = this.props
const {searchTerm} = this.state
return ( return (
<> <>
<TabbedPageHeader> <TabbedPageHeader>
<h1>Telegraf Configurations</h1> <Input
icon={IconFont.Search}
placeholder="Filter telegraf configs by bucket..."
widthPixels={290}
value={searchTerm}
type={InputType.Text}
onChange={this.handleFilterChange}
onBlur={this.handleFilterBlur}
/>
{this.createButton} {this.createButton}
</TabbedPageHeader> </TabbedPageHeader>
<Grid> <Grid>
<Grid.Row> <Grid.Row>
<Grid.Column widthSM={Columns.Twelve}> <Grid.Column widthSM={Columns.Twelve}>
<CollectorList <FilterList<Telegraf>
collectors={collectors} searchTerm={searchTerm}
emptyState={this.emptyState} searchKeys={['plugins.0.config.bucket']}
onDownloadConfig={this.handleDownloadConfig} list={collectors}
onDelete={this.handleDeleteTelegraf} >
/> {cs => (
<CollectorList
collectors={cs}
emptyState={this.emptyState}
onDownloadConfig={this.handleDownloadConfig}
onDelete={this.handleDeleteTelegraf}
/>
)}
</FilterList>
</Grid.Column> </Grid.Column>
<Grid.Column <Grid.Column
widthSM={Columns.Six} widthSM={Columns.Six}
@ -126,14 +152,23 @@ export default class Collectors extends PureComponent<Props, State> {
private get emptyState(): JSX.Element { private get emptyState(): JSX.Element {
const {orgName} = this.props const {orgName} = this.props
const {searchTerm} = this.state
if (_.isEmpty(searchTerm)) {
return (
<EmptyState size={ComponentSize.Medium}>
<EmptyState.Text
text={`${orgName} does not own any Telegraf Configurations, why not create one?`}
highlightWords={['Telegraf', 'Configurations']}
/>
{this.createButton}
</EmptyState>
)
}
return ( return (
<EmptyState size={ComponentSize.Medium}> <EmptyState size={ComponentSize.Medium}>
<EmptyState.Text <EmptyState.Text text="No Telegraf Configuration buckets match your query" />
text={`${orgName} does not own any Telegraf Configurations , why not create one?`}
highlightWords={['Telegraf', 'Configurations']}
/>
{this.createButton}
</EmptyState> </EmptyState>
) )
} }
@ -150,4 +185,12 @@ export default class Collectors extends PureComponent<Props, State> {
await deleteTelegrafConfig(telegrafID) await deleteTelegrafConfig(telegrafID)
this.props.onChange() this.props.onChange()
} }
private handleFilterChange = (e: ChangeEvent<HTMLInputElement>): void => {
this.setState({searchTerm: e.target.value})
}
private handleFilterBlur = (e: ChangeEvent<HTMLInputElement>): void => {
this.setState({searchTerm: e.target.value})
}
} }

View File

@ -1,5 +1,6 @@
// Libraries // Libraries
import React, {PureComponent} from 'react' import _ from 'lodash'
import React, {PureComponent, ChangeEvent} from 'react'
// APIs // APIs
import {deleteScraper} from 'src/organizations/apis/index' import {deleteScraper} from 'src/organizations/apis/index'
@ -13,8 +14,11 @@ import {
IconFont, IconFont,
ComponentSize, ComponentSize,
EmptyState, EmptyState,
Input,
InputType,
} from 'src/clockface' } from 'src/clockface'
import DataLoadersWizard from 'src/dataLoaders/components/DataLoadersWizard' import DataLoadersWizard from 'src/dataLoaders/components/DataLoadersWizard'
import FilterList from 'src/shared/components/Filter'
// Decorators // Decorators
import {ErrorHandling} from 'src/shared/decorators/errors' import {ErrorHandling} from 'src/shared/decorators/errors'
@ -33,6 +37,7 @@ interface Props {
interface State { interface State {
overlayState: OverlayState overlayState: OverlayState
searchTerm: string
} }
@ErrorHandling @ErrorHandling
@ -40,22 +45,43 @@ export default class Scrapers extends PureComponent<Props, State> {
constructor(props: Props) { constructor(props: Props) {
super(props) super(props)
this.state = {overlayState: OverlayState.Closed} this.state = {
overlayState: OverlayState.Closed,
searchTerm: '',
}
} }
public render() { public render() {
const {scrapers, buckets} = this.props const {scrapers, buckets} = this.props
const {searchTerm} = this.state
return ( return (
<> <>
<TabbedPageHeader> <TabbedPageHeader>
<h1>Scrapers</h1> <Input
icon={IconFont.Search}
placeholder="Filter scrapers by bucket..."
widthPixels={290}
value={searchTerm}
type={InputType.Text}
onChange={this.handleFilterChange}
onBlur={this.handleFilterBlur}
/>
{this.createScraperButton} {this.createScraperButton}
</TabbedPageHeader> </TabbedPageHeader>
<ScraperList <FilterList<ScraperTargetResponse>
scrapers={scrapers} searchTerm={searchTerm}
emptyState={this.emptyState} searchKeys={['bucket']}
onDeleteScraper={this.handleDeleteScraper} list={scrapers.configurations || []}
/> >
{configurations => (
<ScraperList
scrapers={{configurations}}
emptyState={this.emptyState}
onDeleteScraper={this.handleDeleteScraper}
/>
)}
</FilterList>
<DataLoadersWizard <DataLoadersWizard
visible={this.isOverlayVisible} visible={this.isOverlayVisible}
onCompleteSetup={this.handleDismissDataLoaders} onCompleteSetup={this.handleDismissDataLoaders}
@ -93,13 +119,23 @@ export default class Scrapers extends PureComponent<Props, State> {
private get emptyState(): JSX.Element { private get emptyState(): JSX.Element {
const {orgName} = this.props const {orgName} = this.props
const {searchTerm} = this.state
if (_.isEmpty(searchTerm)) {
return (
<EmptyState size={ComponentSize.Medium}>
<EmptyState.Text
text={`${orgName} does not own any Scrapers, why not create one?`}
highlightWords={['Scrapers']}
/>
{this.createScraperButton}
</EmptyState>
)
}
return ( return (
<EmptyState size={ComponentSize.Medium}> <EmptyState size={ComponentSize.Medium}>
<EmptyState.Text <EmptyState.Text text="No Scraper buckets match your query" />
text={`${orgName} does not own any Scrapers , why not create one?`}
highlightWords={['Scrapers']}
/>
{this.createScraperButton}
</EmptyState> </EmptyState>
) )
} }
@ -108,4 +144,12 @@ export default class Scrapers extends PureComponent<Props, State> {
await deleteScraper(scraper.id) await deleteScraper(scraper.id)
this.props.onChange() this.props.onChange()
} }
private handleFilterChange = (e: ChangeEvent<HTMLInputElement>): void => {
this.setState({searchTerm: e.target.value})
}
private handleFilterBlur = (e: ChangeEvent<HTMLInputElement>): void => {
this.setState({searchTerm: e.target.value})
}
} }