st: feat:
- compact grid(1/2 넓이) & split grid(1/2 넓이 2개) 컴포넌트 추가 - 시설별 설치 현황 관리 버튼 추가 - 통계입력현황(검토) 컴포넌트 & 컬럼 파일 오타 수정
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
import { Button } from "@common/components";
|
||||
|
||||
interface InstallationStatusButtonProps {
|
||||
installationStatusFunc: () => void;
|
||||
}
|
||||
|
||||
const InstallationStatusButton = ({ installationStatusFunc }: InstallationStatusButtonProps) => {
|
||||
return (
|
||||
<Button className="h-[3.2rem] w-[176px]" color="lightGray" onClick={installationStatusFunc}>
|
||||
<i className="diveicon di-server-line"></i>
|
||||
<span>시설별 설치 현황관리</span>
|
||||
</Button>
|
||||
);
|
||||
};
|
||||
|
||||
export default InstallationStatusButton;
|
||||
@@ -3,7 +3,7 @@ import { ValueType } from "realgrid"
|
||||
|
||||
import RealGrid, { GridFitStyle } from "realgrid"
|
||||
import { RealGridReact, RGDataColumn } from "realgrid-react"
|
||||
import type { TabDataGridProps } from "../type/DataGrid.type"
|
||||
import type { TabDataGridProps, ColumnInfo } from "../type/DataGrid.type"
|
||||
import JSZip from "jszip"
|
||||
import * as XLSX from "xlsx"
|
||||
import { useAlertStore } from "@/shared/lib";
|
||||
@@ -11,6 +11,7 @@ import { useTabStore } from "@/store/tab-store"
|
||||
|
||||
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@common/components";
|
||||
import { Button } from "@common/components";
|
||||
import SplitDataGrid from "./SplitDataGrid";
|
||||
|
||||
// RealGrid 타입 확장
|
||||
declare module "realgrid" {
|
||||
@@ -281,6 +282,61 @@ const TabDataGrid = ({ columnInfo, isExcelImport = true, isExcelExport = true, r
|
||||
|
||||
{columnInfo.map((info) => {
|
||||
const tabKey = info.tabKey;
|
||||
|
||||
// isSplitGrid가 true이고 left, right가 있으면 SplitDataGrid 사용
|
||||
if (info.isSplitGrid && info.left && info.right) {
|
||||
const leftRowData = rowDataMap.get(info.left.tabKey || `${tabKey}_left`) || [];
|
||||
const rightRowData = rowDataMap.get(info.right.tabKey || `${tabKey}_right`) || [];
|
||||
|
||||
// ColumnInfoList를 ColumnInfo로 변환
|
||||
const leftColumnInfo: ColumnInfo = {
|
||||
columns: info.left.columns || [],
|
||||
columnLayout: info.left.columnLayout || []
|
||||
};
|
||||
const rightColumnInfo: ColumnInfo = {
|
||||
columns: info.right.columns || [],
|
||||
columnLayout: info.right.columnLayout || []
|
||||
};
|
||||
|
||||
return (
|
||||
<TabsContent key={tabKey} value={tabKey}>
|
||||
<SplitDataGrid
|
||||
leftColumnInfo={leftColumnInfo}
|
||||
rightColumnInfo={rightColumnInfo}
|
||||
leftFixedColumns={info.left.fixedColumns}
|
||||
rightFixedColumns={info.right.fixedColumns}
|
||||
showHeaderCheckbox={showHeaderCheckbox}
|
||||
leftRowData={leftRowData}
|
||||
rightRowData={rightRowData}
|
||||
setLeftRowData={(updater) => {
|
||||
setRowDataMap(prev => {
|
||||
const newMap = new Map(prev);
|
||||
const leftTabKey = info.left?.tabKey || `${tabKey}_left`;
|
||||
const currentData = newMap.get(leftTabKey) || [];
|
||||
const newData = typeof updater === 'function' ? updater(currentData) : updater;
|
||||
newMap.set(leftTabKey, newData);
|
||||
return newMap;
|
||||
});
|
||||
}}
|
||||
setRightRowData={(updater) => {
|
||||
setRowDataMap(prev => {
|
||||
const newMap = new Map(prev);
|
||||
const rightTabKey = info.right?.tabKey || `${tabKey}_right`;
|
||||
const currentData = newMap.get(rightTabKey) || [];
|
||||
const newData = typeof updater === 'function' ? updater(currentData) : updater;
|
||||
newMap.set(rightTabKey, newData);
|
||||
return newMap;
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</TabsContent>
|
||||
);
|
||||
}
|
||||
|
||||
// 일반 그리드 사용
|
||||
if (!info.columns || !info.columnLayout) {
|
||||
return null;
|
||||
}
|
||||
const { columns, columnLayout } = info;
|
||||
const currentRowData = rowDataMap.get(tabKey) || [];
|
||||
|
||||
@@ -334,7 +390,7 @@ const TabDataGrid = ({ columnInfo, isExcelImport = true, isExcelExport = true, r
|
||||
if (!gridView) return;
|
||||
|
||||
const currentInfo = columnInfo.find(info => info.tabKey === tabKey);
|
||||
if (!currentInfo) return;
|
||||
if (!currentInfo || !currentInfo.columns) return;
|
||||
|
||||
gridView.setDisplayOptions({
|
||||
fitStyle: GridFitStyle.EVEN
|
||||
|
||||
@@ -1,21 +1,18 @@
|
||||
import { useState } from "react";
|
||||
import SearchForm from "@/components/module/SearchForm";
|
||||
import { TabDataGrid } from '@rsone/components';
|
||||
// import { TabDataGrid } from '@rsone/components';
|
||||
import TabDataGrid from "@/components/module/TabDataGrid";
|
||||
import SubmitButton from "@/components/button/SumitButton";
|
||||
import SaveButton from "@/components/button/SaveButton";
|
||||
import LastYearDataButton from "@/components/button/LastYearDataButton";
|
||||
import SubmitExceptionButton from "@/components/button/SubmitExceptionButton";
|
||||
import OperateDateButton from "@/components/button/OperateDataButton";
|
||||
|
||||
import { RegionalFacilityStatusInpColumn } from "@/components/util/column/input/sewagePipe/RegionalFacilityStatusInpColumn";
|
||||
import { FacilityInstallStatusInpColumn } from "@/components/util/column/input/sewagePipe/FacilityInstallStatusInpColumn";
|
||||
import { PipeTypeStatusInpColumn } from "@/components/util/column/input/sewagePipe/PipeTypeStatusInpColumn";
|
||||
import { PipeDiameterStatusInpColumn } from "@/components/util/column/input/sewagePipe/PipeDiameterStatusInpColumn";
|
||||
import { ManholeStatusInpColumn } from "@/components/util/column/input/sewagePipe/ManholeStatusInpColumn";
|
||||
import {
|
||||
AdminAreaConnectionInpColumn,
|
||||
TreatmentPlantConnectionInpColumn
|
||||
} from "@/components/util/column/input/sewagePipe/ConnectionStatusInpColumn";
|
||||
import { ConnectionStatusInpColumn } from "@/components/util/column/input/sewagePipe/ConnectionStatusInpColumn";
|
||||
|
||||
// 하수도 통계 관리 > 02. 하수관로
|
||||
const SewagePipeInp = () => {
|
||||
@@ -27,9 +24,7 @@ const SewagePipeInp = () => {
|
||||
PipeTypeStatusInpColumn,
|
||||
PipeDiameterStatusInpColumn,
|
||||
ManholeStatusInpColumn,
|
||||
// 일단 각 tab으로 구현
|
||||
AdminAreaConnectionInpColumn,
|
||||
TreatmentPlantConnectionInpColumn
|
||||
ConnectionStatusInpColumn,
|
||||
];
|
||||
|
||||
const SubmitExceptionFunc = () => {
|
||||
|
||||
+4
-4
@@ -6,9 +6,9 @@ import ReviewOpinionButton from "@/components/button/ReviewOpinionButton";
|
||||
import ReturnButton from "@/components/button/ReturnButton";
|
||||
import { useState } from "react";
|
||||
|
||||
import { StatsInputSatusInfoList } from "@/components/util/column/review/StatsInputSatusColumnRvw";
|
||||
import { StatsInputStatusInfoList } from "@/components/util/column/review/StatsInputStatusColumnRvw";
|
||||
|
||||
const StatsInputSatusRvw = () => {
|
||||
const StatsInputStatusRvw = () => {
|
||||
|
||||
const approveFunc = () => {
|
||||
console.log('approveFunc');
|
||||
@@ -37,9 +37,9 @@ const StatsInputSatusRvw = () => {
|
||||
<ReturnButton returnFunc={returnFunc} />
|
||||
<SaveButton saveFunc={saveFunc} />
|
||||
</div>
|
||||
<DataGrid columnInfo={StatsInputSatusInfoList} isExcelImport={false} rowStartNum={2} fixedColumns={2} rowData={rowData} setRowData={setRowData} />
|
||||
<DataGrid columnInfo={StatsInputStatusInfoList} isExcelImport={false} rowStartNum={2} fixedColumns={2} rowData={rowData} setRowData={setRowData} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default StatsInputSatusRvw;
|
||||
export default StatsInputStatusRvw;
|
||||
@@ -56,11 +56,14 @@ export type ColumnInfo = {
|
||||
|
||||
export type ColumnInfoList = {
|
||||
tabKey: string; // 탭을 식별하는 고유 키 (필수), server(api)에 전송할 변수 값
|
||||
columns: ColumnConfig[];
|
||||
columnLayout: ColumnLayoutItem[];
|
||||
columns?: ColumnConfig[]; // 일반 그리드용 (isSplitGrid가 false일 때)
|
||||
columnLayout?: ColumnLayoutItem[]; // 일반 그리드용 (isSplitGrid가 false일 때)
|
||||
rowStartNum?: number;
|
||||
fixedColumns?: number;
|
||||
tabLabel?: string; // 탭에 표시될 레이블
|
||||
isSplitGrid?: boolean; // 5:5 분리형 그리드 유무
|
||||
left?: ColumnInfoList; // SplitDataGrid용 왼쪽 그리드 정보
|
||||
right?: ColumnInfoList; // SplitDataGrid용 오른쪽 그리드 정보
|
||||
}
|
||||
|
||||
export type DataGridProps = {
|
||||
@@ -84,6 +87,7 @@ export type TabDataGridProps = {
|
||||
showHeaderCheckbox?: boolean; // 헤더 체크박스 표시 여부 (기본값: true)
|
||||
rowDataMap: Map<string, Record<string, string | number>[]>;
|
||||
setRowDataMap: React.Dispatch<React.SetStateAction<Map<string, Record<string, string | number>[]>>>;
|
||||
isSplitGrid?: boolean; // 5:5 분리형 그리드 유무
|
||||
};
|
||||
|
||||
export type SplitDataGridProps = {
|
||||
|
||||
@@ -30,7 +30,7 @@ export const AdminAreaConnectionInpColumn = {
|
||||
};
|
||||
|
||||
// Tab 6-2: 하수처리장별 연결 현황 (왼쪽 그리드)
|
||||
export const TreatmentPlantConnectionInpColumn = {
|
||||
export const TreatPlantConnectionInpColumn = {
|
||||
columns: [
|
||||
// 하수처리장 정보
|
||||
{ name: 'bscFctNm', fieldName: '하수처리장명', header: { text: '하수처리장명' } },
|
||||
@@ -52,4 +52,12 @@ export const TreatmentPlantConnectionInpColumn = {
|
||||
fixedColumns: 1,
|
||||
tabKey: 'treatmentPlantConnectionInp',
|
||||
tabLabel: '하수처리장별 연결 현황'
|
||||
};
|
||||
|
||||
export const ConnectionStatusInpColumn = {
|
||||
tabKey: 'treatmentPlantConnectionInp',
|
||||
tabLabel: '시설별 현황 관리',
|
||||
isSplitGrid: true,
|
||||
left: AdminAreaConnectionInpColumn,
|
||||
right: TreatPlantConnectionInpColumn,
|
||||
};
|
||||
+1
-1
@@ -34,7 +34,7 @@ const rawStatsInputStatusList = {
|
||||
]
|
||||
};
|
||||
|
||||
export const StatsInputSatusInfoList = {
|
||||
export const StatsInputStatusInfoList = {
|
||||
...rawStatsInputStatusList,
|
||||
columns: rawStatsInputStatusList.columns.map(col => ({
|
||||
...col,
|
||||
Reference in New Issue
Block a user