행 이동 화면 할당한 상황에서도 가능하게, 코드병합 버튼액션에 추가

This commit is contained in:
leeheejin
2025-11-04 18:31:26 +09:00
parent 66b735e864
commit 82ff18e388
19 changed files with 5655 additions and 245 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -63,6 +63,10 @@ interface RealtimePreviewProps {
children?: React.ReactNode; // 그룹 내 자식 컴포넌트들
// 플로우 선택 데이터 전달용
onFlowSelectedDataChange?: (selectedData: any[], stepId: number | null) => void;
// 테이블 정렬 정보 전달용
sortBy?: string;
sortOrder?: "asc" | "desc";
[key: string]: any; // 추가 props 허용
}
// 영역 레이아웃에 따른 아이콘 반환
@@ -225,6 +229,9 @@ export const RealtimePreviewDynamic: React.FC<RealtimePreviewProps> = ({
onGroupToggle,
children,
onFlowSelectedDataChange,
sortBy,
sortOrder,
...restProps
}) => {
const { user } = useAuth();
const { type, id, position, size, style = {} } = component;
@@ -545,7 +552,13 @@ export const RealtimePreviewDynamic: React.FC<RealtimePreviewProps> = ({
{/* 위젯 타입 - 동적 렌더링 (파일 컴포넌트 제외) */}
{type === "widget" && !isFileComponent(component) && (
<div className="pointer-events-none h-full w-full">
<WidgetRenderer component={component} isDesignMode={isDesignMode} />
<WidgetRenderer
component={component}
isDesignMode={isDesignMode}
sortBy={sortBy}
sortOrder={sortOrder}
{...restProps}
/>
</div>
)}

View File

@@ -54,6 +54,11 @@ interface RealtimePreviewProps {
// 폼 데이터 관련 props
formData?: Record<string, any>;
onFormDataChange?: (fieldName: string, value: any) => void;
// 테이블 정렬 정보
sortBy?: string;
sortOrder?: "asc" | "desc";
columnOrder?: string[];
}
// 동적 위젯 타입 아이콘 (레지스트리에서 조회)
@@ -109,6 +114,9 @@ export const RealtimePreviewDynamic: React.FC<RealtimePreviewProps> = ({
onFlowSelectedDataChange,
refreshKey,
onRefresh,
sortBy,
sortOrder,
columnOrder,
flowRefreshKey,
onFlowRefresh,
formData,
@@ -395,6 +403,9 @@ export const RealtimePreviewDynamic: React.FC<RealtimePreviewProps> = ({
onFlowRefresh={onFlowRefresh}
formData={formData}
onFormDataChange={onFormDataChange}
sortBy={sortBy}
sortOrder={sortOrder}
columnOrder={columnOrder}
/>
</div>

View File

@@ -270,6 +270,7 @@ export const ButtonConfigPanel: React.FC<ButtonConfigPanelProps> = ({
<SelectItem value="excel_download"> </SelectItem>
<SelectItem value="excel_upload"> </SelectItem>
<SelectItem value="barcode_scan"> </SelectItem>
<SelectItem value="code_merge"> </SelectItem>
</SelectContent>
</Select>
</div>
@@ -838,6 +839,53 @@ export const ButtonConfigPanel: React.FC<ButtonConfigPanelProps> = ({
</div>
)}
{/* 코드 병합 액션 설정 */}
{(component.componentConfig?.action?.type || "save") === "code_merge" && (
<div className="mt-4 space-y-4 rounded-lg border bg-muted/50 p-4">
<h4 className="text-sm font-medium text-foreground">🔀 </h4>
<div>
<Label htmlFor="merge-column-name">
<span className="text-destructive">*</span>
</Label>
<Input
id="merge-column-name"
placeholder="예: item_code, product_id"
value={config.action?.mergeColumnName || ""}
onChange={(e) => onUpdateProperty("componentConfig.action.mergeColumnName", e.target.value)}
className="h-8 text-xs"
/>
<p className="mt-1 text-xs text-muted-foreground">
(: item_code). .
</p>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="merge-show-preview"> </Label>
<p className="text-xs text-muted-foreground"> </p>
</div>
<Switch
id="merge-show-preview"
checked={config.action?.mergeShowPreview !== false}
onCheckedChange={(checked) => onUpdateProperty("componentConfig.action.mergeShowPreview", checked)}
/>
</div>
<div className="rounded-md bg-blue-50 p-3 dark:bg-blue-950">
<p className="text-xs text-blue-900 dark:text-blue-100">
<strong> :</strong>
<br />
1.
<br />
2.
<br />
3. ,
</p>
</div>
</div>
)}
{/* 제어 기능 섹션 */}
<div className="mt-8 border-t border-border pt-6">
<ImprovedButtonControlConfigPanel component={component} onUpdateProperty={onUpdateProperty} />