0013286: Timesheet: select duration text on focus
[tine20] / tine20 / Timetracker / js / DurationSpinner.js
1 /**
2  * Tine 2.0
3  * 
4  * @package     Timetracker
5  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
6  * @author      Cornelius Weiss <c.weiss@metaways.de>
7  * @copyright   Copyright (c) 2007-2015 Metaways Infosystems GmbH (http://www.metaways.de)
8  *
9  */
10  
11 Ext.ns('Tine.Timetracker');
12
13 /**
14  * handles minutes to time conversions
15  * @class Tine.Timetracker.DurationSpinner
16  * @extends Ext.ux.form.Spinner
17  */
18 Tine.Timetracker.DurationSpinner = Ext.extend(Ext.ux.form.Spinner,  {
19     
20     /**
21      * Set to empty value if value equals 0
22      * @cfg emptyOnZero
23      */
24     emptyOnZero: null,
25     
26     initComponent: function() {
27         this.preventMark = false;
28         this.strategy = new Ext.ux.form.Spinner.TimeStrategy({
29             incrementValue : 15
30         });
31         this.format = this.strategy.format;
32
33         this.on('focus', function(field) {field.focus(true, 10)});
34     },
35
36     setValue: function(value) {
37         if(! value || value == '00:00') {
38             value = this.emptyOnZero ? '' : '00:00';
39         } else if(! value.toString().match(/:/)) {
40             var hours = Math.floor(value / 60),
41                 minutes = value - hours * 60;
42
43             if (hours < 10) {
44                hours = '0' + hours;
45             }
46
47             if (minutes < 10) {
48                 minutes = '0' + minutes;
49             }
50
51             if (minutes !== 0) {
52                 value = hours + ':' + minutes;
53             } else {
54                 value = hours + ':00';
55             }
56         }
57         
58         Tine.Timetracker.DurationSpinner.superclass.setValue.call(this, value);
59     },
60     
61     validateValue: function(value) {
62         if (value.search(/:/) != -1) {
63             var parts = value.split(':'),
64                 hours = parseInt(parts[0]),
65                 minutes = parseInt(parts[1]);
66
67             return 'NaN' != hours && 'NaN' != minutes;
68         }
69     },
70
71     getValue: function() {
72         var value = Tine.Timetracker.DurationSpinner.superclass.getValue.call(this);
73         value = value.replace(',', '.');
74
75         if(value && typeof value == 'string') {
76             if (value.search(/:/) != -1) {
77                 var parts = value.split(':'),
78                     hours = parseInt(parts[0]),
79                     minutes = parseInt(parts[1]);
80
81                 if (0 > hours) {
82                     hours = 0;
83                 }
84
85                 if (0 > minutes) {
86                     minutes = 0;
87                 }
88
89                 if (minutes > 0) {
90                     value = hours * 60 + minutes;
91                 } else {
92                     value = hours * 60;
93                 }
94             } else if (value > 0) {
95                     value = value * 60;
96             } else {
97                 this.markInvalid(i18n._('Not a valid time'));
98                 return;
99             }
100         }
101
102         this.setValue(value);
103         return value;
104     }
105 });
106
107 Ext.reg('tinedurationspinner', Tine.Timetracker.DurationSpinner);