Skip to content

Commit

Permalink
wip: ib-tutkinnon lisäkentät
Browse files Browse the repository at this point in the history
  • Loading branch information
ilkkahanninen committed Dec 30, 2024
1 parent 3404096 commit fde13f5
Show file tree
Hide file tree
Showing 5 changed files with 160 additions and 9 deletions.
8 changes: 6 additions & 2 deletions web/app/components-v2/opiskeluoikeus/KoodistoField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@ import {
SelectOption,
groupKoodistoToOptions
} from '../controls/Select'
import { useKoodisto } from '../../appstate/koodisto'
import {
KoodistokoodiviiteKoodistonNimellä,
useKoodisto
} from '../../appstate/koodisto'

export type KoodistoViewProps<T extends string> = CommonProps<
FieldViewerProps<
Expand All @@ -33,12 +36,13 @@ export type KoodistoEditProps<T extends string> = CommonProps<
{
koodistoUri: T
testId: string
koodiarvot?: string[]
}
>
>

export const KoodistoEdit = <T extends string>(props: KoodistoEditProps<T>) => {
const koodisto = useKoodisto(props.koodistoUri)
const koodisto = useKoodisto(props.koodistoUri, props.koodiarvot)
const options = useMemo(
() =>
(koodisto ?? []).map((k) => ({
Expand Down
3 changes: 2 additions & 1 deletion web/app/components-v2/opiskeluoikeus/KoodistoSelect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { TestIdLayer } from '../../appstate/useTestId'

export type KoodistoSelectProps<T extends string> = CommonProps<{
koodistoUri: T
koodiarvot?: string[]
addNewText?: string | LocalizedString
onSelect: (
tunniste: Koodistokoodiviite<T> | undefined,
Expand All @@ -25,7 +26,7 @@ export type KoodistoSelectProps<T extends string> = CommonProps<{
export function KoodistoSelect<T extends string>(
props: KoodistoSelectProps<T>
) {
const koodisto = useKoodisto(props.koodistoUri)
const koodisto = useKoodisto(props.koodistoUri, props.koodiarvot)
const { filter, zeroValueOption } = props
const options: OptionList<Koodistokoodiviite<T>> = useMemo(() => {
const koodistoOptions = (koodisto || [])
Expand Down
135 changes: 131 additions & 4 deletions web/app/ib/IBPaatasonSuoritusTiedot.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,37 @@
import React from 'react'
import { ActivePäätasonSuoritus } from '../components-v2/containers/EditorContainer'
import React, { useCallback, useMemo } from 'react'
import {
ActivePäätasonSuoritus,
hasPäätasonsuoritusOf
} from '../components-v2/containers/EditorContainer'
import {
KeyValueRow,
KeyValueTable
} from '../components-v2/containers/KeyValueTable'
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 {
OrganisaatioEdit,
OrganisaatioView
} from '../components-v2/opiskeluoikeus/OrganisaatioField'
import { TextEdit, TextView } from '../components-v2/controls/TextField'
import {
LocalizedTextEdit,
LocalizedTextView
} from '../components-v2/controls/LocalizedTestField'
import {
IBTutkinnonSuoritus,
isIBTutkinnonSuoritus
} from '../types/fi/oph/koski/schema/IBTutkinnonSuoritus'
import { Koodistokoodiviite } from '../types/fi/oph/koski/schema/Koodistokoodiviite'
import { createIBCASSuoritus } from './oppiaineet/ibTutkintoOppiaine'
import { isKoodiarvoOf, isKoodistoOf } from '../util/types'
import { KoodistoSelect } from '../components-v2/opiskeluoikeus/KoodistoSelect'

export type IBTutkintTiedotProps = {
form: FormModel<IBOpiskeluoikeus>
Expand All @@ -18,21 +43,123 @@ export const IBPäätasonSuoritusTiedot: React.FC<IBTutkintTiedotProps> = ({
päätasonSuoritus
}) => {
const opiskeluoikeus = form.state
const path = päätasonSuoritus.path

return (
<KeyValueTable>
<KeyValueRow localizableLabel="Koulutus">
{t(ibKoulutusNimi(opiskeluoikeus))}
</KeyValueRow>
<KeyValueRow localizableLabel="Oppilaitos / toimipiste">
{t(päätasonSuoritus.suoritus.toimipiste.nimi)}
<FormField
form={form}
path={path.prop('toimipiste')}
view={OrganisaatioView}
edit={OrganisaatioEdit}
/>
</KeyValueRow>
<KeyValueRow localizableLabel="Suorituskieli">
{t(päätasonSuoritus.suoritus.suorituskieli.nimi)}
<FormField
form={form}
path={path.prop('suorituskieli')}
view={KoodistoView}
edit={KoodistoEdit}
editProps={{ koodistoUri: 'kieli' }}
/>
</KeyValueRow>
{hasPäätasonsuoritusOf(isIBTutkinnonSuoritus, päätasonSuoritus) && (
<IBTutkinnonTiedotRows
form={form}
päätasonSuoritus={päätasonSuoritus}
/>
)}
<KeyValueRow localizableLabel="Todistuksella näkyvät lisätiedot">
<FormField
form={form}
path={path.prop('todistuksellaNäkyvätLisätiedot')}
view={LocalizedTextView}
edit={LocalizedTextEdit}
/>
</KeyValueRow>
</KeyValueTable>
)
}

type IBTutkinnonTiedotRowsProps = {
form: FormModel<IBOpiskeluoikeus>
päätasonSuoritus: ActivePäätasonSuoritus<
IBOpiskeluoikeus,
IBTutkinnonSuoritus
>
}

const IBTutkinnonTiedotRows: React.FC<IBTutkinnonTiedotRowsProps> = ({
form,
päätasonSuoritus
}) => {
const path = päätasonSuoritus.path

return (
<>
<KeyValueRow localizableLabel="Creativity action service">
<CreativityActionServiceField
form={form}
päätasonSuoritus={päätasonSuoritus}
/>
</KeyValueRow>
<KeyValueRow localizableLabel="Lisäpisteet">
<FormField
form={form}
path={path.prop('lisäpisteet')}
view={KoodistoView}
edit={KoodistoEdit}
editProps={{ koodistoUri: 'arviointiasteikkolisapisteetib' }}
/>
</KeyValueRow>
</>
)
}

const CreativityActionServiceField: React.FC<IBTutkinnonTiedotRowsProps> = ({
form,
päätasonSuoritus
}) => {
const props = useMemo(
() => ({
koodistoUri: 'arviointiasteikkoib',
koodiarvot: ['S'],
value:
päätasonSuoritus.suoritus.creativityActionService?.arviointi?.[0]
.arvosana,
testId: 'ibcas'
}),
[päätasonSuoritus.suoritus.creativityActionService?.arviointi]
)

const onSelect = useCallback(
(arvosana?: Koodistokoodiviite) => {
const suoritus = isKoodiarvoOf('arviointiasteikkoib', ['S'])(arvosana)
? createIBCASSuoritus(arvosana)
: undefined
form.updateAt(
päätasonSuoritus.path.prop('creativityActionService'),
() => suoritus
)
},
[form, päätasonSuoritus.path]
)

return form.editMode ? (
<KoodistoSelect
{...props}
value={props.value?.koodiarvo}
onSelect={onSelect}
zeroValueOption
/>
) : (
<KoodistoView {...props} />
)
}

export const ibKoulutusNimi = (opiskeluoikeus: IBOpiskeluoikeus): string =>
`${t(opiskeluoikeus.suoritukset[0]?.koulutusmoduuli.tunniste.nimi)}`
13 changes: 13 additions & 0 deletions web/app/ib/oppiaineet/ibTutkintoOppiaine.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
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 { IBOppiaineCAS } from '../../types/fi/oph/koski/schema/IBOppiaineCAS'
import { IBOppiaineenSuoritus } from '../../types/fi/oph/koski/schema/IBOppiaineenSuoritus'
import { IBOppiaineLanguage } from '../../types/fi/oph/koski/schema/IBOppiaineLanguage'
import { IBOppiaineMuu } from '../../types/fi/oph/koski/schema/IBOppiaineMuu'
Expand Down Expand Up @@ -59,3 +62,13 @@ const createIBOppiaineMuu = ({
isIBOppiaineMuuTunniste(tunniste) && ryhmä && taso
? IBOppiaineMuu({ tunniste, ryhmä, pakollinen: !!pakollinen, taso })
: null

export const createIBCASSuoritus = (
arvosana: Koodistokoodiviite<'arviointiasteikkoib', 'S'>
): IBCASSuoritus =>
IBCASSuoritus({
koulutusmoduuli: IBOppiaineCAS({
pakollinen: true
}),
arviointi: [IBCASOppiaineenArviointi({ arvosana })]
})
10 changes: 8 additions & 2 deletions web/app/util/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,11 @@ export const shortClassName = (fullClassName: string): string => {

export const isKoodistoOf =
<T extends string>(koodistoUri: T) =>
(koodiviite?: Koodistokoodiviite): koodiviite is Koodistokoodiviite<T> =>
koodiviite?.koodistoUri === koodistoUri
(koodiviite?: Koodistokoodiviite): koodiviite is Koodistokoodiviite<T> =>
koodiviite?.koodistoUri === koodistoUri

export const isKoodiarvoOf =
<T extends string, S extends string>(koodistoUri: T, koodiarvot: S[]) =>
(koodiviite?: Koodistokoodiviite): koodiviite is Koodistokoodiviite<T, S> =>
koodiviite?.koodistoUri === koodistoUri &&
koodiarvot.includes(koodiviite?.koodiarvo as any)

0 comments on commit fde13f5

Please sign in to comment.