BerniWittmann/spielplanismaning

View on GitHub
src/public/templates/event/verwaltung/spielplan/verwaltung.spielplan.ui.js

Summary

Maintainability
C
1 day
Test Coverage
(function () {
    'use strict';

    angular
        .module('spi.templates.verwaltung.spielplan.ui', [
            'ui.router', 'spi.spielplan', 'angular-flatpickr', 'toastr', 'spi.spiel', 'spi.config'
        ])
        .config(states)
        .controller('VerwaltungSpielplanController', VerwaltungSpielplanController);

    function states($stateProvider) {
        //noinspection JSUnusedGlobalSymbols
        $stateProvider
            .state('spi.event.verwaltung.spielplan', {
                url: '/spielplan',
                templateUrl: 'templates/event/verwaltung/spielplan/verwaltung.spielplan.html',
                controller: VerwaltungSpielplanController,
                controllerAs: 'vm',
                resolve: {
                    zeiten: function (aktivesEvent, spielplan) {
                        return spielplan.getZeiten();
                    },
                    spiele: function (aktivesEvent, spiel) {
                        return spiel.getAll();
                    },
                    spielplanEnabled: function (config) {
                        return config.getSpielplanEnabled();
                    }
                },
                data: {
                    requiredRoles: ['admin']
                }
            });
    }

    function VerwaltungSpielplanController(spielplan, zeiten, $scope, toastr, spiele, spiel, spielplanEnabled) {
        const vm = this;
        vm.loading = true;

        _.extend(vm, {
            spielplanEnabled: spielplanEnabled,
            import: _import,
            importButtonDisabled: true,
            fileChange: fileChange
        });

        function _import() {
            if (!vm.importFile) return;

            Papa.parse(vm.importFile, {
                header: true,
                error: function (err) {
                    console.error(err);
                    toastr.error('Ein Fehler bei der Umwandlung ist aufgetreten. Bitte überprüfen Sie Ihre Datei', 'Achtung!');
                },
                complete: function (res) {
                    spiel.import(res.data);
                }
            });
        }

        function fileChange(event, files) {
            if (files && files.length > 0) {
                vm.importFile = files[0];
                vm.importButtonDisabled = false;
            } else {
                vm.importFile = undefined;
                vm.importButtonDisabled = true;
            }
            $scope.$apply();
        }

        if (spielplanEnabled) {
            initZeiten.bind(this)(spielplan, zeiten, $scope, toastr, spiele);
        }

        vm.loading = false;
    }

    function initZeiten(spielplan, zeiten, $scope, toastr, spiele) {
        const vm = this;

        function newDateWithHours(h) {
            const d = new Date();
            d.setHours(h);
            d.setMinutes(0);
            return d;
        }

        const d = newDateWithHours(9);
        const d2 = newDateWithHours(17);

        function prettifyDate(d, format) {
            let date;
            if (d && format) {
                date = moment(d, format);
            } else if (d && !format) {
                date = moment(d);
            } else {
                date = moment()
            }
            return date.format('DD.MM.YYYY');
        }

        if (!zeiten.startdatum || !zeiten.enddatum) {
            zeiten.startdatum = prettifyDate();
            zeiten.enddatum = prettifyDate();
        }

        _.extend(vm, {
            startzeit: d,
            endzeit: d2,
            spielzeit: 8,
            pausenzeit: 2,
            saveSpielzeit: saveSpielzeit,
            increment: increment,
            decrement: decrement,
            generateSpielplan: function () {
                spielplan.createSpielplan();
            },
            regenerateSpielplan: function () {
                if (vm.endRundeStarted) {
                    return toastr.warning('Spielplan kann nicht mehr mit Erhalt generiert werden.', 'Endrunde hat bereits begonnen.');
                }
                spielplan.regenerateSpielplan();
            },
            datePickerOptions: {
                mode: 'range',
                dateFormat: 'd.m.Y',
                locale: 'de',
                defaultDate: [moment(zeiten.startdatum, 'DD.MM.YYYY').toDate(), moment(zeiten.enddatum, 'DD.MM.YYYY').toDate()]
            },
            date: prettifyDate(d),
            startdate: undefined,
            enddate: undefined
        });

        vm.endRundeStarted = spiele.filter(function (single) {
                return single.label !== 'normal' && single.beendet;
            }).length > 0;

        if (!_.isUndefined(zeiten) && !_.isNull(zeiten)) {
            if (moment(zeiten.startzeit, 'HH:mm').isValid()) {
                vm.startzeit = moment(zeiten.startzeit, 'HH:mm').toDate();
            }
            if (moment(zeiten.endzeit, 'HH:mm').isValid()) {
                vm.endzeit = moment(zeiten.endzeit, 'HH:mm').toDate();
            }
            vm.spielzeit = zeiten.spielzeit;
            vm.pausenzeit = zeiten.pausenzeit;
            vm.startdate = zeiten.startdatum;
            vm.enddate = zeiten.enddatum;
            vm.date = zeiten.startdatum + ' bis ' + zeiten.enddatum;
        }

        function saveSpielzeit(form) {
            if (form.$valid) {
                form.$setUntouched();
                vm.loading = true;
                spielplan.saveZeiten({
                    startzeit: moment(vm.startzeit.toISOString()).format('HH:mm'),
                    endzeit: moment(vm.endzeit.toISOString()).format('HH:mm'),
                    spielzeit: vm.spielzeit,
                    pausenzeit: vm.pausenzeit,
                    startdatum: vm.startdate,
                    enddatum: vm.enddate
                }).then(function () {
                    spielplan.getZeiten().then(function (res) {
                        zeiten = res;
                        vm.datePickerOptions.defaultDate = [moment(res.startdatum, 'DD.MM.YYYY').toDate(), moment(res.enddatum, 'DD.MM.YYYY').toDate()];
                        vm.loading = false;
                        toastr.success('Spielplan-Einstellungen wurden gespeichert.', 'Gespeichert');
                    });
                });
            }
        }

        function increment(name) {
            if (_.isEqual(name, 'spielzeit')) {
                vm.spielzeit = vm.spielzeit + 1;
            } else if (_.isEqual(name, 'pausenzeit')) {
                vm.pausenzeit = vm.pausenzeit + 1;
            }
        }

        function decrement(name) {
            if (_.isEqual(name, 'spielzeit')) {
                if (vm.spielzeit > 1) {
                    vm.spielzeit = vm.spielzeit - 1;
                }
            } else if (_.isEqual(name, 'pausenzeit')) {
                if (vm.pausenzeit > 1) {
                    vm.pausenzeit = vm.pausenzeit - 1;
                }
            }
        }

        $scope.$watch('vm.date', function () {
            if (vm.date) {
                const parts = vm.date.split(' ');
                if (parts.length === 1) {
                    vm.startdate = parts[0];
                    vm.enddate = parts[0];
                } else {
                    vm.startdate = parts[0];
                    vm.enddate = parts[2];
                }
            }
        });

        $scope.$watchGroup(['vm.endzeit', 'vm.startzeit'], function () {
            if (vm.startzeit && vm.endzeit) {
                if (moment(vm.startzeit.toISOString()).isAfter(moment(vm.endzeit.toISOString()))) {
                    toastr.warning('Die Startzeit muss vor der Endzeit liegen!', 'Achtung!');
                    vm.endzeit = vm.startzeit;
                }
            }
        });
    }
})();