Skip to content
Snippets Groups Projects
questionnaire.js 9.93 KiB
Newer Older
import { $gettext } from '../lib/gettext.js';

const Questionnaire = {
    delayedQueue: [],
    delayedInterval: null,
    lastUpdate: null,
    initialize() {
        STUDIP.JSUpdater.register(
            'questionnaire',
            Questionnaire.updateQuestionnaireResults,
            Questionnaire.getParamsForPolling,
            15000
        );
    },
    getParamsForPolling: function() {
        var questionnaires = {
            questionnaire_ids: [],
            last_update: Questionnaire.lastUpdate
        };
        Questionnaire.lastUpdate = Math.floor(Date.now() / 1000);
        jQuery('.questionnaire_results').each(function() {
            questionnaires.questionnaire_ids.push(jQuery(this).data('questionnaire_id'));
        });
        if (questionnaires.questionnaire_ids.length > 0) {
            return questionnaires;
        }
    },
    updateQuestionnaireResults: function(data) {
        for (var questionnaire_id in data) {
            if (data[questionnaire_id].html) {
                var new_view = jQuery(data[questionnaire_id].html);
                jQuery('.questionnaire_results.questionnaire_' + questionnaire_id).replaceWith(new_view);
                jQuery(document).trigger('dialog-open');
            }
        }
    },
    updateOverviewQuestionnaire: function(data) {
        if (jQuery('#questionnaire_overview tr#questionnaire_' + data.questionnaire_id).length > 0) {
            jQuery('#questionnaire_overview tr#questionnaire_' + data.questionnaire_id).replaceWith(data.overview_html);
        } else {
            if (jQuery('#questionnaire_overview').length > 0) {
                jQuery(data.overview_html)
                    .hide()
                    .insertBefore('#questionnaire_overview > tbody > :first-child')
                    .delay(300)
                    .fadeIn();
                jQuery('#questionnaire_overview .noquestionnaires').remove();
            }
            if (data.message) {
                jQuery('.messagebox').hide();
                jQuery('#layout_content').prepend(data.message);
            }
        }
        if (jQuery('.questionnaire_widget .widget_questionnaire_' + data.questionnaire_id).length > 0) {
            if (data.widget_html) {
                jQuery('.questionnaire_widget .widget_questionnaire_' + data.questionnaire_id).replaceWith(
                    data.widget_html
                );
            } else {
                jQuery('.questionnaire_widget .widget_questionnaire_' + data.questionnaire_id).remove();
            }
        } else {
            if (jQuery('.questionnaire_widget').length > 0 && data.widget_html) {
                jQuery('.ui-dialog-content').dialog('close');
                if (jQuery('.questionnaire_widget > article').length > 0) {
                    jQuery(data.widget_html)
                        .hide()
                        .insertBefore(
                            '.questionnaire_widget > article:first-of-type, .questionnaire_widget > section:first-of-type'
                        )
                        .delay(300)
                        .fadeIn();
                } else {
                    jQuery('.questionnaire_widget .noquestionnaires')
                        .replaceWith(data.widget_html)
                        .hide()
                        .delay(300)
                        .fadeIn();
                }
            } else {
                if (data.message) {
                    jQuery('.messagebox').hide();
                    jQuery('#layout_content').prepend(data.message);
                    jQuery.scrollTo('#layout_content', 400);
                }
            }
        }
        jQuery(document).trigger('dialog-open');
    },
    updateWidgetQuestionnaire: function(html) {
        //update the results of a questionnaire
        var questionnaire_id = jQuery(html).data('questionnaire_id');
        jQuery('.questionnaire_widget .questionnaire_' + questionnaire_id).replaceWith(html);
        jQuery(document).trigger('dialog-open');
    },
    beforeAnswer: function() {
        var form = jQuery(this).closest('form')[0];
        var questionnaire_id = jQuery(form)
            .closest('article')
            .data('questionnaire_id');
        let validated = true;

        //validation
        $(form).find("input, select, textarea").each(function () {
            if ($(this).is(":invalid")) {
                validated = false;
            }
        });

        $(form).find(".questionnaire_answer > article").each(function () {
            let question_type = $(this).data("question_type");
            if (typeof STUDIP.Questionnaire[question_type] !== "undefined"
                    && typeof STUDIP.Questionnaire[question_type].validator === "function") {
                if (!STUDIP.Questionnaire[question_type].validator.call(this)) {
                    validated = false;
                }
            }
        });

        if (!validated) {
            $(form).addClass("show_validation_hints");
            STUDIP.Report.warning($gettext("Noch nicht komplett ausgefüllt."), $gettext("Füllen Sie noch die rot markierten Stellen korrekt aus."));
            return false;
        }

        if (jQuery(form).is('.questionnaire_widget form')) {
            jQuery.ajax({
                url: STUDIP.ABSOLUTE_URI_STUDIP + 'dispatch.php/questionnaire/submit/' + questionnaire_id,
                data: new FormData(form),
                cache: false,
                processData: false,
                contentType: false,
                type: 'POST',
                success: function(output) {
                    jQuery(form).replaceWith(output);
                    jQuery(document).trigger('dialog-open');
                }
            });
            jQuery(form).css('opacity', '0.5');
            return false;
        } else {
            return true;
        }
    },
    Test: {
        updateCheckboxValues: function() {
            jQuery('.questionnaire_edit .question.test').each(function() {
                jQuery(this)
                    .find('.options > li')
                    .each(function(index, li) {
                        jQuery(li)
                            .find('input[type=checkbox]')
                            .val(index + 1);
                    });
            });
        }
    },
    Vote: {
        validator: function () {
            if ($(this).find(".mandatory").length > 0) {
                if ($(this).find(":selected, :checked").length === 0) {
                    $(this).find(".invalidation_notice").addClass("invalid");
                    return false;
                } else {
                    $(this).find(".invalidation_notice").removeClass("invalid");
                }
            }
            return true;
        }
    },
    addQuestion: function(questiontype) {
        jQuery.ajax({
            url: STUDIP.ABSOLUTE_URI_STUDIP + 'dispatch.php/questionnaire/add_question',
            data: {
                questiontype: questiontype
            },
            dataType: 'json',
            success: function(output) {
                var order = JSON.parse(jQuery("input[name=order]").val());
                order.push(output.question_id);
                jQuery("input[name=order]").val(JSON.stringify(order));
                jQuery(output.html)
                    .hide()
                    .appendTo('.questionnaire_edit .all_questions')
                    .show('fade');
            }
        });
    },
    moveQuestionUp: function () {
        let thisquestion = jQuery(this).closest(".question");
        let upper = thisquestion.prev();
        thisquestion.insertBefore(upper);
        upper.hide().fadeIn();
        thisquestion.hide().fadeIn();
    },
    moveQuestionDown: function () {
        let thisquestion = jQuery(this).closest(".question");
        let downer = thisquestion.next();
        thisquestion.insertAfter(downer);
        downer.hide().fadeIn();
        thisquestion.hide().fadeIn();
    },
    addDelayedInit(el, data, isAjax, isMultiple) {
        this.delayedQueue.push({
            el,
            data,
            isAjax,
            isMultiple,
            $el: $(el), // jQueried element (for performance reasons
            visible: false
        });

        if (this.delayedInterval === null) {
            this.delayedInterval = setInterval(() => {
                this.delayedQueue.forEach(item => {
                    if (item.$el.is(':visible')) {
                        this.initVoteEvaluation(item.el, item.data, item.isAjax, item.isMultiple);
                        item.visible = true;
                    }
                });

                this.delayedQueue = this.delayedQueue.filter(item => !item.visible);
                if (this.delayedQueue.length === 0) {
                    clearInterval(this.delayedInterval);
                }
            }, 100);
        }
    },
    initVoteEvaluation: async function (el, data, isAjax, isMultiple) {
        if ($(el).is(':not(:visible)')) {
            if (!$(el).data('vote-evaluation-delayed')) {
                this.addDelayedInit(el, data, isAjax, isMultiple);

                $(el).data('vote-evaluation-delayed', true);
            }

            return;
        }

        const Chartist = await STUDIP.loadChunk('chartist');

        if (isAjax) {
            jQuery(document).add(".questionnaire_results").one("dialog-open", enhance);
        } else {
            jQuery(enhance);
        }

        function enhance() {
            if (isMultiple) {
                new Chartist.Bar(
                    el,
                    data,
                    { onlyInteger: true, axisY: { onlyInteger: true } }
                );
            } else {
                data.series = data.series[0];
                new Chartist.Pie(
                    el,
                    data,
                    { labelPosition: 'outside' }
                );
            }
        };
    },
    initTestEvaluation: async function (el, data, isAjax, isMultiple) {
        this.initVoteEvaluation(el, data, isAjax, isMultiple);
    },
};

export default Questionnaire;