Skip to content

Commit

Permalink
feat(transcript): add provisional grades to transcript
Browse files Browse the repository at this point in the history
Refs #415
  • Loading branch information
lpezzolla committed Jan 15, 2024
1 parent e274655 commit 0e03d4f
Show file tree
Hide file tree
Showing 14 changed files with 614 additions and 130 deletions.
21 changes: 14 additions & 7 deletions assets/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
"refresh": "Refresh",
"room": "Room {{roomName}}",
"rooms": "Rooms {{roomNames}}",
"selectDate": "Select date",
"title": "Agenda",
"weeklyLayout": "Weekly layout",
"selectDate": "Select date"
"weeklyLayout": "Weekly layout"
},
"bookingScreen": {
"barCodeTitle": "Barcode",
Expand Down Expand Up @@ -686,19 +686,26 @@
"opened": "Open tickets",
"title": "Ticket"
},
"transcriptScreen": {
"transcriptGradesScreen": {
"emptyState": "You haven't taken any exams",
"provisionalEmptyState": "There are no provisional grades",
"provisionalTitle": "Provisional",
"recordedTitle": "Recorded",
"rejectedSubtitle": "",
"title": "Grades",
"total": "There are {{total}} grades"
},
"transcriptMetricsScreen": {
"acquiredCreditsLabel": "Acquired credits",
"attendedCreditsLabel": "Attended credits",
"averages": "Averages",
"averagesAndGrades": "Averages and grades",
"emptyState": "You have not taken any exams",
"estimatedFinalGrade": "Final grade",
"estimatedFinalGradePurged": "Estimated final grade",
"finalAverageLabel": "Final average",
"masterAdmissionAverage": "Master admission average",
"provisionalGradesSectionTitle": "Provisional grades",
"thisYear": "This academic year",
"total": "There are {{total}} grades",
"title": "Career",
"weightedAverageLabel": "Weighted average",
"yourCareer": "Your career"
},
Expand All @@ -712,4 +719,4 @@
"videoPlayer": {
"speedSectionTitle": "Speed"
}
}
}
26 changes: 19 additions & 7 deletions assets/translations/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
"refresh": "Aggiorna",
"room": "Aula {{roomName}}",
"rooms": "Aule {{roomNames}}",
"selectDate": "Seleziona data",
"title": "Agenda",
"weeklyLayout": "Layout settimanale",
"selectDate": "Seleziona data"
"weeklyLayout": "Layout settimanale"
},
"bookingScreen": {
"barCodeTitle": "Barcode",
Expand Down Expand Up @@ -686,19 +686,31 @@
"opened": "Ticket aperti",
"title": "Ticket"
},
"transcriptScreen": {
"transcriptGradeScreen": {
"title": "Valutazione"
},
"transcriptGradesScreen": {
"emptyState": "Non hai sostenuto nessun esame",
"provisionalEmptyState": "Non ci sono valutazioni provvisorie",
"provisionalTitle": "Provvisorie",
"recordedTitle": "Registrate",
"rejectedSubtitle": "Rifiutato il {{-date}} alle {{-time}}",
"rejectionCountdown": "Rifiutabile entro:",
"expiredCountdown": "Scaduto",
"title": "Valutazioni",
"total": "Sono presenti {{total}} valutazioni"
},
"transcriptMetricsScreen": {
"acquiredCreditsLabel": "Crediti acquisiti",
"attendedCreditsLabel": "Crediti frequentati",
"averages": "Medie",
"averagesAndGrades": "Medie e voti",
"emptyState": "Non hai sostenuto nessun esame",
"estimatedFinalGrade": "Voto di laurea",
"estimatedFinalGradePurged": "Voto di laurea depurato",
"finalAverageLabel": "Media depurata",
"masterAdmissionAverage": "Media di ammissione al secondo livello",
"provisionalGradesSectionTitle": "Valutazioni provvisorie",
"thisYear": "Questo anno accademico",
"total": "Sono presenti {{total}} appelli",
"title": "Carriera",
"weightedAverageLabel": "Media ponderata",
"yourCareer": "La tua carriera"
},
Expand All @@ -712,4 +724,4 @@
"videoPlayer": {
"speedSectionTitle": "Velocità"
}
}
}
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
"@miblanchard/react-native-slider": "^2.2.0",
"@openspacelabs/react-native-zoomable-view": "^2.1.5",
"@orama/orama": "^2.0.0-beta.8",
"@polito/api-client": "^1.0.0-ALPHA.52",
"@polito/api-client": "^1.0.0-ALPHA.54",
"@react-native-async-storage/async-storage": "^1.17.11",
"@react-native-clipboard/clipboard": "^1.12.1",
"@react-native-community/blur": "^4.3.0",
Expand Down
77 changes: 77 additions & 0 deletions src/core/queries/studentHooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { useMemo } from 'react';

