Opetushallitus/eperusteet-opintopolku

View on GitHub
eperusteet-opintopolku-app/yo/app/eperusteet-esitys/services/menubuilder.ts

Summary

Maintainability
F
3 days
Test Coverage
/*
 * Copyright (c) 2013 The Finnish Board of Education - Opetushallitus
 *
 * This program is free software: Licensed under the EUPL, Version 1.1 or - as
 * soon as they will be approved by the European Commission - subsequent versions
 * of the EUPL (the "Licence");
 *
 * You may not use this work except in compliance with the Licence.
 * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * European Union Public Licence for more details.
 */

angular
    .module("eperusteet.esitys")
    .service("epMenuBuilder", function(Algoritmit, $state, Kieli, Utils, epEsitysSettings) {
        function oppiaineSort(aineet) {
            // Handle mixed jnro + no jnro situations
            function jnroSort(item) {
                return _.isNumber(item.jnro) ? item.jnro : Number.MAX_SAFE_INTEGER;
            }
            return _(aineet)
                .sortBy(jnroSort)
                .sortBy(Utils.nameSort)
                .sortBy(jnroSort)
                .value();
        }

        function filteredOppimaarat(oppiaine, vlks) {
            var ret = [];
            if (oppiaine.koosteinen) {
                ret = _(oppiaine.oppimaarat)
                    .filter(function(oppimaara) {
                        return (
                            oppimaara.nimi[Kieli.getSisaltokieli()] &&
                            _.some(oppimaara.vuosiluokkakokonaisuudet, function(omVlk: any) {
                                return _.some(vlks, function(oneVlk) {
                                    return "" + omVlk._vuosiluokkaKokonaisuus === "" + oneVlk;
                                });
                            })
                        );
                    })
                    .value();
            }
            return oppiaineSort(ret);
        }

        function buildOppiaineItem(arr, oppiaine, vlk, depth, isSisalto) {
            if (!oppiaine.nimi[Kieli.getSisaltokieli()]) {
                return;
            }
            arr.push({
                depth: depth,
                $hidden: depth > 0,
                $oppiaine: oppiaine,
                label: oppiaine.nimi,
                url: isSisalto
                    ? $state.href(epEsitysSettings.perusopetusState + ".sisallot", { oppiaineId: oppiaine.id })
                    : $state.href(epEsitysSettings.perusopetusState + ".vlkoppiaine", {
                          vlkId: vlk[0],
                          oppiaineId: oppiaine.id
                      })
            });
        }

        function createOppiaineItem(oppiaine, depth, idx = undefined) {
            return {
                $id: oppiaine.id,
                depth: depth,
                $jnro: oppiaine.jarjestys,
                $oppiaine: oppiaine,
                $hidden: false,
                idx: idx,
                label: oppiaine.nimi,
                url: $state.href("root.lukio.oppiaine", { oppiaineId: oppiaine.id })
            };
        }

        function createKurssiItem(kurssi, depth) {
            return {
                $id: kurssi.id,
                depth: depth,
                tyyppi: kurssi.tyyppi,
                $jnro: kurssi.jarjestys,
                $kurssi: kurssi,
                $hidden: true,
                label: kurssi.nimi,
                url: $state.href("root.lukio.oppiaine.kurssi", {
                    oppiaineId: kurssi.oppiaineId,
                    kurssiId: kurssi.id
                })
            };
        }

        function buildLukioOppiaineMenu(oppiaineet) {
            var idx = 0;
            return _.reduce(
                oppiaineet,
                function(menu, oppiaine: any) {
                    menu.push(createOppiaineItem(oppiaine, 0, idx));
                    idx++;
                    if (!_.isEmpty(oppiaine.oppimaarat)) {
                        _.each(oppiaine.oppimaarat, function(oppimaara: any) {
                            menu.push(createOppiaineItem(oppimaara, 1));
                            if (!_.isEmpty(oppimaara.kurssit)) {
                                _.each(oppimaara.kurssit, function(kurssi) {
                                    menu.push(createKurssiItem(kurssi, 2));
                                });
                            }
                        });
                    }
                    if (!_.isEmpty(oppiaine.kurssit)) {
                        _.each(oppiaine.kurssit, function(kurssi) {
                            menu.push(createKurssiItem(kurssi, 1));
                        });
                    }
                    return menu;
                },
                []
            );
        }

        function rakennaYksinkertainenMenu(otsikot) {
            var menu = [];
            Algoritmit.kaikilleLapsisolmuille(otsikot, "lapset", function(osa, depth) {
                menu.push({
                    $osa: osa,
                    label: osa.tekstiKappale ? osa.tekstiKappale.nimi : "",
                    depth: depth,
                    $hidden: depth > 0
                });
            });
            var levels = {};
            _.each(menu, function(item, index) {
                levels[item.depth] = index;
                item.$parent = levels[item.depth - 1] || null;
            });
            return menu;
        }

        function traverseOppiaineet(aineet, arr, vlk, startingDepth = 0) {
            const isSisalto = startingDepth === 0;
            const vlks = _.isArray(vlk) ? vlk : [vlk];
            const oaFiltered = _(aineet)
                .filter(function(oa) {
                    const oppiaineHasVlk = _.some(oa.vuosiluokkakokonaisuudet, function(oavkl: any) {
                        return _.some(vlks, function(oneVlk) {
                            return "" + oavkl._vuosiluokkaKokonaisuus === "" + oneVlk;
                        });
                    });
                    const oppimaaraVlkIds = _(oa.oppimaarat)
                        .map(oppimaara => _.map(oppimaara.vuosiluokkakokonaisuudet, "_vuosiluokkaKokonaisuus"))
                        .flatten()
                        .uniq()
                        .value();
                    const vlkIds = _.map(vlks, String);
                    return oppiaineHasVlk || !_.isEmpty(_.intersection(oppimaaraVlkIds, vlkIds));
                })
                .value();

            _.each(oppiaineSort(oaFiltered), function(oa) {
                buildOppiaineItem(arr, oa, vlks, startingDepth, isSisalto);
                _.each(filteredOppimaarat(oa, vlks), function(oppimaara) {
                    buildOppiaineItem(arr, oppimaara, vlks, startingDepth + 1, isSisalto);
                });
            });
        }

        function rakennaTekstisisalto(sisalto) {
            var suunnitelma = [];
            Algoritmit.kaikilleLapsisolmuille(sisalto, "lapset", function(osa, depth) {
                if (
                    osa.perusteenOsa != null &&
                    osa.perusteenOsa.tunniste != null &&
                    osa.perusteenOsa.tunniste === "laajaalainenosaaminen"
                ) {
                    suunnitelma.push({
                        id: "laajaalaiset",
                        $osa: null,
                        label: osa.perusteenOsa.nimi,
                        depth: depth,
                        $hidden: depth > 0,
                        link: ["root.aipe.laajaalaiset"]
                    });
                } else if (osa.perusteenOsa != null &&
                    osa.perusteenOsa.osanTyyppi != null &&
                    osa.perusteenOsa.osanTyyppi === "taiteenala") {

                    suunnitelma.push({
                        $osa: osa,
                        label: osa.perusteenOsa ? osa.perusteenOsa.nimi : "",
                        depth: depth,
                        $hidden: depth > 0,
                        tyyppi: "taiteenala"
                    });
                    suunnitelma.push({
                        id: "aikuistenOpetus",
                        $osa: osa,
                        label: osa.perusteenOsa.aikuistenOpetus ? osa.perusteenOsa.aikuistenOpetus.nimi : "",
                        depth: depth + 1,
                        $hidden: depth > 0,
                        tyyppi: "taiteenalaOsa"
                    });
                    suunnitelma.push({
                        id: "kasvatus",
                        $osa: osa,
                        label: osa.perusteenOsa.kasvatus ? osa.perusteenOsa.kasvatus.nimi : "",
                        depth: depth + 1,
                        $hidden: depth > 0,
                        tyyppi: "taiteenalaOsa"
                    });
                    suunnitelma.push({
                        id: "oppimisenArviointiOpetuksessa",
                        $osa: osa,
                        label: osa.perusteenOsa.oppimisenArviointiOpetuksessa ? osa.perusteenOsa.oppimisenArviointiOpetuksessa.nimi : "",
                        depth: depth + 1,
                        $hidden: depth > 0,
                        tyyppi: "taiteenalaOsa"
                    });
                    suunnitelma.push({
                        id: "teemaopinnot",
                        $osa: osa,
                        label: osa.perusteenOsa.teemaopinnot ? osa.perusteenOsa.teemaopinnot.nimi : "",
                        depth: depth + 1,
                        $hidden: depth > 0,
                        tyyppi: "taiteenalaOsa"
                    });
                    suunnitelma.push({
                        id: "tyotavatOpetuksessa",
                        $osa: osa,
                        label: osa.perusteenOsa.tyotavatOpetuksessa ? osa.perusteenOsa.tyotavatOpetuksessa.nimi : "",
                        depth: depth + 1,
                        $hidden: depth > 0,
                        tyyppi: "taiteenalaOsa"
                    });
                    suunnitelma.push({
                        id: "yhteisetOpinnot",
                        $osa: osa,
                        label: osa.perusteenOsa.yhteisetOpinnot ? osa.perusteenOsa.yhteisetOpinnot.nimi : "",
                        depth: depth + 1,
                        $hidden: depth > 0,
                        tyyppi: "taiteenalaOsa"
                    });
                } else {
                    suunnitelma.push({
                        $osa: osa,
                        label: osa.perusteenOsa ? osa.perusteenOsa.nimi : (osa.nimi ? osa.nimi : ""),
                        depth: depth,
                        $hidden: depth > 0
                    });
                }
            });
            var levels = {};
            _.each(suunnitelma, function(item, index) {
                levels[item.depth] = index;
                item.$parent = levels[item.depth - 1] || null;
            });
            return suunnitelma;
        }

        function rakennaVuosiluokkakokonaisuuksienSisalto(vlkt, aineet) {
            var arr = [];
            _.each(vlkt, function(vlk) {
                arr.push({
                    $vkl: vlk,
                    label: vlk.nimi,
                    depth: 0,
                    url: $state.href(epEsitysSettings.perusopetusState + ".vuosiluokkakokonaisuus", { vlkId: vlk.id })
                });
                traverseOppiaineet(aineet, arr, vlk.id, 1);
            });
            return arr;
        }

        function rakennaSisallotOppiaineet(aineet, sections, selected) {
            var navi: any = {};
            navi.oppiaineet = [];
            traverseOppiaineet(aineet, navi.oppiaineet, selected);
            _.each(sections, function(v) {
                if (navi[v.id]) {
                    v.items = navi[v.id];
                }
            });
        }

        function rakennaVaiheet(vaiheet) {
            const menu = [];
            _.each(vaiheet, vaihe => {
                menu.push({
                    $id: vaihe.id,
                    $vaihe: vaihe,
                    label: vaihe.nimi,
                    depth: 0
                });
            });
            return menu;
        }

        this.filteredOppimaarat = filteredOppimaarat;
        this.buildLukioOppiaineMenu = buildLukioOppiaineMenu;
        this.rakennaTekstisisalto = rakennaTekstisisalto;
        this.rakennaYksinkertainenMenu = rakennaYksinkertainenMenu;
        this.rakennaVuosiluokkakokonaisuuksienSisalto = rakennaVuosiluokkakokonaisuuksienSisalto;
        this.rakennaSisallotOppiaineet = rakennaSisallotOppiaineet;
        this.rakennaVaiheet = rakennaVaiheet;
    });