Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert back remove headings #402

Merged
merged 2 commits into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions i18n/messages.en.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,20 +134,19 @@ module.exports = {
course_requirments_for_final_grade: 'Other requirements for final grade',
course_literature: 'Literature',
course_literature_comment: 'Literature comment',
course_literature_not_exist:
'You can find information about course literature either in the course memo for the course offering or in the course room in Canvas.',
course_examination_comments: 'Examination comment',
course_examination: 'Examination',
course_examination_disclaimer:
'<p>If the course is discontinued, students may request to be examined during the following two academic years.</p>',
course_valid_from: 'Valid from',
course_main_subject: 'Main field of study',
course_language: 'Language of instruction',
course_required_equipment: 'Equipment',
course_level_code: 'Education cycle',
course_decision_to_discontinue: 'Avvecklingsbeslut',
course_transitional_reg: 'Transitional regulations',
course_ethical: 'Ethical approach',
course_possibility_to_completions: 'Opportunity to complete the requirements via supplementary examination',
course_possibility_to_addition: 'Opportunity to raise an approved grade via renewed examination',
course_short_semester: {
1: 'Spring ',
2: 'Autumn ',
Expand All @@ -159,12 +158,10 @@ module.exports = {
RESEARCH: 'Third cycle',
},
course_department: 'Offered by',
course_contact_name: 'Contact ',
course_prerequisites: 'Recommended prerequisites',
course_prerequisites_description:
'Describes the knowledge and skills (in addition to the eligibility requirements) that you need to be able to take the course.',
course_prerequisites_menu_aria_label: 'Information about recommended prerequisites',
course_suggested_addon_studies: 'Add-on studies',
course_supplemental_information_url: 'Supplementary information link',
course_supplemental_information_url_text: 'Supplementary information link text',
course_supplemental_information: 'Supplementary information ',
Expand All @@ -173,7 +170,6 @@ module.exports = {
course_room_canvas: 'Course room in Canvas',
course_room_canvas_info:
'Registered students find further information about the implementation of the course in the course room in Canvas. A link to the course room can be found under the tab Studies in the Personal menu at the start of the course.',
course_application_info: 'Information for research students about course offerings',
},
courseRoundInformation: {
round_header: 'Information for',
Expand Down
8 changes: 2 additions & 6 deletions i18n/messages.se.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,20 +136,19 @@ module.exports = {
course_requirments_for_final_grade: 'Övriga krav för slutbetyg',
course_literature: 'Kurslitteratur',
course_literature_comment: 'Kommentar till kurslitteratur',
course_literature_not_exist:
'Du hittar information om kurslitteratur antingen i kursomgångens kurs-PM eller i kursomgångens kursrum i Canvas.',
course_examination_comments: 'Kommentar till examinationsmoment',
course_examination: 'Examination',
course_examination_disclaimer:
'<p>När kurs inte längre ges har student möjlighet att examineras under ytterligare två läsår.</p>',
course_valid_from: 'Giltig från',
course_main_subject: 'Huvudområde',
course_language: 'Undervisningsspråk',
course_required_equipment: 'Utrustning',
course_level_code: 'Utbildningsnivå',
course_decision_to_discontinue: 'Avvecklingsbeslut',
course_transitional_reg: 'Övergångsbestämmelser',
course_ethical: 'Etiskt förhållningssätt',
course_possibility_to_completions: 'Möjlighet till komplettering',
course_possibility_to_addition: 'Möjlighet till plussning',
course_short_semester: {
1: 'VT ',
2: 'HT ',
Expand All @@ -161,12 +160,10 @@ module.exports = {
RESEARCH: 'Forskarnivå',
},
course_department: 'Ges av',
course_contact_name: 'Kontaktperson',
course_prerequisites: 'Rekommenderade förkunskaper',
course_prerequisites_description:
'Beskriver vilka kunskaper och färdigheter (utöver behörighetskraven) som du behöver för att kunna ta till dig kursen.',
course_prerequisites_menu_aria_label: 'Information om rekommenderade förkunskaper',
course_suggested_addon_studies: 'Påbyggnad',
course_supplemental_information_url: 'Övrig information - länk',
course_supplemental_information_url_text: 'Övrig information - länk text',
course_supplemental_information: 'Övrig information',
Expand All @@ -175,7 +172,6 @@ module.exports = {
course_room_canvas: 'Kursrum i Canvas',
course_room_canvas_info:
'Registrerade studenter hittar information för genomförande av kursen i kursrummet i Canvas. En länk till kursrummet finns under fliken Studier i Personliga menyn vid kursstart.',
course_application_info: 'Information för forskarstuderande om när kursen ges',
},
courseRoundInformation: {
round_header: 'Information för',
Expand Down
28 changes: 3 additions & 25 deletions public/js/app/components/CourseSectionList.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { SyllabusInformation } from './SyllabusInformation'

function CourseSectionList({ courseInfo = {}, partToShow, syllabus = {}, syllabusName }) {
const { translation } = useLanguage()
const { isMissingInfoLabel, missingInfoLabel } = useMissingInfo()
const { isMissingInfoLabel } = useMissingInfo()

function getContent() {
const content = [
Expand Down Expand Up @@ -38,25 +38,18 @@ function CourseSectionList({ courseInfo = {}, partToShow, syllabus = {}, syllabu
}

function getExecution() {
let literatureText = missingInfoLabel
const courseHasLiterature = courseInfo.course_literature && !isMissingInfoLabel(courseInfo.course_literature)
let literatureText = translation.courseInformation.course_literature_not_exist
const syllabusHasLiterature = syllabus.course_literature && !isMissingInfoLabel(syllabus.course_literature)
const syllabusHasLiteratureComment =
syllabus.course_literature_comment && !isMissingInfoLabel(syllabus.course_literature_comment)

if (courseHasLiterature) {
literatureText = courseInfo.course_literature
} else if (syllabusHasLiterature) {
if (syllabusHasLiterature) {
const literatureComment = syllabusHasLiteratureComment ? `<br />${syllabus.course_literature_comment}` : ''
literatureText = `${syllabus.course_literature}${literatureComment}`
} else if (syllabusHasLiteratureComment) {
literatureText = `${syllabus.course_literature_comment}`
}

const courseRequiredEquipment = !isMissingInfoLabel(courseInfo.course_required_equipment)
? courseInfo.course_required_equipment
: syllabus.course_required_equipment

const eligibility = getEligibility()

const during = [
Expand All @@ -70,7 +63,6 @@ function CourseSectionList({ courseInfo = {}, partToShow, syllabus = {}, syllabu
ariaLabel: translation.courseInformation.course_prerequisites_menu_aria_label,
},
},
{ header: translation.courseInformation.course_required_equipment, text: courseRequiredEquipment },
{ header: translation.courseInformation.course_literature, text: literatureText },
]

Expand Down Expand Up @@ -110,14 +102,6 @@ function CourseSectionList({ courseInfo = {}, partToShow, syllabus = {}, syllabu
syllabusMarker: true,
})
}
examination.push({
header: translation.courseInformation.course_possibility_to_completions,
text: courseInfo.course_possibility_to_completions,
})
examination.push({
header: translation.courseInformation.course_possibility_to_addition,
text: courseInfo.course_possibility_to_addition,
})
examination.push({ header: translation.courseInformation.course_examiners, text: courseInfo.course_examiners })
examination.push({
header: translation.courseInformation.course_ethical,
Expand Down Expand Up @@ -147,13 +131,7 @@ function CourseSectionList({ courseInfo = {}, partToShow, syllabus = {}, syllabu
text: translation.courseInformation.course_level_code_label[courseInfo.course_level_code],
syllabusMarker: true,
},
{
header: translation.courseInformation.course_suggested_addon_studies,
text: courseInfo.course_suggested_addon_studies,
},
]
if (!isMissingInfoLabel(courseInfo.course_contact_name))
prepare.push({ header: translation.courseInformation.course_contact_name, text: courseInfo.course_contact_name })
if (syllabus.course_transitional_reg !== '')
prepare.push({
header: translation.courseInformation.course_transitional_reg,
Expand Down
6 changes: 0 additions & 6 deletions public/js/app/components/MainCourseInformation.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,6 @@ const MainCourseInformation = ({ courseCode, courseData, semesterRoundState }) =
</Alert>
)}

{courseInfo.course_application_info.length > 0 && (
<Alert type="info" header={translation.courseInformation.course_application_info}>
<span dangerouslySetInnerHTML={{ __html: courseInfo.course_application_info }} />
</Alert>
)}

<CourseSectionList
courseInfo={courseInfo}
// if there is no syllabus, we still want to display empty syllabus data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { usePlannedModules } from '../../hooks/usePlannedModules'
import { RoundInformationInfoGrid } from './RoundInformationInfoGrid'
import { RoundInformationContacts } from './RoundInformationContacts'

function RoundInformation({ courseCode, courseData, courseRound, semesterRoundState }) {
function RoundInformation({ courseCode, courseRound, semesterRoundState }) {
const { translation } = useLanguage()

const { createRoundHeader } = useRoundUtils()
Expand Down Expand Up @@ -75,7 +75,7 @@ function RoundInformation({ courseCode, courseData, courseRound, semesterRoundSt
)}

<h3>{translation.courseLabels.header_contact}</h3>
<RoundInformationContacts courseData={courseData} courseRoundEmployees={courseRoundEmployees ?? {}} />
<RoundInformationContacts courseRoundEmployees={courseRoundEmployees ?? {}} />
</div>
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react'
import { useLanguage } from '../../hooks/useLanguage'
import { useMissingInfo } from '../../hooks/useMissingInfo'

function RoundInformationContacts({ courseData, courseRoundEmployees }) {
function RoundInformationContacts({ courseRoundEmployees }) {
const { translation } = useLanguage()
const { missingInfoLabel } = useMissingInfo()

Expand All @@ -26,15 +26,6 @@ function RoundInformationContacts({ courseData, courseRoundEmployees }) {
<dt>{translation.courseRoundInformation.round_teacher}</dt>
<dd dangerouslySetInnerHTML={{ __html: courseRoundEmployees.teachers || missingInfoLabel }} />
</div>

{courseData.course_contact_name && courseData.course_contact_name !== missingInfoLabel && (
<div>
<dt>{translation.courseInformation.course_contact_name}</dt>
<dd>
<p>{courseData.course_contact_name}</p>
</dd>
</div>
)}
</div>
)
}
Expand Down
38 changes: 13 additions & 25 deletions public/js/app/components/__tests__/CourseSectionList.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from 'react'
import { render, screen } from '@testing-library/react'
import '@testing-library/jest-dom'
import { WebContextProvider } from '../../context/WebContext'
import i18n from '../../../../../i18n'

import CourseSectionList from '../CourseSectionList'

Expand All @@ -10,11 +11,9 @@ const INFORM_IF_IMPORTANT_INFO_IS_MISSING = ['No information inserted', 'Ingen i
describe('Component <CourseSectionList>', () => {
test('renders course literature correctly', () => {
const lang = 'en'
const [courseLiteratureNoTitle] = INFORM_IF_IMPORTANT_INFO_IS_MISSING // en
const courseInfoWithoutLiterature = { course_literature: `<i>${courseLiteratureNoTitle}</i>` }

const courseLiteratureTitle = 'Course Literature (1970)'
const courseInfoWithLiterature = { course_literature: courseLiteratureTitle }
const translation = i18n.getLanguageByShortname(lang)
const syllabusLiteratureDefaultEmptyValue = translation.courseInformation.course_literature

const [syllabusLiteratureNoTitle] = INFORM_IF_IMPORTANT_INFO_IS_MISSING // en
const syllabusWithoutLiterature = {
Expand Down Expand Up @@ -44,52 +43,41 @@ describe('Component <CourseSectionList>', () => {
lang,
}

// Course has no literature, and syllabus has no literature – Show 'No information inserted'
// Syllabus has no literature – Show the default text
const { rerender } = render(
<WebContextProvider configIn={context1}>
<CourseSectionList courseInfo={courseInfoWithoutLiterature} syllabus={syllabusWithoutLiterature} />
<CourseSectionList syllabus={syllabusWithoutLiterature} />
</WebContextProvider>
)
const noliteratureText = screen.getByText(courseLiteratureNoTitle)
const noliteratureText = screen.getByText(syllabusLiteratureDefaultEmptyValue)
expect(noliteratureText).toBeInTheDocument()

// Course has literature – Show only literature from course
// Syllabus has literature without comment – Show only literature (no comment) from syllabus
rerender(
<WebContextProvider configIn={context1}>
<CourseSectionList courseInfo={courseInfoWithLiterature} syllabus={syllabusWithLiteratureAndComment} />
<CourseSectionList syllabus={syllabusWithLiteratureNoComment} />
</WebContextProvider>
)
const literatureText = screen.getByText(courseLiteratureTitle)
expect(literatureText).toBeInTheDocument()
let syllabusText = screen.queryByText(syllabusLiteratureTitle)
expect(syllabusText).not.toBeInTheDocument()

// Course hasn't literature, syllabus does without comment – Show only literature (no comment) from syllabus
rerender(
<WebContextProvider configIn={context1}>
<CourseSectionList courseInfo={courseInfoWithoutLiterature} syllabus={syllabusWithLiteratureNoComment} />
</WebContextProvider>
)
syllabusText = screen.getByText(syllabusLiteratureTitle, { exact: false })
let syllabusText = screen.getByText(syllabusLiteratureTitle, { exact: false })
expect(syllabusText).toBeInTheDocument()
syllabusText = screen.queryByText(syllabusLiteratureNoComment)
expect(syllabusText).not.toBeInTheDocument()

// Course hasn't literature, syllabus does with comment – Show literature and literature comment from syllabus
// Syllabus has literature with comment – Show literature and literature comment from syllabus
rerender(
<WebContextProvider configIn={context1}>
<CourseSectionList courseInfo={courseInfoWithoutLiterature} syllabus={syllabusWithLiteratureAndComment} />
<CourseSectionList syllabus={syllabusWithLiteratureAndComment} />
</WebContextProvider>
)
syllabusText = screen.getByText(syllabusLiteratureTitle, { exact: false })
expect(syllabusText).toBeInTheDocument()
syllabusText = screen.getByText(syllabusLiteratureComment, { exact: false })
expect(syllabusText).toBeInTheDocument()

// Course hasn't literature, syllabus only has comment – Show literature comment from syllabus
// Syllabus hasn't literature and only has comment – Show literature comment from syllabus
rerender(
<WebContextProvider configIn={context1}>
<CourseSectionList courseInfo={courseInfoWithoutLiterature} syllabus={syllabusWithNoLiteratureAndComment} />
<CourseSectionList syllabus={syllabusWithNoLiteratureAndComment} />
</WebContextProvider>
)
syllabusText = screen.getByText(syllabusLiteratureComment, { exact: false })
Expand Down
6 changes: 0 additions & 6 deletions public/js/app/components/__tests__/RoundInformation.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ describe('Component <RoundInformation>', () => {
const propsWithStudyPace = {
memoStorageUri: '',
semesterRoundState: defaultSemesterRoundState,
courseData: {},
courseRound: {
round_course_term: ['2018', '1'],
round_study_pace: '25',
Expand All @@ -67,7 +66,6 @@ describe('Component <RoundInformation>', () => {
const propsWithEmployees = {
memoStorageUri: '',
semesterRoundState: defaultSemesterRoundState,
courseData: {},
courseCode: 'SF1624',
courseRound: mockCourseRound,
}
Expand Down Expand Up @@ -97,7 +95,6 @@ describe('Component <RoundInformation>', () => {
const propsWithEmptyEmployees = {
memoStorageUri: '',
semesterRoundState: defaultSemesterRoundState,
courseData: {},
courseCode: 'SF1624',
courseRound: mockCourseRound,
}
Expand All @@ -115,7 +112,6 @@ describe('Component <RoundInformation>', () => {
const propsWithoutEmployees = {
memoStorageUri: '',
semesterRoundState: defaultSemesterRoundState,
courseData: {},
courseCode: 'SF1624',
courseRound: mockCourseRound,
}
Expand Down Expand Up @@ -171,7 +167,6 @@ describe('Component <RoundInformation>', () => {
const propsWithoutSeatsNum = {
memoStorageUri: '',
semesterRoundState: defaultSemesterRoundState,
courseData: {},
courseRound: {
round_course_term: ['2018', '1'],
round_selection_criteria: '<p>English. Spicy jalapeno bacon ipsum</p>',
Expand Down Expand Up @@ -200,7 +195,6 @@ describe('Component <RoundInformation>', () => {
const propsWithEmptyCriteria = {
memoStorageUri: '',
semesterRoundState: defaultSemesterRoundState,
courseData: {},
courseRound: {
round_course_term: ['2018', '1'],
round_selection_criteria: '<p></p>',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ const withinNextSibling = element => within(nextSibling(element))
describe('Component <RoundInformationContacts>', () => {
describe('examiners, responsibles and teachers', () => {
test('shoud show headers with "missing info" text when data is missing', () => {
render(<RoundInformationContacts courseData={{}} courseRoundEmployees={{}} />)
render(<RoundInformationContacts courseRoundEmployees={{}} />)
const examinerLabel = screen.getByText('Examiner')
expect(nextSibling(examinerLabel)).toHaveTextContent('No information inserted')

Expand All @@ -36,7 +36,6 @@ describe('Component <RoundInformationContacts>', () => {
test('shoud show headers with data inserted as html', () => {
render(
<RoundInformationContacts
courseData={{ courseInfo: { course_contact_name: undefined } }}
courseRoundEmployees={{
examiners: '<p class="person"><a href="/profile/testexaminers/">Test examiners</a></p>',
responsibles: '<p class="person"><a href="/profile/testresponsibles/">Test responsibles</a></p>',
Expand All @@ -60,24 +59,4 @@ describe('Component <RoundInformationContacts>', () => {
expect(teacherLink).toHaveAttribute('href', '/profile/testteachers/')
})
})

describe('cource contact', () => {
test('should show header and content for course contact name', () => {
render(
<RoundInformationContacts courseData={{ course_contact_name: 'Contact name' }} courseRoundEmployees={{}} />
)
const contactLabel = screen.getByText('Contact')
expect(contactLabel).toBeInTheDocument()
})
test.each([undefined, '<i>No information inserted</i>'])(
"shoud NOT show header if contact name is '%s'",
contactNameArg => {
render(
<RoundInformationContacts courseData={{ course_contact_name: contactNameArg }} courseRoundEmployees={{}} />
)
const contactLabel = screen.queryByText('Contact')
expect(contactLabel).not.toBeInTheDocument()
}
)
})
})
Loading
Loading