Browse Source

기체목록 - 기체 본인 외 수정 불가

pull/2/head
junh_eee(이준희) 2 years ago
parent
commit
09c2615f8c
  1. 11
      src/components/basis/dron/BasisDronForm.js
  2. 38
      src/components/basis/dron/BasisDronImage.js
  3. 15
      src/components/basis/dron/BasisDronTab.js
  4. 38
      src/components/basis/dron/BasisIdntform.js
  5. 55
      src/containers/basis/dron/BasisDronDetailContainer.js
  6. 22
      src/containers/basis/dron/BasisIdntfContainer.js

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

@ -91,6 +91,7 @@ export const BasisDronForm = props => {
className={classnames({
'is-invalid': props.errors.prdctNum
})}
disabled={props.isDisabled}
/>
{props.errors && props.errors.prdctNum && (
<FormFeedback>
@ -114,6 +115,7 @@ export const BasisDronForm = props => {
className={classnames({
'is-invalid': props.errors.arcrftModelNm
})}
disabled={props.isDisabled}
/>
{props.errors && props.errors.arcrftModelNm && (
<FormFeedback>
@ -132,10 +134,11 @@ export const BasisDronForm = props => {
name='arcrftTypeCd'
id='arcrftTypeCd'
bsSize='sm'
innerRef={props.data}
innerRef={props.data}
className={classnames({
'is-invalid': props.errors.arcrftTypeCd
})}
disabled={props.isDisabled}
>
<option value=''>= 선택 =</option>
{/* CDNOT 코드연동 필요 */}
@ -176,6 +179,7 @@ export const BasisDronForm = props => {
className={classnames({
'is-invalid': props.errors.wghtTypeCd
})}
disabled={props.isDisabled}
>
{/* CDNOT 코드연동 필요 */}
<option value=''>= 선택 =</option>
@ -217,10 +221,11 @@ export const BasisDronForm = props => {
className={classnames({
'is-invalid': props.errors.cameraYn
})}
disabled={props.isDisabled}
>
<option
value={'Y'}
// selected={
// props.data.cameraYn === 'Y' ? true : false
// }
@ -257,6 +262,7 @@ export const BasisDronForm = props => {
className={classnames({
'is-invalid': props.errors.insrncYn
})}
disabled={props.isDisabled}
>
<option
value={'Y'}
@ -298,6 +304,7 @@ export const BasisDronForm = props => {
className={classnames({
'is-invalid': props.errors.prdctCmpnNm
})}
disabled={props.isDisabled}
/>
{props.errors && props.errors.prdctCmpnNm && (
<FormFeedback>

38
src/components/basis/dron/BasisDronImage.js

@ -1,6 +1,14 @@
import React from 'react';
import { Edit, Image, Trash2 } from 'react-feather';
import { Button, Label, Media, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';
import {
Button,
Label,
Media,
Modal,
ModalHeader,
ModalBody,
ModalFooter
} from 'reactstrap';
export const BasisDronImage = props => {
return (
@ -24,6 +32,7 @@ export const BasisDronImage = props => {
tag={Label}
className='mr-1'
color='primary'
disabled={props.isDisabled}
>
<span className='d-none d-sm-block'>업로드</span>
<span className='d-block d-sm-none'>
@ -41,7 +50,7 @@ export const BasisDronImage = props => {
<Button.Ripple
color={!props.img ? 'secondary' : 'danger'}
onClick={props.handlerImageDelete}
disabled={!props.img}
disabled={!props.img || props.isDisabled}
outline
>
<span className='d-none d-sm-block'>삭제</span>
@ -53,23 +62,32 @@ export const BasisDronImage = props => {
<div className='vertically-centered-modal'>
<Modal
isOpen={props.modal.isOpen}
toggle={() => props.setModal({ ...props.modal, isOpen: !props.modal.isOpen })}
toggle={() =>
props.setModal({ ...props.modal, isOpen: !props.modal.isOpen })
}
modalClassName={props.modal.color}
className='modal-dialog-centered'
>
<ModalHeader
toggle={() => props.setModal({ ...props.modal, isOpen: !props.modal.isOpen })}
toggle={() =>
props.setModal({ ...props.modal, isOpen: !props.modal.isOpen })
}
>
{props.modal.title}
</ModalHeader>
<ModalBody>{props.modal.desc}</ModalBody>
<ModalFooter>
<Button
color='danger'
onClick={() => props.setModal({ ...props.modal, isOpen: !props.modal.isOpen })}
>
확인
</Button>
<Button
color='danger'
onClick={() =>
props.setModal({
...props.modal,
isOpen: !props.modal.isOpen
})
}
>
확인
</Button>
</ModalFooter>
</Modal>
</div>

15
src/components/basis/dron/BasisDronTab.js

@ -1,4 +1,4 @@
import { useState } from 'react';
import { useEffect, useState } from 'react';
import {
Card,
CardBody,
@ -43,6 +43,7 @@ import { BasisDronDetailContainer } from '../../../containers/basis/dron/BasisDr
import { BasisIdntfContainer } from '../../../containers/basis/dron/BasisIdntfContainer';
export const BasisDronTab = props => {
const [activeTab, setActiveTab] = useState('1');
const [isDisabled, setIsDisabled] = useState(false);
const toggle = tab => {
if (activeTab !== tab) setActiveTab(tab);
@ -80,10 +81,18 @@ export const BasisDronTab = props => {
</Nav>
<TabContent activeTab={activeTab}>
<TabPane tabId='1'>
<BasisDronDetailContainer id={props.id} />
<BasisDronDetailContainer
id={props.id}
isDisabled={isDisabled}
setIsDisabled={setIsDisabled}
/>
</TabPane>
<TabPane tabId='2'>
<BasisIdntfContainer id={props.id} />
<BasisIdntfContainer
id={props.id}
isDisabled={isDisabled}
setIsDisabled={setIsDisabled}
/>
</TabPane>
</TabContent>
</CardBody>

38
src/components/basis/dron/BasisIdntform.js

@ -4,44 +4,15 @@ import moment from 'moment';
import {
Row,
Col,
Table,
Badge,
UncontrolledDropdown,
DropdownMenu,
DropdownItem,
DropdownToggle,
Card,
FormFeedback,
CardHeader,
CardBody,
CardTitle,
CardSubtitle,
ButtonGroup,
Button,
Input,
Form,
CustomInput,
FormGroup,
Modal,
ModalHeader,
ModalBody,
ModalFooter,
Label
} from 'reactstrap';
import {
User,
Info,
Share,
X,
Lock,
Edit,
Trash2,
Image,
UserCheck,
Clipboard,
Settings,
AlertTriangle
} from 'react-feather';
import { X } from 'react-feather';
import Repeater from '@components/repeater';
@ -89,11 +60,11 @@ export const BasisIdntfForm = props => {
</span>
</Col>
</Row>
<Repeater count={props.count ? props.count : 0}>
<Repeater count={props.count ? props.count : 0}>
{i => (
<Form key={i}>
<Row className='justify-content-between align-items-center'>
<Col xs={3} md={3} xl={2}>
<Col xs={3} md={3} xl={2}>
<FormGroup className='form-label-group'>
<Label for={`idntfNum.${i}`}>식별번호</Label>
<Input
@ -182,6 +153,7 @@ export const BasisIdntfForm = props => {
)
}
outline
disabled={props.isDisabled}
>
<X size={14} className='mr-50' />
<span>삭제</span>
@ -201,6 +173,7 @@ export const BasisIdntfForm = props => {
color='primary'
size='sm'
onClick={props.addData}
disabled={props.isDisabled}
>
+ 추가
</Button.Ripple>
@ -209,6 +182,7 @@ export const BasisIdntfForm = props => {
color='primary'
size='sm'
onClick={props.handlerSave}
disabled={props.isDisabled}
>
저장
</Button.Ripple>

55
src/containers/basis/dron/BasisDronDetailContainer.js

@ -21,7 +21,10 @@ export const BasisDronDetailContainer = props => {
const titleName = ' 기체 관리';
const [pageType, setPageType] = useState('create');
const validationSchema = yup.object().shape({
arcrftModelNm: yup.string().trim().required('모델명 을 입력해 주세요.')
arcrftModelNm: yup
.string()
.trim()
.required('모델명 을 입력해 주세요.')
.max(20, '최대 20 자 이하 입력 부탁드립니다.')
.matches(
/^[가-힣a-zA-Z0-9][^!@#$%^&*()+\=\[\]{};':"\\|,.<>\/?\s]*$/,
@ -30,19 +33,25 @@ export const BasisDronDetailContainer = props => {
arcrftTypeCd: yup.string().trim().required('종류 를 선택해 주세요.'),
cameraYn: yup.string().trim().required('카메라 탑재여부 를 선택해 주세요.'),
insrncYn: yup.string().trim().required('보험가입 여부를 선택해 주세요.'),
prdctCmpnNm: yup.string().trim().required('제작사 를 입력해 주세요.')
prdctCmpnNm: yup
.string()
.trim()
.required('제작사 를 입력해 주세요.')
.max(20, '최대 20 자 이하 입력 부탁드립니다.')
.matches(
/^[가-힣a-zA-Z0-9][^!@#$%^&*()+\=\[\]{};':"\\|,.<>\/?\s]*$/,
'지원하지 않는 특수문자입니다.'
),
prdctNum: yup.string().trim().required('제작번호 를 입력해 주세요.')
prdctNum: yup
.string()
.trim()
.required('제작번호 를 입력해 주세요.')
.max(20, '최대 20 자 이하 입력 부탁드립니다.')
.matches(
/^[가-힣a-zA-Z0-9][^!@#$%^&*()+\=\[\]{};':"\\|,.<>\/?\s]*$/,
'지원하지 않는 특수문자입니다.'
),
wghtTypeCd: yup.string().trim().required('중량구분 을 선택해 주세요.'),
wghtTypeCd: yup.string().trim().required('중량구분 을 선택해 주세요.')
// ownerNm: yup.string().trim().required('운영자명 을 입력해 주세요.'),
// hpno: yup.string().trim().required('운영자 연락처 를 입력해 주세요.')
});
@ -62,7 +71,7 @@ export const BasisDronDetailContainer = props => {
createDt: '',
createUserId: '',
updateUserId: '',
updateDt: '',
updateDt: ''
// ownerSno: '',
// ownerNm: '',
// hpno: ''
@ -74,7 +83,8 @@ export const BasisDronDetailContainer = props => {
title: '',
desc: '',
color: ''
})
});
useEffect(() => {
if (props.id) {
handlerSearch();
@ -111,6 +121,11 @@ export const BasisDronDetailContainer = props => {
setImageUrl(detail?.imageUrl);
}
}
if (detail?.createUserId) {
if (detail?.createUserId != user?.userId) {
props.setIsDisabled(true);
}
}
}, [selectData, detail]);
const handlerImageChange = e => {
@ -125,7 +140,7 @@ export const BasisDronDetailContainer = props => {
title: '이미지 용량 초과',
desc: '10MB 이하의 파일만 등록 가능합니다',
color: 'modal-danger'
})
});
return;
}
}
@ -184,6 +199,7 @@ export const BasisDronDetailContainer = props => {
img={img}
modal={modal}
setModal={setModal}
isDisabled={props.isDisabled}
/>
</Col>
<Col md={7} lg={9}>
@ -194,6 +210,7 @@ export const BasisDronDetailContainer = props => {
errors={errors}
type={pageType}
updateDt={detail?.updateDt}
isDisabled={props.isDisabled}
/>
</Col>
<Col md='12'>
@ -207,20 +224,22 @@ export const BasisDronDetailContainer = props => {
? handleSubmit(handlerCreate)
: handleSubmit(handlerUpdate)
}
disabled={props.isDisabled}
>
저장
</Button.Ripple>
{pageType != 'create' ?
(
<Button.Ripple color='danger' size='sm' onClick={handlerDelete} >
삭제
</Button.Ripple>
)
:
(
<></>
)
}
{pageType != 'create' ? (
<Button.Ripple
color='danger'
size='sm'
onClick={handlerDelete}
disabled={props.isDisabled}
>
삭제
</Button.Ripple>
) : (
<></>
)}
</div>
</Col>
</Row>

22
src/containers/basis/dron/BasisIdntfContainer.js

@ -8,6 +8,7 @@ export const BasisIdntfContainer = props => {
const { listIdntf, idntfCount, detail, isRefreshIdntf } = useSelector(
state => state.dronState
);
const { user } = useSelector(state => state.authState);
const dispatch = useDispatch();
const [idntfData, setIdntfData] = useState({
@ -28,7 +29,6 @@ export const BasisIdntfContainer = props => {
const [idntDataList, setIdntfDataList] = useState([]);
useEffect(() => {
if (props.id) {
handlerSearch();
}
@ -49,6 +49,14 @@ export const BasisIdntfContainer = props => {
}
}, [isRefreshIdntf]);
useEffect(() => {
if (detail?.createUserId) {
if (detail?.createUserId != user?.userId) {
props.setIsDisabled(true);
}
}
}, [detail]);
const handlerSearch = () => {
dispatch(Actions.IDNTF_LIST.request(props.id));
};
@ -60,10 +68,9 @@ export const BasisIdntfContainer = props => {
let checking = true;
saveArr.forEach(idntf => {
const check_num = /[0-9]/;
const check_kor = /^[가-힣a-zA-Z0-9][^!@#$%^&*()+\=\[\]{};':"\\|,.<>\/?\s]*$/;
const check_kor =
/^[가-힣a-zA-Z0-9][^!@#$%^&*()+\=\[\]{};':"\\|,.<>\/?\s]*$/;
if (!idntf.idntfNum && idntf.idntfNum === '') {
setModal({
@ -110,7 +117,6 @@ export const BasisIdntfContainer = props => {
});
checking = false;
return false;
}
if (!check_num.test(idntf.hpno)) {
setModal({
@ -120,7 +126,6 @@ export const BasisIdntfContainer = props => {
});
checking = false;
return false;
}
});
@ -140,7 +145,6 @@ export const BasisIdntfContainer = props => {
});
return false;
}
};
const handlerDelete = async data => {
@ -148,13 +152,10 @@ export const BasisIdntfContainer = props => {
};
const addData = () => {
setIdntfDataList([...idntDataList, { ...idntfData, id: Math.random() }]);
};
const deletaData = (isSave, id) => {
if (!isSave) {
setIdntfDataList(idntDataList.filter(item => item.id !== id));
} else {
@ -194,6 +195,7 @@ export const BasisIdntfContainer = props => {
deletaData={deletaData}
handlerSave={handlerCreate}
handlerDelete={handlerDelete}
isDisabled={props.isDisabled}
/>
<ErrorModal modal={modal} setModal={setModal} />
</Col>

Loading…
Cancel
Save