diff options
Diffstat (limited to 'addons/survey/static/src/js/survey_timer.js')
| -rw-r--r-- | addons/survey/static/src/js/survey_timer.js | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/addons/survey/static/src/js/survey_timer.js b/addons/survey/static/src/js/survey_timer.js new file mode 100644 index 00000000..2bfd78fe --- /dev/null +++ b/addons/survey/static/src/js/survey_timer.js @@ -0,0 +1,72 @@ +odoo.define('survey.timer', function (require) { +'use strict'; + +var publicWidget = require('web.public.widget'); + +publicWidget.registry.SurveyTimerWidget = publicWidget.Widget.extend({ + //-------------------------------------------------------------------------- + // Widget + //-------------------------------------------------------------------------- + + /** + * @override + */ + init: function (parent, params) { + this._super.apply(this, arguments); + this.timer = params.timer; + this.timeLimitMinutes = params.timeLimitMinutes; + this.surveyTimerInterval = null; + }, + + + /** + * Two responsabilities : Validate that time limit is not exceeded and Run timer otherwise. + * + * @override + */ + start: function () { + var self = this; + return this._super.apply(this, arguments).then(function () { + self.countDownDate = moment.utc(self.timer).add(self.timeLimitMinutes, 'minutes'); + if (self.timeLimitMinutes <= 0 || self.countDownDate.diff(moment.utc(), 'seconds') < 0) { + self.trigger_up('time_up'); + } else { + self._updateTimer(); + self.surveyTimerInterval = setInterval(self._updateTimer.bind(self), 1000); + } + }); + }, + + // ------------------------------------------------------------------------- + // Private + // ------------------------------------------------------------------------- + + _formatTime: function (time) { + return time > 9 ? time : '0' + time; + }, + + /** + * This function is responsible for the visual update of the timer DOM every second. + * When the time runs out, it triggers a 'time_up' event to notify the parent widget. + * + * We use a diff in millis and not a second, that we round to the nearest second. + * Indeed, a difference of 999 millis is interpreted as 0 second by moment, which is problematic + * for our use case. + */ + _updateTimer: function () { + var timeLeft = Math.round(this.countDownDate.diff(moment.utc(), 'milliseconds') / 1000); + + if (timeLeft >= 0) { + var timeLeftMinutes = parseInt(timeLeft / 60); + var timeLeftSeconds = timeLeft - (timeLeftMinutes * 60); + this.$el.text(this._formatTime(timeLeftMinutes) + ':' + this._formatTime(timeLeftSeconds)); + } else { + clearInterval(this.surveyTimerInterval); + this.trigger_up('time_up'); + } + }, +}); + +return publicWidget.registry.SurveyTimerWidget; + +}); |
