2019-10-17 10:53:11 +00:00
|
|
|
import React from "react";
|
|
|
|
import PropTypes from "prop-types";
|
|
|
|
import styled, { css } from "styled-components";
|
|
|
|
import { tablet } from "../../utils/device";
|
|
|
|
import Label from "../label";
|
2019-10-18 06:51:03 +00:00
|
|
|
import HelpButton from "../help-button";
|
2019-08-27 12:43:30 +00:00
|
|
|
|
2019-09-04 09:17:55 +00:00
|
|
|
const horizontalCss = css`
|
2019-08-27 12:43:30 +00:00
|
|
|
display: flex;
|
|
|
|
flex-direction: row;
|
2019-09-04 09:17:55 +00:00
|
|
|
align-items: start;
|
2019-08-27 12:43:30 +00:00
|
|
|
margin: 0 0 16px 0;
|
|
|
|
|
|
|
|
.field-label {
|
|
|
|
line-height: 32px;
|
|
|
|
margin: 0;
|
2019-10-17 10:53:11 +00:00
|
|
|
position: relative;
|
2019-08-27 12:43:30 +00:00
|
|
|
}
|
2019-09-10 09:49:51 +00:00
|
|
|
.field-body {
|
|
|
|
flex-grow: 1;
|
|
|
|
}
|
2019-10-10 12:08:39 +00:00
|
|
|
.icon-button {
|
2019-10-17 10:53:11 +00:00
|
|
|
position: relative;
|
2019-10-10 12:08:39 +00:00
|
|
|
line-height: 24px;
|
2019-10-17 10:53:11 +00:00
|
|
|
margin: 2px 0 0 4px;
|
2019-10-10 12:08:39 +00:00
|
|
|
}
|
2019-10-17 10:53:11 +00:00
|
|
|
`;
|
2019-09-04 09:17:55 +00:00
|
|
|
const verticalCss = css`
|
|
|
|
display: flex;
|
|
|
|
flex-direction: column;
|
|
|
|
align-items: start;
|
|
|
|
margin: 0 0 16px 0;
|
2019-08-27 12:43:30 +00:00
|
|
|
|
2019-09-04 09:17:55 +00:00
|
|
|
.field-label {
|
|
|
|
line-height: unset;
|
|
|
|
margin: 0 0 4px 0;
|
2019-09-10 09:49:51 +00:00
|
|
|
}
|
|
|
|
.field-body {
|
|
|
|
width: 100%;
|
2019-08-27 12:43:30 +00:00
|
|
|
}
|
2019-10-11 06:17:27 +00:00
|
|
|
.icon-button {
|
2019-10-17 10:53:11 +00:00
|
|
|
position: relative;
|
2019-10-11 06:17:27 +00:00
|
|
|
line-height: unset;
|
2019-10-17 10:53:11 +00:00
|
|
|
margin: -4px 0 0 4px;
|
2019-10-11 06:17:27 +00:00
|
|
|
}
|
2019-10-17 10:53:11 +00:00
|
|
|
`;
|
2019-08-27 12:43:30 +00:00
|
|
|
|
2019-09-04 09:17:55 +00:00
|
|
|
const Container = styled.div`
|
2019-10-17 10:53:11 +00:00
|
|
|
.field-label-icon {
|
|
|
|
min-width: 110px;
|
2019-11-22 09:37:41 +00:00
|
|
|
display: inline-flex;
|
2019-10-17 10:53:11 +00:00
|
|
|
}
|
|
|
|
${props => (props.vertical ? verticalCss : horizontalCss)}
|
2019-08-27 12:43:30 +00:00
|
|
|
|
2019-09-04 10:29:32 +00:00
|
|
|
@media ${tablet} {
|
2019-09-04 09:17:55 +00:00
|
|
|
${verticalCss}
|
2019-08-27 12:43:30 +00:00
|
|
|
}
|
|
|
|
`;
|
2019-10-17 10:53:11 +00:00
|
|
|
class FieldContainer extends React.Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
2019-10-17 13:15:43 +00:00
|
|
|
}
|
|
|
|
|
2019-10-17 10:53:11 +00:00
|
|
|
render() {
|
|
|
|
const {
|
|
|
|
isVertical,
|
|
|
|
className,
|
|
|
|
isRequired,
|
|
|
|
hasError,
|
|
|
|
labelText,
|
|
|
|
children,
|
2019-10-23 08:31:36 +00:00
|
|
|
tooltipContent,
|
2019-11-20 06:42:28 +00:00
|
|
|
place,
|
|
|
|
HelpButtonHeaderContent
|
2019-10-17 10:53:11 +00:00
|
|
|
} = this.props;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Container vertical={isVertical} className={className}>
|
|
|
|
<div className="field-label-icon">
|
|
|
|
<Label
|
|
|
|
isRequired={isRequired}
|
|
|
|
error={hasError}
|
|
|
|
text={labelText}
|
|
|
|
truncate={true}
|
|
|
|
className="field-label"
|
|
|
|
/>
|
|
|
|
{tooltipContent && (
|
2019-10-18 06:51:03 +00:00
|
|
|
<HelpButton
|
|
|
|
tooltipContent={tooltipContent}
|
2019-10-23 08:31:36 +00:00
|
|
|
place={place}
|
2019-11-20 06:42:28 +00:00
|
|
|
HelpButtonHeaderContent={HelpButtonHeaderContent}
|
2019-10-18 06:51:03 +00:00
|
|
|
/>
|
2019-10-17 10:53:11 +00:00
|
|
|
)}
|
|
|
|
</div>
|
|
|
|
<div className="field-body">{children}</div>
|
|
|
|
</Container>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
2019-08-27 12:43:30 +00:00
|
|
|
|
2019-10-17 10:53:11 +00:00
|
|
|
FieldContainer.displayName = "FieldContainer";
|
2019-09-10 09:49:51 +00:00
|
|
|
|
|
|
|
FieldContainer.propTypes = {
|
|
|
|
isVertical: PropTypes.bool,
|
|
|
|
className: PropTypes.string,
|
|
|
|
isRequired: PropTypes.bool,
|
|
|
|
hasError: PropTypes.bool,
|
|
|
|
labelText: PropTypes.string,
|
2019-10-10 12:08:39 +00:00
|
|
|
icon: PropTypes.string,
|
2019-09-10 09:49:51 +00:00
|
|
|
children: PropTypes.oneOfType([
|
|
|
|
PropTypes.arrayOf(PropTypes.node),
|
|
|
|
PropTypes.node
|
2019-10-10 12:08:39 +00:00
|
|
|
]),
|
2019-10-23 08:31:36 +00:00
|
|
|
tooltipContent: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
|
2019-11-20 06:42:28 +00:00
|
|
|
place: PropTypes.string,
|
|
|
|
HelpButtonHeaderContent: PropTypes.string
|
2019-09-10 09:49:51 +00:00
|
|
|
};
|
|
|
|
|
2019-10-23 08:31:36 +00:00
|
|
|
FieldContainer.defaultProps ={
|
|
|
|
place: "bottom"
|
|
|
|
}
|
|
|
|
|
2019-10-17 10:53:11 +00:00
|
|
|
export default FieldContainer;
|