/*
Copyright (C) 2017 Cloudbase Solutions SRL
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
import React from 'react'
import styled, { css } from 'styled-components'
import arrowImage from './images/arrow'
import { ThemePalette, ThemeProps } from '../../../Theme'
const getLabelColor = (props: any) => {
if (props.disabled) {
return ThemePalette.grayscale[3]
}
if (props.primary || props.secondary) {
return 'white'
}
return ThemePalette.black
}
const Label = styled.div`
color: ${(props: any) => getLabelColor(props)};
margin: 0 32px 0 ${(props: any) => (props.embedded ? 0 : 16)}px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex-grow: 1;
${(props: any) => (props.useBold ? `font-weight: ${ThemeProps.fontWeights.medium};` : '')}
${(props: any) => (props.centered ? 'text-align: center;' : '')}
`
const getBackgroundColor = (props: any) => {
if (props.embedded) {
return 'white'
}
if (props.disabled) {
return ThemePalette.grayscale[0]
}
if (props.secondary) {
return ThemePalette.secondaryLight
}
if (props.primary) {
return ThemePalette.primary
}
return 'white'
}
const getArrowColor = (props: any) => {
if (props.disabled) {
return ThemePalette.grayscale[3]
}
if (props.primary || props.secondary) {
return 'white'
}
if (props.outline) {
return ThemePalette.primary
}
return ThemePalette.black
}
const getWidth = (props: any) => {
if (props.large) {
return ThemeProps.inputSizes.large.width - 2
}
if (props.width) {
return props.width - 2
}
return ThemeProps.inputSizes.regular.width - 2
}
const borderColor = (props: any) => {
if (props.highlight) {
return ThemePalette.alert
}
if (props.disabled) {
return ThemePalette.grayscale[0]
}
if (props.primary) {
return ThemePalette.primary
}
if (props.secondary) {
return ThemePalette.secondaryLight
}
if (props.outline) {
return ThemePalette.primary
}
return ThemePalette.grayscale[3]
}
const backgroundHover = (props: any) => {
if (props.disabled || props.embedded) {
return ''
}
if (props.secondary) {
return ThemePalette.secondaryLight
}
return ThemePalette.primary
}
const Wrapper = styled.div`
display: flex;
align-items: center;
position: relative;
width: ${(props: any) => getWidth(props)}px;
height: ${(props: any) => (props.large ? ThemeProps.inputSizes.large.height - 2
: ThemeProps.inputSizes.regular.height - 2)}px;
border: 1px solid ${props => borderColor(props)};
border-radius: ${ThemeProps.borderRadius};
cursor: ${(props: any) => (props.disabled ? 'default' : 'pointer')};
transition: all ${ThemeProps.animations.swift};
background: ${props => getBackgroundColor(props)};
${(props: any) => (props.embedded ? css`
border: 0;
width: calc(100% + 8px);
` : '')}
#dropdown-arrow-image {stroke: ${(props: any) => getArrowColor(props)};}
&:hover {
#dropdown-arrow-image {stroke: ${(props: any) => (props.disabled ? '' : props.embedded ? '' : 'white')};}
background: ${(props: any) => backgroundHover(props)};
}
&:hover ${Label} {
color: ${(props: any) => (props.disabled ? '' : props.embedded ? '' : 'white')};
}
${(props: any) => (props.disabledLoading ? ThemeProps.animations.disabledLoading : '')}
`
const Arrow = styled.div`
position: absolute;
right: 8px;
top: 8px;
display: flex;
width: 16px;
height: 16px;
justify-content: center;
align-items: center;
`
type Props = {
value: string,
onClick?: (event: Event) => void,
customRef?: (ref: HTMLElement) => void,
ref?: (ref: HTMLElement) => void,
arrowRef?: (ref: HTMLElement) => void,
className?: string,
disabled?: boolean,
disabledLoading?: boolean,
'data-test-id'?: string,
embedded?: boolean,
highlight?: boolean,
secondary?: boolean,
centered?: boolean,
outline?: boolean,
primary?: boolean,
width?: number,
useBold?: boolean,
onMouseDown?: () => void,
onMouseUp?: () => void,
}
class DropdownButton extends React.Component {
render() {
const disabled = this.props.disabled || this.props.disabledLoading
return (
{
if (this.props.customRef) {
this.props.customRef(e)
} else if (this.props.ref) {
this.props.ref(e)
}
}}
onClick={(e: Event) => {
if (!disabled && this.props.onClick) this.props.onClick(e)
}}
>
{ if (this.props.arrowRef) this.props.arrowRef(ref) }}
onClick={() => { }}
data-test-id=""
disabled={disabled}
dangerouslySetInnerHTML={{ __html: arrowImage }}
/>
)
}
}
export default DropdownButton