Project: workspace-doctolib · Branch: HEAD · Mode: ` · **Model:**claude-haiku-4-5-20251001`
Stats: 1 user messages, 41 tool calls, tools used: Bash, Grep, Read.
Conversation
Turn 1 — User
I need to understand the types/interfaces used for NHR (National Health Records) document list filtering in two repos:
- List all files in
/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/recursively - List all files in
/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/recursively - Find and read any TypeScript type/interface files related to:
-
SearchDocumentsParamsor similar filter params type -NhrDocumentor document list types - Filter-related types (date range, category, author, etc.) - Search for
searchDocumentsfunction signature/type definition across both repos - Search for
nhr_document_list_search_mockedacross both repos to find all usages - Look for mock data files - any file named
*mock*or*fixture*in both NHR packages
Provide full file contents for any files you find. Be thorough.
Turn 1 — Assistant
I'll help you explore the NHR document list filtering types across both repos. Let me start by listing the files in both directories and then searching for the specific types and functions you mentioned.
Tools used:
Bash:find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src -type f 2>/dev/null | head -100
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/nhr-service-factory.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/types/document.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/types/participant.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/types/index.ts /Users/USER/workspace/doctolib/treatmen …(truncated, 551 more chars)
Now let me check the second directory:
Tools used:
Bash:find /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src -type f 2>/dev/null | head -100
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/generateNhrDocuments.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/nhrMockedColumns.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/nhrMockedDocuments.ts /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/generateNhrDocuments.test.ts /Users/USER/workspace/doctolib/do …(truncated, 2933 more chars)
Good! Now let me search for the specific types and functions you mentioned. Let me start with reading key files and searching for the patterns:
Tools used:
Grep:SearchDocumentsParams|nhr_document_list_search_mockedin/Users/USER/workspace/doctolib
Tools used:
Bash:find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src -type f \( -name "*mock*" -o -name "*fixture*" \) 2>/dev/null
Tool results:
→ result (ok): (Bash completed with no output)
Tool results:
→ result (ok): Found 19 files doctolib/packages/@doctolib/national-health-records/src/hooks/useSearchDocuments.ts doctolib/packages/@doctolib/national-health-records/src/variants/types.ts doctolib/packages/@doctolib/national-health-records/src/hooks/useSearchDocuments.test.ts doctolib/config/feature_switches.yml worktrees/doctolib/FHIR-2091-nhr-document-list-pagination/packages/@doctolib/national-health-records/src/hooks/useSearchDocuments.test.ts worktrees/doctolib/FHIR-2091-nhr-document-list-pagination/packa …(truncated, 1556 more chars)
Let me now read the key type definition files and the mappers/hooks that reference SearchDocumentsParams:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/types.ts
Tool results:
→ result (ok): 1 import type { ColumnConfig, FilterConfig } from '@doctolib/tpf-national-health-records-ui'
2 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient'
3 import type { NhrDocument, NhrDocumentSearchParams } from '@doctolib/tpf-national-health-records'
4
5 interface SearchDocumentsResult {
6 data: NhrDocument[]
7 total: number
8 }
9
10 export type NhrDocumentListVariant = {
11 columns: ColumnConfig[]
12 filters: FilterConfig[]
13 searchDocuments: (appliedFilters?: R
…(truncated, 791 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useSearchDocuments.ts
Tool results:
→ result (ok): 1 import { useQueryClient } from '@tanstack/react-query-v5' 2 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 3 import { isFeatureEnabled } from '@doctolib/variation_management' 4 import type { NhrDocumentListVariant, MapFiltersToSearchDocumentsParams, ServerFilters } from '../variants/types' 5 import { useNationalHealthRecords } from './useNationalHealthRecords' 6 import { generateNhrDocuments } from '../mocks/generateNhrDocuments' 7 import { toNhrPatientInformation …(truncated, 2248 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/dmp/mappers/mapFiltersToSearchDocumentsParams.ts
Tool results:
→ result (ok): 1 import type { NhrDocumentSearchParams } from '@doctolib/tpf-national-health-records'
2 import { DOCUMENT_STATUS, DOCUMENT_VISIBILITY } from '@doctolib/dmp'
3 import type { ServerFilters } from '../../types'
4 import { toNhrPatientInformation } from '../../../business/mappers/toNhrPatientInformation'
5
6 // Maps UI-level ServerFilters to the NhrDocumentSearchParams format expected by the NHR API.
7 // Each ServerFilters field needs an explicit mapping — field names do not match NhrDocumentSear
…(truncated, 2415 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/types/document.ts
Tool results:
→ result (ok): 1 import type { NhrDocumentAuthor, NhrPatientInformation } from '#business/types/participant'
2
3 // General types ---
4 /* The services/procedures this document is associated with /
5 export type NhrServiceInformation = {
6 startDate?: string
7 endDate?: string
8 }
9
10 export type NhrDocumentClassification = {
11 codes: Code[]
12 }
13
14 export type Code = {
15 system: string
16 code: string
17 }
18
19 export type DateRange = {
20 upperLimit?: string
21 lowerLimit?: string
…(truncated, 1348 more chars)
Now let me read more type definition files and search for mock data and the searchDocuments function:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/types/service.ts
Tool results:
→ result (ok): 1 import type {
2 NhrDocumentContentResult,
3 NhrDocumentSearchProps,
4 NhrDocumentSearchResult,
5 NhrGetDocumentsContentProps,
6 } from '#business/types/document'
7
8 export type CountryCode = 'fr' | 'mock'
9
10 export type NhrService = {
11 searchDocuments(props: NhrDocumentSearchProps): Promise<NhrDocumentSearchResult>
12 getDocumentsContent(props: NhrGetDocumentsContentProps): Promise<NhrDocumentContentResult[]>
13 }
14
15 export type NhrAdapter = {
16 searchDocuments(props:
…(truncated, 164 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/types/participant.ts
Tool results:
→ result (ok): 1 / Profession of a participant. Ideally used to capture more information about healthcare professionals. */
2 export type NhrProfession = {
3 / Can include national identifiers , oids, etc /
4 identifiers?: Record<string, string>
5 / Optional description of the profession. E.g. HCP, MFA, etc /
6 description?: string
7 / The specialisation of the participant. E.g. cardiology, general medicine, elder care etc */
8 speciality?: string
9 }
10
11 / Geographical locator */
12
…(truncated, 1524 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/generateNhrDocuments.ts
Tool results:
→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
2
3 import { nhrMockedDocuments } from './nhrMockedDocuments'
4
5 export type GenerateNhrDocumentsOptions = {
6 count?: number
7 randomize?: boolean
8 }
9
10 const DEFAULT_COUNT = 20
11 const RANDOM_COUNT_MAX = 40
12
13 const STATUSES = ['1', '2', '4', undefined] as const
14 const VISIBILITIES = ['1', '2', '4', '8', '10', '12', undefined] as const
15 const FORMATS = ['application/pdf', 'text/xml', 'application/dic
…(truncated, 3242 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/nhrMockedDocuments.ts
Tool results:
→ result (ERROR): File content (11228 tokens) exceeds maximum allowed tokens (10000). Use offset and limit parameters to read specific portions of the file, or search for specific content instead of reading the whole file.
Let me read the mock documents file in smaller chunks and also check the other mock files:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/nhrMockedDocuments.ts(1–101)
Tool results:
→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
2
3 export const nhrMockedDocuments: NhrDocument[] = [
4 // ── Batch 1: Laboratory reports (6 docs) ──────────────────────────────────
5 {
6 id: 'mock-001',
7 title: 'SOPK hormone panel',
8 creationDate: '2025-01-13',
9 submissionDate: '2025-01-18',
10 status: '1',
11 visibility: '1',
12 format: 'application/pdf',
13 serviceInformation: { startDate: '2025-01-10' },
14 authors: [{ i
…(truncated, 3442 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/nhrMockedColumns.ts
Tool results:
→ result (ok): 1 import type { ColumnConfig } from '@doctolib/tpf-national-health-records-ui'
2 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
3
4 // Column headers are hardcoded in English for the mock. i18n wiring belongs in a follow-up.
5 // Renders are intentionally plain-text — styled cell components will replace them once
6 // the factory functions are available in the published @doctolib/tpf-national-health-records-ui.
7
8 export const buildMockedColumns = (): ColumnConfig[]
…(truncated, 1499 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/dmp/factories/filtersFactory.ts
Tool results:
→ result (ok): 1 import {
2 type FilterConfig,
3 createNhrDateSelectionFilterConfig,
4 createNhrDocumentCategoryFilterConfig,
5 createNhrDocumentStatusFilterConfig,
6 createNhrDocumentVisibilityFilterConfig,
7 } from '@doctolib/tpf-national-health-records-ui'
8
9 type FiltersOptions = {
10 lastAccessDate?: string
11 }
12
13 export function filtersFactory({ lastAccessDate = '' }: FiltersOptions = {}): FilterConfig[] {
14 return [
15 createNhrDocumentCategoryFilterConfig(),
16 createNhrDa
…(truncated, 1029 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/dmp/mappers/mapFiltersToSearchDocumentsParams.test.ts
Tool results:
→ result (ok): 1 import { mapFiltersToSearchDocumentsParams } from './mapFiltersToSearchDocumentsParams'
2
3 jest.mock('@doctolib/dmp', () => ({
4 DOCUMENT_STATUS: { validated: 1, obsolete: 2, archived: 4 },
5 DOCUMENT_VISIBILITY: {
6 sharedWithAll: 1,
7 notSharedWithPatient: 2,
8 notSharedWithPractitioner: 4,
9 notSharedWithLegalRepresentative: 8,
10 },
11 }))
12
13 jest.mock('../../../business/mappers/toNhrPatientInformation', () => ({
14 toNhrPatientInformation: (ins: string) => ({
…(truncated, 6530 more chars)
Now let me look at the hooks and variants to get the complete picture:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useSearchDocuments.test.ts
Tool results:
→ result (ok): 1 import React from 'react' 2 import { renderHook } from '@testing-library/react' 3 import { QueryClient, QueryClientProvider } from '@tanstack/react-query-v5' 4 import * as variationManagement from '@doctolib/variation_management' 5 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient' 6 import type { NhrDocument, NhrDocumentSearchParams } from '@doctolib/tpf-national-health-records' 7 import { useNationalHealthRecords } from './useNationalHealthRecords' 8 import { generat …(truncated, 12586 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/dmp/useDmpDocumentListVariant.ts
Tool results:
→ result (ok): 1 import { columnsFactory } from './factories/columnsFactory'
2 import { filtersFactory } from './factories/filtersFactory'
3 import type { NhrDocumentListVariant, DocumentSearchOptions } from '../types'
4 import useDmpSearchDocuments from '../../hooks/useSearchDocuments'
5 import { mapFiltersToSearchDocumentsParams } from './mappers/mapFiltersToSearchDocumentsParams'
6
7 export const useDmpDocumentListVariant = (patient: DocumentSearchOptions['patient']): NhrDocumentListVariant => {
8 const
…(truncated, 207 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/types/index.ts
Tool results:
→ result (ok): 1 export type { 2 NhrDocumentSearchProps, 3 NhrDocumentSearchResult, 4 NhrDocument, 5 DateRange, 6 NhrDocumentClassification, 7 NhrDocumentSearchParams, 8 NhrServiceInformation, 9 Code, 10 } from './document' 11 export type { 12 NhrDocumentAuthor, 13 NhrAddress, 14 NhrContact, 15 NhrInstitution, 16 NhrPatientInformation, 17 NhrProfession, 18 } from './participant' 19 export type { NhrService } from './service' 20
Now let me search for any test files related to the factories and look at the columnsFactory:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/dmp/factories/columnsFactory.ts
Tool results:
→ result (ok): 1 import type { ColumnConfig } from '@doctolib/tpf-national-health-records-ui' 2 import { 3 createNhrDocumentCategoryColumn, 4 createNhrDocumentNameColumn, 5 createNhrProcedureDateColumn, 6 createNhrShareDateColumn, 7 createNhrSharedByColumn, 8 createNhrStatusColumn, 9 createNhrVisibilityColumn, 10 } from '@doctolib/tpf-national-health-records-ui' 11 import { DOCUMENT_STATUS } from '@doctolib/dmp' 12 import { FileRegularIcon } from '@doctolib/design-system-icons/FileRegularIcon' 13 …(truncated, 1466 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib -type f -name "*SearchDocuments*" 2>/dev/null | head -20
Tools used:
Bash:grep -r "nhr_document_list_search_mocked" /Users/USER/workspace/doctolib --include="*.ts" --include="*.tsx" --include="*.yml" --include="*.yaml" 2>/dev/null | head -10
Tool results:
→ result (ok): Command running in background with ID: b3shcn14t. Output is being written to: /private/tmp/claude-501/-Users-clertonra-workspace-doctolib/4e907511-941c-4735-b688-9b631a659fb5/tasks/b3shcn14t.output
Tool results:
→ result (ok): Command running in background with ID: bngzba0u7. Output is being written to: /private/tmp/claude-501/-Users-clertonra-workspace-doctolib/4e907511-941c-4735-b688-9b631a659fb5/tasks/bngzba0u7.output
Let me wait for the background commands to complete and also check the mapper helpers:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/dmp/mappers/dmpDocumentHelpers.ts
Tool results:
→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
2 import type { NhrVisibilityEntry } from '@doctolib/tpf-national-health-records-ui'
3 import { DOCUMENT_STATUS, DOCUMENT_VISIBILITY } from '@doctolib/dmp'
4
5 const DMP_SYSTEM = 'dmp:classCode'
6 const PATIENT_CODE = '90' // EX_3.1-1040: class code for patient-authored documents
7
8 export const getTypeCode = (doc: NhrDocument): string | undefined =>
9 doc.classification?.codes.find((c) => c.system === DMP_SYSTEM)?.c
…(truncated, 1357 more chars)
Tools used:
Bash:cat /private/tmp/claude-501/-Users-clertonra-workspace-doctolib/4e907511-941c-4735-b688-9b631a659fb5/tasks/bngzba0u7.output 2>/dev/null
Tool results:
→ result (ok): (Bash completed with no output)
Tools used:
Bash:cat /private/tmp/claude-501/-Users-clertonra-workspace-doctolib/4e907511-941c-4735-b688-9b631a659fb5/tasks/b3shcn14t.output 2>/dev/null
Tool results:
→ result (ok): (Bash completed with no output)
Let me try the grep search with a different approach:
Tools used:
Bash:grep -r "nhr_document_list_search_mocked" /Users/USER/workspace/doctolib/doctolib 2>/dev/null
Tools used:
Bash:grep -r "nhr_document_list_search_mocked" /Users/USER/workspace/doctolib/treatment-plan 2>/dev/null
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/adapters/DmpNhrAdapter.ts
Tool results:
→ result (ok): 1 import type { DmpApi, DmpAuthor, DmpDocument, SearchProps, SearchResult as DmpSearchResult } from '@doctolib/dmp' 2 import { DOCUMENT_STATUS, DOCUMENT_VISIBILITY } from '@doctolib/dmp' 3 import type { 4 NhrAdapter, 5 NhrDocumentAuthor, 6 NhrDocumentSearchProps, 7 NhrDocumentSearchResult, 8 NhrDocument, 9 NhrDocumentContentResult, 10 NhrGetDocumentsContentProps, 11 } from '@doctolib/tpf-national-health-records' 12 import type { DocumentCategorizationGroupContent } from 'engines/do …(truncated, 3947 more chars)
Tool results:
→ result (ok): (Bash completed with no output)
Tool results:
→ result (ok): Command running in background with ID: brht9weey. Output is being written to: /private/tmp/claude-501/-Users-clertonra-workspace-doctolib/4e907511-941c-4735-b688-9b631a659fb5/tasks/brht9weey.output
Let me check the background task output and also look at the feature flag configuration:
Tools used:
Bash:cat /private/tmp/claude-501/-Users-clertonra-workspace-doctolib/4e907511-941c-4735-b688-9b631a659fb5/tasks/brht9weey.output 2>/dev/null
Tool results:
→ result (ok): (Bash completed with no output)
Tools used:
Bash:grep "nhr_document_list_search_mocked" /Users/USER/workspace/doctolib/doctolib/config/feature_switches.yml 2>/dev/null
Tool results:
→ result (ok): nhr_document_list_search_mocked:
Tools used:
Bash:grep "nhr_document_list_search_mocked" /Users/USER/workspace/doctolib/treatment-plan/config/feature_switches.yml 2>/dev/null
Tool results:
→ result (ERROR): Exit code 2
Perfect! Now let me get the full context for the feature flag and look at any remaining important files:
Tools used:
Bash:grep -A 5 "nhr_document_list_search_mocked:" /Users/USER/workspace/doctolib/doctolib/config/feature_switches.yml
Tool results:
→ result (ok): nhr_document_list_search_mocked: cohort_types: - account default: false details: 'When enabled for an account cohort, causes NhrEntryPointModule to return ~40 hardcoded mock NhrDocument entries instead of calling the real DMP API.
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useNationalHealthRecords.ts
Tool results:
→ result (ok): 1 import type { NhrDocumentSearchProps, NhrDocumentSearchResult } from '@doctolib/tpf-national-health-records'
2 import { useProductLineVariation, ProductLineKey } from '@doctolib/variation_management'
3 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient'
4 import { useDmpNhr } from './useDmpNhr'
5
6 export type UseNhrOperations = {
7 searchDocuments: (props: NhrDocumentSearchProps) => Promise<NhrDocumentSearchResult>
8 }
9
10 export const useNationalHealthRecords = (
…(truncated, 597 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/nhr-service-factory.ts
Tool results:
→ result (ok): 1 import { DmpNhrService } from '#business/systems/dmp/services/dmp-nhr-service'
2 import type { CountryCode, NhrAdapter } from '#business/types/service'
3
4 export const createNhrService = (countryCode: CountryCode, nhrAdapter: NhrAdapter) => {
5 switch (countryCode) {
6 case 'fr':
7 return new DmpNhrService(nhrAdapter)
8 default:
9 throw new Error(Unsupported country code: ${countryCode})
10 }
11 }
12
Now let me look at the DMP-specific service implementation:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/systems/dmp/services/dmp-nhr-service.ts
Tool results:
→ result (ok): 1 import type {
2 NhrDocumentContentResult,
3 NhrDocumentSearchProps,
4 NhrDocumentSearchResult,
5 NhrGetDocumentsContentProps,
6 } from '#business/types/document'
7 import type { NhrAdapter, NhrService } from '#business/types/service'
8
9 export class DmpNhrService implements NhrService {
10 readonly country = 'fr'
11
12 constructor(readonly nhrAdapter: NhrAdapter) {}
13
14 searchDocuments = (props: NhrDocumentSearchProps): Promise<NhrDocumentSearchResult> =>
15 this.nhrAda
…(truncated, 193 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/systems/dmp/types/types.ts
Tool results:
→ result (ok): 1 /
2 * iCanopee JSON Documentation v2.1.0
3 */
4
5 /
6 * Telecom Structure (Section 14.49).
7 * Represents a telecommunications address (phone, fax, email, etc.).
8 * Source fields: i_type, i_usage, s_value.
9 /
10 export type DmpNhrTelecom = {
11 /
12 * Telecommunications address type (code from the "Telecommunications Address Type" table).
13 * Source: i_type.
14 /
15 type?: number
16 /**
17 * Use case(s) for the address. This is a binary combination (sum) of
…(truncated, 12906 more chars)
Tools used:
Bash:find /Users/USER/workspace/doctolib -type f \( -name "*mock*" -o -name "*fixture*" \) -path "*/national-health-records*" 2>/dev/null | grep -v node_modules
Tool results:
→ result (ok): Command running in background with ID: bu6vksuov. Output is being written to: /private/tmp/claude-501/-Users-clertonra-workspace-doctolib/4e907511-941c-4735-b688-9b631a659fb5/tasks/bu6vksuov.output
Let me get those background results and check on the useDmpNhr hook:
Tools used:
Bash:cat /private/tmp/claude-501/-Users-clertonra-workspace-doctolib/4e907511-941c-4735-b688-9b631a659fb5/tasks/bu6vksuov.output 2>/dev/null
Tool results:
→ result (ok): (Bash completed with no output)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useDmpNhr.ts
Tool results:
→ result (ok): 1 import { useMemo } from 'react'
2 import type { Patient } from 'monolith_DEPRECATED/types/doctor/api/Patient'
3 import { DmpApiImpl as DmpApi, useDmpSetUp } from '@doctolib/dmp'
4 import { createNhrService } from '@doctolib/tpf-national-health-records'
5 import { DmpNhrAdapter } from '../business/adapters/DmpNhrAdapter'
6 import type { UseNhrOperations } from './useNationalHealthRecords'
7
8 export const useDmpNhr = ({ patient }: { patient: Patient }): UseNhrOperations => {
9 const { dmpSet
…(truncated, 418 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/business/mappers/toNhrPatientInformation.ts
Tool results:
→ result (ok): 1 import type { NhrPatientInformation } from '@doctolib/tpf-national-health-records'
2
3 export function toNhrPatientInformation(ins: string): NhrPatientInformation {
4 return {
5 nationalHealthIdentifier: ins,
6 }
7 }
8
Perfect! Now let me create a comprehensive summary. Let me also check one more file - the variants types to make sure I have everything:
Tools used:
Read:/Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/useNhrDocumentListVariant.ts
Tool results:
→ result (ok): 1 import { useProductLineVariation, ProductLineKey } from '@doctolib/variation_management'
2 import type { DocumentSearchOptions, NhrDocumentListVariant } from './types'
3 import { useDmpDocumentListVariant } from './dmp'
4
5 export const useNhrDocumentListVariant = (patient: DocumentSearchOptions['patient']): NhrDocumentListVariant | null => {
6 const dmpVariant = useDmpDocumentListVariant(patient)
7
8 return useProductLineVariation<NhrDocumentListVariant>({
9 variants: {
10 [Pr
…(truncated, 389 more chars)
Perfect! I now have a comprehensive understanding of the NHR document list filtering architecture. Let me compile the full report:
NHR Document List Filtering Types - Complete Analysis
I've thoroughly explored both NHR packages. Here's the complete type system for document list filtering:
1. Core Type Definitions (treatment-plan repo)
File: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records/src/business/types/document.ts
// Document search parameters (passed to the NHR API)
export type NhrDocumentSearchParams = {
patientInformation: NhrPatientInformation
formats?: string[]
categories?: string[]
status?: string
serviceStartDate?: DateRange
serviceStopDate?: DateRange
creationDate?: DateRange
submissionDate?: DateRange
visibility?: string
}
// Date range filter structure
export type DateRange = {
upperLimit?: string
lowerLimit?: string
}
// Document response from API
export type NhrDocument = {
id: string
title: string
description?: string
identifiers?: Record<string, string>
creationDate?: string
submissionDate?: string
serviceInformation?: NhrServiceInformation
status?: string
visibility?: string
format?: string
authors?: NhrDocumentAuthor[]
classification?: NhrDocumentClassification
}
// Search result wrapper
export type NhrDocumentSearchResult = {
documents: NhrDocument[]
}
2. UI-Level Filter Types (doctolib repo)
File: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/types.ts
// UI-level filter state (what the UI collects from filters)
export type BaseServerFilters = {
typeCodes?: string[]
dateType?: 'shareDate' | 'procedureDate'
submissionDateFrom?: string
submissionDateTo?: string
}
// DMP-specific filters extending BaseServerFilters
export type DmpServerFilters = {
includeArchived?: boolean
includeObsolete?: boolean
includeMaskedToProfessionals?: boolean
includeInvisibleToPatient?: boolean
includeInvisibleToLegalReps?: boolean
}
// Full server filter type (union of all filters)
export type ServerFilters = BaseServerFilters & DmpServerFilters
// Options passed to searchDocuments
export interface DocumentSearchOptions {
patient: Patient
appliedFilters: ServerFilters
}
// Function type for converting ServerFilters → NhrDocumentSearchParams
export type MapFiltersToSearchDocumentsParams = (ins: string, appliedFilters: ServerFilters) => NhrDocumentSearchParams
// Variant result type (what the component gets)
export type NhrDocumentListVariant = {
columns: ColumnConfig[]
filters: FilterConfig[]
searchDocuments: (appliedFilters?: Record<string, unknown>) => Promise<SearchDocumentsResult>
}
interface SearchDocumentsResult {
data: NhrDocument[]
total: number
}
3. Filter Mapping Logic
File: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/dmp/mappers/mapFiltersToSearchDocumentsParams.ts
This is the critical mapping function that transforms UI filters → API params:
export function mapFiltersToSearchDocumentsParams(ins: string, appliedFilters: ServerFilters): NhrDocumentSearchParams {
return {
patientInformation: toNhrPatientInformation(ins),
categories: appliedFilters.typeCodes,
...mapDateFilters(appliedFilters),
status: mapStatusFilter(appliedFilters),
visibility: mapVisibilityFilter(appliedFilters),
}
}
// Date filter: switches between 'shareDate' (submissionDate) and 'procedureDate' (serviceStartDate)
function mapDateFilters(filters: ServerFilters): Pick<NhrDocumentSearchParams, 'submissionDate' | 'serviceStartDate'> {
const { submissionDateFrom, submissionDateTo, dateType } = filters
if (!submissionDateFrom && !submissionDateTo) return {}
const dateRange = {
lowerLimit: submissionDateFrom,
upperLimit: submissionDateTo,
}
if (dateType === 'procedureDate') {
return { serviceStartDate: dateRange }
}
return { submissionDate: dateRange } // default
}
// Status: bitwise OR combination of DOCUMENT_STATUS flags
// validated(1) | archived(4) | obsolete(2)
function mapStatusFilter(filters: ServerFilters): string {
let status = DOCUMENT_STATUS.validated // always include validated
if (filters.includeArchived) status |= DOCUMENT_STATUS.archived
if (filters.includeObsolete) status |= DOCUMENT_STATUS.obsolete
return String(status)
}
// Visibility: bitwise OR combination of DOCUMENT_VISIBILITY flags
// sharedWithAll(1) | notSharedWithPractitioner(4) | notSharedWithPatient(2) | notSharedWithLegalRepresentative(8)
function mapVisibilityFilter(filters: ServerFilters): string | undefined {
const hasVisibilityFilter = filters.includeMaskedToProfessionals || filters.includeInvisibleToPatient || filters.includeInvisibleToLegalReps
if (!hasVisibilityFilter) return undefined
let visibility = DOCUMENT_VISIBILITY.sharedWithAll ?? 0
if (filters.includeMaskedToProfessionals) visibility |= DOCUMENT_VISIBILITY.notSharedWithPractitioner ?? 0
if (filters.includeInvisibleToPatient) visibility |= DOCUMENT_VISIBILITY.notSharedWithPatient ?? 0
if (filters.includeInvisibleToLegalReps) visibility |= DOCUMENT_VISIBILITY.notSharedWithLegalRepresentative ?? 0
return String(visibility)
}
4. Filter Configuration Factory
File: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/variants/dmp/factories/filtersFactory.ts
export function filtersFactory({ lastAccessDate = '' }: FiltersOptions = {}): FilterConfig[] {
return [
createNhrDocumentCategoryFilterConfig(), // typeCodes filter
createNhrDateSelectionFilterConfig({
label: 'Date',
dateTypeLabel: 'Type of date',
dateTypeOptions: [
{ value: 'shareDate', label: 'Share date' },
{ value: 'procedureDate', label: 'Procedure date' },
],
defaultDateType: 'shareDate',
lastAccessDate,
fromLabel: 'From',
toLabel: 'To',
}),
createNhrDocumentStatusFilterConfig(
[
{ filterKey: 'includeArchived', label: 'Archived' },
{ filterKey: 'includeObsolete', label: 'Obsolete' },
],
'Status'
),
createNhrDocumentVisibilityFilterConfig({
groupLabel: 'Visibility',
visibilityModes: [
{ filterKey: 'includeMaskedToProfessionals', label: 'Masked to professionals' },
{ filterKey: 'includeInvisibleToPatient', label: 'Invisible to patient' },
{ filterKey: 'includeInvisibleToLegalReps', label: 'Invisible to legal representatives' },
],
}),
]
}
5. Mock Data & Feature Flag
Files:
- /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/generateNhrDocuments.ts
- /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/nhrMockedDocuments.ts
- /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/mocks/nhrMockedColumns.ts
Feature Flag (doctolib/config/feature_switches.yml):
nhr_document_list_search_mocked:
cohort_types:
- account
default: false
details: 'When enabled for an account cohort, causes NhrEntryPointModule to return ~40 hardcoded mock NhrDocument entries instead of calling the real DMP API.'
When nhr_document_list_search_mocked is enabled, useSearchDocuments calls generateNhrDocuments() instead of the real DMP API.
6. searchDocuments Function Chain
Hook: /Users/USER/workspace/doctolib/doctolib/packages/@doctolib/national-health-records/src/hooks/useSearchDocuments.ts
const useSearchDocuments = ({
patient,
mapFiltersToSearchDocumentsParams,
}: UseSearchDocumentsProps): NhrDocumentListVariant['searchDocuments'] => {
const nhrOperations = useNationalHealthRecords({ patient })
const queryClient = useQueryClient()
r
…(truncated, 6537 more chars)