Browse Source

laanc 컴포넌트 작업

pull/2/head
sanguu516(박상현) 1 year ago
parent
commit
33e9403467
  1. 259
      src/containers/basis/flight/laanc/LaancContainer.js
  2. 14
      src/modules/laanc/reducers/laancReducers.ts
  3. 49
      src/views/laanc/FlightArea.js
  4. 367
      src/views/laanc/FlightPlan.js

259
src/containers/basis/flight/laanc/LaancContainer.js

@ -0,0 +1,259 @@
import FlightPlan from '../../../../views/laanc/FlightPlan';
import Apply from '../../../../views/laanc/Apply';
import { useEffect, useState } from 'react';
import moment from 'moment';
import { WeatherContainer } from '../../../../containers/basis/flight/plan/WeatherContainer';
import { ErrorModal } from '../../../../components/modal/ErrorModal';
import {
initFlight,
initFlightBas
} from '../../../../modules/basis/flight/models/basisFlightModel';
import {
Row,
Col,
Button,
Modal,
ModalHeader,
ModalBody,
ModalFooter,
Alert,
FormGroup,
Label,
Input
} from 'reactstrap';
const LaancContainer = () => {
const [step, setStep] = useState(1);
const [detailData, setDetailData] = useState(initFlightBas.initDetail);
const [formModal, setFormModal] = useState(false);
const [disabledAnimation, setDisabledAnimation] = useState(true);
const [modal2, setModal2] = useState({
isOpen: false,
title: '',
desc: ''
});
const [centeredModal, setCenteredModal] = useState(false);
//날씨 임시 데이터
const [wheather, setWheather] = useState([
{
coordList: [
{
lat: 37.40284040287055,
lon: 126.68639226254697
}
]
}
]);
// step 핸들러
const handlerStep = step => {
setStep(step);
};
const handlerLogout = () => {
dispatch(Actions.logout.request());
};
useEffect(() => {}, [detailData]);
// 날씨 핸들러
const handlerWeather = () => {
setFormModal(!formModal);
};
// 비행계획서 작성 핸들러
const handleChange = ({ name, value, type, index, pIndex }) => {
const arrName = `${type}List`;
switch (type) {
case 'area':
case 'pilot':
case 'arcrft':
if (name === 'fltElev' || name === 'bufferZone' || name === 'hpno') {
const newValue = value.replace(/[^0-9]/g, '');
setDetailData(prevState => {
const arr = [...prevState[arrName]];
const updateData = {
...prevState[arrName][0],
[name]: newValue
};
arr[0] = updateData;
return {
...prevState,
[arrName]: arr
};
});
} else {
setDetailData(prevState => {
const arr = [...prevState[arrName]];
const updateData = {
...prevState[arrName][0],
[name]: value
};
arr[0] = updateData;
return {
...prevState,
[arrName]: arr
};
});
}
break;
case 'plan':
default:
setDetailData(prevState => ({
...prevState,
[name]: value
}));
break;
}
};
console.log('>>>>', detailData);
// 스텝 1 다음 버튼 이벤트
const handlerNext = () => {
const reg_email =
/^([0-9a-zA-Z_\.-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,2}$/;
const check_num = /[0-9]/;
const check_kor =
/^[가-힣a-zA-Z0-9][^!@#$%^&*()+\=\[\]{};':"\\|,.<>\/?\s]*$/;
// 시작일자
const schFltStDt = moment(detailData.schFltStDt, 'YYYY-MM-DD HH:mm:ss');
// 종료일자
const schFltEndDt = moment(detailData.schFltEndDt, 'YYYY-MM-DD HH:mm:ss');
const currentDate = moment(); // 현재 날짜와 시간을 가져옵니다.
if (!detailData.pilotList[0].memberName) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '이름을 입력해 주세요.'
});
return false;
} else if (!check_num.test(detailData.pilotList[0].hpno)) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '연락처를 확인해 주세요.'
});
return false;
} else if (!reg_email.test(detailData.pilotList[0].email)) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '이메일을 확인해 주세요.'
});
return false;
} else if (
!schFltStDt.isAfter(currentDate) ||
!schFltEndDt.isAfter(currentDate)
) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '비행 일자가 이미 지난 일자입니다.'
});
return false;
} else if (schFltStDt.isAfter(schFltEndDt)) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '비행일자를 확인해주세요.'
});
return false;
} else if (!detailData.fltPurpose) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '비행목적을 선택해 주세요.'
});
return false;
} else if (!detailData.areaList[0].fltElev) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '고도를 입력해 주세요.'
});
return false;
} else if (!detailData.areaList[0].bufferZone) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '반경을 입력해 주세요.'
});
return false;
} else if (!detailData.areaList[0].fltMethod) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '비행방식를 입력해 주세요.'
});
return false;
} else if (!detailData.arcrftList[0].groupNm) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '기체 신고 번호를 입력해 주세요.'
});
return false;
} else if (!detailData.arcrftList[0].arcrftTypeCd) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '기체 종류를 입력해 주세요.'
});
return false;
} else if (!detailData.arcrftList[0].ownerNm) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '소유자명(법인명)를 입력해 주세요.'
});
return false;
} else {
//api 호출 부분
setStep(2);
}
};
return (
<>
<div className='disabled-animation-modal'>
<Modal
isOpen={disabledAnimation}
toggle={() => setDisabledAnimation(!disabledAnimation)}
className='modal-dialog-centered laanc-modal'
fade={false}
backdrop={false}
>
{step === 1 && (
<>
<FlightPlan
// handlerStep={handlerStep}
data={detailData}
handleChange={handleChange}
handlerNext={handlerNext}
handlerWeather={handlerWeather}
setDisabledAnimation={setDisabledAnimation}
disabledAnimation={disabledAnimation}
/>
</>
)}
{step === 2 && <Apply handlerStep={handlerStep} data={detailData} />}
</Modal>
<ErrorModal modal={modal2} setModal={setModal2} />
</div>
</>
);
};
export default LaancContainer;