import { ExamGrade, Message, Student, StudentApi } from '@polito/api-client';
import { UpdateDevicePreferencesRequest } from '@polito/api-client/apis/StudentApi';
import { ProvisionalGrade } from '@polito/api-client/models/ProvisionalGrade';
import * as Sentry from '@sentry/react-native';
import {
useMutation,
Expand All @@ -17,6 +18,7 @@ import { pluckData } from '../../utils/queries';

export const STUDENT_QUERY_KEY = ['student'];
export const GRADES_QUERY_KEY = ['grades'];
export const PROVISIONAL_GRADES_QUERY_KEY = ['provisionalGrades'];
export const MESSAGES_QUERY_PREFIX = 'messages';
export const MESSAGES_QUERY_KEY = [MESSAGES_QUERY_PREFIX];
export const GUIDES_QUERY_KEY = ['guides'];
Expand Down Expand Up @@ -76,6 +78,81 @@ export const useGetGrades = () => {
);
};

export const useGetProvisionalGrades = () => {
// const studentClient = useStudentClient();

return useQuery(
PROVISIONAL_GRADES_QUERY_KEY,
() =>
[
{
id: 5817523,
examId: 903380,
courseShortcode: '02JSKOV',
courseName: 'Human Computer Interaction',
teacherId: 2154,
credits: 6,
grade: '27',
date: new Date('2022-05-15'),
state: 'published',
stateDescription: 'Provvisorio',
teacherMessage:
"sono disponibili aggiornamenti dei risultati relativi all'appello del 26/06/2023 per l'insegnamento Il processo logistico (02TGJRY). Alstom mi ha appena trasmesso la valutazione della parte di formazione svolta in azienda (Flusso fisico e contabile di materiale) e, alla luce dell'ottimo giudizio che avete ricevuto, ho ritenuto opportuno confermare i voti conseguiti durante lo svolgimento del case study in aula e già comunicati al termine del mio corso. La registrazione di questi voti verrà consolidata la prossima settimana.",
isWithdrawn: false,
isFailure: false,
canBeAccepted: true,
canBeRejected: true,
confirmedAt: new Date('2024-01-15T10:47:21.231Z'),
rejectedAt: new Date('2024-01-15T10:47:21.231Z'),
rejectingExpiresAt: new Date('2024-01-15T10:47:21.231Z'),
},
{
id: 5817524,
examId: 903380,
courseShortcode: '02JSKOV',
courseName: 'Software Engineering 2',
teacherId: 2154,
credits: 6,
grade: '27',
date: new Date('2022-05-15'),
state: 'confirmed',
stateDescription: 'Consolidato',
teacherMessage:
"sono disponibili aggiornamenti dei risultati relativi all'appello del 26/06/2023 per l'insegnamento Il processo logistico (02TGJRY). Alstom mi ha appena trasmesso la valutazione della parte di formazione svolta in azienda (Flusso fisico e contabile di materiale) e, alla luce dell'ottimo giudizio che avete ricevuto, ho ritenuto opportuno confermare i voti conseguiti durante lo svolgimento del case study in aula e già comunicati al termine del mio corso. La registrazione di questi voti verrà consolidata la prossima settimana.",
isWithdrawn: false,
isFailure: false,
canBeAccepted: true,
canBeRejected: true,
confirmedAt: new Date('2024-01-15T10:47:21.231Z'),
rejectedAt: new Date('2024-01-15T10:47:21.231Z'),
rejectingExpiresAt: new Date('2024-01-15T16:47:21.231Z'),
},
{
id: 5817525,
examId: 903380,
courseShortcode: '02JSKOV',
courseName: 'Software Engineering 2',
teacherId: 2154,
credits: 6,
grade: '27',
date: new Date('2022-05-15'),
state: 'rejected',
stateDescription: 'Rifiutato',
teacherMessage:
"sono disponibili aggiornamenti dei risultati relativi all'appello del 26/06/2023 per l'insegnamento Il processo logistico (02TGJRY). Alstom mi ha appena trasmesso la valutazione della parte di formazione svolta in azienda (Flusso fisico e contabile di materiale) e, alla luce dell'ottimo giudizio che avete ricevuto, ho ritenuto opportuno confermare i voti conseguiti durante lo svolgimento del case study in aula e già comunicati al termine del mio corso. La registrazione di questi voti verrà consolidata la prossima settimana.",
isWithdrawn: false,
isFailure: false,
canBeAccepted: true,
canBeRejected: true,
confirmedAt: new Date('2024-01-15T10:47:21.231Z'),
rejectedAt: new Date('2024-01-15T10:47:21.231Z'),
rejectingExpiresAt: new Date('2024-01-15T10:47:21.231Z'),
},
] as ProvisionalGrade[],
);
// ?() => studentClient.getStudentProvisionalGrades().then(pluckData),);
};

