diff --git a/public/app/core/components/ToggleButtonGroup/ToggleButtonGroup.tsx b/public/app/core/components/ToggleButtonGroup/ToggleButtonGroup.tsx new file mode 100644 index 00000000000..1e9ae4732df --- /dev/null +++ b/public/app/core/components/ToggleButtonGroup/ToggleButtonGroup.tsx @@ -0,0 +1,68 @@ +import React, { SFC, ReactNode, PureComponent, ReactElement } from 'react'; + +interface ToggleButtonGroupProps { + onChange: (value) => void; + value?: any; + label?: string; + render: (props) => void; +} + +export default class ToggleButtonGroup extends PureComponent { + getValues() { + const { children } = this.props; + return React.Children.toArray(children).map((c: ReactElement) => c.props.value); + } + + smallChildren() { + const { children } = this.props; + return React.Children.toArray(children).every((c: ReactElement) => c.props.className.includes('small')); + } + + handleToggle(toggleValue) { + const { value, onChange } = this.props; + if (value && value === toggleValue) { + return; + } + onChange(toggleValue); + } + + render() { + const { value, label } = this.props; + const values = this.getValues(); + const selectedValue = value || values[0]; + const labelClassName = `gf-form-label ${this.smallChildren() ? 'small' : ''}`; + + return ( +
+
+ {label && } + {this.props.render({ selectedValue, onChange: this.handleToggle.bind(this) })} +
+
+ ); + } +} + +interface ToggleButtonProps { + onChange?: (value) => void; + selected?: boolean; + value: any; + className?: string; + children: ReactNode; +} + +export const ToggleButton: SFC = ({ children, selected, className = '', value, onChange }) => { + const handleChange = event => { + event.stopPropagation(); + if (onChange) { + onChange(value); + } + }; + + const btnClassName = `btn ${className} ${selected ? 'active' : ''}`; + return ( + + ); +}; diff --git a/public/app/features/explore/Logs.tsx b/public/app/features/explore/Logs.tsx index 04dfc15b19f..82995390e26 100644 --- a/public/app/features/explore/Logs.tsx +++ b/public/app/features/explore/Logs.tsx @@ -16,6 +16,7 @@ import { } from 'app/core/logs_model'; import { findHighlightChunksInText } from 'app/core/utils/text'; import { Switch } from 'app/core/components/Switch/Switch'; +import ToggleButtonGroup, { ToggleButton } from 'app/core/components/ToggleButtonGroup/ToggleButtonGroup'; import Graph from './Graph'; import LogLabels from './LogLabels'; @@ -302,29 +303,23 @@ export default class Logs extends PureComponent { - this.onChangeDedup(LogsDedupStrategy.none)} - small - /> - this.onChangeDedup(LogsDedupStrategy.exact)} - small - /> - this.onChangeDedup(LogsDedupStrategy.numbers)} - small - /> - this.onChangeDedup(LogsDedupStrategy.signature)} - small + + Object.keys(LogsDedupStrategy).map((dedupType, i) => ( + + {dedupType} + + )) + } /> {hasData && meta && ( diff --git a/public/sass/_grafana.scss b/public/sass/_grafana.scss index 3c3acf7b490..dac8efcccf0 100644 --- a/public/sass/_grafana.scss +++ b/public/sass/_grafana.scss @@ -102,6 +102,7 @@ @import 'components/delete_button'; @import 'components/add_data_source.scss'; @import 'components/page_loader'; +@import 'components/toggle_button_group'; // PAGES @import 'pages/login'; diff --git a/public/sass/components/_toggle_button_group.scss b/public/sass/components/_toggle_button_group.scss new file mode 100644 index 00000000000..ed701a489a9 --- /dev/null +++ b/public/sass/components/_toggle_button_group.scss @@ -0,0 +1,37 @@ +.toggle-button-group { + display: flex; + + .gf-form-label { + background-color: $input-label-bg; + &:first-child { + border-radius: $border-radius 0 0 $border-radius; + margin: 0; + } + &.small { + padding: ($input-padding-y / 2) ($input-padding-x / 2); + font-size: $font-size-xs; + } + } + + .btn { + background-color: $typeahead-selected-bg; + border-radius: 0; + color: $text-color; + &.active { + background-color: $input-bg; + &:hover { + cursor: default; + } + } + + &:first-child { + border-radius: $border-radius 0 0 $border-radius; + margin: 0; + } + + &:last-child { + border-radius: 0 $border-radius $border-radius 0; + margin-left: 0; + } + } +}