Loading analyst/src/routes/_layout/$exerciseId/emails/route.tsx +4 −2 Original line number Diff line number Diff line Loading @@ -9,8 +9,9 @@ import { import { css } from '@emotion/css' import { ExerciseContext, useEmailThreads } from '@inject/analyst' import type { ExtendedEmailThread } from '@inject/frontend' import { noEmailReceived, ThreadLogCards } from '@inject/frontend' import { ThreadLogCards } from '@inject/frontend' import type { Email, Team } from '@inject/graphql' import { useTranslationFrontend } from '@inject/locale' import { TabButton } from '@inject/shared' import { createFileRoute, Loading Loading @@ -82,6 +83,7 @@ const RouteComponent = () => { {team.name} </TabButton> ) const { t } = useTranslationFrontend() return ( <> <div Loading Loading @@ -124,7 +126,7 @@ const RouteComponent = () => { <ThreadLogCards teamId={selectedTeam.id} emailThreads={emailThreads} noEmailString={noEmailReceived} noEmailString={t('emails.noArchived')} inAnalyst onClick={emailThread => { nav({ Loading frontend/src/actionlog/InjectMessage/Content/ToolContent.tsx +23 −19 Original line number Diff line number Diff line import { css } from '@emotion/css' import type { ToolDetails } from '@inject/graphql' import { useTranslationFrontend } from '@inject/locale' import { breakWord } from '@inject/shared' import type { NavigateOptions } from '@tanstack/react-router' import type { FC } from 'react' Loading Loading @@ -41,16 +42,18 @@ const ToolContent: FC<ToolContentProps> = ({ exerciseId, inInstructor, getFileLink, }) => ( }) => { const { t } = useTranslationFrontend() return ( <div className={wrapper}> {details.tool.requiresInput && ( <> <div className={emphasized}>argument:</div> <div className={emphasized}>{t('tools.argument')}</div> <div className={breakWord}>{details.argument}</div> <div /> </> )} <div className={emphasized}>response:</div> <div className={emphasized}>{t('tools.response')}</div> <div className={response}> <ContentComponent getFileLink={getFileLink} Loading @@ -61,5 +64,6 @@ const ToolContent: FC<ToolContentProps> = ({ </div> </div> ) } export default ToolContent frontend/src/actionlog/InjectMessage/Content/TraineeQuestionnaireContent.tsx +2 −2 Original line number Diff line number Diff line Loading @@ -305,7 +305,7 @@ const TraineeQuestionnaireContent: FC<TraineeQuestionnaireContentProps> = ({ gap: 0.5rem; `} > {onClose && <Button text='Close' onClick={onClose} />} {onClose && <Button text={t('close')} onClick={onClose} />} <Button className={cx({ [wiggleClass]: wiggling, Loading @@ -316,7 +316,7 @@ const TraineeQuestionnaireContent: FC<TraineeQuestionnaireContentProps> = ({ title={title} loading={loading} > Submit {t('submit')} </Button> </div> } Loading frontend/src/components/FileArea/index.tsx +5 −2 Original line number Diff line number Diff line import { Colors, FileInput, FormGroup, type Intent } from '@blueprintjs/core' import { css, cx } from '@emotion/css' import { useUploadFile } from '@inject/graphql' import { useTranslationFrontend } from '@inject/locale' import type { NavigateOptions } from '@tanstack/react-router' import type { ChangeEvent, FC } from 'react' import { useCallback, useState } from 'react' Loading Loading @@ -30,6 +31,7 @@ const FileArea: FC<{ addFileInfo, getLink, }) => { const { t } = useTranslationFrontend() const [internalError, setInternalError] = useState('') // TODO: use contextual saving of file selection, we have an API for that :tm: Loading Loading @@ -70,7 +72,7 @@ const FileArea: FC<{ internalError ? internalError : !teamId ? 'Select a team before selecting a file' ? t('files.selectTeamFirst') : undefined } intent={ Loading @@ -90,7 +92,8 @@ const FileArea: FC<{ [fileInputDanger]: intent === 'danger' || !!internalError, } )} text='Attach a file' text={t('files.attachFile')} buttonText={t('files.browse')} onInputChange={handleFileChange} /> </FormGroup> Loading frontend/src/components/Questionnaire/QuestionDescription.tsx +8 −3 Original line number Diff line number Diff line import { Classes, Colors } from '@blueprintjs/core' import { css, cx } from '@emotion/css' import { useTranslationFrontend } from '@inject/locale' import { ErrorMessage } from '@inject/shared' const container = css` Loading @@ -21,6 +22,8 @@ export const QuestionDescription = ({ max: number current: number }) => { const { t } = useTranslationFrontend() if (min <= 1 && max === -1) { return null } Loading @@ -28,12 +31,14 @@ export const QuestionDescription = ({ <div className={cx(Classes.TEXT_MUTED, container)}> {max !== -1 && current >= max && ( <div> <ErrorMessage minimal>Maximum characters reached</ErrorMessage> <ErrorMessage minimal> {t('questionnaire.maxCharactersReached')} </ErrorMessage> </div> )} {min !== 1 && ( <span> <span>Mininimal length:</span> <span>{t('questionnaire.minimalLength')}:</span> <span className={paragraph}> {min} </span> {current !== 0 && current < min && ( <span Loading @@ -41,7 +46,7 @@ export const QuestionDescription = ({ color: ${Colors.RED4}; `} > Needed {t('questionnaire.needed')} </span> )} </span> Loading Loading
analyst/src/routes/_layout/$exerciseId/emails/route.tsx +4 −2 Original line number Diff line number Diff line Loading @@ -9,8 +9,9 @@ import { import { css } from '@emotion/css' import { ExerciseContext, useEmailThreads } from '@inject/analyst' import type { ExtendedEmailThread } from '@inject/frontend' import { noEmailReceived, ThreadLogCards } from '@inject/frontend' import { ThreadLogCards } from '@inject/frontend' import type { Email, Team } from '@inject/graphql' import { useTranslationFrontend } from '@inject/locale' import { TabButton } from '@inject/shared' import { createFileRoute, Loading Loading @@ -82,6 +83,7 @@ const RouteComponent = () => { {team.name} </TabButton> ) const { t } = useTranslationFrontend() return ( <> <div Loading Loading @@ -124,7 +126,7 @@ const RouteComponent = () => { <ThreadLogCards teamId={selectedTeam.id} emailThreads={emailThreads} noEmailString={noEmailReceived} noEmailString={t('emails.noArchived')} inAnalyst onClick={emailThread => { nav({ Loading
frontend/src/actionlog/InjectMessage/Content/ToolContent.tsx +23 −19 Original line number Diff line number Diff line import { css } from '@emotion/css' import type { ToolDetails } from '@inject/graphql' import { useTranslationFrontend } from '@inject/locale' import { breakWord } from '@inject/shared' import type { NavigateOptions } from '@tanstack/react-router' import type { FC } from 'react' Loading Loading @@ -41,16 +42,18 @@ const ToolContent: FC<ToolContentProps> = ({ exerciseId, inInstructor, getFileLink, }) => ( }) => { const { t } = useTranslationFrontend() return ( <div className={wrapper}> {details.tool.requiresInput && ( <> <div className={emphasized}>argument:</div> <div className={emphasized}>{t('tools.argument')}</div> <div className={breakWord}>{details.argument}</div> <div /> </> )} <div className={emphasized}>response:</div> <div className={emphasized}>{t('tools.response')}</div> <div className={response}> <ContentComponent getFileLink={getFileLink} Loading @@ -61,5 +64,6 @@ const ToolContent: FC<ToolContentProps> = ({ </div> </div> ) } export default ToolContent
frontend/src/actionlog/InjectMessage/Content/TraineeQuestionnaireContent.tsx +2 −2 Original line number Diff line number Diff line Loading @@ -305,7 +305,7 @@ const TraineeQuestionnaireContent: FC<TraineeQuestionnaireContentProps> = ({ gap: 0.5rem; `} > {onClose && <Button text='Close' onClick={onClose} />} {onClose && <Button text={t('close')} onClick={onClose} />} <Button className={cx({ [wiggleClass]: wiggling, Loading @@ -316,7 +316,7 @@ const TraineeQuestionnaireContent: FC<TraineeQuestionnaireContentProps> = ({ title={title} loading={loading} > Submit {t('submit')} </Button> </div> } Loading
frontend/src/components/FileArea/index.tsx +5 −2 Original line number Diff line number Diff line import { Colors, FileInput, FormGroup, type Intent } from '@blueprintjs/core' import { css, cx } from '@emotion/css' import { useUploadFile } from '@inject/graphql' import { useTranslationFrontend } from '@inject/locale' import type { NavigateOptions } from '@tanstack/react-router' import type { ChangeEvent, FC } from 'react' import { useCallback, useState } from 'react' Loading Loading @@ -30,6 +31,7 @@ const FileArea: FC<{ addFileInfo, getLink, }) => { const { t } = useTranslationFrontend() const [internalError, setInternalError] = useState('') // TODO: use contextual saving of file selection, we have an API for that :tm: Loading Loading @@ -70,7 +72,7 @@ const FileArea: FC<{ internalError ? internalError : !teamId ? 'Select a team before selecting a file' ? t('files.selectTeamFirst') : undefined } intent={ Loading @@ -90,7 +92,8 @@ const FileArea: FC<{ [fileInputDanger]: intent === 'danger' || !!internalError, } )} text='Attach a file' text={t('files.attachFile')} buttonText={t('files.browse')} onInputChange={handleFileChange} /> </FormGroup> Loading
frontend/src/components/Questionnaire/QuestionDescription.tsx +8 −3 Original line number Diff line number Diff line import { Classes, Colors } from '@blueprintjs/core' import { css, cx } from '@emotion/css' import { useTranslationFrontend } from '@inject/locale' import { ErrorMessage } from '@inject/shared' const container = css` Loading @@ -21,6 +22,8 @@ export const QuestionDescription = ({ max: number current: number }) => { const { t } = useTranslationFrontend() if (min <= 1 && max === -1) { return null } Loading @@ -28,12 +31,14 @@ export const QuestionDescription = ({ <div className={cx(Classes.TEXT_MUTED, container)}> {max !== -1 && current >= max && ( <div> <ErrorMessage minimal>Maximum characters reached</ErrorMessage> <ErrorMessage minimal> {t('questionnaire.maxCharactersReached')} </ErrorMessage> </div> )} {min !== 1 && ( <span> <span>Mininimal length:</span> <span>{t('questionnaire.minimalLength')}:</span> <span className={paragraph}> {min} </span> {current !== 0 && current < min && ( <span Loading @@ -41,7 +46,7 @@ export const QuestionDescription = ({ color: ${Colors.RED4}; `} > Needed {t('questionnaire.needed')} </span> )} </span> Loading