skyline/src/components/FormItem/InstanceVolume/index.jsx
Jingwei.Zhang eae1e27256 fix: Fix GB/MB unit to GiB/MiB
1. Fix size unit to GiB/MiB for
volume/snapshot/backup/image/flavor/monitor
2. Update i18n for Zun

Change-Id: I97bc881b438c9922a2123c36b7e8ea40e5307fd2
2022-05-25 14:48:02 +08:00

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>
);
}
}