Browse Source

Merge branch 'master' of http://gitea.palntour.com/pav/pav-home

pull/2/head
junh_eee 2 years ago
parent
commit
b60417a224
  1. 4
      src/assets/css/custom.css
  2. 3
      src/components/basis/dron/BasisDronForm.js
  3. 124
      src/components/basis/flight/plan/FlightPlanAreaForm.js
  4. 52
      src/components/basis/flight/plan/FlightPlanAreaMap.js
  5. 378
      src/components/basis/flight/plan/FlightPlanForm.js
  6. 62
      src/components/basis/flight/plan/FlightPlanGrid.js
  7. 37
      src/components/modal/FormModal.js
  8. 21
      src/containers/basis/flight/plan/FlightPlanAreaContainer.js
  9. 24
      src/containers/basis/flight/plan/FlightPlanContainer.js
  10. 42
      src/containers/basis/flight/plan/FlightPlanDetailContainer.js
  11. 16
      src/navigation/basis/index.js
  12. 14
      src/router/routes/RouteBasis.js
  13. 14
      src/views/basis/flight/plan/FlightPlan.js
  14. 12
      src/views/basis/flight/plan/FlightPlanDetail.js

4
src/assets/css/custom.css

@ -724,3 +724,7 @@ background-size: 75% auto;
.datepicker-border-sm{border:1px solid #404656;padding:0 20px;border-radius:20px;} .datepicker-border-sm{border:1px solid #404656;padding:0 20px;border-radius:20px;}
.datepicker-border-sm input{width:100px;height:34px;padding:0 0 0 1rem;} .datepicker-border-sm input{width:100px;height:34px;padding:0 0 0 1rem;}
.m_ft{display:flex;align-items:flex-end; justify-content: space-between;}
.m_ft_box{flex:0 0 49%}
.m_ft_box + .m_ft_box{margin-left:1%}

3
src/components/basis/dron/BasisDronForm.js

@ -131,8 +131,7 @@ export const BasisDronForm = props => {
name='arcrftTypeCd' name='arcrftTypeCd'
id='arcrftTypeCd' id='arcrftTypeCd'
size='sm' size='sm'
innerRef={props.data} innerRef={props.data}
id='test'
className={classnames({ className={classnames({
'is-invalid': props.errors.arcrftTypeCd 'is-invalid': props.errors.arcrftTypeCd
})} })}

124
src/components/basis/flight/plan/FlightPlanAreaForm.js

@ -0,0 +1,124 @@
import React from 'react';
import {
Card,
CardBody,
Col,
FormGroup,
Input,
Label,
Row,
Button
} from 'reactstrap';
const FlightPlanAreaForm = () => {
return (
<Card>
<CardBody>
<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>
<h4>상세 정보</h4>
</div>
<div className='final'>
{/* {props.type === 'update' ? (
<span>최종 수정일자 : {props.updateDt}</span>
) : null} */}
</div>
</div>
<dl>
<dt>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={6} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder=''
/>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={6} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder=''
/>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={6} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>(m)
</Label>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder=''
/>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={6} md={6} sm={12}>
<FormGroup className='m_ft'>
<div className='m_ft_box'>
<Label for='test'>
<span className='necessary'>*</span>(m/ft)
</Label>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder='m'
/>
</div>
<div className='m_ft_box'>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder='ft'
/>
</div>
</FormGroup>
</Col>
</Row>
</div>
</dt>
</dl>
</div>
</CardBody>
</Card>
)
}
export default FlightPlanAreaForm;

52
src/components/basis/flight/plan/FlightPlanAreaMap.js

@ -0,0 +1,52 @@
import React, { useEffect, useState } from 'react';
import {
Card,
CardBody,
} from 'reactstrap';
const FlightPlanAreaMap = () => {
const naver = window.naver;
const [map, setMap] = useState();
useEffect(() => {
NaverMapInit();
}, []);
useEffect(() => {
}, [map]);
const NaverMapInit = () => {
const mapOptions = {
center: new naver.maps.LatLng(36.56793936069445, 127.85101412107547),
zoom: 10,
zoomControl: true,
mapTypeId: naver.maps.MapTypeId.HYBRID,
zoomControlOptions: {
position: naver.maps.Position.TOP_LEFT,
style: naver.maps.ZoomControlStyle.SMALL
}
};
setMap(new naver.maps.Map('map', mapOptions));
};
return (
<Card>
<CardBody>
<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>
<h4>지도 영역</h4>
</div>
</div>
</div>
<div id="map" style={{ width: '100%', height: '50vh'}}></div>
</CardBody>
</Card>
)
}
export default FlightPlanAreaMap;

378
src/components/basis/flight/plan/FlightPlanForm.js

@ -0,0 +1,378 @@
import React from 'react';
import {
Card,
CardBody,
Col,
FormGroup,
Input,
Label,
Row,
Button
} from 'reactstrap';
import Flatpickr from 'react-flatpickr';
import '@styles/react/libs/flatpickr/flatpickr.scss';
const FlightPlanForm = (props) => {
return (
<Row>
<Col sm='12'>
<Card>
<CardBody className='pt-2 card-body-tab-cont'>
<Row>
<Col>
<Card>
<CardBody className='pal-card-body'>
<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>
<h4> 상세정보</h4>
</div>
<div className='final'>
{/* {props.type === 'update' ? (
<span>최종 수정일자 : {props.updateDt}</span>
) : null} */}
</div>
</div>
<dl>
<dt>
<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={6} sm={12}>
<FormGroup>
<Label for='test'>성명</Label>
<Input
type='text'
id='applicantNm'
name='applicantNm'
size='sm'
// innerRef={props.data}
placeholder=''
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>생년월일</Label>
<Input
type='text'
id='applicantBirthDt'
name='applicantBirthDt'
size='sm'
// innerRef={props.data}
placeholder=''
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>전화번호</Label>
<Input
type='text'
id='applicantPhone'
name='applicantPhone'
size='sm'
// innerRef={props.data}
placeholder=''
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>팩스번호</Label>
<Input
type='text'
id='applicantPhone'
name='applicantPhone'
size='sm'
// innerRef={props.data}
placeholder=''
/>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>주소</Label>
<Input
type='text'
id='applicantAddress'
name='applicantAddress'
size='sm'
// innerRef={props.data}
placeholder=''
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>상세주소</Label>
<Input
type='text'
id='applicantAddress'
name='applicantAddress'
size='sm'
// innerRef={props.data}
placeholder=''
/>
</FormGroup>
</Col>
</Row>
</div>
</dt>
<dt>
<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={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Flatpickr size='sm' className='form-control calendar-flat' />
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Flatpickr size='sm' className='form-control calendar-flat' />
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='select'
name='arcrftTypeCd'
id='arcrftTypeCd'
size='sm'
// innerRef={props.data}
// className={classnames({
// 'is-invalid': props.errors.arcrftTypeCd
// })}
>
<option value=''>= 선택 =</option>
{/* CDNOT 코드연동 필요 */}
{/* {ARCTFT_TYPE_CD.map(item => {
return (
<option
value={item.code}
selected={
props.data.arcrftTypeCd === item.code
? true
: false
}
>
{item.codeNm}
</option>
);
})} */}
</Input>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='select'
name='arcrftTypeCd'
id='arcrftTypeCd'
size='sm'
// innerRef={props.data}
// className={classnames({
// 'is-invalid': props.errors.arcrftTypeCd
// })}
>
<option value=''>= 선택 =</option>
{/* CDNOT 코드연동 필요 */}
{/* {ARCTFT_TYPE_CD.map(item => {
return (
<option
value={item.code}
selected={
props.data.arcrftTypeCd === item.code
? true
: false
}
>
{item.codeNm}
</option>
);
})} */}
</Input>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'></span>
</Label>
<Input
type='text'
id='arcrftModelNm'
name='arcrftModelNm'
// innerRef={props.data}
size='sm'
placeholder=''
// className={classnames({
// 'is-invalid': props.errors.arcrftModelNm
// })}
/>
{/* {props.errors && props.errors.arcrftModelNm && (
<FormFeedback>
{props.errors.arcrftModelNm.message}
</FormFeedback>
)} */}
</FormGroup>
</Col>
</Row>
</div>
</dt>
<dt>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>비행 구역 정보</h4>
<Button.Ripple
color="primary"
onClick={props.openModal}
>
비행 구역 설정
</Button.Ripple>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder=''
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder=''
/>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>(m)
</Label>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder=''
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={6} sm={12}>
<FormGroup className='m_ft'>
<div className='m_ft_box'>
<Label for='test'>
<span className='necessary'>*</span>(m/ft)
</Label>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder='m'
/>
</div>
<div className='m_ft_box'>
<Input
type='text'
id='ownerNm'
name='ownerNm'
size='sm'
placeholder='ft'
/>
</div>
</FormGroup>
</Col>
</Row>
</div>
</dt>
<div className='d-flex align-items-center'>
<Button.Ripple
className='mr-1'
color='primary'
size='sm'
// onClick={
// pageType === 'create'
// ? handleSubmit(handlerCreate)
// : handleSubmit(handlerUpdate)
// }
>
저장
</Button.Ripple>
<Button.Ripple
color='danger'
size='sm'
// onClick={handlerDelete}
>
삭제
</Button.Ripple>
</div>
</dl>
</div>
</CardBody>
</Card>
</Col>
</Row>
</CardBody>
</Card>
</Col>
</Row>
)
}
export default FlightPlanForm;

62
src/components/basis/flight/plan/FlightPlanGrid.js

@ -0,0 +1,62 @@
import React from 'react';
import {
Row,
Col,
Table,
Badge,
UncontrolledDropdown,
DropdownMenu,
DropdownItem,
DropdownToggle,
Card,
CardHeader,
CardBody,
CardTitle,
CardSubtitle,
ButtonGroup,
Button,
Input,
CustomInput,
FormGroup
} from 'reactstrap';
const FlightPlanGrid = (props) => {
return (
<div className='pal-card-box'>
<Row>
<Col>
<div className='cont-ti d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'>
<div>
<h4>{"비행 계획"} 목록</h4>
<span className='search-case'>검색결과 0</span>
</div>
<div className='d-flex align-items-center'>
<Button.Ripple
color='primary'
size='sm'
onClick={props.moveFlightPlan}
>
계획서 생성
</Button.Ripple>
</div>
</div>
<div className='invoice-list-wrapper'>
<Card>
<div className='invoice-list-dataTable'>
{/* <GridDatabase
title={'비행이력'}
// data={props.data}
// count={props.count}
// columns={props.columns}
// pagination={props.pagination}
/> */}
</div>
</Card>
</div>
</Col>
</Row>
</div>
)
}
export default FlightPlanGrid;

37
src/components/modal/FormModal.js

@ -0,0 +1,37 @@
import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
export const FormModal = props => {
return (
<div className='vertically-centered-modal'>
<Modal
isOpen={props.modal.isOpen}
toggle={() =>
props.setModal({ ...props.modal, isOpen: !props.modal.isOpen })
}
className='modal-dialog-centered modal-xl'
>
<ModalHeader
toggle={() =>
props.setModal({ ...props.modal, isOpen: !props.modal.isOpen })
}
>
{props.modal.title}
</ModalHeader>
<ModalBody>
{props.modal.contents}
</ModalBody>
<ModalFooter>
<Button
color='primary'
onClick={() =>
props.setModal({ ...props.modal, isOpen: !props.modal.isOpen })
}
outline
>
확인
</Button>
</ModalFooter>
</Modal>
</div>
);
};

21
src/containers/basis/flight/plan/FlightPlanAreaContainer.js

@ -0,0 +1,21 @@
import React, { useState } from 'react';
import FlightPlanAreaForm from '../../../../components/basis/flight/plan/FlightPlanAreaForm';
import { Button, Col, Row } from 'reactstrap';
import FlightPlanAreaMap from '../../../../components/basis/flight/plan/FlightPlanAreaMap';
const FlightPlanAreaContainer = () => {
return (
<Row>
<Col md={6} lg={6}>
<FlightPlanAreaMap />
</Col>
<Col md={6} lg={6}>
<FlightPlanAreaForm />
</Col>
</Row>
)
}
export default FlightPlanAreaContainer;

24
src/containers/basis/flight/plan/FlightPlanContainer.js

@ -0,0 +1,24 @@
import React, { } from 'react';
import { Link, useHistory } from 'react-router-dom';
import FlightPlanGrid from '../../../../components/basis/flight/plan/FlightPlanGrid';
import { CustomMainLayout } from '../../../../components/layout/CustomMainLayout';
const FlightPlanContainer = () => {
const history = useHistory();
const moveFlightPlan = () => {
history.push('/basis/flight/plan/create');
};
return (
<CustomMainLayout title={"비행 계획 관리"}>
<FlightPlanGrid
moveFlightPlan={moveFlightPlan}
/>
</CustomMainLayout>
)
}
export default FlightPlanContainer;

42
src/containers/basis/flight/plan/FlightPlanDetailContainer.js

@ -0,0 +1,42 @@
import React, {useState} from 'react';
import FlightPlanForm from '../../../../components/basis/flight/plan/FlightPlanForm';
import { CustomDetailLayout } from '../../../../components/layout/CustomDetailLayout';
import { FormModal } from '../../../../components/modal/FormModal';
import FlightPlanAreaContainer from './FlightPlanAreaContainer';
const FlightPlanDetailContainer = () => {
const [modal, setModal] = useState({
isOpen: false,
title: '',
contents: '',
});
const saveFlightPlanArea = () => {
console.log('비행 구역 설정 저장');
}
const openModal = () => {
setModal({
isOpen: true,
title: '비행 구역 설정',
contents: <FlightPlanAreaContainer />
});
}
return (
<CustomDetailLayout title={"비행 승인 신청서"}>
<FlightPlanForm
openModal={openModal}
/>
<FormModal
modal={modal}
save={saveFlightPlanArea}
setModal={setModal}
/>
</CustomDetailLayout>
)
}
export default FlightPlanDetailContainer;

16
src/navigation/basis/index.js

@ -45,5 +45,19 @@ export default [
} }
], ],
navLink: '#' navLink: '#'
} },
{
id: 'basis_001_03',
type: 'dropdown',
title: '비행 계획 관리',
children: [
{
id: 'basis_001_03_01',
type: 'item',
title: '비행 계획 목록',
navLink: '/basis/flight/plan/index'
}
],
navLink: '#'
}
]; ];

