2020-03-11 13:12:04 +00:00
|
|
|
import React, { useState } from "react";
|
|
|
|
import styled from "styled-components";
|
|
|
|
import PropTypes from "prop-types";
|
|
|
|
import DropDown from "../drop-down";
|
|
|
|
import Link from "./link";
|
|
|
|
|
|
|
|
const StyledProgressBar = styled.div`
|
|
|
|
position: relative;
|
|
|
|
height: 22px;
|
|
|
|
background-color: #f8f9f9;
|
|
|
|
|
|
|
|
.progress-bar_full-text {
|
2020-05-08 06:13:02 +00:00
|
|
|
display: block;
|
2020-03-11 13:12:04 +00:00
|
|
|
padding: 0px 6px;
|
|
|
|
position: absolute;
|
|
|
|
font-weight: 600;
|
|
|
|
margin: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.progress-bar_percent {
|
2020-04-28 08:56:48 +00:00
|
|
|
width: ${props => props.uploadedPercent}%;
|
2020-03-11 13:12:04 +00:00
|
|
|
float: left;
|
|
|
|
overflow: hidden;
|
|
|
|
max-height: 22px;
|
|
|
|
min-height: 22px;
|
|
|
|
}
|
|
|
|
.progress-bar_field {
|
2020-04-28 08:56:48 +00:00
|
|
|
width: ${props => props.remainPercent}%;
|
2020-03-11 13:12:04 +00:00
|
|
|
float: left;
|
|
|
|
overflow: hidden;
|
|
|
|
max-height: 22px;
|
|
|
|
min-height: 22px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.progress-bar_percent {
|
2020-04-28 08:56:48 +00:00
|
|
|
transition: width .6s ease;
|
2020-03-11 13:12:04 +00:00
|
|
|
background: linear-gradient(90deg, #20d21f 75%, #b9d21f 100%);
|
|
|
|
}
|
|
|
|
|
|
|
|
.progress-bar_text {
|
|
|
|
min-width: 200%;
|
|
|
|
|
|
|
|
.progress-bar_progress-text {
|
|
|
|
padding: 2px 6px;
|
|
|
|
position: relative;
|
|
|
|
margin: 0;
|
|
|
|
min-width: 100px;
|
|
|
|
font-weight: 600;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.progress-bar_field .progress-bar_text {
|
|
|
|
margin-left: -100%;
|
|
|
|
}
|
|
|
|
|
|
|
|
.progress-bar_drop-down {
|
|
|
|
padding: 16px 16px 16px 17px;
|
|
|
|
}
|
|
|
|
`;
|
|
|
|
|
|
|
|
const ProgressBar = props => {
|
2020-04-28 08:56:48 +00:00
|
|
|
const { percent, label, dropDownContent, ...rest } = props;
|
2020-07-03 08:41:38 +00:00
|
|
|
const progressPercent = percent > 100 ? 100 : percent;
|
|
|
|
const remainPercent = 100 - progressPercent;
|
2020-03-11 13:12:04 +00:00
|
|
|
|
2020-07-03 08:41:38 +00:00
|
|
|
const ref = React.createRef();
|
2020-03-11 13:12:04 +00:00
|
|
|
const [isOpen, setIsOpen] = useState(false);
|
2020-07-03 08:41:38 +00:00
|
|
|
|
2020-03-11 13:12:04 +00:00
|
|
|
const onLinkClick = () => setIsOpen(!isOpen);
|
2020-07-03 08:41:38 +00:00
|
|
|
|
2020-03-11 13:12:04 +00:00
|
|
|
const onClose = e => {
|
|
|
|
if (ref.current.contains(e.target)) return;
|
|
|
|
setIsOpen(!isOpen);
|
|
|
|
};
|
|
|
|
|
2020-03-11 14:18:12 +00:00
|
|
|
//console.log("ProgressBar render");
|
2020-03-11 13:12:04 +00:00
|
|
|
return (
|
2020-07-03 08:41:38 +00:00
|
|
|
<StyledProgressBar ref={ref} {...rest} uploadedPercent={progressPercent} remainPercent={remainPercent} >
|
2020-03-11 13:12:04 +00:00
|
|
|
<Link
|
|
|
|
className="progress-bar_full-text"
|
|
|
|
color="#333"
|
|
|
|
onClick={onLinkClick}
|
|
|
|
isOpen={isOpen}
|
2020-07-24 10:51:10 +00:00
|
|
|
showIcon={dropDownContent}
|
2020-03-11 13:12:04 +00:00
|
|
|
>
|
|
|
|
{label}
|
|
|
|
</Link>
|
|
|
|
<div className="progress-bar_percent">
|
|
|
|
<div className="progress-bar_text">
|
|
|
|
<Link
|
|
|
|
className="progress-bar_progress-text"
|
|
|
|
color="#fff"
|
|
|
|
onClick={onLinkClick}
|
|
|
|
isOpen={isOpen}
|
2020-07-24 10:51:10 +00:00
|
|
|
showIcon={dropDownContent}
|
2020-03-11 13:12:04 +00:00
|
|
|
>
|
|
|
|
{label}
|
|
|
|
</Link>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="progress-bar_field" />
|
2020-07-24 10:51:10 +00:00
|
|
|
{dropDownContent && (
|
|
|
|
<DropDown open={isOpen} clickOutsideAction={onClose}>
|
|
|
|
<div className="progress-bar_drop-down">{dropDownContent}</div>
|
|
|
|
</DropDown>
|
|
|
|
)}
|
2020-03-11 13:12:04 +00:00
|
|
|
</StyledProgressBar>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
ProgressBar.propTypes = {
|
2020-04-28 08:56:48 +00:00
|
|
|
percent: PropTypes.number.isRequired,
|
2020-03-11 13:12:04 +00:00
|
|
|
label: PropTypes.string,
|
|
|
|
dropDownContent: PropTypes.any,
|
|
|
|
};
|
|
|
|
|
|
|
|
export default ProgressBar;
|