From 9d5486cc92436e4e4b80d6a48a2324b41a606b93 Mon Sep 17 00:00:00 2001 From: Alex P Date: Mon, 26 Mar 2018 19:09:29 -0700 Subject: [PATCH] Introduce component for selecting color scales --- .../shared/components/ColorScaleDropdown.js | 118 ++++++++++++++++++ ui/src/style/components/color-dropdown.scss | 37 ++++-- 2 files changed, 145 insertions(+), 10 deletions(-) create mode 100644 ui/src/shared/components/ColorScaleDropdown.js diff --git a/ui/src/shared/components/ColorScaleDropdown.js b/ui/src/shared/components/ColorScaleDropdown.js new file mode 100644 index 000000000..909d0bcc9 --- /dev/null +++ b/ui/src/shared/components/ColorScaleDropdown.js @@ -0,0 +1,118 @@ +import React, {Component} from 'react' +import PropTypes from 'prop-types' +import uuid from 'uuid' +import classnames from 'classnames' + +import OnClickOutside from 'shared/components/OnClickOutside' +import FancyScrollbar from 'shared/components/FancyScrollbar' + +import {LINE_COLOR_SCALES} from 'src/shared/constants/graphColorPalettes' + +class ColorScaleDropdown extends Component { + constructor(props) { + super(props) + + this.state = { + expanded: false, + } + } + + handleToggleMenu = () => { + const {disabled} = this.props + + if (disabled) { + return + } + this.setState({expanded: !this.state.expanded}) + } + + handleClickOutside = () => { + this.setState({expanded: false}) + } + + handleDropdownClick = colorScale => () => { + this.props.onChoose(colorScale) + this.setState({expanded: false}) + } + + generateGradientStyle = colors => ({ + background: `linear-gradient(to right, ${colors[0].hex} 0%,${ + colors[1].hex + } 50%,${colors[2].hex} 100%)`, + }) + + render() { + const {expanded} = this.state + const {selected, disabled, stretchToFit} = this.props + + const dropdownClassNames = classnames('color-dropdown', { + open: expanded, + 'color-dropdown--stretch': stretchToFit, + }) + const toggleClassNames = classnames( + 'btn btn-sm btn-default color-dropdown--toggle', + {active: expanded, 'color-dropdown__disabled': disabled} + ) + + return ( +
+
+
+
{selected[0].name}
+ +
+ {expanded ? ( +
+ + {LINE_COLOR_SCALES.map(colorScale => ( +
+
+ + {colorScale.name} + +
+ ))} + +
+ ) : null} +
+ ) + } +} + +const {arrayOf, bool, func, shape, string, number} = PropTypes + +ColorScaleDropdown.propTypes = { + selected: arrayOf( + shape({ + type: string.isRequired, + hex: string.isRequired, + id: string.isRequired, + name: string.isRequired, + value: number.isRequired, + }).isRequired + ).isRequired, + onChoose: func.isRequired, + stretchToFit: bool, + disabled: bool, +} + +export default OnClickOutside(ColorScaleDropdown) diff --git a/ui/src/style/components/color-dropdown.scss b/ui/src/style/components/color-dropdown.scss index b892cd0b2..99f6901f7 100644 --- a/ui/src/style/components/color-dropdown.scss +++ b/ui/src/style/components/color-dropdown.scss @@ -4,6 +4,10 @@ */ $color-dropdown--circle: 14px; +$color-dropdown--bar: 104px; +$color-dropdown--bar-height: 10px; +$color-dropdown--left-padding: 11px; +$color-dropdown--name-padding: 20px; .color-dropdown { width: 140px; @@ -31,11 +35,11 @@ $color-dropdown--circle: 14px; position: absolute; top: 30px; left: 0; - z-index: 2; + z-index: 5; width: 100%; border-radius: 4px; box-shadow: 0 2px 5px 0.6px fade-out($g0-obsidian, 0.7); - @include gradient-h($g0-obsidian,$g2-kevlar); + @include gradient-h($g0-obsidian, $g2-kevlar); } .color-dropdown--item { @include no-user-select(); @@ -43,9 +47,7 @@ $color-dropdown--circle: 14px; height: 28px; position: relative; color: $g11-sidewalk; - transition: - color 0.25s ease, - background-color 0.25s ease; + transition: color 0.25s ease, background-color 0.25s ease; &:hover { background-color: $g4-onyx; @@ -67,6 +69,7 @@ $color-dropdown--circle: 14px; } } .color-dropdown--swatch, +.color-dropdown--swatches, .color-dropdown--name { position: absolute; top: 50%; @@ -76,21 +79,35 @@ $color-dropdown--circle: 14px; width: $color-dropdown--circle; height: $color-dropdown--circle; border-radius: 50%; - left: 11px; + left: $color-dropdown--left-padding; +} +.color-dropdown--swatches { + width: $color-dropdown--bar; + height: $color-dropdown--bar-height; + border-radius: $color-dropdown--bar-height / 2; + left: $color-dropdown--left-padding; } .color-dropdown--name { text-align: left; - right: 11px; - left: 34px; + right: $color-dropdown--name-padding; + left: $color-dropdown--circle + $color-dropdown--name-padding; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; font-weight: 600; text-transform: capitalize; + + .color-dropdown--swatches + & { + left: $color-dropdown--bar + $color-dropdown--name-padding; + } } -.color-dropdown .color-dropdown--menu .fancy-scroll--container .fancy-scroll--track-v .fancy-scroll--thumb-v { - @include gradient-v($g9-mountain,$g7-graphite); +.color-dropdown + .color-dropdown--menu + .fancy-scroll--container + .fancy-scroll--track-v + .fancy-scroll--thumb-v { + @include gradient-v($g9-mountain, $g7-graphite); } .color-dropdown--toggle.color-dropdown__disabled { color: $g7-graphite;