From fb01f1ebb7427456a4b44c710e394e2a32df49ea Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms <tleilax+studip@gmail.com> Date: Tue, 25 Jan 2022 10:21:33 +0000 Subject: [PATCH] use interval to check for visibility of elements, fixes #538 --- .../assets/javascripts/lib/questionnaire.js | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/resources/assets/javascripts/lib/questionnaire.js b/resources/assets/javascripts/lib/questionnaire.js index 199a98affea..56da337f398 100644 --- a/resources/assets/javascripts/lib/questionnaire.js +++ b/resources/assets/javascripts/lib/questionnaire.js @@ -1,6 +1,8 @@ import { $gettext } from '../lib/gettext.js'; const Questionnaire = { + delayedQueue: [], + delayedInterval: null, lastUpdate: null, initialize() { STUDIP.JSUpdater.register( @@ -198,7 +200,42 @@ const Questionnaire = { 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'); -- GitLab