Skip to content

Commit

Permalink
wip: ib-tutkinto core requirements
Browse files Browse the repository at this point in the history
  • Loading branch information
ilkkahanninen committed Dec 30, 2024
1 parent fde13f5 commit f557caa
Show file tree
Hide file tree
Showing 9 changed files with 486 additions and 66 deletions.
2 changes: 1 addition & 1 deletion web/app/components-v2/createdialog/DialogField.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export type DialogField<T> = {

export const useDialogField = <T>(
isVisible: boolean,
defaultValue?: () => T
defaultValue?: () => T | undefined
): DialogField<T> => {
const [value, set] = useState<T | undefined>(defaultValue)
const [visible, setVisible] = useState<boolean>(false)
Expand Down
181 changes: 170 additions & 11 deletions web/app/ib/IBPaatasonSuoritusTiedot.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React, { useCallback, useMemo } from 'react'
import React, { useCallback, useEffect, useMemo } from 'react'
import {
ActivePäätasonSuoritus,
hasPäätasonsuoritusOf
Expand All @@ -7,31 +7,42 @@ import {
KeyValueRow,
KeyValueTable
} from '../components-v2/containers/KeyValueTable'
import {
LocalizedTextEdit,
LocalizedTextView
} from '../components-v2/controls/LocalizedTestField'
import { Select, useKoodistoOptions } from '../components-v2/controls/Select'
import { FormField } from '../components-v2/forms/FormField'
import { FormModel } from '../components-v2/forms/FormModel'
import { t } from '../i18n/i18n'
import { IBOpiskeluoikeus } from '../types/fi/oph/koski/schema/IBOpiskeluoikeus'
import {
KoodistoEdit,
KoodistoView
} from '../components-v2/opiskeluoikeus/KoodistoField'
import { FormField } from '../components-v2/forms/FormField'
import { KoodistoSelect } from '../components-v2/opiskeluoikeus/KoodistoSelect'
import {
OrganisaatioEdit,
OrganisaatioView
} from '../components-v2/opiskeluoikeus/OrganisaatioField'
import { TextEdit, TextView } from '../components-v2/controls/TextField'
import {
LocalizedTextEdit,
LocalizedTextView
} from '../components-v2/controls/LocalizedTestField'
import { t } from '../i18n/i18n'
import { IBOpiskeluoikeus } from '../types/fi/oph/koski/schema/IBOpiskeluoikeus'
import {
IBTutkinnonSuoritus,
isIBTutkinnonSuoritus
} from '../types/fi/oph/koski/schema/IBTutkinnonSuoritus'
import { Koodistokoodiviite } from '../types/fi/oph/koski/schema/Koodistokoodiviite'
import { parasArviointi, viimeisinArviointi } from '../util/arvioinnit'
import { koodiviiteId } from '../util/koodisto'
import { isKoodiarvoOf } from '../util/types'
import { DialogSelect } from '../uusiopiskeluoikeus/components/DialogSelect'
import { createIBCASSuoritus } from './oppiaineet/ibTutkintoOppiaine'
import { isKoodiarvoOf, isKoodistoOf } from '../util/types'
import { KoodistoSelect } from '../components-v2/opiskeluoikeus/KoodistoSelect'
import { useExtendedEssayState } from './state/extendedEssay'
import {
useAineryhmäOptions,
useKielivalikoimaOptions,
useOppiaineTasoOptions
} from './state/options'
import { Checkbox } from '../components-v2/controls/Checkbox'
import { useTheoryOfKnowledgeState } from './state/theoryOfKnowledge'

export type IBTutkintTiedotProps = {
form: FormModel<IBOpiskeluoikeus>
Expand Down Expand Up @@ -101,6 +112,7 @@ const IBTutkinnonTiedotRows: React.FC<IBTutkinnonTiedotRowsProps> = ({

return (
<>
<ExtendedEssayFieldRows form={form} päätasonSuoritus={päätasonSuoritus} />
<KeyValueRow localizableLabel="Creativity action service">
<CreativityActionServiceField
form={form}
Expand All @@ -120,6 +132,153 @@ const IBTutkinnonTiedotRows: React.FC<IBTutkinnonTiedotRowsProps> = ({
)
}

const TheoryOfKnowledgeRows: React.FC<IBTutkinnonTiedotRowsProps> = ({
form,
päätasonSuoritus
}) => {
const state = useTheoryOfKnowledgeState(form, päätasonSuoritus)
const osasuoritukset = päätasonSuoritus.suoritus.osasuoritukset || []

return form.editMode ? (
<>
<KeyValueRow localizableLabel="Theory of knowledge">
<KeyValueTable>
{osasuoritukset.map((os, index) => (
<KeyValueRow localizableLabel="Osasuoritus" innerKeyValueTable>

Check warning on line 147 in web/app/ib/IBPaatasonSuoritusTiedot.tsx

View workflow job for this annotation

GitHub Actions / 👀 / Lint Koski

Missing JSX expression container around literal string: "TODO"
TODO
</KeyValueRow>
))}
{state.pakollinen.visible && (
<KeyValueRow innerKeyValueTable>
<Checkbox
label={t('Pakollinen')}
checked={!!state.pakollinen.value}
onChange={state.pakollinen.set}
testId="pakollinen"
/>
</KeyValueRow>
)}
</KeyValueTable>
{state.arvosana.visible && (
<KeyValueRow localizableLabel="Arvosana" innerKeyValueTable>
<KoodistoSelect
koodistoUri="arviointiasteikkocorerequirementsib"
value={state.arvosana.value?.koodiarvo}
onSelect={state.arvosana.set}
testId="arvosana"
/>
</KeyValueRow>
)}
</KeyValueRow>
</>
) : (
<KeyValueRow localizableLabel="Theory of knowledge">
{
parasArviointi(päätasonSuoritus.suoritus.extendedEssay?.arviointi)
?.arvosana.koodiarvo
}
</KeyValueRow>
)
}

const ExtendedEssayFieldRows: React.FC<IBTutkinnonTiedotRowsProps> = ({
form,
päätasonSuoritus
}) => {
const state = useExtendedEssayState(form, päätasonSuoritus)
const tunnisteet = useKoodistoOptions('oppiaineetib')
const kielet = useKielivalikoimaOptions(true)
const ryhmät = useAineryhmäOptions(true)
const tasot = useOppiaineTasoOptions(true)

return form.editMode ? (
<>
<KeyValueRow localizableLabel="Extended essay">
<KeyValueTable>
{state.tunniste.visible && tunnisteet && (
<KeyValueRow localizableLabel="Tunniste" innerKeyValueTable>
<Select
inlineOptions
options={tunnisteet}
value={
state.tunniste.value && koodiviiteId(state.tunniste.value)
}
onChange={(opt) => state.tunniste.set(opt?.value)}
testId="tunniste"
/>
</KeyValueRow>
)}
{state.kieli.visible && kielet && (
<KeyValueRow localizableLabel="Kieli" innerKeyValueTable>
<DialogSelect
options={kielet}
value={state.kieli.value && koodiviiteId(state.kieli.value)}
onChange={(o) => state.kieli.set(o?.value)}
testId="kieli"
/>
</KeyValueRow>
)}
{state.taso.visible && tasot && (
<KeyValueRow localizableLabel="Taso" innerKeyValueTable>
<DialogSelect
options={tasot}
value={state.taso.value && koodiviiteId(state.taso.value)}
onChange={(o) => state.taso.set(o?.value)}
testId="taso"
/>
</KeyValueRow>
)}
{state.ryhmä.visible && ryhmät && (
<KeyValueRow localizableLabel="Aineryhmä" innerKeyValueTable>
<DialogSelect
options={ryhmät}
value={state.ryhmä.value && koodiviiteId(state.ryhmä.value)}
onChange={(o) => state.ryhmä.set(o?.value)}
testId="ryhmä"
/>
</KeyValueRow>
)}
{state.pakollinen.visible && (
<KeyValueRow innerKeyValueTable>
<Checkbox
label={t('Pakollinen')}
checked={!!state.pakollinen.value}
onChange={state.pakollinen.set}
testId="pakollinen"
/>
</KeyValueRow>
)}
</KeyValueTable>
{state.aihe.visible && (
<KeyValueRow localizableLabel="Aihe" innerKeyValueTable>
<LocalizedTextEdit
value={state.aihe.value}
onChange={state.aihe.set}
/>
</KeyValueRow>
)}
{state.arvosana.visible && (
<KeyValueRow localizableLabel="Arvosana" innerKeyValueTable>
<KoodistoSelect
koodistoUri="arviointiasteikkocorerequirementsib"
value={state.arvosana.value?.koodiarvo}
onSelect={state.arvosana.set}
testId="arvosana"
/>
</KeyValueRow>
)}
</KeyValueRow>
</>
) : (
<KeyValueRow localizableLabel="Extended essay">
{
parasArviointi(päätasonSuoritus.suoritus.extendedEssay?.arviointi)
?.arvosana.koodiarvo
}
</KeyValueRow>
)
}

const CreativityActionServiceField: React.FC<IBTutkinnonTiedotRowsProps> = ({
form,
päätasonSuoritus
Expand Down
13 changes: 4 additions & 9 deletions web/app/ib/dialogs/UusiIBTutkintoOppiaineDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,27 @@ import {
ModalFooter,
ModalTitle
} from '../../components-v2/containers/Modal'
import { Checkbox } from '../../components-v2/controls/Checkbox'
import { FlatButton } from '../../components-v2/controls/FlatButton'
import { RaisedButton } from '../../components-v2/controls/RaisedButton'
import {
Select,
SelectOption,
useKoodistoOptions
} from '../../components-v2/controls/Select'
import {
paikallinenKoulutus,
PaikallinenKoulutusFields
} from '../../components-v2/opiskeluoikeus/PaikallinenKoulutusFields'
import { t } from '../../i18n/i18n'
import { IBOpiskeluoikeus } from '../../types/fi/oph/koski/schema/IBOpiskeluoikeus'
import { IBOppiaineenSuoritus } from '../../types/fi/oph/koski/schema/IBOppiaineenSuoritus'
import { Koodistokoodiviite } from '../../types/fi/oph/koski/schema/Koodistokoodiviite'
import { koodiviiteId } from '../../util/koodisto'
import { PäätasonSuoritusOf } from '../../util/opiskeluoikeus'
import { DialogSelect } from '../../uusiopiskeluoikeus/components/DialogSelect'
import { useUusiIBTutkintoOppiaineState } from '../state/ibTutkintoOppiaine'
import { useIBTutkintoOppiaineState } from '../state/ibTutkintoOppiaine'
import {
useAineryhmäOptions,
useKielivalikoimaOptions,
useOppiaineTasoOptions,
UusiPaikallinenOppiaineKey
useOppiaineTasoOptions
} from '../state/options'
import { Checkbox } from '../../components-v2/controls/Checkbox'

export type UusiIBTutkintoOppiaineDialogProps = {
organisaatioOid: string
Expand All @@ -42,7 +37,7 @@ export type UusiIBTutkintoOppiaineDialogProps = {
export const UusiIBTutkintoOppiaineDialog: React.FC<
UusiIBTutkintoOppiaineDialogProps
> = (props) => {
const state = useUusiIBTutkintoOppiaineState()
const state = useIBTutkintoOppiaineState()
const tunnisteet = useKoodistoOptions('oppiaineetib')
const kielet = useKielivalikoimaOptions(true)
const ryhmät = useAineryhmäOptions(true)
Expand Down
67 changes: 67 additions & 0 deletions web/app/ib/oppiaineet/ibTutkintoOppiaine.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
import { IBAineRyhmäOppiaine } from '../../types/fi/oph/koski/schema/IBAineRyhmaOppiaine'
import { IBCASOppiaineenArviointi } from '../../types/fi/oph/koski/schema/IBCASOppiaineenArviointi'
import { IBCASSuoritus } from '../../types/fi/oph/koski/schema/IBCASSuoritus'
import { IBCoreRequirementsArviointi } from '../../types/fi/oph/koski/schema/IBCoreRequirementsArviointi'
import { IBExtendedEssaySuoritus } from '../../types/fi/oph/koski/schema/IBExtendedEssaySuoritus'
import { IBOppiaineCAS } from '../../types/fi/oph/koski/schema/IBOppiaineCAS'
import { IBOppiaineenSuoritus } from '../../types/fi/oph/koski/schema/IBOppiaineenSuoritus'
import { IBOppiaineExtendedEssay } from '../../types/fi/oph/koski/schema/IBOppiaineExtendedEssay'
import { IBOppiaineLanguage } from '../../types/fi/oph/koski/schema/IBOppiaineLanguage'
import { IBOppiaineMuu } from '../../types/fi/oph/koski/schema/IBOppiaineMuu'
import { IBOppiaineTheoryOfKnowledge } from '../../types/fi/oph/koski/schema/IBOppiaineTheoryOfKnowledge'
import { IBTheoryOfKnowledgeSuoritus } from '../../types/fi/oph/koski/schema/IBTheoryOfKnowledgeSuoritus'
import { Koodistokoodiviite } from '../../types/fi/oph/koski/schema/Koodistokoodiviite'
import { LocalizedString } from '../../types/fi/oph/koski/schema/LocalizedString'
import {
isIBOppiaineLanguageTunniste,
isIBOppiaineMuuTunniste
Expand Down Expand Up @@ -72,3 +78,64 @@ export const createIBCASSuoritus = (
}),
arviointi: [IBCASOppiaineenArviointi({ arvosana })]
})

export type IBExtendedEssaySuoritusProps = {
tunniste?: Koodistokoodiviite<'oppiaineetib'>
kieli?: Koodistokoodiviite<'kielivalikoima'>
ryhmä?: Koodistokoodiviite<'aineryhmaib'>
taso?: Koodistokoodiviite<'oppiaineentasoib'>
aihe?: LocalizedString
pakollinen?: boolean
arvosana?: Koodistokoodiviite<'arviointiasteikkocorerequirementsib'>
}

export const createIBExtendedEssaySuoritus = (
props: IBExtendedEssaySuoritusProps
): IBExtendedEssaySuoritus | null => {
const koulutusmoduuli = createIBOppiaineExtendedEssay(props)
const arviointi = createIBCoreRequirementsArviointi(props)
return (
koulutusmoduuli &&
arviointi &&
IBExtendedEssaySuoritus({ koulutusmoduuli, arviointi: [arviointi] })
)
}

const createIBOppiaineExtendedEssay = (
props: IBExtendedEssaySuoritusProps
): IBOppiaineExtendedEssay | null => {
const aine = createIBAineRyhmäOppiaine(props)
return aine && props.aihe
? IBOppiaineExtendedEssay({
aine,
aihe: props.aihe,
pakollinen: !!props.pakollinen
})
: null
}

const createIBCoreRequirementsArviointi = ({
arvosana
}: IBExtendedEssaySuoritusProps): IBCoreRequirementsArviointi | null =>
arvosana ? IBCoreRequirementsArviointi({ arvosana }) : null

export type IBCoreRequirementsArviointiProps = {
pakollinen?: boolean
arvosana?: Koodistokoodiviite<'arviointiasteikkocorerequirementsib'>
}

export const createIBTheoryOfKnowledgeSuoritus = (
props: IBCoreRequirementsArviointiProps
): IBTheoryOfKnowledgeSuoritus | null => {
const koulutusmoduuli = createIBOppiaineTheoryOfKnowledge(props)
const arviointi = createIBCoreRequirementsArviointi(props)
return koulutusmoduuli && arviointi
? IBTheoryOfKnowledgeSuoritus({ koulutusmoduuli, arviointi: [arviointi] })
: null
}

const createIBOppiaineTheoryOfKnowledge = ({
pakollinen
}: IBCoreRequirementsArviointiProps): IBOppiaineTheoryOfKnowledge => {
return IBOppiaineTheoryOfKnowledge({ pakollinen: !!pakollinen })
}
Loading

0 comments on commit f557caa

Please sign in to comment.