14
src/router/routes/RouteBasis.js

@ -38,7 +38,19 @@ const RouteBasis = [
{ {
path: '/basis/dron/create', path: '/basis/dron/create',
component: lazy(() => import('../../views/basis/dron/BasisDronDetail')) component: lazy(() => import('../../views/basis/dron/BasisDronDetail'))
} },
{
path: '/basis/flight/plan/index',
component: lazy(() => import('../../views/basis/flight/plan/FlightPlan'))
},
{
path: '/basis/flight/plan/create',
component: lazy(() => import('../../views/basis/flight/plan/FlightPlanDetail'))
},
{
path: '/basis/flight/plan/detail/:id',
component: lazy(() => import('../../views/basis/flight/plan/FlightPlanDetail'))
},
]; ];
export default RouteBasis; export default RouteBasis;

14
src/views/basis/flight/plan/FlightPlan.js

@ -0,0 +1,14 @@
// ** Styles
import '@styles/react/libs/flatpickr/flatpickr.scss';
import '@styles/react/libs/tables/react-dataTable-component.scss';
import React from 'react';
import '../../../../assets/css/custom.css';
import FlightPlanContainer from '../../../../containers/basis/flight/plan/FlightPlanContainer';
const FlightPlan = props => {
return (
<FlightPlanContainer />
);
};
export default FlightPlan;

12
src/views/basis/flight/plan/FlightPlanDetail.js

@ -0,0 +1,12 @@
import React, { useState } from 'react';
import FlightPlanDetailContainer from '../../../../containers/basis/flight/plan/FlightPlanDetailContainer';
import '../../../../assets/css/custom.css';
import '@styles/react/libs/flatpickr/flatpickr.scss';
const FlightPlanDetail = () => {
return (
<FlightPlanDetailContainer />
)
}
export default FlightPlanDetail;
Loading…
Cancel
Save