2018-12-12 15:12:51 +00:00
|
|
|
import React, { Fragment } from 'react';
|
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import { Field, reduxForm } from 'redux-form';
|
|
|
|
import { R_IPV4 } from '../../../helpers/constants';
|
|
|
|
|
|
|
|
const required = (value) => {
|
2018-12-13 12:26:47 +00:00
|
|
|
if (value || value === 0) {
|
2018-12-12 15:12:51 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return 'Required field';
|
|
|
|
};
|
|
|
|
|
|
|
|
const ipv4 = (value) => {
|
|
|
|
if (value && !new RegExp(R_IPV4).test(value)) {
|
|
|
|
return 'Invalid IPv4 format';
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
2018-12-13 12:26:47 +00:00
|
|
|
const isPositive = (value) => {
|
|
|
|
if ((value || value === 0) && (value <= 0)) {
|
|
|
|
return 'Must be greater than 0';
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
|
|
|
const toNumber = value => value && parseInt(value, 10);
|
|
|
|
|
2018-12-12 15:12:51 +00:00
|
|
|
const renderField = ({
|
|
|
|
input, className, placeholder, type, disabled, meta: { touched, error },
|
|
|
|
}) => (
|
|
|
|
<Fragment>
|
|
|
|
<input
|
|
|
|
{...input}
|
|
|
|
placeholder={placeholder}
|
|
|
|
type={type}
|
|
|
|
className={className}
|
|
|
|
disabled={disabled}
|
|
|
|
/>
|
|
|
|
{!disabled && touched && (error && <span className="form__message form__message--error">{error}</span>)}
|
|
|
|
</Fragment>
|
|
|
|
);
|
|
|
|
|
|
|
|
const Form = (props) => {
|
|
|
|
const {
|
|
|
|
handleSubmit, pristine, submitting, enabled,
|
|
|
|
} = props;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<form onSubmit={handleSubmit}>
|
|
|
|
<div className="row">
|
|
|
|
<div className="col-lg-6">
|
|
|
|
<div className="form__group form__group--dhcp">
|
|
|
|
<label>Gateway IP</label>
|
|
|
|
<Field
|
|
|
|
name="gateway_ip"
|
|
|
|
component={renderField}
|
|
|
|
type="text"
|
|
|
|
className="form-control"
|
|
|
|
placeholder="Gateway IP"
|
|
|
|
validate={[ipv4, required]}
|
|
|
|
disabled={!enabled}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div className="form__group form__group--dhcp">
|
|
|
|
<label>Subnet mask</label>
|
|
|
|
<Field
|
|
|
|
name="subnet_mask"
|
|
|
|
component={renderField}
|
|
|
|
type="text"
|
|
|
|
className="form-control"
|
|
|
|
placeholder="Subnet mask"
|
|
|
|
validate={[ipv4, required]}
|
|
|
|
disabled={!enabled}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="col-lg-6">
|
|
|
|
<div className="form__group form__group--dhcp">
|
|
|
|
<div className="row">
|
|
|
|
<div className="col-12">
|
|
|
|
<label>Range of IP addresses</label>
|
|
|
|
</div>
|
|
|
|
<div className="col">
|
|
|
|
<Field
|
|
|
|
name="range_start"
|
|
|
|
component={renderField}
|
|
|
|
type="text"
|
|
|
|
className="form-control"
|
|
|
|
placeholder="Range start"
|
|
|
|
validate={[ipv4, required]}
|
|
|
|
disabled={!enabled}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div className="col">
|
|
|
|
<Field
|
|
|
|
name="range_end"
|
|
|
|
component={renderField}
|
|
|
|
type="text"
|
|
|
|
className="form-control"
|
|
|
|
placeholder="Range end"
|
|
|
|
validate={[ipv4, required]}
|
|
|
|
disabled={!enabled}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className="form__group form__group--dhcp">
|
|
|
|
<label>DHCP lease time (in seconds)</label>
|
|
|
|
<Field
|
|
|
|
name="lease_duration"
|
|
|
|
component={renderField}
|
|
|
|
type="number"
|
|
|
|
className="form-control"
|
|
|
|
placeholder="Lease duration"
|
2018-12-13 12:26:47 +00:00
|
|
|
validate={[required, isPositive]}
|
2018-12-12 15:12:51 +00:00
|
|
|
disabled={!enabled}
|
2018-12-13 12:26:47 +00:00
|
|
|
normalize={toNumber}
|
2018-12-12 15:12:51 +00:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<button
|
|
|
|
type="submit"
|
|
|
|
className="btn btn-success btn-standart"
|
|
|
|
disabled={pristine || submitting || !enabled}
|
|
|
|
>
|
|
|
|
Save config
|
|
|
|
</button>
|
|
|
|
</form>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
Form.propTypes = {
|
|
|
|
handleSubmit: PropTypes.func,
|
|
|
|
pristine: PropTypes.bool,
|
|
|
|
submitting: PropTypes.bool,
|
|
|
|
enabled: PropTypes.bool,
|
|
|
|
};
|
|
|
|
|
|
|
|
export default reduxForm({
|
|
|
|
form: 'dhcpForm',
|
|
|
|
})(Form);
|