From 665c3604e5a4ab5622bd4cca4a3a8a74d0669c35 Mon Sep 17 00:00:00 2001 From: Mishael-2584 Date: Tue, 17 Mar 2026 15:45:41 +0300 Subject: [PATCH 1/3] feat: Filter out soft-deleted observations in WatermelonDBRepo and related hooks/services --- .../src/database/repositories/WatermelonDBRepo.ts | 11 +++++------ formulus/src/hooks/useObservations.ts | 2 +- formulus/src/services/FormService.ts | 4 ++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/formulus/src/database/repositories/WatermelonDBRepo.ts b/formulus/src/database/repositories/WatermelonDBRepo.ts index 8086230f4..46acfe7ee 100644 --- a/formulus/src/database/repositories/WatermelonDBRepo.ts +++ b/formulus/src/database/repositories/WatermelonDBRepo.ts @@ -206,13 +206,12 @@ export class WatermelonDBRepo implements LocalRepoInterface { return []; } - // First, let's check all observations in the database for debugging - const allObservations = await this.observationsCollection.query().fetch(); - console.log(`Total observations in database: ${allObservations.length}`); - - // Query for observations with form_type matching the requested form type + // Query for observations with form_type matching and exclude soft-deleted const observations = await this.observationsCollection - .query(Q.where('form_type', formId)) + .query( + Q.where('form_type', formId), + Q.where('deleted', false), + ) .fetch(); return observations.map(observation => diff --git a/formulus/src/hooks/useObservations.ts b/formulus/src/hooks/useObservations.ts index 176b55949..17c31ece4 100644 --- a/formulus/src/hooks/useObservations.ts +++ b/formulus/src/hooks/useObservations.ts @@ -62,7 +62,7 @@ export const useObservations = (): UseObservationsResult => { }, [loadObservations]); const filteredAndSorted = useMemo(() => { - let filtered = [...observations]; + let filtered = observations.filter(obs => !obs.deleted); if (searchQuery.trim()) { const query = searchQuery.toLowerCase(); diff --git a/formulus/src/services/FormService.ts b/formulus/src/services/FormService.ts index 32d356edf..ea334115e 100644 --- a/formulus/src/services/FormService.ts +++ b/formulus/src/services/FormService.ts @@ -280,6 +280,10 @@ export class FormService { options.formType, ); + if (!options.includeDeleted) { + observations = observations.filter(o => !o.deleted); + } + if (options.whereClause && options.whereClause.trim()) { observations = this.filterObservationsByWhereClause( observations, From 26522c279148c5a1d45c2e6efca2e8473f218bbe Mon Sep 17 00:00:00 2001 From: Mishael-2584 Date: Tue, 17 Mar 2026 15:58:33 +0300 Subject: [PATCH 2/3] refactor: streamline query syntax in WatermelonDBRepo and remove unnecessary eslint comments in syncNativeVersion script --- formulus/scripts/syncNativeVersion.js | 4 ++-- formulus/src/database/repositories/WatermelonDBRepo.ts | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/formulus/scripts/syncNativeVersion.js b/formulus/scripts/syncNativeVersion.js index d28ecd0f9..dd5bba266 100644 --- a/formulus/scripts/syncNativeVersion.js +++ b/formulus/scripts/syncNativeVersion.js @@ -93,13 +93,13 @@ function syncNativeVersions() { console.log('✓ Native version sync complete'); } catch (error) { console.error('✗ Failed to sync native versions:', error); - // eslint-disable-next-line no-undef + process.exit(1); } } // Run if executed directly -// eslint-disable-next-line no-undef + if (import.meta.url === `file://${process.argv[1]}`) { syncNativeVersions(); } diff --git a/formulus/src/database/repositories/WatermelonDBRepo.ts b/formulus/src/database/repositories/WatermelonDBRepo.ts index 46acfe7ee..366bbb61b 100644 --- a/formulus/src/database/repositories/WatermelonDBRepo.ts +++ b/formulus/src/database/repositories/WatermelonDBRepo.ts @@ -208,10 +208,7 @@ export class WatermelonDBRepo implements LocalRepoInterface { // Query for observations with form_type matching and exclude soft-deleted const observations = await this.observationsCollection - .query( - Q.where('form_type', formId), - Q.where('deleted', false), - ) + .query(Q.where('form_type', formId), Q.where('deleted', false)) .fetch(); return observations.map(observation => From bae840cb02799a9ba2fbeacd292bf8138cf04ff1 Mon Sep 17 00:00:00 2001 From: Mishael-2584 Date: Tue, 17 Mar 2026 16:33:50 +0300 Subject: [PATCH 3/3] refactor: update FormulusInterface to deprecate draft handling and improve observation query method --- formulus/src/webview/FormulusInterfaceDefinition.ts | 6 +++--- formulus/src/webview/FormulusMessageHandlers.ts | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/formulus/src/webview/FormulusInterfaceDefinition.ts b/formulus/src/webview/FormulusInterfaceDefinition.ts index 084e3e29b..83184dfd9 100644 --- a/formulus/src/webview/FormulusInterfaceDefinition.ts +++ b/formulus/src/webview/FormulusInterfaceDefinition.ts @@ -289,8 +289,8 @@ export interface FormulusInterface { /** * Get observations for a specific form * @param {string} formType - The identifier of the formtype - * @param {boolean} [isDraft=false] - Whether to include draft observations - * @param {boolean} [includeDeleted=false] - Whether to include deleted observations + * @param {boolean} [isDraft=false] - Deprecated: drafts are handled only in formplayer; ignored in Formulus + * @param {boolean} [includeDeleted=false] - Whether to include deleted observations (default false = exclude) * @returns {Promise} Array of form observations */ getObservations( @@ -305,7 +305,7 @@ export interface FormulusInterface { * Age filtering via age_from_dob(data.dob) is handled client-side in formplayer. * @param options - Query options * @param options.formType - Form type to query - * @param options.isDraft - Include drafts (default false) + * @param options.isDraft - Deprecated: drafts handled in formplayer; ignored * @param options.includeDeleted - Include deleted (default false) * @param options.whereClause - SQL-like WHERE clause for filtering (e.g. "data.sex = 'male'") * @returns {Promise} Array of filtered observations diff --git a/formulus/src/webview/FormulusMessageHandlers.ts b/formulus/src/webview/FormulusMessageHandlers.ts index 3b42d68fc..148a7bed0 100644 --- a/formulus/src/webview/FormulusMessageHandlers.ts +++ b/formulus/src/webview/FormulusMessageHandlers.ts @@ -1056,8 +1056,11 @@ export function createFormulusMessageHandlers(): FormulusMessageHandlers { } const service = await FormService.getInstance(); - //TODO: Handle deleted etc. - return await service.getObservationsByFormType(formTypeString); + // Use getObservationsByQuery so includeDeleted is respected (default false = exclude deleted) + return await service.getObservationsByQuery({ + formType: formTypeString, + includeDeleted: includeDeleted ?? false, + }); }, onGetObservationsByQuery: async (payload: { options?: {