feat(UniversalFormModal): 저장 버튼 표시 설정 옵션 추가

ConfigPanel에 showSaveButton 체크박스 추가
체크 해제 시 모달 하단 저장 버튼 숨김 가능
SaveSettingsModal SelectItem key 중복 해결
서브 테이블 삭제 버튼 클릭 이벤트 충돌 수정
This commit is contained in:
SeongHyun Kim 2025-12-22 14:36:13 +09:00
parent f38447be8e
commit 6a4ebf362c
2 changed files with 35 additions and 19 deletions

View File

@ -4,6 +4,7 @@ import React, { useState, useEffect, useCallback } from "react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Checkbox } from "@/components/ui/checkbox";
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion";
import { Badge } from "@/components/ui/badge";
@ -334,6 +335,21 @@ export function UniversalFormModalConfigPanel({ config, onChange }: UniversalFor
<HelpText> </HelpText>
</div>
{/* 저장 버튼 표시 설정 */}
<div className="w-full min-w-0">
<div className="flex items-center gap-2">
<Checkbox
id="show-save-button"
checked={config.modal.showSaveButton !== false}
onCheckedChange={(checked) => updateModalConfig({ showSaveButton: checked === true })}
/>
<Label htmlFor="show-save-button" className="text-xs font-medium cursor-pointer">
</Label>
</div>
<HelpText> </HelpText>
</div>
<div className="space-y-3 w-full min-w-0">
<div className="w-full min-w-0">
<Label className="text-xs font-medium mb-1.5 block"> </Label>

View File

@ -217,8 +217,8 @@ export function SaveSettingsModal({
const repeatSections = sections.filter((s) => s.repeatable);
// 모든 필드 목록 (반복 섹션 포함)
const getAllFields = (): { columnName: string; label: string; sectionTitle: string }[] => {
const fields: { columnName: string; label: string; sectionTitle: string }[] = [];
const getAllFields = (): { columnName: string; label: string; sectionTitle: string; sectionId: string }[] => {
const fields: { columnName: string; label: string; sectionTitle: string; sectionId: string }[] = [];
sections.forEach((section) => {
// 필드 타입 섹션만 처리 (테이블 타입은 fields가 undefined)
if (section.fields && Array.isArray(section.fields)) {
@ -227,6 +227,7 @@ export function SaveSettingsModal({
columnName: field.columnName,
label: field.label,
sectionTitle: section.title,
sectionId: section.id,
});
});
}
@ -550,8 +551,8 @@ export function SaveSettingsModal({
return (
<Accordion key={subIndex} type="single" collapsible>
<AccordionItem value={`sub-${subIndex}`} className="border rounded-lg bg-orange-50/30">
<AccordionTrigger className="px-3 py-2 text-xs hover:no-underline">
<div className="flex items-center justify-between flex-1">
<div className="flex items-center justify-between px-3 py-2">
<AccordionTrigger className="flex-1 text-xs hover:no-underline p-0">
<div className="flex items-center gap-2">
<span className="font-medium">
{subIndex + 1}: {subTable.tableName || "(미설정)"}
@ -560,19 +561,18 @@ export function SaveSettingsModal({
({subTable.fieldMappings?.length || 0} )
</span>
</div>
<Button
size="sm"
variant="ghost"
onClick={(e) => {
e.stopPropagation();
removeSubTable(subIndex);
}}
className="h-5 w-5 p-0 text-destructive hover:text-destructive mr-2"
>
<Trash2 className="h-3 w-3" />
</Button>
</div>
</AccordionTrigger>
</AccordionTrigger>
<button
type="button"
onClick={(e) => {
e.stopPropagation();
removeSubTable(subIndex);
}}
className="h-5 w-5 p-0 text-destructive hover:text-destructive/80 ml-2 inline-flex items-center justify-center"
>
<Trash2 className="h-3 w-3" />
</button>
</div>
<AccordionContent className="px-3 pb-3 space-y-3">
<div>
<Label className="text-[10px]"> </Label>
@ -755,8 +755,8 @@ export function SaveSettingsModal({
<SelectValue placeholder="필드 선택" />
</SelectTrigger>
<SelectContent>
{allFields.map((field) => (
<SelectItem key={field.columnName} value={field.columnName}>
{allFields.map((field, fieldIndex) => (
<SelectItem key={`${field.sectionId}-${field.columnName}-${fieldIndex}`} value={field.columnName}>
{field.label} ({field.sectionTitle})
</SelectItem>
))}