Fix export/import validation missing categories, dialog now always clears json and file selection on open/close
This commit is contained in:
@@ -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,30 +120,31 @@ 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
|
||||
setJsonEditorContent('');
|
||||
setJsonEditorExpanded(false);
|
||||
setJsonValidationMessage({ type: null, message: '' });
|
||||
setSelectedFile(null);
|
||||
if (fileInputRef.current) {
|
||||
// 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: '' });
|
||||
setSelectedFile(null);
|
||||
if (fileInputRef.current) {
|
||||
fileInputRef.current.value = '';
|
||||
}
|
||||
}
|
||||
}, [isOpen]);
|
||||
|
||||
@@ -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,19 +738,33 @@ const DataManagementModal: React.FC<DataManagementModalProps> = ({
|
||||
/>
|
||||
|
||||
{jsonValidationMessage.type && (
|
||||
<div
|
||||
className={`flex items-center gap-2 text-sm ${
|
||||
jsonValidationMessage.type === 'success'
|
||||
? 'text-green-600 dark:text-green-400'
|
||||
: 'text-red-600 dark:text-red-400'
|
||||
}`}
|
||||
>
|
||||
{jsonValidationMessage.type === 'success' ? (
|
||||
<Check className="h-4 w-4" />
|
||||
) : (
|
||||
<X className="h-4 w-4" />
|
||||
<div className="space-y-2">
|
||||
<div
|
||||
className={`flex items-center gap-2 text-sm ${
|
||||
jsonValidationMessage.type === 'success'
|
||||
? 'text-green-600 dark:text-green-400'
|
||||
: 'text-red-600 dark:text-red-400'
|
||||
}`}
|
||||
>
|
||||
{jsonValidationMessage.type === 'success' ? (
|
||||
<Check className="h-4 w-4 flex-shrink-0" />
|
||||
) : (
|
||||
<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>
|
||||
)}
|
||||
<span>{jsonValidationMessage.message}</span>
|
||||
</div>
|
||||
)}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user