1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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;
});
|