14
src/modules/laanc/reducers/laancReducers.ts

@ -15,12 +15,14 @@ import {
export const laancReducer = createReducer<laancState, Actions.LaancAction>( export const laancReducer = createReducer<laancState, Actions.LaancAction>(
laancControlData laancControlData
).handleAction(Actions.laancFlightApproval.success, (state, action) =>
produce(state, draft => {
// laanc 승인 처리
const data = action.payload;
draft.laancApproval = data;
})
); );
// handleAction(Actions.laancFlightApproval.success, (state, action) =>
// produce(state, draft => {
// // laanc 승인 처리
// const data = action.payload;
// draft.approval = data;
// })
// );
export default laancReducer; export default laancReducer;

49
src/views/laanc/FlightArea.js

@ -0,0 +1,49 @@
import {
Row,
Col,
Button,
Modal,
ModalHeader,
ModalBody,
ModalFooter,
Alert,
FormGroup,
Label,
Input
} from 'reactstrap';
const FlightArea = ({ centeredModal, setCenteredModal }) => {
return (
<div className='vertically-centered-modal'>
<Modal
isOpen={centeredModal}
toggle={() => setCenteredModal(!centeredModal)}
className='modal-dialog-centered modal-xl'
>
<ModalHeader toggle={() => setCenteredModal(!centeredModal)}>
비행 구역 설정
</ModalHeader>
<ModalBody>지도영역 지도 height 정해주기</ModalBody>
<ModalFooter>
<div className='laanc-map-btn'>
<div className='laanc-point'>
<Button color='primary'>버튼1</Button>
<Button color='primary'>버튼2</Button>
<Button color='primary'>버튼3</Button>
<Button color='primary'>버튼4</Button>
</div>
<div>
<Button
color='primary'
onClick={() => setCenteredModal(!centeredModal)}
>
닫기
</Button>
</div>
</div>
</ModalFooter>
</Modal>
</div>
);
};
export default FlightArea;

367
src/views/laanc/FlightPlan.js

@ -9,19 +9,19 @@ import '@styles/react/libs/flatpickr/flatpickr.scss';
import { ErrorModal } from '../../components/modal/ErrorModal'; import { ErrorModal } from '../../components/modal/ErrorModal';
import moment from 'moment'; import moment from 'moment';
import { import {
Button,
InputGroup,
ButtonGroup,
InputGroupAddon,
Input,
Row, Row,
Col, Col,
Button,
Modal,
ModalHeader,
ModalBody,
ModalFooter,
Alert,
FormGroup, FormGroup,
Label, Label,
Card, Input
CardBody,
CustomInput
} from 'reactstrap'; } from 'reactstrap';
import { import {
initFlight, initFlight,
initFlightBas initFlightBas
@ -33,8 +33,17 @@ import {
sensorClickAction sensorClickAction
} from '../../modules/control/map/actions/controlMapActions'; } from '../../modules/control/map/actions/controlMapActions';
import { useHistory } from 'react-router-dom'; import { useHistory } from 'react-router-dom';
const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => { import FlightArea from './FlightArea';
const FlightPlan = ({
handleChange,
handlerNext,
data,
handlerWeather,
disabledAnimation,
setDisabledAnimation
}) => {
const user = useSelector(state => state.authState); const user = useSelector(state => state.authState);
const [centeredModal, setCenteredModal] = useState(false);
const history = useHistory(); const history = useHistory();
@ -43,72 +52,22 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
}; };
return ( return (
<div className=''> <>
<div className='layer-content'> <ModalHeader>
<div className='layer-ti'> LAANC 승인 요청
<h4>LAANC 승인 요청</h4> <Button
{/* <button className='btn-icon' outline color='primary'> */}
{/* <X size={20} /> */}
{/* </button> */}
<Button.Ripple
color='danger' color='danger'
className='badge badge-danger' onClick={() => setDisabledAnimation(!disabledAnimation)}
onClick={() => handlerLaanc()}
> >
취소 취소
</Button.Ripple> </Button>
</div> </ModalHeader>
</div> <ModalBody>
<Row> <div>
<Col sm='12'>
<Row>
<Col>
<div className='search-cont search-info pd-0'>
<div className='cont-ti mb-1 d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div className='final'></div>
</div>
<dl>
<dt>
<div className='layer-ti'>
<h4>위치 선택</h4>
</div>
<div className='layer-ti'>
<Button.Ripple
className='mr-1'
color='primary'
onClick={e => handlerDrawType('LINE')}
// disabled={isDisabled || isDone}
>
WayPoint
</Button.Ripple>
<Button.Ripple
className='mr-1'
color='primary'
onClick={e => handlerDrawType('CIRCLE')}
// disabled={isDisabled || isDone}
>
Circle
</Button.Ripple>
<Button.Ripple
className='mr-1'
color='primary'
onClick={e => handlerDrawType('POLYGON')}
// disabled={isDisabled || isDone}
>
Polygon
</Button.Ripple>
<Button.Ripple color='info' onClick={handlerWeather}>
날씨 정보
</Button.Ripple>
</div>
</dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>조종사 정보</h4>
</div>
<div className='search-info-box'>
<Row> <Row>
<Col className='list-input' lg={3} md={3} sm={12}> <Col className='list-input' md='6'>
<FormGroup> <FormGroup>
<div className='ti'>조종사 정보</div>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
</Label> </Label>
@ -116,7 +75,8 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
type='text' type='text'
id='memberName' id='memberName'
name='memberName' name='memberName'
// defaultValue={data.memberName} size='sm'
placeholder=''
value={data.pilotList[0].memberName || ''} value={data.pilotList[0].memberName || ''}
onChange={e => { onChange={e => {
const { name, value } = e.target; const { name, value } = e.target;
@ -126,94 +86,31 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
value value
}); });
}} }}
bsSize='sm' disabled
placeholder='홍길동'
/>
</FormGroup>
</Col>
<Col className='list-input' lg={5} md={5} sm={12}>
<FormGroup className='m_ft'>
<div className='m_ft_box'>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='clncd'
name='clncd'
// defaultValue={data.clncd}
// value={data.clncd || '+81'}
bsSize='sm'
placeholder='+82'
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'pilot',
name,
value
});
}}
readOnly
/>
</div>
<div className='m_ft_box'>
<Input
type='text'
id='hpno'
name='hpno'
// defaultValue={data.hpno}
value={data.pilotList[0].hpno || ''}
bsSize='sm'
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'pilot',
name,
value
});
}}
placeholder='010-0000-0000'
/> />
</div>
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' lg={3} md={4} sm={12}> <Col className='list-input' md='6'>
<FormGroup> <FormGroup>
<div className='ti'>비행 유형</div>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
</Label> </Label>
<Input <Input type='select' name='select' size='sm' id='test'>
type='text' <option>무인 비행기</option>
id='email' <option>무인 헬리콥터</option>
name='email' <option>무인 멀티콥터</option>
// defaultValue={data.email || ''} <option>무인 비행선</option>
value={data.pilotList[0].email} </Input>
bsSize='sm'
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'pilot',
name,
value
});
}}
// innerRef={data}
placeholder=''
/>
</FormGroup> </FormGroup>
</Col> </Col>
</Row> <Col className='list-input' md='12'>
</div> <div className='ti'>비행 계획 정보</div>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>비행 계획 정보</h4>
</div>
<div className='search-info-box'>
<Row> <Row>
<Col className='list-input' lg={4} md={4} sm={12}> <Col className='list-input' md='4'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
비행시작일자
</Label> </Label>
<Flatpickr <Flatpickr
className='form-control form-control-sm' className='form-control form-control-sm'
@ -228,8 +125,7 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
}} }}
onChange={date => { onChange={date => {
const value = const value =
moment(date[0]).format('YYYY-MM-DD HH:mm:ss') || moment(date[0]).format('YYYY-MM-DD HH:mm:ss') || '';
'';
handleChange({ handleChange({
name: 'schFltStDt', name: 'schFltStDt',
value value
@ -239,11 +135,10 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
/> />
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' lg={4} md={4} sm={12}> <Col className='list-input' md='4'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
비행종료일자
</Label> </Label>
<Flatpickr <Flatpickr
className='form-control form-control-sm' className='form-control form-control-sm'
@ -258,8 +153,7 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
}} }}
onChange={date => { onChange={date => {
const value = const value =
moment(date[0]).format('YYYY-MM-DD HH:mm:ss') || moment(date[0]).format('YYYY-MM-DD HH:mm:ss') || '';
'';
handleChange({ handleChange({
name: 'schFltEndDt', name: 'schFltEndDt',
value value
@ -270,7 +164,7 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
/> />
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' lg={4} md={4} sm={12}> <Col className='list-input' md='4'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
@ -298,26 +192,21 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
<option value=''>= 선택 =</option> <option value=''>= 선택 =</option>
<option value='시험비행'>= 시험비행 =</option> <option value='시험비행'>= 시험비행 =</option>
<option value='교육비행'>= 교육비행 =</option> <option value='교육비행'>= 교육비행 =</option>
<option value='사진/영상촬영'> <option value='사진/영상촬영'>= 사진/영상촬영 =</option>
= 사진/영상촬영 =
</option>
<option value='비행훈련'>= 비행훈련 =</option> <option value='비행훈련'>= 비행훈련 =</option>
<option value='비행교육'>= 비행교육 =</option> <option value='비행교육'>= 비행교육 =</option>
<option value='비행실기시험'> <option value='비행실기시험'>= 비행실기시험 =</option>
= 비행실기시험 =
</option>
</Input> </Input>
</FormGroup> </FormGroup>
</Col> </Col>
</Row> </Row>
</Col>
<Col className='list-input' md='12'>
<div className='ti'>
비행 구역 정보<Button size='sm'>적용</Button>
</div> </div>
{/* TODO area 다건 표출 */}
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>비행 구역 정보</h4>
</div>
<div className='search-info-box'>
<Row> <Row>
<Col className='list-input' lg={4} md={4} sm={12}> <Col className='list-input' md='6'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
@ -342,7 +231,7 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
/> />
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' lg={4} md={4} sm={12}> <Col className='list-input' md='6'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
@ -367,13 +256,13 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
/> />
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' lg={4} md={4} sm={12}> <Col className='list-input' md='6'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
</Label> </Label>
<Input <Input
type='text' type='select'
id='fltMethod' id='fltMethod'
name='fltMethod' name='fltMethod'
// defaultValue={data.email || ''} // defaultValue={data.email || ''}
@ -389,42 +278,48 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
}} }}
// innerRef={data} // innerRef={data}
placeholder='' placeholder=''
/> >
<option value=''>= 선택 =</option>
<option value='시험비행'>= 시계비행 =</option>
<option value='교육비행'>= 선화비행 =</option>
<option value='사진/영상촬영'>= 계기비행 =</option>
<option value='비행훈련'>= 격자비행 =</option>
<option value='비행교육'>= 수직이착륙비행 =</option>
<option value='비행실기시험'>= 수동조종비행 =</option>
<option value='비행실기시험'>= 군집비행 =</option>
<option value='비행실기시험'>= 직접입력 =</option>
비행방식
</Input>
</FormGroup> </FormGroup>
</Col> </Col>
</Row> <Col className='list-input' md='6'>
</div>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>기체 정보</h4>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'></span>
</Label> </Label>
<Input <Input
type='text' type='text'
id='groupNm' id='test'
name='groupNm' size='sm'
// defaultValue={data.email || ''} placeholder='직접입력 선택 후 활성화'
value={data.arcrftList[0].groupNm} disabled
bsSize='sm'
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'arcrft',
name,
value
});
}}
// innerRef={data}
placeholder=''
/> />
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' lg={4} md={4} sm={12}> </Row>
</Col>
<Col className='list-input' md='12'>
<div className='ti'>기체 정보</div>
<Row>
<Col className='list-input' md='4'>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input type='text' id='test' size='sm' placeholder='' />
</FormGroup>
</Col>
<Col className='list-input' md='4'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
@ -449,17 +344,17 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
/> />
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' lg={4} md={4} sm={12}> <Col className='list-input' md='4'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span>() <span className='necessary'>*</span>
</Label> </Label>
<Input <Input
type='text' type='text'
id='ownerNm' id='groupNm'
name='ownerNm' name='groupNm'
// defaultValue={data.email || ''} // defaultValue={data.email || ''}
value={data.arcrftList[0].ownerNm} value={data.arcrftList[0].groupNm}
bsSize='sm' bsSize='sm'
onChange={e => { onChange={e => {
const { name, value } = e.target; const { name, value } = e.target;
@ -475,37 +370,53 @@ const FlightPlan = ({ handleChange, handlerNext, data, handlerWeather }) => {
</FormGroup> </FormGroup>
</Col> </Col>
</Row> </Row>
</Col>
</Row>
</div> </div>
<div className='search-info-ti d-flex justify-content-between'> <div>
<h4 className='ti'>유의사항</h4> <div className='ti'>
비행 구역 설정
<Button size='sm' onClick={() => setCenteredModal(!centeredModal)}>
자세히보기
</Button>
</div> </div>
{/* <div className='d-flex align-items-center'> <div className='laanc-map-sm'>
여기가 지도 영역
{data.planSno ? ( <FlightArea
<Button.Ripple centeredModal={centeredModal}
setCenteredModal={setCenteredModal}
/>
</div>
</div>
<div className='mt-1'>
<div className='ti'>유의사항</div>
</div>
</ModalBody>
<ModalFooter>
<Button
outline
color='danger' color='danger'
size='sm' onClick={() => setDisabledAnimation(!disabledAnimation)}
onClick={handleDelete}
>
삭제
</Button.Ripple>
) : null}
</div> */}
<Button.Ripple
className='mr-1'
color='primary'
bsSize='sm'
onClick={() => handlerNext()}
> >
닫기
</Button>
<ul className='step'>
<li>
<span className='on'></span>
</li>
<li>
<span></span>
</li>
<li>
<span></span>
</li>
</ul>
{/* 완료후 다음 진행할 수 있을때 버튼에 ouline 뺴주고 color='danger' 넣어주기 */}
<Button outline onClick={() => handlerNext()}>
다음 다음
</Button.Ripple> </Button>
</dl> </ModalFooter>
</div> </>
</Col>
</Row>
</Col>
</Row>
</div>
); );
}; };
export default FlightPlan; export default FlightPlan;

Loading…
Cancel
Save