Skip to content

Commit c185cda

Browse files
committed
fix: xml import fixes
1 parent c2fba73 commit c185cda

3 files changed

Lines changed: 61 additions & 35 deletions

File tree

src/app/new.state/xml/xml.effects.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -338,13 +338,24 @@ export class XmlEffects {
338338
return this.actions$.pipe(
339339
ofType(XmlManipulationActions.startImportMetadata),
340340
switchMap(({ importedXmlString, variableTemplate }) => {
341-
const xml = ddiService.XMLtoJSON(importedXmlString);
342-
return of(
343-
XmlManipulationActions.importConversionSuccess({
344-
importDdiData: xml,
345-
variableTemplate,
346-
}),
347-
);
341+
try {
342+
const xml = ddiService.XMLtoJSON(importedXmlString);
343+
return of(
344+
XmlManipulationActions.importConversionSuccess({
345+
importDdiData: xml,
346+
variableTemplate,
347+
}),
348+
);
349+
} catch (error) {
350+
return of(
351+
XmlManipulationActions.importConversionError({
352+
error:
353+
error instanceof Error
354+
? error.message
355+
: 'Failed to parse imported XML file',
356+
}),
357+
);
358+
}
348359
}),
349360
);
350361
},

src/app/new.state/xml/xml.reducer.ts

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -115,36 +115,48 @@ export const xmlReducer = createReducer(
115115
const variables = duplicateState.dataset?.codeBook.dataDscr.var || [];
116116
let variableGroups =
117117
duplicateState.dataset?.codeBook.dataDscr.varGrp || [];
118-
if (duplicateState.dataset && variables.length) {
119-
const variablesMatched: MatchVariables = matchVariableIDs(
120-
importDdiData.codeBook.dataDscr.var,
121-
variables,
122-
);
123-
duplicateState.dataset.codeBook.dataDscr.var = createNewVariables(
118+
119+
// Validate imported DDI structure before accessing
120+
const importedVariables = importDdiData?.codeBook?.dataDscr?.var;
121+
if (!duplicateState.dataset || !variables.length || !importedVariables) {
122+
return { ...duplicateState };
123+
}
124+
125+
// Normalize single-element to array for fast-xml-parser
126+
const importedVariablesArray = Array.isArray(importedVariables)
127+
? importedVariables
128+
: [importedVariables];
129+
130+
const variablesMatched: MatchVariables = matchVariableIDs(
131+
importedVariablesArray,
132+
variables,
133+
);
134+
duplicateState.dataset.codeBook.dataDscr.var = createNewVariables(
135+
variablesMatched,
136+
variables,
137+
variableTemplate,
138+
);
139+
if (variableTemplate.groups) {
140+
const importedVariableGroups =
141+
importDdiData.codeBook.dataDscr.varGrp || [];
142+
variableGroups = updateGroups(
143+
Array.isArray(importedVariableGroups)
144+
? importedVariableGroups
145+
: [importedVariableGroups],
124146
variablesMatched,
125-
variables,
126-
variableTemplate,
127147
);
128-
if (variableTemplate.groups) {
129-
const importedVariableGroups = importDdiData.codeBook.dataDscr.varGrp
130-
? importDdiData.codeBook.dataDscr.varGrp
131-
: [];
132-
variableGroups = updateGroups(
133-
Array.isArray(importedVariableGroups)
134-
? importedVariableGroups
135-
: [importedVariableGroups],
136-
variablesMatched,
137-
);
138-
}
139-
duplicateState.info
140-
? (duplicateState.info.importedSuccess = true)
141-
: {
142-
siteURL: '',
143-
fileID: '',
144-
apiKey: '',
145-
importedSuccess: true,
146-
};
148+
duplicateState.dataset.codeBook.dataDscr.varGrp = variableGroups;
149+
}
150+
151+
if (duplicateState.info) {
152+
duplicateState.info.importedSuccess = true;
153+
} else {
154+
duplicateState.info = {
155+
secureUploadUrl: null,
156+
importedSuccess: true,
157+
};
147158
}
159+
148160
return {
149161
...duplicateState,
150162
};

src/app/new.state/xml/xml.util.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,10 @@ export function updateGroups(
423423
const newVars: string[] = [];
424424
if (groupVariables.length) {
425425
groupVariables.forEach((variable) => {
426-
newVars.push(flipMatched[variable]);
426+
const mapped = flipMatched[variable];
427+
if (mapped !== undefined) {
428+
newVars.push(mapped);
429+
}
427430
});
428431
}
429432
duplicateVariableGroups.push({

0 commit comments

Comments
 (0)