import React, { Component, PropTypes } from 'react'; import osqueryTableInterface from 'interfaces/osquery_table'; import { osqueryTableNames } from 'utilities/osquery_tables'; import Dropdown from 'components/forms/fields/Dropdown'; import Icon from 'components/Icon'; import SecondarySidePanelContainer from '../SecondarySidePanelContainer'; import Button from '../../buttons/Button'; import { availability, columnsToRender, displayTypeForDataType, numAdditionalColumns, shouldShowAllColumns, } from './helpers'; const baseClass = 'query-side-panel'; class QuerySidePanel extends Component { static propTypes = { onOsqueryTableSelect: PropTypes.func, onTextEditorInputChange: PropTypes.func, selectedOsqueryTable: osqueryTableInterface, }; componentWillMount () { const { selectedOsqueryTable } = this.props; const showAllColumns = shouldShowAllColumns(selectedOsqueryTable); this.setState({ showAllColumns }); } componentWillReceiveProps (nextProps) { const { selectedOsqueryTable } = nextProps; if (this.props.selectedOsqueryTable !== selectedOsqueryTable) { const showAllColumns = shouldShowAllColumns(selectedOsqueryTable); this.setState({ showAllColumns }); } return false; } onSelectTable = ({ value }) => { const { onOsqueryTableSelect } = this.props; onOsqueryTableSelect(value); return false; } onShowAllColumns = () => { this.setState({ showAllColumns: true }); } onSuggestedQueryClick = (query) => { return (evt) => { evt.preventDefault(); const { onTextEditorInputChange } = this.props; return onTextEditorInputChange(query); }; }; renderColumns = () => { const { selectedOsqueryTable } = this.props; const { showAllColumns } = this.state; const columns = columnsToRender(selectedOsqueryTable, showAllColumns); return columns.map((column) => { return (
{column.name}
{displayTypeForDataType(column.type)}
); }); } renderMoreColumns = () => { const { selectedOsqueryTable } = this.props; const { showAllColumns } = this.state; const { onShowAllColumns } = this; if (showAllColumns) { return false; } return (
{numAdditionalColumns(selectedOsqueryTable)} MORE COLUMNS
); } renderSuggestedQueries = () => { const { onSuggestedQueryClick } = this; const { selectedOsqueryTable } = this.props; return selectedOsqueryTable.examples.map((example) => { return (
{example}
); }); } renderTableSelect = () => { const { onSelectTable } = this; const { selectedOsqueryTable } = this.props; const tableNames = osqueryTableNames.map((name) => { return { label: name, value: name }; }); return ( ); } render () { const { renderColumns, renderMoreColumns, renderTableSelect, renderSuggestedQueries, } = this; const { selectedOsqueryTable: { description, platform } } = this.props; return (

Choose a Table

{renderTableSelect()}

{description}

OS Availability

{availability(platform)}

Columns

{renderColumns()} {renderMoreColumns()}

Joins

Suggested Queries

{renderSuggestedQueries()}
); } } export default QuerySidePanel;