summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--components/form-data/spreadJS-dialog.tsx99
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}
/>