10 {statuses.map((status) => (
11
10 onChange: (filterKey: string, checked: boolean) => void
11 }
12
13 export const NhrDocumentVisibilityFilter = ({
14 groupLabel,
15 visibilityModes,
16 f
…(truncated, 645 more chars)
Tools used:
- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrStatusColumn.tsx
Tool results:
→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
2
3 import { NhrStatusCell } from '../../../components/NhrDocumentList/NhrStatusCell'
4 import type { ColumnConfig } from '../../../types'
5
6 /
7 Aliases Oxygen BadgeStyle for consumer type-safety.
8 Only includes values that are semantically meaningful for document status display.
9 /
10 export type NhrStatusBadgeVariant =
11 | 'info'
12 | 'error'
13 | 'success'
14 | 'warning'
15 | 'dark-info'
16
…(truncated, 2092 more chars)
Tools used:
- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrVisibilityColumn.tsx
Tool results:
→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
2
3 import { NhrVisibilityCell } from '../../../components/NhrDocumentList/NhrVisibilityCell'
4 import type { ColumnConfig } from '../../../types'
5
6 export type NhrVisibilityColumnOptions = {
7 / Translated column header /
8 header: string
9 / Extracts the human-readable visibility label from the document /
10 getVisibility: (doc: NhrDocument) => string | undefined
11 }
12
13 /
14 Feature-based fac
…(truncated, 470 more chars)
Tools used:
- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrSharedByColumn.tsx
Tool results:
→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
2
3 import { NhrSharedByCell } from '../../../components/NhrDocumentList/NhrSharedByCell'
4 import type { ColumnConfig } from '../../../types'
5
6 export type NhrSharedByColumnOptions = {
7 / Translated column header /
8 header: string
9 /
10 Returns true when the document was authored by the patient.
11 EX_3.1-1040: classCode=90 triggers the Patient badge.
12 /
13 isPatientAuthored: (doc: Nhr
…(truncated, 943 more chars)
Tools used:
- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/filters/createNhrDocumentStatusFilterConfig.tsx
Tool results:
→ result (ok): 1 import { NhrDocumentStatusFilter } from '../../../components/NhrDocumentList/NhrDocumentStatusFilter/NhrDocumentStatusFilter'
2 import type { FilterConfig, StatusOption } from '../../../types'
3
4 export const createNhrDocumentStatusFilterConfig = (statuses: StatusOption[], label: string): FilterConfig => ({
5 key: 'documentStatus',
6 render: (filters, onChange) => (
7 fil
…(truncated, 176 more chars)
Tools used:
- Read: /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/filters/createNhrDocumentVisibilityFilterConfig.tsx
Tool results:
→ result (ok): 1 import { NhrDocumentVisibilityFilter } from '../../../components/NhrDocumentVisibilityFilter/NhrDocumentVisibilityFilter'
2 import type { FilterConfig, VisibilityOption } from '../../../types'
3
4 type CreateNhrDocumentVisibilityFilterConfigOptions = {
5 groupLabel: string
6 visibilityModes: VisibilityOption[]
7 }
8
9 export const createNhrDocumentVisibilityFilterConfig = ({
10 groupLabel,
11 visibilityModes,
12 }: CreateNhrDocumentVisibilityFilterConfigOptions): FilterConfig => ({
1
…(truncated, 355 more chars)
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 {
13 getTypeCode,
14 getProcedureDate,
15 getShareDate,
16 getAutho
…(truncated, 1312 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, 1047 more chars)
Perfect! I have successfully read all 18 files. Here's the complete contents:
File 1: NhrDocumentListModal.tsx
import { useDocuments } from '#data/documents'
import { wrapActions } from '#helpers/actions'
import { Modal } from '@doctolib/design-system/Modal'
import { ModalBody } from '@doctolib/design-system/ModalBody'
import { useMemo, useState } from 'react'
import type { ActionConfig, ColumnConfig, FilterConfig, NhrPatientInfo, SearchDocumentsFn } from '../../types'
import { NhrDocumentList } from '../NhrDocumentList/NhrDocumentList'
export type NhrDocumentListModalProps = {
isOpen: boolean
onClose: () => void
title: string
patient: NhrPatientInfo
columns: ColumnConfig[]
filters: FilterConfig[]
searchDocuments: SearchDocumentsFn
actions?: ActionConfig[]
}
export const NhrDocumentListModal = ({
isOpen,
onClose,
title,
patient,
columns,
filters,
searchDocuments,
actions,
}: NhrDocumentListModalProps) => {
const [appliedFilters, setAppliedFilters] = useState>({})
const [isActionLoading, setIsActionLoading] = useState(false)
const { data: rows = [], isLoading } = useDocuments({ searchDocuments, appliedFilters })
const wrappedActions = useMemo(() => wrapActions(actions, setIsActionLoading), [actions])
return (
)
}
File 2: NhrDocumentListHeader.tsx
import { SlidersRegularIcon } from '@doctolib/design-system-icons/SlidersRegularIcon'
import { Button } from '@doctolib/design-system/Button/v2'
import { Paragraph } from '@doctolib/design-system/Paragraph'
import { formatAge, formatGender } from '../../../business/formatters/patientFormatter'
import type { NhrPatientInfo } from '../../../types'
export type NhrDocumentListHeaderProps = {
patient: NhrPatientInfo
filterCount: number
onOpenFilters: () => void
}
export const NhrDocumentListHeader = ({ patient, filterCount, onOpenFilters }: NhrDocumentListHeaderProps) => {
const formattedAge = formatAge(patient.age)
return (
{patient.fullName}
{formatGender(patient.gender)}
{patient.birthDate && • ${patient.birthDate}}
{formattedAge !== null && (${formattedAge})}
)
}
File 3: NhrDocumentList.tsx
import { SpinnerLoader } from '@doctolib/design-system-b2b/SpinnerLoader'
import type { NhrDocument } from '@doctolib/tpf-national-health-records'
import { useState } from 'react'
import type { ActionConfig, ColumnConfig, FilterConfig, NhrPatientInfo } from '../../types'
import { NhrDocumentListFilterPanel } from '../NhrDocumentListFilterPanel/NhrDocumentListFilterPanel'
import { NhrDocumentListHeader } from '../NhrDocumentListModal/NhrDocumentListHeader/NhrDocumentListHeader'
import { NhrDocumentListTable } from '../NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable'
export type NhrDocumentListProps = {
columns: ColumnConfig[]
filters: FilterConfig[]
patient: NhrPatientInfo
// Data fetching to be implemented in future work; leave undefined for now for Storybook
data?: NhrDocument[]
isLoading?: boolean
/ When provided, filter state is controlled externally (e.g. by NhrDocumentListModal for server-side filtering) /
appliedFilters?: Record
onApplyFilters?: (filters: Record) => void
actions?: ActionConfig[]
isActionLoading?: boolean
}
export const NhrDocumentList = ({
columns,
filters,
patient,
data,
isLoading = true,
appliedFiltersProp,
onApplyFilters,
actions,
isActionLoading = false,
}: NhrDocumentListProps) => {
const [isFilterPanelOpen, setIsFilterPanelOpen] = useState(false)
const [appliedFiltersInternal, setAppliedFiltersInternal] = useState>({})
const appliedFilters = appliedFiltersProp ?? appliedFiltersInternal
const handleApplyFilters = onApplyFilters ?? setAppliedFiltersInternal
const filterCount = Object.values(appliedFilters).filter(Boolean).length
return (
setIsFilterPanelOpen(true)}
/>
setIsFilterPanelOpen(false)}
filters={filters}
appliedFilters={appliedFilters}
onApply={handleApplyFilters}
/>
)
}
File 4: NhrDocumentListTableBody.tsx
import { IconButton } from '@doctolib/design-system/IconButton/v2'
import { TableBody } from '@doctolib/design-system/TableBody'
import { TableCell } from '@doctolib/design-system/TableCell'
import { TableRow } from '@doctolib/design-system/TableRow'
import { TableSelectCell } from '@doctolib/design-system/TableSelectCell'
import type { NhrDocument } from '@doctolib/tpf-national-health-records'
import type { ActionConfig, ColumnConfig } from '../../../../types'
export type NhrDocumentListTableBodyProps = {
columns: ColumnConfig[]
isLoading: boolean
rows: NhrDocument[]
actions?: ActionConfig[]
}
export const NhrDocumentListTableBody = ({ columns, isLoading, rows, actions }: NhrDocumentListTableBodyProps) => {
// +2 for the checkbox column and the row actions column
const totalColumns = columns.length + 2
if (isLoading) {
return
}
return (
{rows.map((row) => (
{}} />
{columns.map((col) => (
{col.render(row)}
))}
{actions?.map((action) => (
action.onClick(row)}
/>
))}
))}
)
}
File 5: NhrVisibilityCell.tsx
type Props = {
label: string | undefined
}
export const NhrVisibilityCell = ({ label }: Props) => {
if (label === undefined) return null
return {label}
}
File 6: NhrStatusCell.tsx
import { Badge } from '@doctolib/design-system/Badge'
type StatusConfig = {
label: st
…(truncated, 17545 more chars)