diff --git a/specifyweb/frontend/js_src/lib/components/Forms/DataTask.tsx b/specifyweb/frontend/js_src/lib/components/Forms/DataTask.tsx index 54f1d737f60..922294e867f 100644 --- a/specifyweb/frontend/js_src/lib/components/Forms/DataTask.tsx +++ b/specifyweb/frontend/js_src/lib/components/Forms/DataTask.tsx @@ -29,6 +29,10 @@ import { useSearchParameter } from '../../hooks/navigation'; import { RA } from '../../utils/types'; import { State } from 'typesafe-reducer'; import { LoadingContext } from '../Core/Contexts'; +import { useCachedState } from '../../hooks/useCachedState'; +import { Dialog } from '../Molecules/Dialog'; +import { commonText } from '../../localization/common'; +import { userText } from '../../localization/user'; export function ViewRecordSet(): JSX.Element { const { id, index } = useParams(); @@ -80,9 +84,17 @@ function DisplayRecordSet({ }: { readonly recordSet: SpecifyResource; readonly resourceIndex: number; -}): null { +}): null | JSX.Element { const [recordToOpen] = usePref('form', 'recordSet', 'recordToOpen'); const navigate = useNavigate(); + + const [isReadOnly = false] = useCachedState( + 'forms', + 'readOnlyMode' + ); + + const [readOnlyState, setReadOnlyState] = React.useState(false); + useAsyncState( React.useCallback( async () => @@ -92,6 +104,7 @@ function DisplayRecordSet({ orderBy: recordToOpen === 'first' ? 'id' : '-id', limit: 1, }).then(({ records }) => + isReadOnly === true && records.length === 0 ? setReadOnlyState(true) : navigate( formatUrl( getResourceViewUrl( @@ -104,12 +117,20 @@ function DisplayRecordSet({ replace: true, } ) + ), [recordSet, resourceIndex, recordToOpen] ), true ); - return null; + return readOnlyState ? + <> + navigate('/specify/')} + >{userText.emptyRecordSetsReadOnly()} + : null; } /** Begins the process of creating a new resource */ diff --git a/specifyweb/frontend/js_src/lib/localization/resources.ts b/specifyweb/frontend/js_src/lib/localization/resources.ts index 49d112f2cfd..b4c84fe05b8 100644 --- a/specifyweb/frontend/js_src/lib/localization/resources.ts +++ b/specifyweb/frontend/js_src/lib/localization/resources.ts @@ -124,5 +124,5 @@ export const resourcesText = createDictionary({ selectResourceType: { 'en-us': 'Select Resource Type', 'ru-ru': 'Выберите тип ресурса', - }, + } } as const); diff --git a/specifyweb/frontend/js_src/lib/localization/user.ts b/specifyweb/frontend/js_src/lib/localization/user.ts index a9c6682eda3..5148591b4af 100644 --- a/specifyweb/frontend/js_src/lib/localization/user.ts +++ b/specifyweb/frontend/js_src/lib/localization/user.ts @@ -189,6 +189,9 @@ export const userText = createDictionary({ следующих действий: `, }, + emptyRecordSetsReadOnly: { + 'en-us': `Cannot open empty Record Set when in Read-Only mode` + }, permissionDeniedForUrl: { 'en-us': 'Permission denied when accessing ', 'ru-ru': 'Разрешение не было дано при доступе к ',