summaryrefslogtreecommitdiff
path: root/addons/timer/static/src/js/timer_mixin.js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/timer/static/src/js/timer_mixin.js')
-rw-r--r--addons/timer/static/src/js/timer_mixin.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/addons/timer/static/src/js/timer_mixin.js b/addons/timer/static/src/js/timer_mixin.js
new file mode 100644
index 00000000000..779d06dbe4a
--- /dev/null
+++ b/addons/timer/static/src/js/timer_mixin.js
@@ -0,0 +1,115 @@
+odoo.define('timer.Timer', function (require) {
+"use strict";
+
+ /**
+ * This class improves the timer display using the
+ * unit_amount field on account.analytic.line.
+ */
+ class Timer {
+ constructor(hours, minutes, seconds) {
+ this.hours = hours;
+ this.minutes = minutes;
+ this.seconds = seconds;
+ }
+
+ /**
+ * Convert float to time
+ * @param {number} float
+ */
+ static convertFloatToTime(float) {
+ if (float === 0) {
+ return new Timer(0, 0, 0);
+ }
+
+ let minutes = float % 1;
+ const hours = float - minutes;
+ minutes *= 60;
+
+ return new Timer(hours, Math.round(minutes), 0);
+ }
+
+ /**
+ * Create timer
+ * @param {number} unit_amount
+ * @param {String} timer_start
+ * @param {String} serverTime
+ */
+ static createTimer(unit_amount, timer_start, serverTime) {
+ const timer = this.convertFloatToTime(unit_amount);
+
+ timer.addTime(
+ moment.utc(
+ moment.utc(serverTime)
+ .diff(moment.utc(timer_start))
+ ).format("HH:mm:ss")
+ );
+
+ return timer;
+ }
+
+ addHours(hours) {
+ this.hours += hours;
+ }
+
+ addMinutes(minutes) {
+ minutes += this.minutes;
+
+ this.minutes = minutes % 60;
+ this.addHours(Math.floor(minutes / 60));
+ }
+
+ addSeconds(seconds) {
+ seconds += this.seconds;
+ this.seconds = seconds % 60;
+ this.addMinutes(Math.floor(seconds / 60));
+ }
+
+ display2digits(number) {
+ return number > 9 ? "" + number : "0" + number;
+ }
+
+ addSecond() {
+ this.seconds += 1;
+ if (this.seconds === 60) {
+ this.minutes += 1;
+ this.seconds = 0;
+
+ if (this.minutes === 60) {
+ this.hours += 1;
+ this.minutes = 0;
+ }
+ }
+ }
+
+ addTime(time) {
+ if (typeof time == 'string' && time.indexOf(':') !== -1) {
+ let [hour, minute, second] = time.split(':');
+
+ hour = parseInt(hour);
+ minute = parseInt(minute);
+ second = parseInt(second);
+
+ this.addSeconds(second);
+ this.addMinutes(minute);
+ this.addHours(hour);
+ }
+ }
+
+ convertToFloat() {
+ return (this.hours * 60 + this.minutes) * 60 / 3600;
+ }
+
+ toString() {
+ const time = {
+ hours: this.display2digits(this.hours),
+ minutes: this.display2digits(this.minutes),
+ seconds: this.display2digits(this.seconds)
+ };
+
+ return `${time.hours}:${time.minutes}:${time.seconds}`;
+ }
+ }
+
+ return Timer;
+
+});