Browse Source

laanc 신청서 작업중

pull/2/head
sanguu516(박상현) 1 year ago
parent
commit
b269e54add
  1. 55
      src/containers/basis/flight/laanc/LaancPlanContainer.js
  2. 2
      src/navigation/flightPlan/index.js
  3. 476
      src/views/laanc/Apply.js
  4. 46
      src/views/laanc/FlightPlan.js

55
src/containers/basis/flight/laanc/LaancPlanContainer.js

@ -25,6 +25,8 @@ import {
const LaancPlanContainer = () => { const LaancPlanContainer = () => {
const [step, setStep] = useState(1); const [step, setStep] = useState(1);
const [detailData, setDetailData] = useState(initFlightBas.initDetail); const [detailData, setDetailData] = useState(initFlightBas.initDetail);
const [centeredModal, setCenteredModal] = useState(false);
const [formModal, setFormModal] = useState(false); const [formModal, setFormModal] = useState(false);
const [disabledAnimation, setDisabledAnimation] = useState(true); const [disabledAnimation, setDisabledAnimation] = useState(true);
const [modal2, setModal2] = useState({ const [modal2, setModal2] = useState({
@ -32,7 +34,6 @@ const LaancPlanContainer = () => {
title: '', title: '',
desc: '' desc: ''
}); });
const [centeredModal, setCenteredModal] = useState(false);
//날씨 임시 데이터 //날씨 임시 데이터
const [wheather, setWheather] = useState([ const [wheather, setWheather] = useState([
{ {
@ -123,32 +124,7 @@ const LaancPlanContainer = () => {
const currentDate = moment(); // 현재 날짜와 시간을 가져옵니다. const currentDate = moment(); // 현재 날짜와 시간을 가져옵니다.
if (!detailData.pilotList[0].memberName) { if (!schFltStDt.isAfter(currentDate) || !schFltEndDt.isAfter(currentDate)) {
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({ setModal2({
isOpen: true, isOpen: true,
title: '필수값 입력 오류', title: '필수값 입력 오류',
@ -193,14 +169,6 @@ const LaancPlanContainer = () => {
desc: '비행방식를 입력해 주세요.' desc: '비행방식를 입력해 주세요.'
}); });
return false;
} else if (!detailData.arcrftList[0].groupNm) {
setModal2({
isOpen: true,
title: '필수값 입력 오류',
desc: '기체 신고 번호를 입력해 주세요.'
});
return false; return false;
} else if (!detailData.arcrftList[0].arcrftTypeCd) { } else if (!detailData.arcrftList[0].arcrftTypeCd) {
setModal2({ setModal2({
@ -210,11 +178,11 @@ const LaancPlanContainer = () => {
}); });
return false; return false;
} else if (!detailData.arcrftList[0].ownerNm) { } else if (!detailData.arcrftList[0].groupNm) {
setModal2({ setModal2({
isOpen: true, isOpen: true,
title: '필수값 입력 오류', title: '필수값 입력 오류',
desc: '소유자명(법인명)를 입력해 주세요.' desc: '기체 신고 번호를 입력해 주세요.'
}); });
return false; return false;
@ -245,11 +213,22 @@ const LaancPlanContainer = () => {
handlerWeather={handlerWeather} handlerWeather={handlerWeather}
setDisabledAnimation={setDisabledAnimation} setDisabledAnimation={setDisabledAnimation}
disabledAnimation={disabledAnimation} disabledAnimation={disabledAnimation}
centeredModal={centeredModal}
setCenteredModal={setCenteredModal}
/> />
</> </>
)} )}
{step === 2 && <Apply handlerStep={handlerStep} data={detailData} />} {step === 2 && (
<Apply
handlerStep={handlerStep}
data={detailData}
disabledAnimation={disabledAnimation}
setDisabledAnimation={setDisabledAnimation}
centeredModal={centeredModal}
setCenteredModal={setCenteredModal}
/>
)}
</Modal> </Modal>
<ErrorModal modal={modal2} setModal={setModal2} /> <ErrorModal modal={modal2} setModal={setModal2} />
</div> </div>

2
src/navigation/flightPlan/index.js

@ -16,7 +16,7 @@ export default [
navLink: '/basis/flight/plan/index' navLink: '/basis/flight/plan/index'
}, },
{ {
id: 'flight_plan_001_01_01', id: 'laanc_001_01_01',
type: 'item', type: 'item',
title: 'LAANC 신청 목록', title: 'LAANC 신청 목록',
navLink: '/basis/laanc/index' navLink: '/basis/laanc/index'

476
src/views/laanc/Apply.js

@ -7,19 +7,20 @@ import { useDispatch, useSelector } from 'react-redux';
import Flatpickr from 'react-flatpickr'; import Flatpickr from 'react-flatpickr';
import '@styles/react/libs/flatpickr/flatpickr.scss'; import '@styles/react/libs/flatpickr/flatpickr.scss';
import moment from 'moment'; import moment from 'moment';
import { AlertCircle } from 'react-feather';
import FlightArea from './FlightArea';
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,
@ -33,8 +34,16 @@ import {
sensorClickAction sensorClickAction
} from '../../modules/control/map/actions/controlMapActions'; } from '../../modules/control/map/actions/controlMapActions';
const Apply = ({ data, handlerStep }) => { const Apply = ({
data,
handlerStep,
disabledAnimation,
setDisabledAnimation,
centeredModal,
setCenteredModal
}) => {
const [detailData, setDetailData] = useState(initFlightBas.initDetail); const [detailData, setDetailData] = useState(initFlightBas.initDetail);
const { user } = useSelector(state => state.authState);
const history = useHistory(); const history = useHistory();
// 변경감지 // 변경감지
@ -52,294 +61,181 @@ const Apply = ({ data, handlerStep }) => {
}; };
return ( return (
<div className=''> <>
<div className='layer-content'> <ModalHeader>
<div className='layer-ti'> LAANC 승인 요청
<h4 className='ti'>LAANC 승인 요청</h4> <Button
{/* <button className='btn-icon' outline color='primary'> */} color='danger'
{/* <X size={20} /> */} onClick={() => setDisabledAnimation(!disabledAnimation)}
{/* </button> */} >
<Button.Ripple 취소
color='danger' </Button>
className='badge badge-danger' </ModalHeader>
onClick={() => handlerLaanc()} <ModalBody>
> <div className='mb-1'>
취소 <div className='ti'>비행승인 사전결과 확인</div>
</Button.Ripple> <div className='laanc-map-sm'>지도영역</div>
<div className='mt-1'>
<Alert color='danger'>
<div className='alert-body'>
<AlertCircle size={15} />{' '}
<span className='ms-1'>사전 결과 승인 대상입니다.</span>
</div>
</Alert>
</div>
<div className='vertically-centered-modal'>
<FlightArea
centeredModal={centeredModal}
setCenteredModal={setCenteredModal}
/>
</div>
</div> </div>
</div> <div>
<Row>
<Col sm='12'>
<Row> <Row>
<Col> <Col className='list-input' md='6' sm='12'>
<div className='search-cont search-info pd-0'> <FormGroup>
<div className='cont-ti mb-1 d-flex justify-content-between align-items-sm-center align-items-start flex-sm-row'> <div className='ti'>조종사 정보</div>
<div className='final'></div> <Label for='test'>
</div> <span className='necessary'>*</span>
<dl> </Label>
<dt> <Input
<div className='layer-ti'> type='text'
<h4>유효성 검사 정보</h4> id='memberName'
</div> name='memberName'
<CustomInput size='sm'
inline placeholder=''
type='checkbox' value={user.memberName}
id='pilotYn' disabled
label='조종사자격정보유무' />
name='pilotYn' </FormGroup>
value='A' </Col>
// checked={true} <Col className='list-input' md='6' sm='12'>
// checked={checkState.all} <FormGroup>
// onChange={handleChangeCheckbox} <div className='ti'>승인 유형</div>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input type='select' name='select' size='sm' id='test' disabled>
<option>상업</option>
<option>비상업</option>
</Input>
</FormGroup>
</Col>
<Col className='list-input' md='12'>
<div className='ti'>비행 계획 정보</div>
<Row>
<Col className='list-input' md='6'>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Flatpickr
className='form-control form-control-sm'
type='text'
id='schFltStDt'
name='schFltStDt'
data-enable-time
defaultValue={data.schFltStDt}
value={data.schFltStDt}
options={{
minDate: moment().format('YYYY-MM-DD')
}}
onChange={date => {
const value =
moment(date[0]).format('YYYY-MM-DD HH:mm:ss') || '';
handleChange({
name: 'schFltStDt',
value
});
}}
placeholder='비행 시작일자 선택(클릭)'
disabled
/> />
<CustomInput </FormGroup>
inline </Col>
type='checkbox' <Col className='list-input' md='6'>
id='DronYn' <FormGroup>
label='기체보험가입여부' <Label for='test'>
name='DronYn' <span className='necessary'>*</span>
value='B' </Label>
// checked={true} <Flatpickr
// checked={checkState.all} className='form-control form-control-sm'
// onChange={handleChangeCheckbox} type='text'
id='schFltEndDt'
name='schFltEndDt'
data-enable-time
defaultValue={data.schFltEndDt}
value={data.schFltEndDt}
options={{
minDate: moment().format('YYYY-MM-DD')
}}
onChange={date => {
const value =
moment(date[0]).format('YYYY-MM-DD HH:mm:ss') || '';
handleChange({
name: 'schFltEndDt',
value
});
}}
placeholder='비행 종료일자 선택(클릭)'
disabled
// {...{options:{minDate: "today"}}}
/> />
</dt> </FormGroup>
</Col>
</Row>
</Col>
<div className='search-info-ti d-flex justify-content-between'> <Col className='list-input' md='12'>
<h4 className='ti'>LAANC 승인 사전 결과 확인</h4> <div className='ti'>기체 정보</div>
</div> <Row>
<CustomInput <Col className='list-input' md='12'>
inline <FormGroup>
type='checkbox' <Label for='test'>
id='exampleCustomCheckbox' <span className='necessary'>*</span>
label='승인 처리를 위해 다음 스텝을 진행해주세요.' </Label>
name='aprvlYn' <Input
value='C' type='text'
// checked={true} id='test'
// checked={checkState.all} size='sm'
// onChange={handleChangeCheckbox} placeholder=''
/> disabled
<div className='search-info-box'> />
<Row> </FormGroup>
<Col className='list-input' lg={4} md={4} sm={12}> </Col>
<FormGroup> </Row>
<Label for='test'> </Col>
<span className='necessary'>*</span>
비행시작일자 <Col className='list-input' md='12'>
</Label> <div className='ti'> 승인 사유</div>
<Flatpickr <div className='cancel-box'>내용</div>
className='form-control form-control-sm'
type='text'
id='schFltStDt'
name='schFltStDt'
data-enable-time
// defaultValue={data.schFltStDt}
value={data.schFltStDt}
onChange={date => {
const value =
moment(date[0]).format('YYYY-MM-DD HH:mm:ss') ||
'';
handleChange({
name: 'schFltStDt',
value
});
}}
placeholder='비행 시작일자 선택(클릭)'
disabled
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
비행종료일자
</Label>
<Flatpickr
className='form-control form-control-sm'
type='text'
id='schFltEndDt'
name='schFltEndDt'
data-enable-time
// defaultValue={data.schFltEndDt}
value={data.schFltEndDt}
onChange={date => {
const value =
moment(date[0]).format('YYYY-MM-DD HH:mm:ss') ||
'';
handleChange({
name: 'schFltEndDt',
value
});
}}
disabled
placeholder='비행 종료일자 선택(클릭)'
// {...{options:{minDate: "today"}}}
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='select'
id='fltPurpose'
name='fltPurpose'
value={data.fltPurpose}
bsSize='sm'
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'plan',
name,
value
});
}}
disabled
// innerRef={props.data}
// className={classnames({
// 'is-invalid': props.errors.arcrftTypeCd
// })}
>
{/* TODO CDNOT 코드연동 필요 */}
<option value=''>= 선택 =</option>
<option value='시험비행'>= 시험비행 =</option>
<option value='교육비행'>= 교육비행 =</option>
<option value='사진/영상촬영'>
= 사진/영상촬영 =
</option>
<option value='비행훈련'>= 비행훈련 =</option>
<option value='비행교육'>= 비행교육 =</option>
<option value='비행실기시험'>
= 비행실기시험 =
</option>
</Input>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-box'>
<Row>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='fltElev'
name='fltElev'
// defaultValue={data.email || ''}
value={data.areaList[0].fltElev}
bsSize='sm'
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'area',
name,
value
});
}}
// innerRef={data}
placeholder='100m'
disabled
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='bufferZone'
name='bufferZone'
// defaultValue={data.email || ''}
value={data.areaList[0].bufferZone}
bsSize='sm'
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'area',
name,
value
});
}}
// innerRef={data}
placeholder='100m'
disabled
/>
</FormGroup>
</Col>
<Col className='list-input' lg={4} md={4} sm={12}>
<FormGroup>
<Label for='test'>
<span className='necessary'>*</span>
</Label>
<Input
type='text'
id='fltMethod'
name='fltMethod'
// defaultValue={data.email || ''}
value={data.areaList[0].fltMethod}
bsSize='sm'
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'area',
name,
value
});
}}
// innerRef={data}
placeholder=''
disabled
/>
</FormGroup>
</Col>
</Row>
</div>
<div className='search-info-ti d-flex justify-content-between'>
<h4 className='ti'>조종사 준수사항 처벌 동의 약관</h4>
</div>
<CustomInput
inline
type='checkbox'
id='aprvlYn'
label='조종자 준수사항 미 준수 시 처벌에 동의합니다.'
name='aprvlYn'
value='D'
// checked={true}
// checked={checkState.all}
// onChange={handleChangeCheckbox}
/>
<div className='d-flex align-items-center'>
<Button.Ripple
color='danger'
bsSize='sm'
onClick={() => handleClick(1)}
>
이전
</Button.Ripple>
<Button.Ripple
className='mr-1'
color='primary'
beSize='sm'
//onClick={() => handleClick(3)}
>
다음
</Button.Ripple>
</div>
</dl>
</div>
</Col> </Col>
</Row> </Row>
</Col> </div>
</Row> </ModalBody>
</div> <ModalFooter>
<Button outline color='danger' onClick={() => handlerStep(1)}>
이전
</Button>
<ul className='step'>
<li>
<span className='on'></span>
</li>
<li>
<span className='on'></span>
</li>
<li>
<span></span>
</li>
</ul>
<Button
outline
onClick={() => setDisabledAnimation(!disabledAnimation)}
>
다음
</Button>
</ModalFooter>
</>
); );
}; };
export default Apply; export default Apply;

