import Button from '@material-ui/core/Button'; import CardContent from '@material-ui/core/CardContent'; import Dialog from '@material-ui/core/Dialog'; import DialogActions from '@material-ui/core/DialogActions'; import DialogContent from '@material-ui/core/DialogContent'; import DialogContentText from '@material-ui/core/DialogContentText'; import DialogTitle from '@material-ui/core/DialogTitle'; import FormControl from '@material-ui/core/FormControl'; import FormHelperText from '@material-ui/core/FormHelperText'; import IconButton from '@material-ui/core/IconButton'; import Input from '@material-ui/core/Input'; import InputLabel from '@material-ui/core/InputLabel'; import NoteAddIcon from '@material-ui/icons/NoteAdd'; import PropTypes from 'prop-types'; import React from 'react'; import { Trans } from '@lingui/macro'; import Typography from '@material-ui/core/Typography'; import _isEmpty from 'lodash/isEmpty'; import { withContext } from './util/AppContext.jsx'; import { withStyles } from '@material-ui/core/styles'; const styles = theme => ({ button: { margin: theme.spacing(1), }, margin: { marginRight: theme.spacing(1), }, container: { display: 'flex', flexWrap: 'wrap', }, textField: { marginLeft: theme.spacing(1), marginRight: theme.spacing(1), marginTop: theme.spacing(2), width: 200, }, root: { marginTop: theme.spacing(3), marginBottom: theme.spacing(3), }, }); const dns1035ServiceFmt = '^[a-z]([-a-z0-9]*[a-z0-9])?$'; const dns1123NamespaceFmt = '^[a-z0-9]([-a-z0-9]*[a-z0-9])?$'; const serviceNameRegexp = RegExp(dns1035ServiceFmt); const namespaceNameRegexp = RegExp(dns1123NamespaceFmt); class ConfigureProfilesMsg extends React.Component { constructor(props) { super(props); this.state = { open: false, error: { service: false, namespace: false, }, query: { service: '', namespace: '', }, }; } handleClickOpen = () => { this.setState({ open: true }); }; handleClose = () => { this.setState({ open: false, error: { service: false, namespace: false, }, query: { service: '', namespace: '', }, }); }; handleChange = name => { const state = this.state; return e => { state.query[name] = e.target.value; state.error[name] = false; this.setState(state); }; }; validateFields = (type, name) => { const { error } = this.state; if (_isEmpty(name)) { error[type] = false; } else { const match = type === 'service' ? serviceNameRegexp.test(name) : namespaceNameRegexp.test(name); error[type] = !match; } this.setState({ error }); }; renderDownloadProfileForm = () => { const { api, classes, showAsIcon } = this.props; const { query, error, open, service, name } = this.state; const downloadUrl = api.prefixedUrl(`/profiles/new?service=${query.service}&namespace=${query.namespace}`); let button; if (showAsIcon) { button = ( ); } else { button = ( ); } const disableDownloadButton = _isEmpty(query.service) || _isEmpty(query.namespace) || error.service || error.namespace; const downloadButton = ( ); return ( {button} New service profile formCreateServiceProfileHelpText this.validateFields('service', query.service)} error={error.service}> Service {error.service && ( formServiceNameErrorText )} this.validateFields('namespace', query.namespace)} error={error.namespace}> Namespace {error.namespace && ( formNamespaceErrorText )} {disableDownloadButton ? downloadButton : {downloadButton} } ); } render() { const { showAsIcon } = this.props; if (showAsIcon) { return this.renderDownloadProfileForm(); } else { return ( formNoNamedRouteTrafficFound {this.renderDownloadProfileForm()} ); } } } ConfigureProfilesMsg.propTypes = { api: PropTypes.shape({ prefixedUrl: PropTypes.func.isRequired, }).isRequired, showAsIcon: PropTypes.bool, }; ConfigureProfilesMsg.defaultProps = { showAsIcon: false, }; export default withContext(withStyles(styles, { withTheme: true })(ConfigureProfilesMsg));