import React, { Component } from 'react'; import styled from 'styled-components'; import { kindToIcon } from '../shared/rosettaStone'; type PropsType = { label: string, name: string, handleClick?: () => void, selected?: boolean, isLast?: boolean, roundAllCorners?: boolean, status?: { label: string, available?: number, total?: number, } | null expanded?: boolean, }; type StateType = { expanded: boolean, showTooltip: boolean, }; export default class ResourceTab extends Component { state = { expanded: this.props.expanded || false, showTooltip: false, } renderDropdownIcon = () => { if (this.props.children) { return ( arrow_right ); } } renderIcon = (kind: string) => { let icon = 'tonality'; if (Object.keys(kindToIcon).includes(kind)) { icon = kindToIcon[kind]; } return ( {icon} ); } renderTooltip = (x: string): JSX.Element | undefined => { if (this.state.showTooltip) { return ( {x} ); } } getStatusText = () => { let { status } = this.props; if (status.available && status.total) { return `${status.available}/${status.total}`; } else if (status.label) { return status.label; } } renderStatus = () => { let { status } = this.props; if (status) { return ( {this.getStatusText()} ); } } renderExpanded = () => { if (this.props.children && this.state.expanded) { return ( {this.props.children} ); } } render() { let { label, name, children, isLast, handleClick, selected, status, roundAllCorners, } = this.props; return ( handleClick && handleClick()} roundAllCorners={roundAllCorners} > { if (children) { this.setState({ expanded: !this.state.expanded }); } }} > {this.renderDropdownIcon()} {this.renderIcon(label)} {label} { this.setState({ showTooltip: true }) }} onMouseOut={() => { this.setState({ showTooltip: false }) }} > {name} {this.renderTooltip(name)} {this.renderStatus()} {this.renderExpanded()} ); } } const StyledResourceTab = styled.div` width: 100%; margin-bottom: 2px; background: #ffffff11; border-bottom-left-radius: ${(props: { isLast: boolean, roundAllCorners: boolean }) => props.isLast ? '5px' : ''}; border-bottom-right-radius: ${(props: { isLast: boolean, roundAllCorners: boolean }) => props.roundAllCorners && props.isLast ? '5px' : ''}; `; const Tooltip = styled.div` position: absolute; right: 0px; top: 25px; white-space: nowrap; height: 18px; padding: 2px 5px; background: #383842dd; display: flex; align-items: center; justify-content: center; flex: 1; color: white; text-transform: none; font-size: 12px; font-family: "Work Sans", sans-serif; outline: 1px solid #ffffff55; opacity: 0; animation: faded-in 0.2s 0.15s; animation-fill-mode: forwards; @keyframes faded-in { from { opacity: 0 } to { opacity: 1 } } `; const ExpandWrapper = styled.div` overflow: hidden; `; const ResourceHeader = styled.div` width: 100%; height: 50px; display: flex; font-size: 13px; align-items: center; justify-content: space-between; color: #ffffff66; user-select: none; padding: 8px 18px; padding-left: ${(props: { expanded: boolean, hasChildren: boolean }) => props.hasChildren ? '10px' : '22px'}; cursor: pointer; background: ${(props: { expanded: boolean, hasChildren: boolean }) => props.expanded ? '#ffffff11' : ''}; :hover { background: #ffffff18; > i { background: #ffffff22; } } `; const Info = styled.div` display: flex; flex-direction: row; align-items: center; width: 80%; height: 100%; `; const Metadata = styled.div` display: flex; align-items: center; position: relative; max-width: ${(props: { hasStatus: boolean }) => props.hasStatus ? 'calc(100% - 50px)' : '100%'}; `; const Status = styled.div` display: flex; width; 20%; font-size: 12px; text-transform: capitalize; justify-content: flex-end; align-items: center; font-family: 'Work Sans', sans-serif; color: #aaaabb; animation: fadeIn 0.5s; @keyframes fadeIn { from { opacity: 0 } to { opacity: 1 } } `; const StatusColor = styled.div` margin-left: 12px; width: 8px; min-width: 8px; height: 8px; background: ${(props: { status: string }) => (props.status === 'running' || props.status === 'Ready' || props.status === 'Completed' ? '#4797ff' : props.status === 'failed' || props.status === 'FailedValidation' ? "#ed5f85" : "#f5cb42")}; border-radius: 20px; `; const ResourceName = styled.div` color: #ffffff; margin-left: ${(props: { showKindLabels: boolean }) => props.showKindLabels ? '10px' : ''}; text-transform: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; `; const IconWrapper = styled.div` width: 25px; height: 25px; display: flex; align-items: center; justify-content: center; > i { font-size: 15px; color: #ffffff; margin-right: 14px; } `; const DropdownIcon = styled.div` > i { margin-top: 2px; margin-right: 11px; font-size: 20px; color: #ffffff66; cursor: pointer; border-radius: 20px; background: ${(props: { expanded: boolean }) => props.expanded ? '#ffffff18' : ''}; transform: ${(props: { expanded: boolean }) => props.expanded ? 'rotate(180deg)' : ''}; animation: ${(props: { expanded: boolean }) => props.expanded ? 'quarterTurn 0.3s' : ''}; animation-fill-mode: forwards; @keyframes quarterTurn { from { transform: rotate(0deg) } to { transform: rotate(90deg) } } } `;