1. Fix size unit to GiB/MiB for volume/snapshot/backup/image/flavor/monitor 2. Update i18n for Zun Change-Id: I97bc881b438c9922a2123c36b7e8ea40e5307fd2
192 lines
4.2 KiB
JavaScript
192 lines
4.2 KiB
JavaScript
// Copyright 2021 99cloud
|
|
//
|
|
// Licensed 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 React from 'react';
|
|
import { Select, Checkbox, Row, Col, Form } from 'antd';
|
|
import PropTypes from 'prop-types';
|
|
import InputInt from '../InputInt';
|
|
import styles from './index.less';
|
|
|
|
export default class InstanceVolume extends React.Component {
|
|
static propTypes = {
|
|
options: PropTypes.array,
|
|
value: PropTypes.any,
|
|
minSize: PropTypes.number,
|
|
};
|
|
|
|
static defaultProps = {
|
|
options: [],
|
|
value: {},
|
|
minSize: 0,
|
|
};
|
|
|
|
constructor(props) {
|
|
super(props);
|
|
const { type, size, deleteType } = props.value || {};
|
|
const { minSize } = props;
|
|
this.state = {
|
|
type,
|
|
size,
|
|
deleteType,
|
|
minSize,
|
|
};
|
|
}
|
|
|
|
static getDerivedStateFromProps(nextProps, prevState) {
|
|
if (
|
|
nextProps.options !== prevState.options ||
|
|
nextProps.minSize !== prevState.minSize
|
|
) {
|
|
const { options, value, minSize } = nextProps;
|
|
return {
|
|
options,
|
|
type: value.type,
|
|
minSize,
|
|
};
|
|
}
|
|
return null;
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.onChange();
|
|
}
|
|
|
|
checkVolume = (callback) => {
|
|
const { type } = this.state;
|
|
if (!type) {
|
|
this.setState(
|
|
{
|
|
errorMsg: t('Please select a type!'),
|
|
validateStatus: 'error',
|
|
},
|
|
callback
|
|
);
|
|
return;
|
|
}
|
|
this.setState(
|
|
{
|
|
errorMsg: undefined,
|
|
validateStatus: 'success',
|
|
},
|
|
callback
|
|
);
|
|
};
|
|
|
|
onChange = () => {
|
|
this.checkVolume(() => {
|
|
const { onChange, options = [] } = this.props;
|
|
if (onChange) {
|
|
const { type, deleteType } = this.state;
|
|
const deleteTypeLabel =
|
|
deleteType === 1
|
|
? t('Deleted with the instance')
|
|
: t('Not deleted with the instance');
|
|
const typeOption = options.find((it) => it.value === type);
|
|
const value = {
|
|
...this.state,
|
|
deleteTypeLabel,
|
|
typeOption,
|
|
};
|
|
onChange(value);
|
|
}
|
|
});
|
|
};
|
|
|
|
onSelectChange = (value) => {
|
|
this.setState(
|
|
{
|
|
type: value,
|
|
},
|
|
this.onChange
|
|
);
|
|
};
|
|
|
|
onInputChange = (value) => {
|
|
this.setState(
|
|
{
|
|
size: value,
|
|
},
|
|
this.onChange
|
|
);
|
|
};
|
|
|
|
onDeleteChange = () => {
|
|
const { deleteType } = this.state;
|
|
this.setState(
|
|
{
|
|
deleteType: 1 - deleteType,
|
|
},
|
|
this.onChange
|
|
);
|
|
};
|
|
|
|
render() {
|
|
const {
|
|
options,
|
|
type,
|
|
size,
|
|
deleteType,
|
|
validateStatus,
|
|
errorMsg,
|
|
minSize,
|
|
} = this.state;
|
|
const { name } = this.props;
|
|
const selects = (
|
|
<Select
|
|
value={type}
|
|
options={options}
|
|
onChange={this.onSelectChange}
|
|
className={styles.select}
|
|
placeholder={t('Please select type')}
|
|
/>
|
|
);
|
|
const input = (
|
|
<InputInt
|
|
value={size}
|
|
onChange={this.onInputChange}
|
|
min={minSize}
|
|
style={{ maxWidth: '60%' }}
|
|
/>
|
|
);
|
|
const deleteValue = deleteType === 1;
|
|
const checkbox = (
|
|
<Checkbox onChange={this.onDeleteChange} checked={deleteValue}>
|
|
{t('Deleted with the instance')}
|
|
</Checkbox>
|
|
);
|
|
|
|
return (
|
|
<Form.Item
|
|
className={styles['instance-volume']}
|
|
name={name}
|
|
validateStatus={validateStatus}
|
|
help={errorMsg}
|
|
>
|
|
<Row gutter={24}>
|
|
<Col span={8}>
|
|
<span className={styles.label}>{t('Type')}</span>
|
|
{selects}
|
|
</Col>
|
|
<Col span={14}>
|
|
<span className={styles.label}>{t('Size')}</span>
|
|
{input}
|
|
<span className={styles['size-label']}>GiB</span>
|
|
{checkbox}
|
|
</Col>
|
|
</Row>
|
|
</Form.Item>
|
|
);
|
|
}
|
|
}
|