diff --git a/src/components/flight/OldOperationApprovalsTable.js b/src/components/flight/OldOperationApprovalsTable.js
new file mode 100644
index 00000000..df145b36
--- /dev/null
+++ b/src/components/flight/OldOperationApprovalsTable.js
@@ -0,0 +1,1523 @@
+import React, { useEffect, useState, useRef } from 'react';
+import { useDispatch, useSelector } from 'react-redux';
+import { Button, Card } from '@component/ui';
+import { openModal } from '@src/redux/features/comn/message/messageSlice';
+import { FaAngleDown, FaAngleUp } from 'react-icons/fa';
+import { Form, Input, Table, Typography } from 'antd';
+import {
+ updateLaancAprv,
+ getLaancAprvList,
+ updateLaancAprvReview
+} from '@src/redux/features/laanc/laancThunk';
+import { ERROR_MESSAGE, ERROR_TITLE } from '@src/configs/msgConst';
+import OperationModal from './OperationModal';
+import ScrollContainer from 'react-indiana-drag-scroll';
+import OperationCheckBoxModal from './OperationCheckBoxModal';
+
+export default function OldOperationApprovalsTable(props) {
+ const dispatch = useDispatch();
+
+ // 비행승인 목록
+ const { laancAprvList, laancElev, laancAprvLoading } = useSelector(
+ state => state.laancState
+ );
+
+ // 승인, 미승인, 비대상 건수
+ const [approvalCdValue, setApprovalCdValue] = useState({
+ S: 0,
+ F: 0,
+ C: 0,
+ U: 0
+ });
+
+ // 체크박스 팝업 테이블 데이터
+ const [checkData, setCheckData] = useState([]);
+
+ const scrollContainerRef = useRef(null);
+
+ // 확장된 행 키
+ const [expandedRowKeys, setExpandedRowKeys] = useState([]);
+
+ // 확장된 행 데이터
+ const [expandedRowDatas, setExpandedRowDatas] = useState([]);
+
+ // 수정 키
+ const [editingKey, setEditingKey] = useState('');
+
+ // select row key
+ const [selectedRowKey, setSelectedRowKey] = useState('');
+
+ const [ismodal, setIsModal] = useState(false);
+
+ const [form] = Form.useForm();
+
+ // 체크박스 선택
+ const [checkList, setCheckList] = useState([]);
+
+ // 체큽작스 모달
+ const [isCheckBoxModal, setIsCheckBoxModal] = useState(false);
+
+ // 수정 키 확인
+ const isEditing = record => record.key === editingKey;
+
+ // 유효성 기체 데이터
+ const [validData, setValidData] = useState();
+
+ useEffect(() => {
+ let approvalCdValue = { S: 0, F: 0, C: 0, U: 0 };
+
+ laancAprvList.map(item => {
+ item.areaList.map(area => {
+ if (area.approvalCd === 'S') {
+ approvalCdValue.S += 1;
+ } else if (area.approvalCd === 'F') {
+ approvalCdValue.F += 1;
+ } else if (area.approvalCd === 'C') {
+ approvalCdValue.C += 1;
+ } else {
+ approvalCdValue.U += 1;
+ }
+ });
+ });
+
+ setApprovalCdValue({
+ F: approvalCdValue.F,
+ S: approvalCdValue.S,
+ C: approvalCdValue.C,
+ U: approvalCdValue.U
+ });
+
+ if (editingKey) {
+ setEditingKey('');
+ }
+ setCheckList([]);
+ }, [laancAprvList]);
+
+ const handlerReviewed = type => {
+ let text = '검토대기';
+ if (type === 'U') {
+ text = '검토불필요';
+ } else if (!type) {
+ text = '검토대기';
+ } else {
+ if (type === 'R') {
+ text = '검토완료';
+ } else if (type === 'W') {
+ text = '검토대기';
+ } else if (type === 'Q') {
+ text = '검토요청';
+ } else if (type === 'A') {
+ text = '검토재요청';
+ } else if (type === 'C') {
+ text = '검토취소';
+ }
+ }
+
+ return text;
+ };
+
+ // 데이터
+ const columns = [
+ {
+ title: (
+ <>
+ 신청
+
+ 번호
+ >
+ ),
+ dataIndex: 'applyNo',
+ align: 'center',
+ width: '60px'
+ },
+ {
+ title: (
+ <>
+ 신청
월
+ >
+ ),
+ dataIndex: 'applyDtMonth',
+ width: '70px',
+ align: 'center',
+ render: text => `${text}월`
+ },
+ {
+ title: (
+ <>
+ 신청
일
+ >
+ ),
+ dataIndex: 'applyDtDay',
+ width: '70px',
+ align: 'center',
+
+ render: text => `${text}일`
+ },
+ {
+ title: (
+ <>
+ 신청
+ 구역 수
+ >
+ ),
+ dataIndex: 'areaList',
+ align: 'center',
+ width: '85px',
+ render: areaList => <>총{areaList.length}건>
+ },
+ {
+ title: <>신청자>,
+ dataIndex: 'applyNm',
+ width: '90px',
+ align: 'center',
+
+ render: text => (text ? text : '-')
+ },
+ {
+ title: (
+ <>
+ 행정
+ 구역 1
+ >
+ ),
+ dataIndex: 'areaList',
+ width: '90px',
+ align: 'center',
+ render: areaList => {
+ return areaList.length <= 1 && areaList[0].addr1
+ ? areaList[0].addr1
+ : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ 행정
+ 구역 2
+ >
+ ),
+ dataIndex: 'areaList',
+ width: '90px',
+ align: 'center',
+ render: areaList => {
+ return areaList.length <= 1 && areaList[0].addr2
+ ? areaList[0].addr2
+ : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ 상세
+
+ 주소
+ >
+ ),
+ dataIndex: 'areaList',
+ width: '100px',
+ align: 'center',
+ render: areaList => {
+ return areaList.length <= 1 && areaList[0].addr3
+ ? areaList[0].addr3
+ : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ 장애물
+
+ 제한 표면
+ >
+ ),
+ dataIndex: 'areaList',
+ width: '100px',
+ align: 'center',
+ render: areaList => {
+ return areaList.length <= 1
+ ? areaList[0]?.limitZoneNm
+ ? areaList[0]?.limitZoneNm
+ : '-'
+ : '-';
+ // return areaList.length <= 1 ? areaList[0].limitZoneNm : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ 중심 좌표
+
+ (위도, 경도)
+ >
+ ),
+ dataIndex: 'areaList',
+ align: 'center',
+ width: '90px',
+ render: areaList => {
+ return areaList.length <= 1 ? (
+ <>
+ {areaList[0].lat.toFixed(5)},
+
+ {areaList[0].lon.toFixed(5)}
+ >
+ ) : (
+ '-'
+ );
+ }
+ },
+ {
+ title: (
+ <>
+ 비행 반경
+
+ (m이내)
+ >
+ ),
+ dataIndex: 'bufferZone',
+ align: 'center',
+ width: '80px',
+ render: (text, record) => {
+ return text ? text : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ 요청 반경
+
+ (m이내)
+ >
+ ),
+ dataIndex: 'reqRadius',
+ align: 'center',
+ width: '80px',
+ editable: true,
+ render: (text, record) => {
+ return text ? text : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ 허용 반경
+
+ (m이내)
+ >
+ ),
+ dataIndex: 'allowRadius',
+ align: 'center',
+ width: '80px',
+ render: (text, record) => {
+ return text ? text : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ 신청 고도
+
+ (m이하)
+ >
+ ),
+ dataIndex: 'fltElev',
+ align: 'center',
+ width: '80px',
+ editable: true,
+ render: (text, record) => {
+ return text ? text : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ 요청 고도
+
+ (m이하)
+ >
+ ),
+ dataIndex: 'reqElev',
+ align: 'center',
+ width: '80px',
+ editable: true,
+ render: (text, record) => {
+ return text ? text : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ 허용 고도
+
+ (m이하)
+ >
+ ),
+ dataIndex: 'fltElevMax',
+ align: 'center',
+ width: '90px',
+ render: (text, record) => {
+ return text || text === 0 ? text : '-';
+ }
+ },
+
+ {
+ title: <>비행 목적>,
+ dataIndex: 'areaList',
+ align: 'center',
+ width: '110px',
+ render: areaList => {
+ return areaList.length <= 1 && areaList[0].purpose
+ ? areaList[0].purpose
+ : '-';
+ }
+ },
+ {
+ title: (
+ <>
+ LAANC
+
+ 검토 결과
+ >
+ ),
+ dataIndex: 'areaList',
+ align: 'center',
+ width: '140px',
+ render: areaList => {
+ const approvalCounts = areaList.reduce(
+ (counts, item) => {
+ if (item.approvalCd === 'U') {
+ counts.unapproved += 1;
+ } else if (item.approvalCd === 'S') {
+ counts.approved += 1;
+ } else if (item.approvalCd === 'C') {
+ counts.conditionalapproval += 1;
+ } else {
+ counts.pending += 1;
+ }
+ return counts;
+ },
+ { unapproved: 0, approved: 0, pending: 0, conditionalapproval: 0 }
+ );
+
+ return (
+ <>
+ {areaList.length > 1 ? (
+ <>
+ 승인: {approvalCounts.approved}건
+ 미승인:
+ {approvalCounts.pending}건
+
+ 조건부승인:{approvalCounts.conditionalapproval}건
+ 비대상:
+ {approvalCounts.unapproved}건
+ >
+ ) : (
+ <>
+ {areaList[0].approvalCd === 'U'
+ ? '비대상'
+ : areaList[0].approvalCd === 'S'
+ ? '승인'
+ : areaList[0].approvalCd === 'C'
+ ? '조건부승인'
+ : '미승인'}
+ >
+ )}
+ >
+ );
+ }
+ },
+ {
+ title: <>더보기>,
+ dataIndex: 'areaList',
+ align: 'center',
+ width: '130px',
+ render: (areaList, record) =>
+ areaList.length > 1 ? (
+
+ ) : (
+ <>->
+ )
+ },
+ {
+ title: '편집',
+ dataIndex: 'planAreaSno',
+ align: 'center',
+ width: '110px',
+ render: (_, record) => {
+ const editable = isEditing(record);
+ return record.areaList.length <= 1 ? (
+ editable ? (
+
+
+ 검토결과
+ >
+ ),
+ dataIndex: 'areaList',
+ align: 'center',
+ width: '130px',
+ render: areaList => {
+ const approvalCounts = areaList.reduce(
+ (counts, item) => {
+ if (item.reviewedType === 'U') {
+ counts.unapproved += 1;
+ } else if (item.reviewedType === 'R') {
+ counts.reviewed += 1;
+ } else if (item.reviewedType === 'Q') {
+ counts.request += 1;
+ } else if (item.reviewedType === 'W') {
+ counts.wait += 1;
+ } else if (item.reviewedType === 'A') {
+ counts.rerequest += 1;
+ } else if (item.reviewedType === 'C') {
+ counts.cancel += 1;
+ }
+ return counts;
+ },
+ {
+ reviewed: 0,
+ wait: 0,
+ cancel: 0,
+ unapproved: 0,
+ request: 0,
+ rerequest: 0
+ }
+ );
+
+ return (
+ <>
+ {areaList.length > 1 ? (
+ <>
+ 검토완료: {approvalCounts.reviewed}건
+ 검토대기:{approvalCounts.wait}건
+ 검토요청:
+ {approvalCounts.request}건
+
+ 검토재요청:
+ {approvalCounts.rerequest}건
+
+ 검토요청취소:
+ {approvalCounts.cancel}건
+
+ 검토불필요:
+ {approvalCounts.unapproved}건
+ >
+ ) : (
+ <>{handlerReviewed(areaList[0].reviewedType)}>
+ )}
+ >
+ );
+ }
+ },
+ {
+ title: (
+ <>
+ 재검토
+ 사유
+ >
+ ),
+ dataIndex: 'reviewedReason',
+ width: '70px',
+ align: 'center',
+
+ render: text => (text ? `${text}` : '-')
+ },
+ {
+ title: '비고',
+ dataIndex: 'areaList',
+ align: 'center',
+ width: '130px',
+ render: (areaList, record) =>
+ areaList.length <= 1 ? (
+
+ ) : (
+ <>->
+ )
+ }
+ ];
+
+ // 확장된 테이블 데이터
+ const expandedRowRender = record => {
+ const childColumns = [
+ {
+ dataIndex: 'applyNo',
+ width: '60px',
+ align: 'center'
+ },
+ {
+ dataIndex: 'applyDtMonth',
+ width: '70px',
+ align: 'center',
+
+ render: text => `${text}월`
+ },
+ {
+ dataIndex: 'applyDtDay',
+ width: '70px',
+ align: 'center',
+ render: text => `${text}일`
+ },
+ {
+ dataIndex: 'zoneNo',
+ align: 'center',
+ width: '85px',
+ render: text => {
+ return <>구역{text}>;
+ }
+ },
+ {
+ dataIndex: 'applyNm',
+ align: 'center',
+ width: '90px',
+ render: text => {
+ return text ? text : '-';
+ }
+ },
+ {
+ dataIndex: 'addr1',
+ align: 'center',
+ width: '90px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+ {
+ dataIndex: 'addr2',
+ align: 'center',
+ width: '90px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+ {
+ dataIndex: 'addr3',
+ align: 'center',
+ width: '100px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+
+ {
+ dataIndex: 'limitZoneNm',
+ align: 'center',
+ width: '100px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+
+ {
+ align: 'center',
+ width: '90px',
+ dataIndex: ['lat', 'lon'],
+ render: (text, record) => {
+ const lat = record.lat;
+ const lon = record.lon;
+ return (
+ <>
+ {lat.toFixed(5)},
+ {lon.toFixed(5)}
+ >
+ );
+ }
+ },
+ {
+ dataIndex: 'bufferZone',
+ align: 'center',
+ width: '80px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+ {
+ dataIndex: 'reqRadius',
+ align: 'center',
+ editable: true,
+ width: '80px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+ {
+ dataIndex: 'allowRadius',
+ align: 'center',
+ width: '80px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+ {
+ dataIndex: 'fltElev',
+ align: 'center',
+ editable: true,
+ width: '80px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+ {
+ dataIndex: 'reqElev',
+ align: 'center',
+ width: '80px',
+ editable: true,
+
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+ {
+ dataIndex: 'fltElevMax',
+ align: 'center',
+ width: '90px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+
+ {
+ dataIndex: 'purpose',
+ align: 'center',
+ width: '110px',
+ render: text => {
+ return text ? text : <>->;
+ }
+ },
+ {
+ dataIndex: 'approvalCd',
+ align: 'center',
+ width: '140px',
+ render: text => (
+ <>
+ {text === 'U'
+ ? '비대상'
+ : text === 'S'
+ ? '승인'
+ : text === 'C'
+ ? '조건부승인'
+ : '미승인'}
+ >
+ )
+ },
+ {
+ dataIndex: '더보기',
+ align: 'center',
+ width: '130px',
+ render: text => {
+ return <>->;
+ }
+ },
+ {
+ dataIndex: 'planAreaSno',
+ align: 'center',
+ width: '110px',
+ render: (_, record) => {
+ const editable = isEditing(record);
+ return editable ? (
+
+