// 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 { inject, observer } from 'mobx-react'; import { StepAction } from 'containers/Action'; import globalSegmentStore from 'src/stores/masakari/segments'; import React from 'react'; import { Button, Modal } from 'antd'; import { toJS } from 'mobx'; import { QuestionCircleFilled } from '@ant-design/icons'; import stylesConfirm from 'src/components/Confirm/index.less'; import globalHostStore from 'src/stores/masakari/hosts'; import Notify from 'src/components/Notify'; import StepHost from './StepHost'; import StepSegment from './StepSegment'; export class StepCreate extends StepAction { static id = 'instance-ha-create'; static title = t('Create Segment'); static path = '/ha/segments-admin/create-step-admin'; init() { this.store = globalHostStore; this.state = { btnIsLoading: false, ...this.state }; } static policy = 'get_images'; static allowed() { return Promise.resolve(true); } get name() { return t('Create Segment'); } get listUrl() { return this.getRoutePath('masakariSegments'); } get hasConfirmStep() { return false; } next() { this.currentRef.current.wrappedInstance.checkFormInput( (values) => { this.updateData(values); if (this.state.current === 0) { this.setState({ btnIsLoading: true }); const { segment_name, recovery_method, service_type, description } = this.state.data; globalSegmentStore .create({ segment: { name: segment_name, recovery_method, service_type, description, }, }) .then( (item) => { this.setState( { extra: toJS({ createdSegmentId: item.segment.uuid }) }, () => { this.setState((prev) => ({ current: prev.current + 1 })); } ); }, (err) => { this.responseError = err; const { response: { data: responseData } = {} } = err; Notify.errorWithDetail(responseData, this.errorText); } ) .finally(() => { this.setState({ btnIsLoading: false }); }); } }, () => this.setState({ btnIsLoading: false }) ); } getNextBtn() { const { current } = this.state; if (current >= this.steps.length - 1) { return null; } const { title } = this.steps[current + 1]; return ( ); } getPrevBtn() { const { current } = this.state; if (current === 0) { return null; } const preTitle = this.steps[current - 1].title; return ( ); } prev() { this.currentRef.current.wrappedInstance.checkFormInput( this.updateDataOnPrev, this.updateDataOnPrev ); globalSegmentStore.delete({ id: this.state.extra.createdSegmentId }); } onClickCancel = () => { if (this.state.current !== 0) { Modal.confirm({ title: 'Confirm', icon: , content: 'Segment will be deleted. Are you sure want to cancel this created segment?', okText: 'Confirm', cancelText: 'Cancel', loading: true, onOk: () => { return globalSegmentStore .delete({ id: this.state.extra.createdSegmentId }) .finally(() => this.routing.push(this.listUrl)); }, }); } else { this.routing.push(this.listUrl); } }; get steps() { return [ { title: t('Create Segment'), component: StepSegment }, { title: t('Add Host'), component: StepHost }, ]; } onSubmit = (values) => { const { name } = values; return Promise.resolve( name.selectedRows.forEach((item) => { const { binary, forced_down, host, id, state, status, updated_at, zone, ...hostData } = item; this.store.create(this.state.extra.createdSegmentId, { host: { name: host, ...hostData }, }); }) ); }; } export default inject('rootStore')(observer(StepCreate));