Opetushallitus/eperusteet-opintopolku

View on GitHub
eperusteet-opintopolku-app/yo/app/scripts/views/amops/osa/state.ts

Summary

Maintainability
F
5 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.
 */

namespace Osat {
    export const isTutke2 = (osa) => {
        return _.isObject(osa) && (osa.tyyppi === "tutke2" || osa.tyyppi === "reformi_tutke2");
    };
}


angular.module("app").config($stateProvider =>
    $stateProvider.state("root.amops.osa", {
        url: "/osa/:osaId",
        onEnter: osa => Murupolku.register("root.amops.osa", osa.tekstiKappale.nimi),
        resolve: {
            osa: (ops, $stateParams) => {
                return ops.one("tekstit", $stateParams.osaId).get();
            },
            pTosat: (Api, osa, ops) =>
                (osa.tyyppi === "suorituspolku" || osa.tyyppi === "osasuorituspolku") && Api.all("perusteet/" + ops.peruste.id + "/tutkinnonosat").getList(),
            pTosa: (Api, osa, ops) => {
                if (osa.tyyppi === "tutkinnonosa") {
                    let perusteId = null;
                    let tosaId = null;
                    if (osa.tosa.tyyppi === "perusteesta") {
                        if (osa.peruste) {
                            // Tuotu toisesta perusteesta
                            perusteId = osa.peruste.id;
                        } else {
                            perusteId = ops.peruste.id;
                        }
                        tosaId = osa.tosa.perusteentutkinnonosa;
                    } else if (osa.tosa.tyyppi === "vieras") {
                        perusteId = osa.tosa.vierastutkinnonosa._cperuste;
                        tosaId = osa.tosa.vierastutkinnonosa.tosaId;
                    } else {
                        return;
                    }

                    return Api.one("perusteet/" + perusteId + "/tutkinnonosat/" + tosaId).get();
                }
            },
            pTosaViite: async (Api, osa, ops) => {
                if (osa.tyyppi === "tutkinnonosa") {
                    let perusteId = null;
                    let tosaId = null;
                    if (osa.tosa.tyyppi === "perusteesta") {
                        if (osa.peruste) {
                            // Tuotu toisesta perusteesta
                            perusteId = osa.peruste.id;
                        } else {
                            perusteId = ops.peruste.id;
                        }
                        tosaId = osa.tosa.perusteentutkinnonosa;
                    } else if (osa.tosa.tyyppi === "vieras") {
                        perusteId = osa.tosa.vierastutkinnonosa._cperuste;
                        tosaId = osa.tosa.vierastutkinnonosa.tosaId;
                    } else {
                        return;
                    }

                    const getSuoritustapaSisalto = async(suoritustavat) => {
                        if (!suoritustavat) {
                            return;
                        }
                        else if (!_.head(suoritustavat)) {
                            return await getSuoritustapaSisalto(_.tail(suoritustavat));
                        }
                        else {
                            const url = "perusteet/" + perusteId + "/suoritustavat/" + _.head(suoritustavat) + "/tutkinnonosat/" + tosaId;
                            try {
                                return await Api.one(url).get();
                            }
                            catch (err) {
                                return await getSuoritustapaSisalto(_.tail(suoritustavat));
                            }
                        }
                    };

                    return getSuoritustapaSisalto([ops.suoritustapa, "reformi", "ops", "naytto"]);
                }
            },
            pSuoritustavat: (Api, osa, ops) =>
                (osa.tyyppi === "suorituspolku" || osa.tyyppi === "osasuorituspolku") && Api.one("perusteet/" + ops.peruste.id + "/suoritustavat").get(),
            arviointiAsteikot: Api => Api.all("arviointiasteikot").getList()
        },
        views: {
            "": {
                templateUrl: "views/amops/osa/view.html",
                controller: ($scope, osa, pTosa, ktId) => {
                    $scope.osa = osa;
                    $scope.pTosa = pTosa;
                    if (pTosa) {
                        $scope.pTosa.$$isTutke2 = Osat.isTutke2(pTosa);
                    }
                    $scope.ktId = ktId;
                }
            },
            "suorituspolku@root.amops.osa": {
                templateUrl: "views/amops/osa/suorituspolku.html",
                controller: (
                    $q,
                    $rootScope,
                    $scope,
                    $state,
                    $stateParams,
                    osa,
                    peruste,
                    pSuoritustavat,
                    pTosat,
                    koodisto,
                    paikallisetTutkinnonosatEP,
                    koulutustoimija
                ) => {
                    const suoritustapa = Perusteet.getSuoritustapa(pSuoritustavat),
                        tosat = _.indexBy(pTosat, "id"),
                        tosaViitteet: any = _(_.cloneDeep(Perusteet.getTosaViitteet(suoritustapa)))
                            .each(viite => (viite.$$tosa = tosat[viite._tutkinnonOsa]))
                            .indexBy("id")
                            .value(),
                        paikallisetKoodit = koulutustoimija.all("koodi"),
                        update = () => {
                            const spRivit: any = _.indexBy($scope.osa.suorituspolku.rivit, "rakennemoduuli");
                            Algoritmit.traverse($scope.perusteRakenne, "osat", node => {
                                node.pakollinen = Suorituspolku.pakollinen(node);
                                node.$$poistettu = spRivit[node.tunniste] && spRivit[node.tunniste].piilotettu;
                            });
                            Suorituspolku.calculateRealAmount($scope.perusteRakenne, $scope.misc.tosat, spRivit);
                            $scope.misc.spRivit = spRivit;

                            const uniikitKoodit = _($scope.osa.suorituspolku.rivit)
                                    .map("koodit")
                                    .flatten()
                                    .filter((koodi: string) => !$scope.misc.koodinimet[koodi])
                                    .uniq()
                                    .value(),
                                pkoodit = _.filter(uniikitKoodit, (koodi: string) =>
                                    _.startsWith(koodi, Koodisto.paikallinenPrefix)
                                ),
                                kkoodit = _.reject(uniikitKoodit, (koodi: string) =>
                                    _.startsWith(koodi, Koodisto.paikallinenPrefix)
                                );

                            $q
                                .all(_.map(kkoodit, koodi => koodisto.one("uri/" + koodi).get()))
                                .then(Koodisto.parseRawKoodisto)
                                .then(res => {
                                    _.each(res, koodi => {
                                        $scope.misc.koodinimet[koodi.uri] = koodi;
                                    });
                                });
                            $q.all(_.map(pkoodit, koodi => paikallisetKoodit.one(koodi).get())).then(res => {
                                _.each(res, koodi => {
                                    $scope.misc.koodinimet[koodi.route] = {
                                        nimi: "tutkinnon-osaa-ei-olemassa",
                                        uri: koodi.route,
                                        arvo: _.last(koodi.route.split("_"))
                                    };

                                    if (_.size(koodi) === 1) {
                                        $scope.misc.koodinimet[koodi.route].nimi = koodi[0].tekstiKappale.nimi;
                                        $scope.misc.koodinimet[koodi.route].url = $state.href("root.amops.osa", {
                                            opsId: koodi[0].owner.id,
                                            osaId: koodi[0].id
                                        });
                                    } else if (_.size(koodi) > 1) {
                                        const opskohtaiset = _.filter(
                                            koodi,
                                            (arvo: any) => arvo.owner.id == $stateParams.opsId
                                        );
                                        if (_.size(opskohtaiset) === 1) {
                                            $scope.misc.koodinimet[koodi.route].nimi =
                                                opskohtaiset[0].tekstiKappale.nimi;
                                            $scope.misc.koodinimet[koodi.route].url = $state.href("root.amops.osa", {
                                                opsId: opskohtaiset[0].owner.id,
                                                osaId: opskohtaiset[0].id
                                            });
                                        } else {
                                            $scope.misc.koodinimet[koodi.route].nimi =
                                                "koodilla-liian-monta-toteutusta";
                                            $scope.misc.koodinimet[koodi.route].nimet = _.map(
                                                koodi,
                                                "tekstiKappale.nimi"
                                            );
                                            $scope.misc.koodinimet[koodi.route].rikki = true;
                                            $scope.misc.koodinimet[koodi.route].url = $state.href("root.amops.osa", {
                                                opsId: koodi[0].owner.id,
                                                osaId: koodi[0].id
                                            });
                                        }
                                    } else {
                                        $scope.misc.koodinimet[koodi.route].rikki = true;
                                    }
                                });
                            });
                        };

                    _.merge($scope, {
                        collapsed_dirty: false,
                        perusteRakenne: _.cloneDeep(Perusteet.getRakenne(suoritustapa)),
                        misc: {
                            collapsed_removed: false,
                            root: $rootScope,
                            suoritustapa: suoritustapa,
                            koodinimet: {},
                            tosat: tosaViitteet,
                            hasInput: false,
                            osa: $scope.osa,
                            toggle: model => {
                                model.$$collapsed = !model.$$collapsed;
                                $scope.collapsed_dirty = true;
                            },
                            siirry: obj => {
                                paikallisetKoodit
                                    .one(obj.$$tosa ? obj.$$tosa.koodiUri : obj)
                                    .get()
                                    .then(res => {
                                        const goToSisalto = osa =>
                                            $state.go("root.amops.osa", {
                                                opsId: osa.owner.id,
                                                osaId: osa.id
                                            });

                                        const opskohtaiset = _.filter(
                                            res,
                                            (arvo: any) => arvo.owner.id == $stateParams.opsId
                                        );
                                        goToSisalto(_.size(opskohtaiset) > 0 ? opskohtaiset[0] : res[0]);
                                    });
                            }
                        },
                        toggleAll: () => {
                            Algoritmit.traverse(
                                $scope.perusteRakenne,
                                "osat",
                                (node, depth) => (node.$$collapsed = $scope.collapsed_dirty ? depth > 0 : false)
                            );
                            $scope.collapsed_dirty = !$scope.collapsed_dirty;
                        },
                        suodata: input => {
                            $scope.misc.hasInput = !_.isEmpty(input);
                            if ($scope.misc.hasInput) {
                                Algoritmit.traverse($scope.perusteRakenne, "osat", node => {
                                    node.$$haettu = Algoritmit.match(
                                        input,
                                        node._tutkinnonOsaViite
                                            ? tosaViitteet[node._tutkinnonOsaViite].$$tosa.nimi
                                            : node.nimi
                                    );
                                    if (node.$$haettu) {
                                        Algoritmit.traverseUp(node, pnode => (pnode.$$haettu = true));
                                    }
                                });
                            } else {
                                Algoritmit.traverse($scope.perusteRakenne, "osat", node => (node.$$haettu = false));
                            }
                        }
                    });

                    {
                        // Initialize
                        update();
                        Algoritmit.traverse($scope.perusteRakenne, "osat", (node, depth) => {
                            node.$$collapsed = depth > 0;
                            node.pakollinen = Suorituspolku.pakollinen(node);
                        });
                        $scope.toggleAll();
                    }
                }
            },
            "tutkinnonosa@root.amops.osa": {
                templateUrl: "views/amops/osa/tutkinnonosa.html",
                controller: ($q, $scope, ops, peruste, arviointiAsteikot, koodisto, koulutustoimija, pTosaViite) => {
                    $scope.pTosaViite = pTosaViite;
                    $scope.st = _.find(peruste.suoritustavat, st => st.suoritustapakoodi === ops.suoritustapa);
                    const isPaikallinen = _.property("tosa.tyyppi")($scope.osa) === "oma",
                        osaamisalaKoodit = peruste.osaamisalat,
                        paikallisetKoodit = koulutustoimija.all("koodi"),
                        osaAlueKoodit = $scope.pTosa
                            ? _.map($scope.pTosa.osaAlueet, (oa: any) => ({
                                  nimi: oa.nimi,
                                  arvo: oa.koodiArvo,
                                  uri: oa.koodiUri
                              }))
                            : [],
                        koodit = _([])
                            .concat(osaAlueKoodit)
                            .concat(osaamisalaKoodit)
                            .indexBy("uri")
                            .value(),
                        haeKoodiTiedot = koodiUrit =>
                            $q
                                .all(_.map(koodiUrit, uri => koodisto.one("uri/" + uri).get()))
                                .then(Koodisto.parseRawKoodisto),
                        paivitaKoodistoTiedot = () => {
                            const toteutuksienKoodit = _($scope.osa.tosa.toteutukset)
                                .map("koodit")
                                .flatten()
                                .uniq()
                                .reject((koodi: string) => !!$scope.koodistoTiedot[koodi])
                                .value();

                            haeKoodiTiedot(toteutuksienKoodit).then(koodit => {
                                _.each(koodit, koodi => {
                                    $scope.koodistoTiedot[koodi.uri] = koodi;
                                });
                            });
                        };

                    $scope.paikallinenKoodiUpdate = pkoodi => {
                        if (pkoodi) {
                            const fullKoodi = Koodisto.paikallinenToFull(koulutustoimija, pkoodi);
                            paikallisetKoodit
                                .one(fullKoodi)
                                .getList()
                                .then(
                                    res =>
                                        ($scope.tormaavatKoodit = _.reject(
                                            res,
                                            (koodi: any) => koodi.id === $scope.osa.id
                                        ))
                                );
                        }
                    };

                    $scope.paikallinenKoodiUpdate(_.property("tosa.omatutkinnonosa.koodi")($scope.osa));

                    {
                        // Init block
                        $scope.koodistoTiedot = {};
                        $scope.$$showToteutus = _.size($scope.osa.tosa.toteutukset) > 0;
                        $scope.koodit = koodit;
                        $scope.peruste = peruste;
                        $scope.sortableOptions = {
                            handle: ".toteutus-handle",
                            cursor: "move",
                            delay: 100,
                            tolerance: "pointer",
                            placeholder: "toteutus-placeholder"
                        };

                        paivitaKoodistoTiedot();
                    }

                    $scope.pa = {
                        arviointiasteikko: x => x._arviointiasteikko || x._arviointiAsteikko
                    };

                    $scope.sortableOptionsArvioinninKohdealueet = Sorting.getSortableOptions(".arviointi-kohdealueet");
                    $scope.sortableOptionsArvioinninKohteet = Sorting.getSortableOptions(".arviointi-kohteet");
                    $scope.sortableOptionsOsaamistasonKriteerit = Sorting.getSortableOptions(".osaamistason-kriteerit");
                    $scope.sortableOptionsAmmattitaitovaatimukset = Sorting.getSortableOptions(
                        ".ammattitaitovaatimukset"
                    );
                    $scope.sortableOptionsVaatimuksenKohteet = Sorting.getSortableOptions(".vaatimuksen-kohteet");
                    $scope.sortableOptionsVaatimukset = Sorting.getSortableOptions(".vaatimukset");

                    $scope.arviointiAsteikot = arviointiAsteikot;
                }
            }
        }
    })
);