Merge "fix: fix port/port_range required check when create/edit port forwarding"

This commit is contained in:
Zuul 2022-08-25 10:08:06 +00:00 committed by Gerrit Code Review
commit 8e4c482765
5 changed files with 29 additions and 14 deletions

View File

@ -19,22 +19,27 @@ import { portRangeValidate, portRangeMessage } from 'utils/validate';
export default class index extends Component { export default class index extends Component {
static isFormItem = true; static isFormItem = true;
getRules(rules) { getRules(rules, required, requiredMessage) {
const newRules = { const newRules = {
validator: portRangeValidate, validator: portRangeValidate,
}; };
if (required) {
newRules.required = required;
newRules.message = requiredMessage;
}
return [newRules, ...rules]; return [newRules, ...rules];
} }
render() { render() {
const { componentProps, formItemProps } = this.props; const { componentProps, formItemProps } = this.props;
const placeholder = t('Please input port range'); const { required, label } = componentProps || {};
const placeholder = t('Please input') + label;
const props = { const props = {
placeholder, placeholder,
...componentProps, ...componentProps,
}; };
const { rules, extra, ...rest } = formItemProps; const { rules, extra, ...rest } = formItemProps;
const newRules = this.getRules(rules); const newRules = this.getRules(rules, required, placeholder);
const newFormItemProps = { const newFormItemProps = {
...rest, ...rest,
rules: newRules, rules: newRules,

View File

@ -126,6 +126,7 @@ export default class FormItem extends React.Component {
onChange: PropTypes.func, onChange: PropTypes.func,
dependencies: PropTypes.array, dependencies: PropTypes.array,
formref: PropTypes.object, formref: PropTypes.object,
hasRequiredCheck: PropTypes.bool,
}; };
static defaultProps = { static defaultProps = {
@ -289,11 +290,11 @@ export default class FormItem extends React.Component {
validator, validator,
type = '', type = '',
otherRule, otherRule,
tip,
name, name,
hidden, hidden,
label, label,
placeholder, placeholder,
hasRequiredCheck = true,
} = this.props; } = this.props;
if (hidden) { if (hidden) {
return []; return [];
@ -312,10 +313,10 @@ export default class FormItem extends React.Component {
} else if (type && type.includes('select')) { } else if (type && type.includes('select')) {
requiredRule.required = true; requiredRule.required = true;
requiredRule.message = placeholder || `${t('Please select') + label}!`; requiredRule.message = placeholder || `${t('Please select') + label}!`;
} else if (tip) { } else if (hasRequiredCheck) {
requiredRule.required = true; requiredRule.required = true;
requiredRule.message = placeholder || `${t('Please input') + label}!`; requiredRule.message = placeholder || `${t('Please input') + label}!`;
} else { } else if (validator) {
newRule.required = required; newRule.required = required;
} }
} }

View File

@ -15,7 +15,7 @@
import React from 'react'; import React from 'react';
import { inject, observer } from 'mobx-react'; import { inject, observer } from 'mobx-react';
import { ModalAction } from 'containers/Action'; import { ModalAction } from 'containers/Action';
import { isNull, isObject, isString } from 'lodash'; import { isNull, isObject } from 'lodash';
import { getCanReachSubnetIdsWithRouterIdInComponent } from 'resources/neutron/router'; import { getCanReachSubnetIdsWithRouterIdInComponent } from 'resources/neutron/router';
import { PortStore } from 'stores/neutron/port-extension'; import { PortStore } from 'stores/neutron/port-extension';
import { import {
@ -411,8 +411,7 @@ export class CreatePortForwarding extends ModalAction {
}; };
validateExternalPort = (rule, val) => { validateExternalPort = (rule, val) => {
const value = const value = val === undefined || val === null ? '' : `${val}`;
val === undefined ? '' : isString(val) ? val : val.toString() || '';
const { internal_port: internalPort } = this.formRef.current.getFieldsValue( const { internal_port: internalPort } = this.formRef.current.getFieldsValue(
['internal_port'] ['internal_port']
); );
@ -469,8 +468,7 @@ export class CreatePortForwarding extends ModalAction {
}; };
validateInternalPort = (_, val) => { validateInternalPort = (_, val) => {
const value = const value = val === undefined || val === null ? '' : `${val}`;
val === undefined ? '' : isString(val) ? val : val.toString() || '';
if (!portRangeRegex.test(value)) { if (!portRangeRegex.test(value)) {
return Promise.resolve(true); return Promise.resolve(true);
} }
@ -588,6 +586,7 @@ export class CreatePortForwarding extends ModalAction {
dependencies: ['protocol', 'internal_port'], dependencies: ['protocol', 'internal_port'],
placeholder: externalPortExtra, placeholder: externalPortExtra,
extra: externalPortExtra, extra: externalPortExtra,
hasRequiredCheck: false,
}, },
{ {
name: 'internal_port', name: 'internal_port',
@ -599,6 +598,7 @@ export class CreatePortForwarding extends ModalAction {
dependencies: ['protocol', 'external_port'], dependencies: ['protocol', 'external_port'],
placeholder: internalPortExtra, placeholder: internalPortExtra,
extra: internalPortExtra, extra: internalPortExtra,
hasRequiredCheck: false,
}, },
]; ];
const [virtualAdapterItem, fixedIpItem] = getPortFormItem.call(this); const [virtualAdapterItem, fixedIpItem] = getPortFormItem.call(this);

View File

@ -193,9 +193,14 @@ export class Edit extends Base {
min: 1, min: 1,
max: 65535, max: 65535,
extra: t('Enter an integer value between 1 and 65535.'), extra: t('Enter an integer value between 1 and 65535.'),
hasRequiredCheck: true,
}; };
Object.assign(externalPortItem, inputConfig); Object.assign(externalPortItem, inputConfig, {
Object.assign(internalPortItem, inputConfig); placeholder: t('Please input') + externalPortItem.label,
});
Object.assign(internalPortItem, inputConfig, {
placeholder: t('Please input') + internalPortItem.label,
});
return items; return items;
} }

View File

@ -558,9 +558,13 @@ export const macAddressValidate = (rule, value) => {
}; };
export const portRangeValidate = (rule, value) => { export const portRangeValidate = (rule, value) => {
if (!value && !rule.required) { const { required, message } = rule || {};
if (!value && !required) {
return Promise.resolve(); return Promise.resolve();
} }
if (!value && required) {
return Promise.reject(message || t('Please input'));
}
if (portRangeRegex.test(value)) { if (portRangeRegex.test(value)) {
const ports = value.split(':'); const ports = value.split(':');
if (Number(ports[0]) > Number(ports[1])) { if (Number(ports[0]) > Number(ports[1])) {