Fix export/import validation missing categories, dialog now always clears json and file selection on open/close

This commit is contained in:
2026-02-01 20:06:12 +00:00
parent b9a2489225
commit b67bfa7687
2 changed files with 55 additions and 37 deletions

View File

@@ -112,6 +112,7 @@ const DataManagementModal: React.FC<DataManagementModalProps> = ({
const [jsonValidationMessage, setJsonValidationMessage] = useState<{
type: 'success' | 'error' | null;
message: string;
warnings?: string[];
}>({ type: null, message: '' });
// Clipboard feedback
@@ -119,23 +120,25 @@ const DataManagementModal: React.FC<DataManagementModalProps> = ({
// Reset editor when modal opens/closes
React.useEffect(() => {
if (isOpen) {
// Load current app data into editor when opening
const appState = {
pkParams,
days,
therapeuticRange,
doseIncrement,
uiSettings,
steadyStateConfig: { daysOnMedication: pkParams.advanced.steadyStateDays },
};
const exportData = exportSettings(appState, exportOptions, APP_VERSION);
const jsonString = JSON.stringify(exportData, null, 2);
setJsonEditorContent(jsonString);
setJsonEditorExpanded(true);
validateJsonContent(jsonString);
} else {
// Clear editor when closing
// TODO nice to have: use can decide behavior via checkbox (near editor)
// if (isOpen) {
// // Load current app data into editor when opening
// const appState = {
// pkParams,
// days,
// therapeuticRange,
// doseIncrement,
// uiSettings,
// steadyStateConfig: { daysOnMedication: pkParams.advanced.steadyStateDays },
// };
// const exportData = exportSettings(appState, exportOptions, APP_VERSION);
// const jsonString = JSON.stringify(exportData, null, 2);
// setJsonEditorContent(jsonString);
// setJsonEditorExpanded(true);
// validateJsonContent(jsonString);
// } else {
// Clear/collapse editor and clear upload file ref when opening/closing
setJsonEditorContent('');
setJsonEditorExpanded(false);
setJsonValidationMessage({ type: null, message: '' });
@@ -143,7 +146,6 @@ const DataManagementModal: React.FC<DataManagementModalProps> = ({
if (fileInputRef.current) {
fileInputRef.current.value = '';
}
}
}, [isOpen]);
if (!isOpen) return null;
@@ -300,9 +302,11 @@ const DataManagementModal: React.FC<DataManagementModalProps> = ({
}
if (validation.warnings.length > 0) {
// Show success with warnings - warnings will be displayed separately
setJsonValidationMessage({
type: 'success',
message: t('jsonValidationSuccess') + ' ⚠️ ' + validation.warnings.length + ' warnings',
message: t('jsonValidationSuccess'),
warnings: validation.warnings,
});
return;
}
@@ -734,6 +738,7 @@ const DataManagementModal: React.FC<DataManagementModalProps> = ({
/>
{jsonValidationMessage.type && (
<div className="space-y-2">
<div
className={`flex items-center gap-2 text-sm ${
jsonValidationMessage.type === 'success'
@@ -742,12 +747,25 @@ const DataManagementModal: React.FC<DataManagementModalProps> = ({
}`}
>
{jsonValidationMessage.type === 'success' ? (
<Check className="h-4 w-4" />
<Check className="h-4 w-4 flex-shrink-0" />
) : (
<X className="h-4 w-4" />
<X className="h-4 w-4 flex-shrink-0" />
)}
<span>{jsonValidationMessage.message}</span>
</div>
{jsonValidationMessage.warnings && jsonValidationMessage.warnings.length > 0 && (
<div className="space-y-1.5">
{jsonValidationMessage.warnings.map((warning, index) => (
<div
key={index}
className="bg-yellow-500 text-white text-xs p-2 rounded-md"
>
{warning}
</div>
))}
</div>
)}
</div>
)}
<div className="flex gap-2">

View File

@@ -219,7 +219,7 @@ export const validateImportData = (data: any): ImportValidationResult => {
// Validate advanced settings
if (importData.advancedSettings !== undefined) {
const validCategories = ['standardVd', 'weightBasedVd', 'foodEffect', 'urinePh', 'fOral', 'steadyStateDays'];
const validCategories = ['standardVd', 'weightBasedVd', 'foodEffect', 'urinePh', 'fOral', 'steadyStateDays', 'ageGroup', 'renalFunction'];
const importedCategories = Object.keys(importData.advancedSettings);
const unknownCategories = importedCategories.filter(c => !validCategories.includes(c));
if (unknownCategories.length > 0) {