Loading analyst/src/components/ActionLogTitle/ActionLogContent.tsx +19 −9 Original line number Diff line number Diff line Loading @@ -2,6 +2,12 @@ import { Classes, Colors } from '@blueprintjs/core' import { css } from '@emotion/css' import type { IAnalystActionLogSimple } from '@inject/graphql' import type { FC } from 'react' import { getConfirmationTextForConfirmationLog, getInjectNameForConfirmationLog, getQuestionnaireNameForReviewLog, getQuestionnaireNameForSubmissionLog, } from '../utilities' const activated = css` color: ${Colors.GREEN2}; Loading @@ -27,19 +33,23 @@ export const ActionLogContent: FC<ActionLogContentProps> = ({ actionLog }) => { return <>{actionLog.details.tool.displayName}</> case 'IInjectDetailsType': return <>{actionLog.details.inject.displayName}</> case 'IConfirmationDetailsType': // TODO: improve (requires more data from BE) return <>confirmation</> case 'IConfirmationDetailsType': { const injectName = getInjectNameForConfirmationLog(actionLog) const confirmationText = getConfirmationTextForConfirmationLog(actionLog) return `${injectName} confirmation${confirmationText ? `: "${confirmationText}"` : ''}` } case 'ICustomInjectDetailsType': return <>custom inject</> case 'IEmailType': return <>{actionLog.details.thread.subject}</> case 'IQuestionnaireReviewDetailsType': // TODO: improve (requires more data from BE) return <>questionnaire reviewed</> case 'IQuestionnaireSubmissionType': // TODO: improve (requires more data from BE) return <>questionnaire submitted</> case 'IQuestionnaireReviewDetailsType': { const questionnaireName = getQuestionnaireNameForReviewLog(actionLog) return <>{questionnaireName} reviewed</> } case 'IQuestionnaireSubmissionType': { const questionnaireName = getQuestionnaireNameForSubmissionLog(actionLog) return <>{questionnaireName} submitted</> } case 'ITeamQuestionnaireStateType': return <>{actionLog.details.questionnaire.displayName}</> case 'IFileDownloadDetailsType': Loading analyst/src/components/ActionLogTitle/ActionLogDescription.tsx +21 −12 Original line number Diff line number Diff line import type { IAnalystActionLogSimple } from '@inject/graphql' import type { FC } from 'react' import { getConfirmationTextForConfirmationLog, getInjectNameForConfirmationLog, getQuestionnaireNameForReviewLog, getQuestionnaireNameForSubmissionLog, } from '../utilities' interface ActionLogDescriptionProps { actionLog: IAnalystActionLogSimple } // TODO: add users? ask xvykopal export const ActionLogDescription: FC<ActionLogDescriptionProps> = ({ actionLog, }) => { Loading @@ -25,13 +29,16 @@ export const ActionLogDescription: FC<ActionLogDescriptionProps> = ({ the team </> ) case 'IConfirmationDetailsType': // TODO: improve (requires more data from BE) case 'IConfirmationDetailsType': { const injectName = getInjectNameForConfirmationLog(actionLog) const confirmationText = getConfirmationTextForConfirmationLog(actionLog) return ( <> An inject was <b>confirmed</b> by a trainee The <b>{injectName}</b> inject was <b>confirmed</b> by a trainee (button text: "<b>{confirmationText}</b>") </> ) } case 'ICustomInjectDetailsType': return ( <> Loading @@ -52,21 +59,23 @@ export const ActionLogDescription: FC<ActionLogDescriptionProps> = ({ </> ) } case 'IQuestionnaireReviewDetailsType': // TODO: improve (requires more data from BE) case 'IQuestionnaireReviewDetailsType': { const questionnaireName = getQuestionnaireNameForReviewLog(actionLog) return ( <> A questionnaire was <b>reviewed</b> by an instructor The <b>{questionnaireName}</b> was <b>reviewed</b> by an instructor </> ) case 'IQuestionnaireSubmissionType': // TODO: improve (requires more data from BE) } case 'IQuestionnaireSubmissionType': { const questionnaireName = getQuestionnaireNameForSubmissionLog(actionLog) return ( <> A questionnaire was submitted by a trainee, the answers were{' '} <b>{actionLog.details.accepted ? '' : 'not '}accepted</b> The <b>{questionnaireName}</b> was submitted by a trainee, the answers were <b>{actionLog.details.accepted ? '' : 'not '}accepted</b> </> ) } case 'ITeamQuestionnaireStateType': return ( <> Loading analyst/src/components/utilities.ts +85 −0 Original line number Diff line number Diff line Loading @@ -154,3 +154,88 @@ export const plotDataElement = css` opacity: 1; } ` // TODO: add inject to confirmation log on BE instead? export const getInjectNameForConfirmationLog = ( actionLog: IAnalystActionLogSimple ) => { if (actionLog.details.__typename !== 'IConfirmationDetailsType') { throw new Error( 'getInjectNameForConfirmationLog called with non-confirmation log' ) } const prevLog = actionLog.previousLogs.find( prevLog => prevLog.__typename === 'IActionLogType' && prevLog.details.__typename === 'IInjectDetailsType' ) return prevLog?.__typename === 'IActionLogType' && prevLog.details.__typename === 'IInjectDetailsType' ? prevLog.details.inject.displayName : 'inject' } // TODO: add confirmation to confirmation log on BE instead? export const getConfirmationTextForConfirmationLog = ( actionLog: IAnalystActionLogSimple ) => { if (actionLog.details.__typename !== 'IConfirmationDetailsType') { throw new Error( 'getConfirmationTextForConfirmationLog called with non-confirmation log' ) } const prevLog = actionLog.previousLogs.find( prevLog => prevLog.__typename === 'IActionLogType' && prevLog.details.__typename === 'IInjectDetailsType' ) return prevLog?.__typename === 'IActionLogType' && prevLog.details.__typename === 'IInjectDetailsType' ? prevLog.details.confirmation?.text : undefined } // TODO: add questionnaire to review log on BE instead? export const getQuestionnaireNameForSubmissionLog = ( actionLog: IAnalystActionLogSimple ) => { if (actionLog.details.__typename !== 'IQuestionnaireSubmissionType') { throw new Error( 'getQuestionnaireNameForSubmissionLog called with non-submission log' ) } const prevLog = actionLog.previousLogs.find( prevLog => prevLog.__typename === 'IActionLogType' && prevLog.details.__typename === 'ITeamQuestionnaireStateType' ) return prevLog?.__typename === 'IActionLogType' && prevLog.details.__typename === 'ITeamQuestionnaireStateType' ? prevLog.details.questionnaire.displayName : 'questionnaire' } // TODO: add questionnaire to review log on BE instead? export const getQuestionnaireNameForReviewLog = ( actionLog: IAnalystActionLogSimple ) => { if (actionLog.details.__typename !== 'IQuestionnaireReviewDetailsType') { throw new Error( 'getQuestionnaireNameForReviewLog called with non-review log' ) } const prevLog = actionLog.previousLogs.find( prevLog => prevLog.__typename === 'IActionLogType' && prevLog.details.__typename === 'IQuestionnaireSubmissionType' ) const prevPrevLog = prevLog?.previousLogs.find( prevPrevLog => prevPrevLog.__typename === 'IActionLogType' && prevPrevLog.details.__typename === 'ITeamQuestionnaireStateType' ) return prevPrevLog?.__typename === 'IActionLogType' && prevPrevLog.details.__typename === 'ITeamQuestionnaireStateType' ? prevPrevLog.details.questionnaire.displayName : 'questionnaire' } graphql/fragments.ts +45 −1 Original line number Diff line number Diff line Loading @@ -2508,7 +2508,51 @@ export const IAnalystActionLogSimple = graphql( cmd } } # TODO: add prev/next logs (also in actionLogs subscription) previousLogs { __typename id timestamp ... on IActionLogType { details { __typename ... on IInjectDetailsType { id inject { id displayName } confirmation { id text } } ... on ITeamQuestionnaireStateType { id questionnaire { id displayName } } } } previousLogs { __typename id timestamp ... on IActionLogType { details { __typename ... on ITeamQuestionnaireStateType { id questionnaire { id displayName } } } } } } } `, [] Loading graphql/graphql-cache.d.ts +8 −8 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
analyst/src/components/ActionLogTitle/ActionLogContent.tsx +19 −9 Original line number Diff line number Diff line Loading @@ -2,6 +2,12 @@ import { Classes, Colors } from '@blueprintjs/core' import { css } from '@emotion/css' import type { IAnalystActionLogSimple } from '@inject/graphql' import type { FC } from 'react' import { getConfirmationTextForConfirmationLog, getInjectNameForConfirmationLog, getQuestionnaireNameForReviewLog, getQuestionnaireNameForSubmissionLog, } from '../utilities' const activated = css` color: ${Colors.GREEN2}; Loading @@ -27,19 +33,23 @@ export const ActionLogContent: FC<ActionLogContentProps> = ({ actionLog }) => { return <>{actionLog.details.tool.displayName}</> case 'IInjectDetailsType': return <>{actionLog.details.inject.displayName}</> case 'IConfirmationDetailsType': // TODO: improve (requires more data from BE) return <>confirmation</> case 'IConfirmationDetailsType': { const injectName = getInjectNameForConfirmationLog(actionLog) const confirmationText = getConfirmationTextForConfirmationLog(actionLog) return `${injectName} confirmation${confirmationText ? `: "${confirmationText}"` : ''}` } case 'ICustomInjectDetailsType': return <>custom inject</> case 'IEmailType': return <>{actionLog.details.thread.subject}</> case 'IQuestionnaireReviewDetailsType': // TODO: improve (requires more data from BE) return <>questionnaire reviewed</> case 'IQuestionnaireSubmissionType': // TODO: improve (requires more data from BE) return <>questionnaire submitted</> case 'IQuestionnaireReviewDetailsType': { const questionnaireName = getQuestionnaireNameForReviewLog(actionLog) return <>{questionnaireName} reviewed</> } case 'IQuestionnaireSubmissionType': { const questionnaireName = getQuestionnaireNameForSubmissionLog(actionLog) return <>{questionnaireName} submitted</> } case 'ITeamQuestionnaireStateType': return <>{actionLog.details.questionnaire.displayName}</> case 'IFileDownloadDetailsType': Loading
analyst/src/components/ActionLogTitle/ActionLogDescription.tsx +21 −12 Original line number Diff line number Diff line import type { IAnalystActionLogSimple } from '@inject/graphql' import type { FC } from 'react' import { getConfirmationTextForConfirmationLog, getInjectNameForConfirmationLog, getQuestionnaireNameForReviewLog, getQuestionnaireNameForSubmissionLog, } from '../utilities' interface ActionLogDescriptionProps { actionLog: IAnalystActionLogSimple } // TODO: add users? ask xvykopal export const ActionLogDescription: FC<ActionLogDescriptionProps> = ({ actionLog, }) => { Loading @@ -25,13 +29,16 @@ export const ActionLogDescription: FC<ActionLogDescriptionProps> = ({ the team </> ) case 'IConfirmationDetailsType': // TODO: improve (requires more data from BE) case 'IConfirmationDetailsType': { const injectName = getInjectNameForConfirmationLog(actionLog) const confirmationText = getConfirmationTextForConfirmationLog(actionLog) return ( <> An inject was <b>confirmed</b> by a trainee The <b>{injectName}</b> inject was <b>confirmed</b> by a trainee (button text: "<b>{confirmationText}</b>") </> ) } case 'ICustomInjectDetailsType': return ( <> Loading @@ -52,21 +59,23 @@ export const ActionLogDescription: FC<ActionLogDescriptionProps> = ({ </> ) } case 'IQuestionnaireReviewDetailsType': // TODO: improve (requires more data from BE) case 'IQuestionnaireReviewDetailsType': { const questionnaireName = getQuestionnaireNameForReviewLog(actionLog) return ( <> A questionnaire was <b>reviewed</b> by an instructor The <b>{questionnaireName}</b> was <b>reviewed</b> by an instructor </> ) case 'IQuestionnaireSubmissionType': // TODO: improve (requires more data from BE) } case 'IQuestionnaireSubmissionType': { const questionnaireName = getQuestionnaireNameForSubmissionLog(actionLog) return ( <> A questionnaire was submitted by a trainee, the answers were{' '} <b>{actionLog.details.accepted ? '' : 'not '}accepted</b> The <b>{questionnaireName}</b> was submitted by a trainee, the answers were <b>{actionLog.details.accepted ? '' : 'not '}accepted</b> </> ) } case 'ITeamQuestionnaireStateType': return ( <> Loading
analyst/src/components/utilities.ts +85 −0 Original line number Diff line number Diff line Loading @@ -154,3 +154,88 @@ export const plotDataElement = css` opacity: 1; } ` // TODO: add inject to confirmation log on BE instead? export const getInjectNameForConfirmationLog = ( actionLog: IAnalystActionLogSimple ) => { if (actionLog.details.__typename !== 'IConfirmationDetailsType') { throw new Error( 'getInjectNameForConfirmationLog called with non-confirmation log' ) } const prevLog = actionLog.previousLogs.find( prevLog => prevLog.__typename === 'IActionLogType' && prevLog.details.__typename === 'IInjectDetailsType' ) return prevLog?.__typename === 'IActionLogType' && prevLog.details.__typename === 'IInjectDetailsType' ? prevLog.details.inject.displayName : 'inject' } // TODO: add confirmation to confirmation log on BE instead? export const getConfirmationTextForConfirmationLog = ( actionLog: IAnalystActionLogSimple ) => { if (actionLog.details.__typename !== 'IConfirmationDetailsType') { throw new Error( 'getConfirmationTextForConfirmationLog called with non-confirmation log' ) } const prevLog = actionLog.previousLogs.find( prevLog => prevLog.__typename === 'IActionLogType' && prevLog.details.__typename === 'IInjectDetailsType' ) return prevLog?.__typename === 'IActionLogType' && prevLog.details.__typename === 'IInjectDetailsType' ? prevLog.details.confirmation?.text : undefined } // TODO: add questionnaire to review log on BE instead? export const getQuestionnaireNameForSubmissionLog = ( actionLog: IAnalystActionLogSimple ) => { if (actionLog.details.__typename !== 'IQuestionnaireSubmissionType') { throw new Error( 'getQuestionnaireNameForSubmissionLog called with non-submission log' ) } const prevLog = actionLog.previousLogs.find( prevLog => prevLog.__typename === 'IActionLogType' && prevLog.details.__typename === 'ITeamQuestionnaireStateType' ) return prevLog?.__typename === 'IActionLogType' && prevLog.details.__typename === 'ITeamQuestionnaireStateType' ? prevLog.details.questionnaire.displayName : 'questionnaire' } // TODO: add questionnaire to review log on BE instead? export const getQuestionnaireNameForReviewLog = ( actionLog: IAnalystActionLogSimple ) => { if (actionLog.details.__typename !== 'IQuestionnaireReviewDetailsType') { throw new Error( 'getQuestionnaireNameForReviewLog called with non-review log' ) } const prevLog = actionLog.previousLogs.find( prevLog => prevLog.__typename === 'IActionLogType' && prevLog.details.__typename === 'IQuestionnaireSubmissionType' ) const prevPrevLog = prevLog?.previousLogs.find( prevPrevLog => prevPrevLog.__typename === 'IActionLogType' && prevPrevLog.details.__typename === 'ITeamQuestionnaireStateType' ) return prevPrevLog?.__typename === 'IActionLogType' && prevPrevLog.details.__typename === 'ITeamQuestionnaireStateType' ? prevPrevLog.details.questionnaire.displayName : 'questionnaire' }
graphql/fragments.ts +45 −1 Original line number Diff line number Diff line Loading @@ -2508,7 +2508,51 @@ export const IAnalystActionLogSimple = graphql( cmd } } # TODO: add prev/next logs (also in actionLogs subscription) previousLogs { __typename id timestamp ... on IActionLogType { details { __typename ... on IInjectDetailsType { id inject { id displayName } confirmation { id text } } ... on ITeamQuestionnaireStateType { id questionnaire { id displayName } } } } previousLogs { __typename id timestamp ... on IActionLogType { details { __typename ... on ITeamQuestionnaireStateType { id questionnaire { id displayName } } } } } } } `, [] Loading
graphql/graphql-cache.d.ts +8 −8 File changed.Preview size limit exceeded, changes collapsed. Show changes