const getDeadlineWeekQueryKey = (since: DateTime) => [
DEADLINES_QUERY_PREFIX,
since,
Expand Down
22 changes: 20 additions & 2 deletions src/features/teaching/components/TeachingNavigator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,13 @@ import { CoursesScreen } from '../../courses/screens/CoursesScreen';
import { PlacesNavigator } from '../../places/components/PlacesNavigator';
import { PlacesStackParamList } from '../../places/components/PlacesNavigator';
import { CpdSurveysScreen } from '../../surveys/screens/CpdSurveysScreen';
import { TranscriptTopTabsNavigator } from '../../transcript/navigation/TranscriptTopTabsNavigator';
import { ProvisionalGradeScreen } from '../../transcript/screens/ProvisionalGradeScreen';
import { ExamQuestionScreen } from '../screens/ExamQuestionScreen';
import { ExamRequestScreen } from '../screens/ExamRequestScreen';
import { ExamScreen } from '../screens/ExamScreen';
import { ExamsScreen } from '../screens/ExamsScreen';
import { TeachingScreen } from '../screens/TeachingScreen';
import { TranscriptScreen } from '../screens/TranscriptScreen';

export type TeachingStackParamList = CourseSharedScreensParamList &
SharedScreensParamList & {
Expand All @@ -38,6 +39,7 @@ export type TeachingStackParamList = CourseSharedScreensParamList &
ExamRequest: { id: number };
MessagesModal: undefined;
Transcript: undefined;
ProvisionalGrade: { id: number };
OnboardingModal: undefined;
PlacesTeachingStack: NavigatorScreenParams<PlacesStackParamList>;
CpdSurveys: { categoryId: string; typeId: string; typeName: string };
Expand Down Expand Up @@ -113,9 +115,25 @@ export const TeachingNavigator = () => {
/>
<Stack.Screen
name="Transcript"
component={TranscriptScreen}
component={TranscriptTopTabsNavigator}
options={{
headerTitle: t('common.transcript'),
headerLargeTitle: false,
headerTransparent: false,
headerShadowVisible: false,
headerBackTitleVisible: false,
headerLargeStyle: {
backgroundColor: colors.headersBackground,
},
}}
/>
<Stack.Screen
name="ProvisionalGrade"
component={ProvisionalGradeScreen}
options={{
headerTitle: t('transcriptGradeScreen.title'),
headerLargeTitle: false,
headerBackTitleVisible: false,
}}
/>
<Stack.Screen
Expand Down
10 changes: 6 additions & 4 deletions src/features/teaching/screens/TeachingScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -195,8 +195,8 @@ export const TeachingScreen = ({ navigation }: Props) => {
<Metric
title={
studentQuery.data?.averageGradePurged != null
? t('transcriptScreen.finalAverageLabel')
: t('transcriptScreen.weightedAverageLabel')
? t('transcriptMetricsScreen.finalAverageLabel')
: t('transcriptMetricsScreen.weightedAverageLabel')
}
value={
studentQuery.data?.averageGradePurged ??
Expand All @@ -208,7 +208,7 @@ export const TeachingScreen = ({ navigation }: Props) => {
{studentQuery.data?.estimatedFinalGradePurged ? (
<Metric
title={t(
'transcriptScreen.estimatedFinalGradePurged',
'transcriptMetricsScreen.estimatedFinalGradePurged',
)}
value={formatFinalGrade(
studentQuery.data?.estimatedFinalGradePurged,
Expand All @@ -217,7 +217,9 @@ export const TeachingScreen = ({ navigation }: Props) => {
/>
) : (
<Metric
title={t('transcriptScreen.estimatedFinalGrade')}
title={t(
'transcriptMetricsScreen.estimatedFinalGrade',
)}
value={formatFinalGrade(
studentQuery.data?.estimatedFinalGrade,
)}
Expand Down
83 changes: 83 additions & 0 deletions src/features/transcript/components/ProvisionalGradeListItem.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';

import { DisclosureIndicator } from '@lib/ui/components/DisclosureIndicator';
import { ListItem } from '@lib/ui/components/ListItem';
import { Row } from '@lib/ui/components/Row';
import { useStylesheet } from '@lib/ui/hooks/useStylesheet';
import { Theme } from '@lib/ui/types/Theme';
import {
ProvisionalGrade,
ProvisionalGradeStateEnum,
} from '@polito/api-client/models/ProvisionalGrade';

import { IS_IOS } from '../../../core/constants';
import { formatDate, formatTime } from '../../../utils/dates';
import { useGetRejectionTime } from '../hooks/useGetRejectionTime';
import { ProvisionalGradeStatusBadge } from './ProvisionalGradeStatusBadge';

type Props = {
grade: ProvisionalGrade;
};

export const ProvisionalGradeListItem = ({ grade }: Props) => {
const { t } = useTranslation();

const styles = useStylesheet(createStyles);
const isRejected = grade.state === ProvisionalGradeStateEnum.Rejected;

const rejectionTime = useGetRejectionTime({
rejectingExpiresAt: grade.rejectingExpiresAt,
isCompact: true,
});

const subtitle = useMemo(() => {
switch (grade.state) {
case ProvisionalGradeStateEnum.Confirmed:
return rejectionTime;
case ProvisionalGradeStateEnum.Rejected:
return t('transcriptGradesScreen.rejectedSubtitle', {
date: formatDate(grade.rejectedAt!),
time: formatTime(grade.rejectedAt!),
});
default:
return undefined;
}
}, [grade.rejectedAt, grade.state, rejectionTime, t]);

return (
<ListItem
title={grade.courseName}
subtitle={subtitle}
subtitleStyle={
grade.state === ProvisionalGradeStateEnum.Confirmed
? styles.rejectableSubtitle
: styles.subtitle
}
disabled={isRejected}
linkTo={
isRejected
? undefined
: {
screen: 'ProvisionalGrade',
params: { id: grade.id },
}
}
trailingItem={
<Row align="center" pl={2}>
<ProvisionalGradeStatusBadge grade={grade} />
{IS_IOS && !isRejected ? <DisclosureIndicator /> : undefined}
</Row>
}
/>
);
};

const createStyles = ({ colors, dark, palettes }: Theme) => ({
subtitle: {
color: colors.title,
},
rejectableSubtitle: {
color: dark ? palettes.danger[300] : palettes.danger[700],
},
});
Loading

0 comments on commit 0e03d4f

Please sign in to comment.