blob: db2293a4e54b0426dc5fbd9ed55629959707de80 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { ReactNode } from 'react';
import { css, styled } from '@superset-ui/core';
import { InfoTooltip } from '@superset-ui/core/components';
interface ModalFormFieldProps {
label: string;
required?: boolean;
tooltip?: ReactNode;
error?: string;
helperText?: string;
bottomSpacing?: boolean;
children: ReactNode;
testId?: string;
validateStatus?: 'success' | 'warning' | 'error' | 'validating';
hasFeedback?: boolean;
}
const StyledFieldContainer = styled.div<{ bottomSpacing: boolean }>`
${({ theme, bottomSpacing }) => css`
flex: 1;
margin-top: 0px;
margin-bottom: ${bottomSpacing ? theme.sizeUnit * 4 : 0}px;
.control-label {
margin-top: ${theme.sizeUnit}px;
margin-bottom: ${theme.sizeUnit * 2}px;
color: ${theme.colorText};
font-size: ${theme.fontSize}px;
}
.required {
margin-left: ${theme.sizeUnit / 2}px;
color: ${theme.colorError};
}
.helper {
display: block;
color: ${theme.colorTextTertiary};
font-size: ${theme.fontSizeSM}px;
padding: ${theme.sizeUnit}px 0;
text-align: left;
}
.error {
color: ${theme.colorError};
font-size: ${theme.fontSizeSM}px;
margin-top: ${theme.sizeUnit}px;
}
.input-container {
display: flex;
align-items: center;
> div {
width: 100%;
}
label {
display: flex;
margin-right: ${theme.sizeUnit * 2}px;
}
i {
margin: 0 ${theme.sizeUnit}px;
}
}
input,
textarea {
flex: 1 1 auto;
}
input[disabled] {
color: ${theme.colorTextDisabled};
}
textarea {
resize: vertical;
}
input::placeholder,
textarea::placeholder {
color: ${theme.colorTextPlaceholder};
}
textarea,
input[type='text'],
input[type='number'] {
padding: ${theme.sizeUnit}px ${theme.sizeUnit * 2}px;
border-style: none;
border: 1px solid ${theme.colorBorder};
border-radius: ${theme.borderRadius}px;
&[name='description'] {
flex: 1 1 auto;
}
}
`}
`;
export function ModalFormField({
label,
required = false,
tooltip,
error,
helperText,
bottomSpacing = true,
children,
testId,
validateStatus,
hasFeedback = false,
}: ModalFormFieldProps) {
return (
<StyledFieldContainer bottomSpacing={bottomSpacing} data-test={testId}>
<div className="control-label">
{label}
{tooltip && <InfoTooltip tooltip={tooltip} />}
{required && <span className="required">*</span>}
</div>
<div className="input-container">{children}</div>
{helperText && <div className="helper">{helperText}</div>}
{error && <div className="error">{error}</div>}
</StyledFieldContainer>
);
}