diff options
| -rw-r--r-- | components/form-data/spreadJS-dialog.tsx | 99 |
1 files changed, 65 insertions, 34 deletions
diff --git a/components/form-data/spreadJS-dialog.tsx b/components/form-data/spreadJS-dialog.tsx index 375c097c..272d99be 100644 --- a/components/form-data/spreadJS-dialog.tsx +++ b/components/form-data/spreadJS-dialog.tsx @@ -189,6 +189,11 @@ export function TemplateViewDialog({ }, [columnsJSON]); const isValidTemplate = React.useCallback((template: TemplateItem): boolean => { + // ๐ TMPL_ID ํ์ ๊ฒ์ฆ ์ถ๊ฐ + if (!template || !template.TMPL_ID || typeof template.TMPL_ID !== 'string') { + console.warn('โ ๏ธ Invalid template: missing or invalid TMPL_ID', template); + return false; + } return determineTemplateType(template) !== null; }, [determineTemplateType]); @@ -270,29 +275,43 @@ export function TemplateViewDialog({ if (validTemplates.length > 0 && !selectedTemplateId) { const firstTemplate = validTemplates[0]; - const templateTypeToSet = determineTemplateType(firstTemplate); - setSelectedTemplateId(firstTemplate.TMPL_ID); - setTemplateType(templateTypeToSet); + // ๐ TMPL_ID ๊ฒ์ฆ (isValidTemplate๋ก ํํฐ๋งํ์ผ๋ฏ๋ก ์กด์ฌํด์ผ ํ์ง๋ง ์์ ์ฅ์น) + if (firstTemplate?.TMPL_ID) { + const templateTypeToSet = determineTemplateType(firstTemplate); + setSelectedTemplateId(firstTemplate.TMPL_ID); + setTemplateType(templateTypeToSet); + } else { + console.error('โ First valid template has no TMPL_ID:', firstTemplate); + } } }, [templateData, selectedTemplateId, isValidTemplate, determineTemplateType, columnsJSON]); const handleTemplateChange = (templateId: string) => { - const template = availableTemplates.find(t => t.TMPL_ID === templateId); - if (template) { - const templateTypeToSet = determineTemplateType(template); - setSelectedTemplateId(templateId); - setTemplateType(templateTypeToSet); - setHasChanges(false); - setValidationErrors([]); - - if (currentSpread && template) { - initSpread(currentSpread, template); - } + const template = availableTemplates.find(t => t?.TMPL_ID === templateId); + + // ๐ ํ
ํ๋ฆฟ๊ณผ TMPL_ID ๊ฒ์ฆ + if (!template || !template.TMPL_ID) { + console.error('โ Template not found or invalid TMPL_ID:', templateId); + return; + } + + const templateTypeToSet = determineTemplateType(template); + setSelectedTemplateId(templateId); + setTemplateType(templateTypeToSet); + setHasChanges(false); + setValidationErrors([]); + + if (currentSpread) { + initSpread(currentSpread, template); } }; const selectedTemplate = React.useMemo(() => { - return availableTemplates.find(t => t.TMPL_ID === selectedTemplateId); + const found = availableTemplates.find(t => t?.TMPL_ID === selectedTemplateId); + if (!found && selectedTemplateId) { + console.warn('โ ๏ธ Selected template not found:', selectedTemplateId); + } + return found; }, [availableTemplates, selectedTemplateId]); const editableFields = React.useMemo(() => { @@ -1293,17 +1312,29 @@ export function TemplateViewDialog({ }, [selectedTemplate, templateType, selectedRow, tableData, updateProgress, getSafeActiveSheet, createGrdListTableOptimized, setBatchValues, setBatchStyles, setupSheetProtectionAndEvents, setCellMappings, createCellStyle, isFieldEditable, columnsJSON, setupOptimizedListValidation, parseCellAddress, ensureRowCapacity, getCellAddress]); React.useEffect(() => { - if (!selectedTemplateId) { + // ๐ ์์ ์ฑ ๊ฒ์ฆ: availableTemplates๊ฐ ์๊ณ , selectedTemplateId๊ฐ ์์ ๋๋ง ์คํ + if (!selectedTemplateId && availableTemplates.length > 0) { const only = availableTemplates[0]; + + // ๐ TMPL_ID ๊ฒ์ฆ + if (!only || !only.TMPL_ID) { + console.error('โ First template has no TMPL_ID:', only); + return; + } + const type = determineTemplateType(only); + + // ๐ type์ด null์ด ์๋ ๋๋ง ์งํ + if (!type) { + console.warn('โ ๏ธ Could not determine template type for:', only); + return; + } // ์ ํ๋์ด ์์ง ์๋ค๋ฉด ์๋ ์ ํ - if (selectedTemplateId !== only.TMPL_ID) { - setSelectedTemplateId(only.TMPL_ID); - setTemplateType(type); - } + setSelectedTemplateId(only.TMPL_ID); + setTemplateType(type); - // ์ด๋ฏธ ์คํ๋ ๋๊ฐ ๋ง์ดํธ๋์ด ์๋ค๋ฉด ์ฆ์ ์ด๊ธฐํ(์ ํ ๋ณ๊ฒฝ๋ง์ผ๋ก๋ ๋ฆฌ๋ ๋๋์ง๋ง ์์ ํ๊ฒ ๋ณด๊ฐ) + // ์ด๋ฏธ ์คํ๋ ๋๊ฐ ๋ง์ดํธ๋์ด ์๋ค๋ฉด ์ฆ์ ์ด๊ธฐํ if (currentSpread) { initSpread(currentSpread, only); } @@ -1313,9 +1344,7 @@ export function TemplateViewDialog({ selectedTemplateId, currentSpread, determineTemplateType, - initSpread, - setTemplateType, - setSelectedTemplateId + initSpread ]); const handleSaveChanges = React.useCallback(async () => { @@ -1491,8 +1520,8 @@ export function TemplateViewDialog({ <DialogTitle>SEDP Template - {formCode}</DialogTitle> <DialogDescription> <div className="space-y-3"> - {availableTemplates.length > 0 ? ( - // ํ
ํ๋ฆฟ์ด 2๊ฐ ์ด์์ผ ๋: Select ๋ฐ์ค ํ์ + {availableTemplates.length > 1 ? ( + // ๐ ํ
ํ๋ฆฟ์ด 2๊ฐ ์ด์์ผ ๋: Select ๋ฐ์ค ํ์ <div className="flex items-center gap-4"> <span className="text-sm font-medium">Template:</span> <Select value={selectedTemplateId} onValueChange={handleTemplateChange}> @@ -1500,20 +1529,22 @@ export function TemplateViewDialog({ <SelectValue placeholder="Select a template" /> </SelectTrigger> <SelectContent> - {availableTemplates.map(template => ( - <SelectItem key={template.TMPL_ID} value={template.TMPL_ID}> - {template.NAME} ({template.TMPL_TYPE}) - </SelectItem> - ))} + {availableTemplates + .filter(template => template?.TMPL_ID) // ๐ TMPL_ID๊ฐ ์๋ ๊ฒ๋ง ํ์ + .map(template => ( + <SelectItem key={template.TMPL_ID} value={template.TMPL_ID}> + {template.NAME || 'Unnamed'} ({template.TMPL_TYPE || 'Unknown'}) + </SelectItem> + ))} </SelectContent> </Select> </div> ) : availableTemplates.length === 1 ? ( - // ํ
ํ๋ฆฟ์ด ์ ํํ 1๊ฐ์ผ ๋: ํ
ํ๋ฆฟ ์ด๋ฆ์ ํ
์คํธ๋ก ํ์ + // ๐ ํ
ํ๋ฆฟ์ด ์ ํํ 1๊ฐ์ผ ๋: ํ
ํ๋ฆฟ ์ด๋ฆ์ ํ
์คํธ๋ก ํ์ <div className="flex items-center gap-4"> <span className="text-sm font-medium">Template:</span> <span className="text-sm text-blue-600 font-medium"> - {availableTemplates[0].NAME} ({availableTemplates[0].TMPL_TYPE}) + {availableTemplates[0]?.NAME || 'Unnamed'} ({availableTemplates[0]?.TMPL_TYPE || 'Unknown'}) </span> </div> ) : null} @@ -1581,7 +1612,7 @@ export function TemplateViewDialog({ {selectedTemplate && isClient && isDataValid ? ( <SpreadSheets - key={`${templateType}-${selectedTemplate.TMPL_ID}-${selectedTemplateId}`} + key={`${templateType}-${selectedTemplate?.TMPL_ID || 'unknown'}-${selectedTemplateId}`} workbookInitialized={initSpread} hostStyle={hostStyle} /> |
