fix: export/import missing refill history, prescription, and bottle fields (#227)

- Add refill history export/import with medication reference mapping
- Include totalPills (bottle type capacity) in inventory export
- Include dismissedUntil field for past dose dismissal state
- Add expiryWarningDays and shareStockStatus to settings export
- Bump export version to 1.1
- Add refill count to import result reporting
- Update i18n import success details to include refill count

Closes #224
This commit is contained in:
Daniel Volz
2026-02-16 21:51:39 +01:00
committed by GitHub
parent ff100dfea5
commit 871e6066ec
5 changed files with 102 additions and 12 deletions
+21 -3
View File
@@ -175,8 +175,20 @@ export interface AppContextValue {
setShowImportConfirm: React.Dispatch<React.SetStateAction<boolean>>;
pendingImportData: unknown;
setPendingImportData: React.Dispatch<React.SetStateAction<unknown>>;
importResult: { medications: number; doses: number; shares: number } | null;
setImportResult: React.Dispatch<React.SetStateAction<{ medications: number; doses: number; shares: number } | null>>;
importResult: {
medications: number;
doses: number;
refills: number;
shares: number;
} | null;
setImportResult: React.Dispatch<
React.SetStateAction<{
medications: number;
doses: number;
refills: number;
shares: number;
} | null>
>;
handleExport: (includeImages?: boolean) => Promise<void>;
handleImportFileSelect: (e: React.ChangeEvent<HTMLInputElement>) => void;
handleImportConfirm: () => Promise<void>;
@@ -237,7 +249,12 @@ export function AppProvider({ children }: { children: React.ReactNode }) {
const [showExportModal, setShowExportModal] = useState(false);
const [showImportConfirm, setShowImportConfirm] = useState(false);
const [pendingImportData, setPendingImportData] = useState<unknown>(null);
const [importResult, setImportResult] = useState<{ medications: number; doses: number; shares: number } | null>(null);
const [importResult, setImportResult] = useState<{
medications: number;
doses: number;
refills: number;
shares: number;
} | null>(null);
// Load user-specific scheduleDays when user changes
useEffect(() => {
@@ -581,6 +598,7 @@ export function AppProvider({ children }: { children: React.ReactNode }) {
setImportResult({
medications: data.imported?.medications || 0,
doses: data.imported?.doseHistory || 0,
refills: data.imported?.refillHistory || 0,
shares: data.imported?.shareLinks || 0,
});
+1 -1
View File
@@ -501,7 +501,7 @@
"cancelButton": "Abbrechen",
"exportSuccess": "Daten erfolgreich exportiert",
"importSuccess": "Daten erfolgreich importiert",
"importSuccessDetails": "Importiert: {{medications}} Medikamente, {{doses}} Dosen, {{shares}} Teilen-Links",
"importSuccessDetails": "Importiert: {{medications}} Medikamente, {{doses}} Dosen, {{refills}} Nachfüllungen, {{shares}} Teilen-Links",
"importError": "Daten konnten nicht importiert werden",
"invalidFile": "Ungültiges Dateiformat. Bitte wähle eine gültige MedAssist-ng-Exportdatei.",
"downloadFilename": "medassist-export"
+1 -1
View File
@@ -501,7 +501,7 @@
"cancelButton": "Cancel",
"exportSuccess": "Data exported successfully",
"importSuccess": "Data imported successfully",
"importSuccessDetails": "Imported: {{medications}} medications, {{doses}} doses, {{shares}} share links",
"importSuccessDetails": "Imported: {{medications}} medications, {{doses}} doses, {{refills}} refills, {{shares}} share links",
"importError": "Failed to import data",
"invalidFile": "Invalid file format. Please select a valid MedAssist-ng export file.",
"downloadFilename": "medassist-export"
@@ -256,7 +256,7 @@ describe("useAppContext", () => {
(global.fetch as ReturnType<typeof vi.fn>).mockResolvedValue({
ok: true,
json: () => Promise.resolve({}),
text: () => Promise.resolve('{"imported":{"medications":1,"doseHistory":2,"shareLinks":3}}'),
text: () => Promise.resolve('{"imported":{"medications":1,"doseHistory":2,"refillHistory":4,"shareLinks":3}}'),
});
});
@@ -364,7 +364,7 @@ describe("useAppContext", () => {
expect(mockUseMedications().loadMeds).toHaveBeenCalled();
expect(mockUseSettings().loadSettings).toHaveBeenCalled();
expect(mockUseDoses().loadTakenDoses).toHaveBeenCalled();
expect(result.current.importResult).toEqual({ medications: 1, doses: 2, shares: 3 });
expect(result.current.importResult).toEqual({ medications: 1, doses: 2, refills: 4, shares: 3 });
});
it("exports data and triggers JSON download", async () => {