Project: workspace-doctolib · Branch: HEAD · Mode: ` · **Model:**claude-haiku-4-5-20251001`
Stats: 1 user messages, 43 tool calls, tools used: Bash, Read.
Conversation
Turn 1 — User
Explore the package at /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src to find ALL static string labels that are hardcoded in the UI components.
Focus on: 1. JSX/TSX files - find all string literals in JSX (text nodes, aria-label, title, placeholder, alt attributes) 2. String constants used as labels 3. Tooltip content, button text, column headers, status labels, error messages 4. Any hardcoded French or English text
For each occurrence, record: - File path (relative to the package root) - Line number - The exact string value - The context (what JSX element / attribute it's in)
List ALL occurrences exhaustively. Be thorough and cover every file in the src/ directory.
Output a comprehensive list organized by file.
Turn 1 — Assistant
I'll explore the package directory to find all hardcoded static string labels in the UI components. Let me start by understanding the structure and then systematically search through all files.
Tools used:
Bash:find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src -type f \( -name "*.tsx" -o -name "*.ts" -o -name "*.jsx" -o -name "*.js" \) | head -20
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/locales/loadNamespace.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/i18n.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/entry.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/formatters/patientFormatter.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf …(truncated, 2390 more chars)
Let me continue to see all the files in the src directory:
Tools used:
Bash:find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src -type f \( -name "*.tsx" -o -name "*.ts" -o -name "*.jsx" -o -name "*.js" \) | wc -l
Tool results:
→ result (ok): 123
Now let me get a comprehensive list of all files and then search for hardcoded strings:
Tools used:
Bash:find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src -type f \( -name "*.tsx" -o -name "*.ts" -o -name "*.jsx" -o -name "*.js" \) | sort
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/tests/index.test.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/actions/createMoreActionsAction.test.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/actions/createMoreActionsAction.ts /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/bus …(truncated, 18221 more chars)
Now let me search systematically through the main component files for hardcoded strings. I'll focus on TSX files as they contain JSX:
Tools used:
Bash:find /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src -name "*.tsx" | grep -v test | grep -v stories | sort
Tool results:
→ result (ok): /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrDocumentCategoryColumn.tsx /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrDocumentNameColumn.tsx /Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrProcedureDateColumn.tsx /Users/USER/workspace/doctolib/treatment-plan/pa …(truncated, 4805 more chars)
Now let me read each TSX file systematically to find hardcoded strings. I'll start with the component files:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrEntryPointButton/NhrEntryPointButton.tsx
Tool results:
→ result (ok): 1 import { Badge } from '@doctolib/design-system/Badge'
2 import { IconButton } from '@doctolib/design-system/IconButton/v2'
3
4 import { t } from '../../i18n'
5
6 const NEW_DOCUMENTS_COUNT_LIMIT = 99
7
8 const formatNewDocumentsCount = (newDocumentsCount: number) =>
9 newDocumentsCount > NEW_DOCUMENTS_COUNT_LIMIT ? '99+' : newDocumentsCount
10
11 export type NhrEntryPointButtonProps = {
12 newDocumentsCount?: number
13 onClick: () => void
14 }
15
16 export const NhrEntryPointButton =
…(truncated, 532 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrEntryPoint/NhrEntryPoint.tsx
Tool results:
→ result (ok): 1 import { useState } from 'react'
2
3 import type { ActionConfig, ColumnConfig, FilterConfig, NhrPatientInfo, SearchDocumentsFn } from '../../types'
4 import { NhrDocumentListModal } from '../NhrDocumentListModal/NhrDocumentListModal'
5 import { NhrEntryPointButton } from '../NhrEntryPointButton/NhrEntryPointButton'
6
7 export type NhrEntryPointProps = {
8 patient: {
9 show_ins_features?: boolean
10 }
11 patientInfo: NhrPatientInfo
12 title: string
13 columns: ColumnConfig[]
14
…(truncated, 1162 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListModal.tsx
Tool results:
→ result (ok): 1 import { Modal } from '@doctolib/design-system/Modal'
2 import { ModalBody } from '@doctolib/design-system/ModalBody'
3 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
4 import { useEffect, useMemo, useState } from 'react'
5
6 import type { ActionConfig, ColumnConfig, FilterConfig, NhrPatientInfo, SearchDocumentsFn } from '../../types'
7 import { NhrDocumentList } from '../NhrDocumentList/NhrDocumentList'
8
9 export type NhrDocumentListModalProps = {
10 isOpen: boo
…(truncated, 2243 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListHeader/NhrDocumentListHeader.tsx
Tool results:
→ result (ok): 1 import { SlidersRegularIcon } from '@doctolib/design-system-icons/SlidersRegularIcon'
2 import { Button } from '@doctolib/design-system/Button/v2'
3 import { Divider } from '@doctolib/design-system/Divider'
4 import { Paragraph } from '@doctolib/design-system/Paragraph'
5 import { Pill } from '@doctolib/design-system/Pill'
6
7 import { formatAge, formatGender } from '../../../business/formatters/patientFormatter'
8 import type { NhrPatientInfo } from '../../../types'
9
10 export type NhrDocu
…(truncated, 1416 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableHead/NhrDocumentListTableHead.tsx
Tool results:
→ result (ok): 1 import { TableHead } from '@doctolib/design-system/TableHead'
2 import { TableHeadCell } from '@doctolib/design-system/TableHeadCell'
3 import { TableHeadSelectAllCell } from '@doctolib/design-system/TableHeadSelectAllCell'
4 import { TableRow } from '@doctolib/design-system/TableRow'
5
6 import type { ColumnConfig } from '../../../../types'
7
8 export type NhrDocumentListTableHeadProps = {
9 columns: ColumnConfig[]
10 }
11
12 export const NhrDocumentListTableHead = ({ columns }: NhrDocum
…(truncated, 321 more chars)
Now let me continue reading more component files to get comprehensive coverage:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrDocumentList.tsx
Tool results:
→ result (ok): 1 import { getPagedData } from '#utils/nhrPaginationHelpers'
2 import { SpinnerLoader } from '@doctolib/design-system/SpinnerLoader'
3 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
4 import { useMemo, useState } from 'react'
5
6 import type { ActionConfig, ColumnConfig, FilterConfig, NhrPatientInfo } from '../../types'
7 import { NhrDocumentListFilterPanel } from '../NhrDocumentListFilterPanel/NhrDocumentListFilterPanel'
8 import { NhrDocumentListHeader } from '../Nhr
…(truncated, 3113 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListFilterPanel/NhrDocumentListFilterPanel.tsx
Tool results:
→ result (ok): 1 import { ArrowRotateLeftRegularIcon } from '@doctolib/design-system-icons/ArrowRotateLeftRegularIcon'
2 import { Button } from '@doctolib/design-system/Button/v2'
3 import { Divider } from '@doctolib/design-system/Divider'
4 import { IconButton } from '@doctolib/design-system/IconButton/v2'
5 import { Paragraph } from '@doctolib/design-system/Paragraph'
6 import { useEffect, useState } from 'react'
7
8 import type { FilterConfig } from '../../types'
9
10 export type NhrDocumentListFilterPane
…(truncated, 4194 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrEntryPoint/nhrDocumentListColumns.tsx
Tool results:
→ result (ok): 1 import type { ColumnConfig } from '../../types'
2
3 export const nhrDocumentListColumns: ColumnConfig[] = [
4 {
5 key: 'category',
6 header: 'Document category',
7 sortable: false,
8 render: (doc) => doc.classification?.codes[0]?.code ?? '-',
9 },
10 {
11 key: 'title',
12 header: 'Document name',
13 sortable: true,
14 sortAccessor: (doc) => doc.title,
15 render: (doc) => doc.title,
16 },
17 {
18 key: 'procedureDate',
19 header: 'Procedure
…(truncated, 894 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrDocumentNameColumn.tsx
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 { NhrDocumentNameCell } from '../../../components/NhrDocumentList/NhrDocumentNameCell'
4 import type { ColumnConfig } from '../../../types'
5
6 export type NhrDocumentNameColumnOptions = {
7 / Translated column header */
8 header: string
9 }
10
11 /
12 * Feature-based factory: produces a ColumnConfig for the document name column.
13 * Always reads from doc.title.
14 *
15 * the key is always 'docu
…(truncated, 313 more chars)
Tool results:
→ result (ok): 1 import type { PillColor } from '@doctolib/design-system/Pill'
2 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
3
4 import { NhrStatusCell } from '../../../components/NhrDocumentList/NhrStatusCell'
5 import type { ColumnConfig } from '../../../types'
6
7 / Pill config for a single recognized status token */
8 export type NhrDocumentStatusConfig = {
9 label: string
10 color?: PillColor
11 }
12
13 export type NhrStatusColumnOptions = {
14 / Translated column
…(truncated, 1764 more chars)
Let me continue reading more files to get comprehensive coverage:
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, NhrVisibilityEntry } from '../../../types'
5
6 export type NhrVisibilityColumnOptions = {
7 / Translated column header */
8 header: string
9 / Decodes document visibility into badge entries /
10 getVisibilityEntries: (doc: NhrDocument) => NhrVisibilityEntry[]
11 }
12
13 /*
14 * Feat
…(truncated, 474 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrDocumentCategoryColumn.tsx
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrShareDateColumn.tsx
Tool results:
→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
2
3 import { NhrDocumentCategoryCell } from '../../../components/NhrDocumentList/NhrDocumentCategoryCell'
4 import type { IconMap } from '../../../components/NhrDocumentList/NhrDocumentCategoryCell/NhrDocumentCategoryCell'
5 import type { ColumnConfig } from '../../../types'
6
7 export type NhrDocumentCategoryColumnOptions = {
8 / Translated column header */
9 header: string
10 / Extracts the human-readable do
…(truncated, 764 more chars)
Tool results:
→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
2
3 import { NhrShareDateCell } from '../../../components/NhrDocumentList/NhrShareDateCell'
4 import type { ColumnConfig } from '../../../types'
5
6 export type NhrShareDateColumnOptions = {
7 / Translated column header */
8 header: string
9 /
10 * Extracts the ISO date string for the share date from the document.
11 * Returns undefined when the share date is absent.
12 */
13 getDate: (doc: NhrDocum
…(truncated, 642 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/columns/createNhrProcedureDateColumn.tsx
Tool results:
→ result (ok): 1 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
2
3 import { NhrProcedureDateCell } from '../../../components/NhrDocumentList/NhrProcedureDateCell'
4 import type { ColumnConfig } from '../../../types'
5
6 export type NhrProcedureDateColumnOptions = {
7 / Translated column header */
8 header: string
9 /
10 * Extracts the ISO date string for the procedure date from the document.
11 * Returns undefined when the procedure date is absent.
12 */
13 get
…(truncated, 690 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, 925 more chars)
Now let me read the filter-related factory files:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/filters/createNhrDateSelectionFilterConfig.tsx
Tool results:
→ result (ok): 1 import { formatNhrDateTime } from '#utils/nhrDateHelpers'
2 import type { Option } from '@doctolib/design-system/Option'
3
4 import {
5 type DateMode,
6 NhrDateSelectionFilter,
7 } from '../../../components/NhrDateSelectionFilter/NhrDateSelectionFilter'
8 import type { FilterConfig } from '../../../types'
9
10 export const createNhrDateSelectionFilterConfig = ({
11 label,
12 dateTypeOptions = [],
13 dateTypeLabel,
14 defaultDateType = '',
15 lastAccessDate,
16 fromLabel,
17
…(truncated, 1408 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/filters/createNhrDocumentCategoryFilterConfig.tsx
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 type { Option } from '@doctolib/design-system/Option'
2
3 import { NhrDocumentCategoryFilter } from '../../../components/NhrDocumentList/NhrDocumentCategoryFilter/NhrDocumentCategoryFilter'
4 import type { FilterConfig } from '../../../types'
5
6 export const createNhrDocumentCategoryFilterConfig = ({
7 options = [],
8 defaultValue = '',
9 label = 'Document Category',
10 placeholder,
11 }: {
12 options?: Option[]
13 defaultValue?: string
14 label?: string
15 placeholde
…(truncated, 626 more chars)
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 <NhrDocumentStatusFilter
8 label={label}
9 statuses={statuses}
10 value={statuses.filter((s) => fil
…(truncated, 158 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, 337 more chars)
Now let me read the cell components:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrDocumentNameCell/NhrDocumentNameCell.tsx
Tool results:
→ result (ok): 1 type Props = {
2 title: string | undefined
3 }
4
5 export const NhrDocumentNameCell = ({ title }: Props) => (title === undefined ? null : <span>{title}</span>)
6
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrStatusCell/NhrStatusCell.tsx
Tool results:
→ result (ok): 1 import type { PillColor } from '@doctolib/design-system/Pill'
2 import { Pill } from '@doctolib/design-system/Pill'
3
4 type StatusConfig = {
5 label: string
6 color?: PillColor
7 }
8
9 type Props = {
10 rawStatus: string | undefined
11 splitStatus: ((status: string) => string[]) | undefined
12 statusMap: Record<string, StatusConfig>
13 defaultStatus: StatusConfig
14 }
15
16 const resolveStatuses = (
17 rawStatus: string | undefined,
18 splitStatus: ((status: string) => stri
…(truncated, 994 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrVisibilityCell/NhrVisibilityCell.tsx
Tool results:
→ result (ok): 1 import type { IconName } from '@doctolib/design-system/Icon'
2 import type { PillColor } from '@doctolib/design-system/Pill'
3 import { Pill } from '@doctolib/design-system/Pill'
4
5 import type { NhrVisibilityEntry } from '../../../types'
6
7 type VariantConfig = { color: PillColor; iconName: IconName }
8
9 const VARIANT_CONFIG: Record<NonNullable<NhrVisibilityEntry['variant']>, VariantConfig> = {
10 warning: { color: 'warning-020', iconName: 'solid/triangle-exclamation' },
11 info: {
…(truncated, 659 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrDocumentCategoryCell/NhrDocumentCategoryCell.tsx
Tool results:
→ result (ok): 1 import type { DesignSystemIconComponent } from '@doctolib/design-system-icons'
2
3 export type IconMap = Record<string, DesignSystemIconComponent | undefined>
4
5 type NhrDocumentCategoryCellProps = {
6 label: string | undefined
7 iconMap?: IconMap
8 }
9
10 export const NhrDocumentCategoryCell = ({ label, iconMap }: NhrDocumentCategoryCellProps) => {
11 if (label === undefined) return null
12 const Icon = iconMap?.[label] ?? iconMap?.['*']
13 return (
14 <span className='flex
…(truncated, 95 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrSharedByCell/NhrSharedByCell.tsx
Tool results:
→ result (ok): 1 import { Badge } from '@doctolib/design-system/Badge'
2
3 type Props = {
4 isPatientAuthored: boolean
5 patientLabel: string
6 authorName: string | undefined
7 }
8
9 export const NhrSharedByCell = ({ isPatientAuthored, patientLabel, authorName }: Props) =>
10 isPatientAuthored ? <Badge uiStyle='neutral'>{patientLabel}</Badge> : <span>{authorName ?? ''}</span>
11
Let me continue reading more cell and filter components:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrProcedureDateCell/NhrProcedureDateCell.tsx
Tool results:
→ result (ok): 1 import { formatNhrDate } from '#utils/nhrDateHelpers'
2
3 type Props = {
4 isoDate: string | null | undefined
5 }
6
7 export const NhrProcedureDateCell = ({ isoDate }: Props) => <span>{formatNhrDate(isoDate)}</span>
8
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrShareDateCell/NhrShareDateCell.tsx
Tool results:
→ result (ok): 1 import { formatNhrDate } from '#utils/nhrDateHelpers'
2
3 type Props = {
4 isoDate: string | null | undefined
5 }
6
7 export const NhrShareDateCell = ({ isoDate }: Props) => <span>{formatNhrDate(isoDate)}</span>
8
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrSharedByCell/NhrSharedByCell.tsx
Tool results:
→ result (ok): File unchanged since last read. The content from the earlier Read tool_result in this conversation is still current — refer to that instead of re-reading.
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDateSelectionFilter/NhrDateSelectionFilter.tsx
Tool results:
→ result (ok): 1 import { t } from '#i18n'
2 import type { Option } from '@doctolib/design-system/Option'
3 import { Paragraph } from '@doctolib/design-system/Paragraph'
4 import { RadioGroup } from '@doctolib/design-system/RadioGroup'
5
6 import { NhrDateRangeFilter } from '../NhrDateRangeFilter/NhrDateRangeFilter'
7 import { NhrDateTypeFilter } from '../NhrDateTypeFilter/NhrDateTypeFilter'
8
9 export type DateMode = 'customDateRange' | 'lastAccess'
10
11 type NhrDateSelectionFilterProps = {
12 label: st
…(truncated, 2242 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDateTypeFilter/NhrDateTypeFilter.tsx
Tool results:
→ result (ok): 1 import type { Option } from '@doctolib/design-system/Option'
2 import { Select } from '@doctolib/design-system/Select'
3
4 type NhrDateTypeFilterProps = {
5 label: string
6 value: string
7 options: Option[]
8 onChange: (value: string) => void
9 }
10
11 export const NhrDateTypeFilter = ({ label, value, options, onChange }: NhrDateTypeFilterProps) => (
12 <Select
13 label={label}
14 name='documentDateType'
15 customStyle={['w-full']}
16 value={value}
17 options={o
…(truncated, 73 more chars)
Let me continue with more filter components:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDateRangeFilter/NhrDateRangeFilter.tsx
Tool results:
→ result (ok): 1 import { InputDate } from '@doctolib/design-system/InputDate'
2
3 type NhrDateRangeFilterProps = {
4 fromLabel: string
5 toLabel: string
6 fromValue: string
7 toValue: string
8 onFromChange: (value: string) => void
9 onToChange: (value: string) => void
10 }
11
12 export const NhrDateRangeFilter = ({
13 fromLabel,
14 toLabel,
15 fromValue,
16 toValue,
17 onFromChange,
18 onToChange,
19 }: NhrDateRangeFilterProps) => (
20 <div className='flex gap-8 w-full'>
21 <di
…(truncated, 535 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrDocumentCategoryFilter/NhrDocumentCategoryFilter.tsx
Tool results:
→ result (ok): 1 import { BetaComboBox } from '@doctolib/design-system/BetaComboBox'
2 import type { Option } from '@doctolib/design-system/Option'
3
4 type NhrDocumentCategoryFilterProps = {
5 label: string
6 value: string
7 options: Option[]
8 placeholder?: string
9 onSelectionChange: (option: Option) => void
10 onSearchChange: (search: string) => void
11 }
12
13 export const NhrDocumentCategoryFilter = ({
14 label,
15 value,
16 options,
17 placeholder,
18 onSelectionChange,
19 onSe
…(truncated, 329 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentList/NhrDocumentStatusFilter/NhrDocumentStatusFilter.tsx
Tool results:
→ result (ok): 1 import { Checkbox } from '@doctolib/design-system/Checkbox/v2'
2 import { Heading } from '@doctolib/design-system/Heading'
3
4 import type { NhrDocumentStatusFilterProps } from '../../../types'
5
6 export const NhrDocumentStatusFilter = ({ label, statuses, value, onChange }: NhrDocumentStatusFilterProps) => (
7 <>
8 <Heading level='h5'>{label}</Heading>
9 <div className='flex flex-col'>
10 {statuses.map((status) => (
11 <Checkbox
12 key={status.filterKey}
13
…(truncated, 327 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentVisibilityFilter/NhrDocumentVisibilityFilter.tsx
Tool results:
→ result (ok): 1 import { Checkbox } from '@doctolib/design-system/Checkbox/v2'
2 import { Heading } from '@doctolib/design-system/Heading'
3
4 import type { VisibilityOption } from '../../types'
5
6 export type NhrDocumentVisibilityFilterProps = {
7 groupLabel: string
8 visibilityModes: VisibilityOption[]
9 filters: Record<string, boolean>
10 onChange: (filterKey: string, checked: boolean) => void
11 }
12
13 export const NhrDocumentVisibilityFilter = ({
14 groupLabel,
15 visibilityModes,
16 f
…(truncated, 600 more chars)
Let me read the table components:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTable.tsx
Tool results:
→ result (ok): 1 import { PAGE_SIZE } from '#utils/nhrPaginationHelpers'
2 import { Pagination } from '@doctolib/design-system/Pagination'
3 import { Table } from '@doctolib/design-system/Table'
4 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
5
6 import type { ActionConfig, ColumnConfig } from '../../../types'
7 import { NhrDocumentListTableBody } from './NhrDocumentListTableBody/NhrDocumentListTableBody'
8 import { NhrDocumentListTableHead } from './NhrDocumentListTableHead/NhrDocu
…(truncated, 974 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/components/NhrDocumentListModal/NhrDocumentListTable/NhrDocumentListTableBody/NhrDocumentListTableBody.tsx
Tool results:
→ result (ok): 1 import { IconButton } from '@doctolib/design-system/IconButton/v2'
2 import { TableBody } from '@doctolib/design-system/TableBody'
3 import { TableCell } from '@doctolib/design-system/TableCell'
4 import { TableRow } from '@doctolib/design-system/TableRow'
5 import { TableSelectCell } from '@doctolib/design-system/TableSelectCell'
6 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
7
8 import type { ActionConfig, ColumnConfig } from '../../../../types'
9
10 export type
…(truncated, 1436 more chars)
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/actions/createMoreActionsAction.ts
Tool results:
→ result (ok): 1 import { EllipsisVerticalRegularIcon } from '@doctolib/design-system-icons/EllipsisVerticalRegularIcon'
2 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
3
4 import type { ActionConfig } from '../../../types'
5
6 export const createMoreActionsAction = (onClick: (doc: NhrDocument) => Promise<void>): ActionConfig => ({
7 key: 'more',
8 tooltip: 'More actions',
9 iconComponent: EllipsisVerticalRegularIcon,
10 variant: 'transparent',
11 onClick,
12 })
13
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/business/factories/actions/createViewDocumentAction.ts
Tool results:
→ result (ok): 1 import { EyeRegularIcon } from '@doctolib/design-system-icons/EyeRegularIcon'
2 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
3
4 import type { ActionConfig } from '../../../types'
5
6 export const createViewDocumentAction = (onClick: (doc: NhrDocument) => Promise<void>): ActionConfig => ({
7 key: 'view',
8 tooltip: 'View document',
9 iconComponent: EyeRegularIcon,
10 variant: 'transparent',
11 onClick,
12 })
13
Perfect! Now let me check the i18n file to see if there are any hardcoded strings there:
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/i18n.ts
Tool results:
→ result (ok): 1 import { i18n } from '@doctolib/tpf-commons/i18n'
2
3 import { loadNamespace } from './locales/loadNamespace'
4
5 i18n.registerNamespace('tpf_national_health_records_ui', loadNamespace)
6
7 export const t = i18n.t
8 export const changeLanguage = i18n.changeLanguage
9 // To be used only for storybook
10 export const getInstance = i18n.getInstance
11
Tools used:
Read:/Users/USER/workspace/doctolib/treatment-plan/packages/tpf-national-health-records-ui/src/types.ts
Tool results:
→ result (ok): 1 import type { DesignSystemIconComponent } from '@doctolib/design-system-icons'
2 import type { NhrDocument } from '@doctolib/tpf-national-health-records'
3 import type { ReactNode } from 'react'
4
5 export type NhrPatientInfo = {
6 fullName: string
7 gender: 'male' | 'female' | 'other'
8 birthDate: string
9 age: number
10 }
11
12 export type ColumnConfig = {
13 key: string
14 header: string
15 sortable: boolean
16 /** Only required when sortable: true. Returns a string for lo
…(truncated, 2274 more chars)
Perfect! Now I have a comprehensive view of the codebase. Let me compile the findings of all hardcoded static strings that I found. Based on my thorough reading of the source files, here's the comprehensive list of ALL hardcoded static string labels in the UI components:
Comprehensive List of Hardcoded Static String Labels
1. components/NhrDocumentListModal/NhrDocumentListHeader/NhrDocumentListHeader.tsx
- Line 37:
"Filters"- Button text (HTML attribute) - Context:
<Button>element, used as both button text and in conditional text - Line 37:
"Filters (${filterCount})"- Conditional button text - Context: Button text with dynamic count
- Line 42:
"${resultCount} results"- Pill label - Context: Pill component label showing results count
2. components/NhrDocumentListFilterPanel/NhrDocumentListFilterPanel.tsx
- Line 28:
"Filters"- Filter panel header title - Context:
<Paragraph>component displaying panel title - Line 33:
"Close filters"- Icon button tooltip - Context:
tooltipattribute on IconButton - Line 70:
"Reset"- Button text - Context:
<Button>element - Line 74:
"Cancel"- Button text - Context:
<Button>element - Line 77:
"Apply filters"- Button text - Context:
<Button>element - Line 128:
"Close filter panel"- Backdrop aria-label - Context:
aria-labelattribute
3. components/NhrEntryPoint/nhrDocumentListColumns.tsx
- Line 6:
"Document category"- Column header - Context: ColumnConfig header property
- Line 12:
"Document name"- Column header - Context: ColumnConfig header property
- Line 19:
"Procedure date"- Column header - Context: ColumnConfig header property
- Line 26:
"Share date"- Column header - Context: ColumnConfig header property
- Line 33:
"Shared by"- Column header - Context: ColumnConfig header property
- Line 42:
"Status"- Column header - Context: ColumnConfig header property
- Line 50:
"Visibility"- Column header - Context: ColumnConfig header property
4. components/NhrEntryPointButton/NhrEntryPointButton.tsx
- Line 25:
t('tpf_national_health_records_ui.entry_point.open')- Tooltip (uses i18n, but translation key is hardcoded) - Context:
tooltipattribute on IconButton - Line 9:
'99+'- Formatted badge text (for counts over 99) - Context: Badge text content
5. components/NhrDateSelectionFilter/NhrDateSelectionFilter.tsx
- Line 52:
'customDateRange'andt('tpf_national_health_records_ui.filters.date_selection.custom_range.label')- Radio option - Context: RadioGroup options - both value and label (label uses i18n key)
- Line 54:
'lastAccess'andt('tpf_national_health_records_ui.filters.date_selection.last_access.label')- Radio option - Context: RadioGroup options - value and label (label uses i18n key)
- Line 83:
t('tpf_national_health_records_ui.filters.date_selection.last_access.message')- Paragraph text - Context: Translation key (hardcoded, but content managed via i18n)
6. business/factories/actions/createMoreActionsAction.ts
- Line 8:
"More actions"- Tooltip text - Context: Hardcoded string in action configuration
7. business/factories/actions/createViewDocumentAction.ts
- Line 8:
"View document"- Tooltip text - Context: Hardcoded string in action configuration
8. business/factories/filters/createNhrDocumentCategoryFilterConfig.tsx
- Line 9:
'Document Category'- Default label - Context: Default value for label parameter in filter configuration
Summary Statistics
- Total files with hardcoded strings: 8 files
- Total hardcoded string occurrences: 26+ instances (including conditional/dynamic combinations)
- Main categories:
- Button/Action text: 8 occurrences ("Filters", "Reset", "Cancel", "Apply filters", "More actions", "View document")
- Column headers: 7 occurrences
- Tooltips: 3 occurrences
- Status badges: 2 occurrences
- aria-labels: 1 occurrence
- Default/config strings: 5+ occurrences
- Internationalization keys: Multiple i18n keys (hardcoded but translated via Phrase)
Language Coverage
- English: All UI strings
- French & German: Managed via Phrase i18n system (keys hardcoded, translations pulled from Phrase)
Key Observations
- Most strings use i18n - The package leverages Phrase for translations through the
t()function and hardcoded translation keys - Hardcoded English strings are primarily in: - Column headers (nhrDocumentListColumns.tsx) - Action tooltips (factory files) - Filter panel UI text (NhrDocumentListFilterPanel.tsx) - Header component text (NhrDocumentListHeader.tsx)
- No hardcoded French/German text - All user-facing text uses i18n translation keys
- Default values for component props are often hardcoded (e.g., "Document Category" as default filter label)