Part of #145. Fourteen files whose user-facing strings are generic enough to belong in `common` — loading and empty states, the confirmation modal, the shared input modals (text/date/user/attachment viewer), the mobile nav bar, the autocomplete input, the error screen and the file-upload error paths. Extends the namespace that already exists, so `src/i18n/config.js` is untouched and this cannot collide with any other extraction PR over the `ns:` array. 28 keys added to `public/locales/en/common.json`. English only — no translations, no behaviour change. Every t() value is checked against this branch's base: the string must appear character-for-character in the code it replaces (36 call sites). One value is matched loosely and worth naming: `errorScreen.hideDetails`. The base renders `{showDetails ? 'Hide' : 'Show'} error details`, so neither full phrase exists contiguously in the source — only one branch of the ternary can. Both keys hold exactly what each branch renders. The sentence is kept whole rather than split around the ternary, because a split sentence cannot be reordered by a translator.
43 lines
1.1 KiB
JavaScript
43 lines
1.1 KiB
JavaScript
import { Input } from '@mui/joy'
|
|
import { useState } from 'react'
|
|
import ModalActions from '../../../components/common/ModalActions'
|
|
import { useResponsiveModal } from '../../../hooks/useResponsiveModal'
|
|
import { useTranslation } from 'react-i18next'
|
|
|
|
function DateModal({ isOpen, onClose, onSave, current, title }) {
|
|
const { t } = useTranslation('common')
|
|
const { ResponsiveModal } = useResponsiveModal()
|
|
const [date, setDate] = useState(
|
|
current ? new Date(current).toISOString().split('T')[0] : '',
|
|
)
|
|
|
|
const handleSave = () => {
|
|
onSave(date)
|
|
onClose()
|
|
}
|
|
|
|
return (
|
|
<ResponsiveModal
|
|
open={isOpen}
|
|
onClose={onClose}
|
|
size='sm'
|
|
title={title}
|
|
footer={
|
|
<ModalActions
|
|
secondary={{ label: t('cancel'), onClick: onClose }}
|
|
primary={{ label: t('save'), onClick: handleSave, disabled: !date }}
|
|
/>
|
|
}
|
|
>
|
|
<Input
|
|
autoFocus
|
|
type='date'
|
|
value={date}
|
|
onChange={event => setDate(event.target.value)}
|
|
/>
|
|
</ResponsiveModal>
|
|
)
|
|
}
|
|
|
|
export default DateModal
|