분할패널에서 버튼 비활성화기능 수정
This commit is contained in:
parent
84a3956b02
commit
fb82d2f5a1
|
|
@ -296,6 +296,32 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
|
|||
return false;
|
||||
}, [component.componentConfig?.action, formData, vehicleStatus, statusLoading, component.label]);
|
||||
|
||||
// 🆕 modalDataStore에서 선택된 데이터 확인 (분할 패널 등에서 저장됨)
|
||||
const [modalStoreData, setModalStoreData] = useState<Record<string, any[]>>({});
|
||||
|
||||
// modalDataStore 상태 구독 (실시간 업데이트)
|
||||
useEffect(() => {
|
||||
const actionConfig = component.componentConfig?.action;
|
||||
if (!actionConfig?.requireRowSelection) return;
|
||||
|
||||
// 동적 import로 modalDataStore 구독
|
||||
let unsubscribe: (() => void) | undefined;
|
||||
|
||||
import("@/stores/modalDataStore").then(({ useModalDataStore }) => {
|
||||
// 초기값 설정
|
||||
setModalStoreData(useModalDataStore.getState().dataRegistry);
|
||||
|
||||
// 상태 변경 구독
|
||||
unsubscribe = useModalDataStore.subscribe((state) => {
|
||||
setModalStoreData(state.dataRegistry);
|
||||
});
|
||||
});
|
||||
|
||||
return () => {
|
||||
unsubscribe?.();
|
||||
};
|
||||
}, [component.componentConfig?.action?.requireRowSelection]);
|
||||
|
||||
// 🆕 행 선택 기반 비활성화 조건 계산
|
||||
const isRowSelectionDisabled = useMemo(() => {
|
||||
const actionConfig = component.componentConfig?.action;
|
||||
|
|
@ -311,43 +337,76 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
|
|||
// 선택된 데이터 확인
|
||||
let hasSelection = false;
|
||||
let selectionCount = 0;
|
||||
let selectionSource = "";
|
||||
|
||||
// 1. 자동 감지 모드 또는 특정 소스 모드
|
||||
// 1. 자동 감지 모드 또는 테이블 리스트 모드
|
||||
if (rowSelectionSource === "auto" || rowSelectionSource === "tableList") {
|
||||
// TableList에서 선택된 행 확인 (props로 전달됨)
|
||||
if (selectedRowsData && selectedRowsData.length > 0) {
|
||||
hasSelection = true;
|
||||
selectionCount = selectedRowsData.length;
|
||||
selectionSource = "tableList (selectedRowsData)";
|
||||
}
|
||||
// 또는 selectedRows prop 확인
|
||||
else if (selectedRows && selectedRows.length > 0) {
|
||||
hasSelection = true;
|
||||
selectionCount = selectedRows.length;
|
||||
selectionSource = "tableList (selectedRows)";
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 분할 패널 좌측 선택 데이터 확인
|
||||
if (rowSelectionSource === "auto" || rowSelectionSource === "splitPanelLeft") {
|
||||
// 분할 패널 좌측 선택 데이터 확인
|
||||
if (!hasSelection && splitPanelContext?.selectedLeftData) {
|
||||
hasSelection = true;
|
||||
selectionCount = 1;
|
||||
// SplitPanelContext에서 확인
|
||||
if (splitPanelContext?.selectedLeftData && Object.keys(splitPanelContext.selectedLeftData).length > 0) {
|
||||
if (!hasSelection) {
|
||||
hasSelection = true;
|
||||
selectionCount = 1;
|
||||
selectionSource = "splitPanelLeft (context)";
|
||||
}
|
||||
}
|
||||
|
||||
// 🆕 modalDataStore에서도 확인 (SplitPanelLayoutComponent에서 저장)
|
||||
if (!hasSelection && Object.keys(modalStoreData).length > 0) {
|
||||
// modalDataStore에서 데이터가 있는지 확인
|
||||
for (const [sourceId, items] of Object.entries(modalStoreData)) {
|
||||
if (items && items.length > 0) {
|
||||
hasSelection = true;
|
||||
selectionCount = items.length;
|
||||
selectionSource = `modalDataStore (${sourceId})`;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 플로우 위젯 선택 데이터 확인
|
||||
if (rowSelectionSource === "auto" || rowSelectionSource === "flowWidget") {
|
||||
// 플로우 위젯 선택 데이터 확인
|
||||
if (!hasSelection && flowSelectedData && flowSelectedData.length > 0) {
|
||||
hasSelection = true;
|
||||
selectionCount = flowSelectedData.length;
|
||||
selectionSource = "flowWidget";
|
||||
}
|
||||
}
|
||||
|
||||
// 디버깅 로그
|
||||
console.log("🔍 [ButtonPrimary] 행 선택 체크:", component.label, {
|
||||
rowSelectionSource,
|
||||
hasSelection,
|
||||
selectionCount,
|
||||
selectionSource,
|
||||
hasSplitPanelContext: !!splitPanelContext,
|
||||
selectedLeftData: splitPanelContext?.selectedLeftData,
|
||||
selectedRowsData: selectedRowsData?.length,
|
||||
selectedRows: selectedRows?.length,
|
||||
flowSelectedData: flowSelectedData?.length,
|
||||
modalStoreDataKeys: Object.keys(modalStoreData),
|
||||
});
|
||||
|
||||
// 선택된 데이터가 없으면 비활성화
|
||||
if (!hasSelection) {
|
||||
console.log("🚫 [ButtonPrimary] 행 선택 필요 → 비활성화:", component.label, {
|
||||
rowSelectionSource,
|
||||
hasSelection,
|
||||
});
|
||||
console.log("🚫 [ButtonPrimary] 행 선택 필요 → 비활성화:", component.label);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -362,7 +421,7 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
|
|||
|
||||
console.log("✅ [ButtonPrimary] 행 선택 조건 충족:", component.label, {
|
||||
selectionCount,
|
||||
rowSelectionSource,
|
||||
selectionSource,
|
||||
});
|
||||
return false;
|
||||
}, [
|
||||
|
|
@ -372,6 +431,8 @@ export const ButtonPrimaryComponent: React.FC<ButtonPrimaryComponentProps> = ({
|
|||
selectedRowsData,
|
||||
splitPanelContext?.selectedLeftData,
|
||||
flowSelectedData,
|
||||
splitPanelContext,
|
||||
modalStoreData,
|
||||
]);
|
||||
|
||||
// 확인 다이얼로그 상태
|
||||
|
|
|
|||
|
|
@ -2030,14 +2030,14 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
|
|||
className="border-border flex flex-shrink-0 flex-col border-r"
|
||||
>
|
||||
<Card className="flex flex-col border-0 shadow-none" style={{ height: "100%" }}>
|
||||
<CardHeader
|
||||
<CardHeader
|
||||
className="flex-shrink-0 border-b"
|
||||
style={{
|
||||
style={{
|
||||
height: componentConfig.leftPanel?.panelHeaderHeight || 48,
|
||||
minHeight: componentConfig.leftPanel?.panelHeaderHeight || 48,
|
||||
padding: '0 1rem',
|
||||
display: 'flex',
|
||||
alignItems: 'center'
|
||||
padding: "0 1rem",
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
}}
|
||||
>
|
||||
<div className="flex w-full items-center justify-between">
|
||||
|
|
@ -2521,14 +2521,14 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
|
|||
className="flex flex-shrink-0 flex-col"
|
||||
>
|
||||
<Card className="flex flex-col border-0 shadow-none" style={{ height: "100%" }}>
|
||||
<CardHeader
|
||||
<CardHeader
|
||||
className="flex-shrink-0 border-b"
|
||||
style={{
|
||||
style={{
|
||||
height: componentConfig.rightPanel?.panelHeaderHeight || 48,
|
||||
minHeight: componentConfig.rightPanel?.panelHeaderHeight || 48,
|
||||
padding: '0 1rem',
|
||||
display: 'flex',
|
||||
alignItems: 'center'
|
||||
padding: "0 1rem",
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
}}
|
||||
>
|
||||
<div className="flex w-full items-center justify-between">
|
||||
|
|
|
|||
Loading…
Reference in New Issue