46
src/views/laanc/FlightPlan.js

@ -40,16 +40,18 @@ const FlightPlan = ({
data, data,
handlerWeather, handlerWeather,
disabledAnimation, disabledAnimation,
setDisabledAnimation setDisabledAnimation,
centeredModal,
setCenteredModal
}) => { }) => {
const user = useSelector(state => state.authState); const { user } = useSelector(state => state.authState);
const [centeredModal, setCenteredModal] = useState(false);
const history = useHistory(); const history = useHistory();
const handlerLaanc = () => { const handlerLaanc = () => {
history.replace('/control'); history.replace('/control');
}; };
console.log('>>', user);
return ( return (
<> <>
@ -77,15 +79,7 @@ const FlightPlan = ({
name='memberName' name='memberName'
size='sm' size='sm'
placeholder='' placeholder=''
value={data.pilotList[0].memberName || ''} value={user.memberName}
onChange={e => {
const { name, value } = e.target;
handleChange({
type: 'pilot',
name,
value
});
}}
disabled disabled
/> />
</FormGroup> </FormGroup>
@ -97,17 +91,16 @@ const FlightPlan = ({
<span className='necessary'>*</span> <span className='necessary'>*</span>
</Label> </Label>
<Input type='select' name='select' size='sm' id='test'> <Input type='select' name='select' size='sm' id='test'>
<option>무인 비행기</option> <option value=''>= 선택 =</option>
<option>무인 헬리콥터</option> <option>상업</option>
<option>무인 멀티콥터</option> <option>비상업</option>
<option>무인 비행선</option>
</Input> </Input>
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' md='12'> <Col className='list-input' md='12'>
<div className='ti'>비행 계획 정보</div> <div className='ti'>비행 계획 정보</div>
<Row> <Row>
<Col className='list-input' md='4'> <Col className='list-input' md='6'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
@ -135,7 +128,7 @@ const FlightPlan = ({
/> />
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' md='4'> <Col className='list-input' md='6'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
@ -164,7 +157,7 @@ const FlightPlan = ({
/> />
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' md='4'> <Col className='list-input' md='12'>
<FormGroup> <FormGroup>
<Label for='test'> <Label for='test'>
<span className='necessary'>*</span> <span className='necessary'>*</span>
@ -324,12 +317,11 @@ const FlightPlan = ({
<span className='necessary'>*</span> <span className='necessary'>*</span>
</Label> </Label>
<Input <Input
type='text' type='select'
id='arcrftTypeCd' id='arcrftTypeCd'
name='arcrftTypeCd' name='arcrftTypeCd'
// defaultValue={data.email || ''}
value={data.arcrftList[0].arcrftTypeCd} value={data.arcrftList[0].arcrftTypeCd}
bsSize='sm' size='sm'
onChange={e => { onChange={e => {
const { name, value } = e.target; const { name, value } = e.target;
handleChange({ handleChange({
@ -338,9 +330,13 @@ const FlightPlan = ({
value value
}); });
}} }}
// innerRef={data} >
placeholder='100m' <option value=''>= 선택 =</option>
/> <option>무인 비행기</option>
<option>무인 헬리콥터</option>
<option>무인 멀티콥터</option>
<option>무인 비행선</option>
</Input>
</FormGroup> </FormGroup>
</Col> </Col>
<Col className='list-input' md='4'> <Col className='list-input' md='4'>

Loading…
Cancel
Save