Blame view

js/app/views/IntervalUI.js 8.27 KB
16035364   Benjamin Renard   First commit
1
2
3
4
5
6
7
8
/**
 * Project   : AMDA-NG
 * Name      : IntervalUI.js
 * @class 	 amdaUI.IntervalUI
 * @extends  Ext.container.Container
 * @brief    common component to select interval
 * @author 	 Benjamin
 * @version  $Id: IntervalUI.js 2077 2014-02-11 11:33:36Z elena $
10200969   Roipoussiere   Remove whitespace...
9
 * @todo Validations
16035364   Benjamin Renard   First commit
10
11
 */

5e85f9e6   Nathanael Jourdane   Add 'durationLimi...
12
13
14
15
/**
config:
- durationLimit: The maximum value of the duration days field (9999 by default).
*/
16035364   Benjamin Renard   First commit
16
Ext.define('amdaUI.IntervalUI', {
ecced9f7   Elena.Budnik   redmine #5395 and...
17
	extend: 'Ext.container.Container',
10200969   Roipoussiere   Remove whitespace...
18

ecced9f7   Elena.Budnik   redmine #5395 and...
19
20
	alias: 'widget.intervalSelector',
	activeField : null,
10200969   Roipoussiere   Remove whitespace...
21

16035364   Benjamin Renard   First commit
22
23
24
25
	constructor: function(config) {
		this.init(config);
		this.callParent(arguments);
	},
10200969   Roipoussiere   Remove whitespace...
26

b185823c   Nathanael Jourdane   Use IntervalUI mo...
27
	/**
ecced9f7   Elena.Budnik   redmine #5395 and...
28
29
30
31
		Set the start and stop date, and update the duration field.
		- startDate: A Extjs Date object representing the new start time.
		- stopDate: A Extjs Date object representing the new stop time.
		- return: None.
b185823c   Nathanael Jourdane   Use IntervalUI mo...
32
	*/
16035364   Benjamin Renard   First commit
33
34
35
	setInterval : function(startDate,stopDate)
	{
		// get the search form
ecced9f7   Elena.Budnik   redmine #5395 and...
36
37
38
39
40
			var form = this.findParentByType('form').getForm();
			// get start field
			var startField = form.findField('startDate');
			// get stop field
			var stopField = form.findField('stopDate');
10200969   Roipoussiere   Remove whitespace...
41

ecced9f7   Elena.Budnik   redmine #5395 and...
42
43
			if (startField != null)
			startField.setValue(startDate);
10200969   Roipoussiere   Remove whitespace...
44

ecced9f7   Elena.Budnik   redmine #5395 and...
45
46
			if (stopField != null)
			stopField.setValue(stopDate);
10200969   Roipoussiere   Remove whitespace...
47

ecced9f7   Elena.Budnik   redmine #5395 and...
48
			this.updateDuration();
16035364   Benjamin Renard   First commit
49
	},
10200969   Roipoussiere   Remove whitespace...
50

ecced9f7   Elena.Budnik   redmine #5395 and...
51
52
	/**
		Set the limits values of both startField and stopField date fields.
5e85f9e6   Nathanael Jourdane   Add 'durationLimi...
53
	*/
72195d65   Nathanael Jourdane   Automatically set...
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
	setLimits: function(minValue, maxValue) {
		var form = this.findParentByType('form').getForm();
		var startField = form.findField('startDate');
		var stopField = form.findField('stopDate');

		if (startField != null) {
			startField.setMinValue(minValue);
			startField.setMaxValue(maxValue);
		}

		if (stopField != null) {
			stopField.setMinValue(minValue);
			stopField.setMaxValue(maxValue);
		}

		this.updateDuration();
	},
ecced9f7   Elena.Budnik   redmine #5395 and...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
	
	setStartTime: function(startTime) {
		var form = this.findParentByType('form').getForm();
		var startField = form.findField('startDate');
		startField.setValue(startTime);
		this.updateDuration();
	},
	
	setStopTime: function(stopTime) {
		var form = this.findParentByType('form').getForm();
		var stopField = form.findField('stopDate');
		stopField.setValue(stopTime);
		this.updateDuration();
	},
72195d65   Nathanael Jourdane   Automatically set...
85

ecced9f7   Elena.Budnik   redmine #5395 and...
86
	/**
30cd92df   Roipoussiere   Fix merge conflicts
87
88
		Get the start time field value.
		- return: A Extjs Date object representing the start time (null if the date is not valid).
b185823c   Nathanael Jourdane   Use IntervalUI mo...
89
	*/
16035364   Benjamin Renard   First commit
90
91
92
	getStartTime : function()
	{
		// get the search form
ecced9f7   Elena.Budnik   redmine #5395 and...
93
94
95
			var form = this.findParentByType('form').getForm();
			// get start field
			var startField = form.findField('startDate');
10200969   Roipoussiere   Remove whitespace...
96

ecced9f7   Elena.Budnik   redmine #5395 and...
97
			return startField.getValue();
16035364   Benjamin Renard   First commit
98
	},
10200969   Roipoussiere   Remove whitespace...
99

b185823c   Nathanael Jourdane   Use IntervalUI mo...
100
101
	/**
		Get the stop time field value.
b97c59e9   Nathanael Jourdane   Provide to the us...
102
		- return: A Extjs Date object representing the stop time (null if the date is not valid).
b185823c   Nathanael Jourdane   Use IntervalUI mo...
103
	*/
16035364   Benjamin Renard   First commit
104
105
106
	getStopTime : function()
	{
		// get the search form
ecced9f7   Elena.Budnik   redmine #5395 and...
107
108
109
			var form = this.findParentByType('form').getForm();
			// get stop field
			var stopField = form.findField('stopDate');
10200969   Roipoussiere   Remove whitespace...
110

ecced9f7   Elena.Budnik   redmine #5395 and...
111
			return stopField.getValue();
16035364   Benjamin Renard   First commit
112
	},
10200969   Roipoussiere   Remove whitespace...
113

b185823c   Nathanael Jourdane   Use IntervalUI mo...
114
115
116
	/*
		#### Private methods from here ####
	*/
ecced9f7   Elena.Budnik   redmine #5395 and...
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
	updateDuration: function() {
		// get the search form
		var form = this.findParentByType('form').getForm();
		// get start value
		var start = this.getStartTime();
		// get stop value
		var stop = this.getStopTime();
		// if duration computable
		if (stop != null && start != null) {
			// compute offset
			var zoneOffset = stop.getTimezoneOffset() - start.getTimezoneOffset();
			// compute duration
			var diff = stop - start - zoneOffset*60000;

			var durationDays = Math.floor(diff/86400000);
			// set all duration values
			form.findField('durationDay').setValue(durationDays);
			form.findField('durationHour').setValue(Math.floor(diff/3600000 % 24));
			form.findField('durationMin').setValue(Math.floor(diff/60000 % 60));
			form.findField('durationSec').setValue(Math.floor(diff/1000 % 60));

			if (durationDays > this.durationLimit) {
					form.findField('durationDay').markInvalid('Maximum interval is ' + this.durationLimit + ' days!');
			}
		} else {
			form.findField('durationDay').setValue('');
			form.findField('durationHour').setValue('');
			form.findField('durationMin').setValue('');
			form.findField('durationSec').setValue('');
		}
	},
16035364   Benjamin Renard   First commit
148

ecced9f7   Elena.Budnik   redmine #5395 and...
149
150
151
152
153
154
155
156
157
	isValidDuration: function(){
		var form = this.findParentByType('form').getForm();
		return (
					form.findField('durationDay').isValid() &&
					form.findField('durationHour').isValid() &&
					form.findField('durationMin').isValid() &&
					form.findField('durationSec').isValid()
		);
	},
0de2b2fd   Nathanael Jourdane   fix and improve i...
158

ecced9f7   Elena.Budnik   redmine #5395 and...
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
	updateStop: function() {
		var form = this.findParentByType('form').getForm();
		var start = form.findField('startDate').getValue();

		var d = form.findField('durationDay').getValue();
		var h = form.findField('durationHour').getValue();
		var m = form.findField('durationMin').getValue();
		var s = form.findField('durationSec').getValue();
		var duration = (d?d:0)*86400 + (h?h:0)*3600 + (m?m:0)*60 + (s?s:0)
		var stop = Ext.Date.add(start, Ext.Date.SECOND, duration);
		
		if (Ext.Date.isDST(stop) && !Ext.Date.isDST(start))
			stop = Ext.Date.add(start, Ext.Date.SECOND, duration-3600);
		
		if (!Ext.Date.isDST(stop) && Ext.Date.isDST(start))
			stop = Ext.Date.add(start, Ext.Date.SECOND, duration+3600);
		
		form.findField('stopDate').setValue(stop);
	},
10200969   Roipoussiere   Remove whitespace...
178
179
180

	onChangeStartField : function(field, newValue, oldValue)
	{
ecced9f7   Elena.Budnik   redmine #5395 and...
181
182
183
184
185
186
187
188
189
190
191
		if (field.isValid())  {
			// get the search form
			var form = this.findParentByType('form').getForm();
			// set to the stop datefield the newValue as minValue
			form.findField('stopDate').setMinValue(newValue);
			// if it's a user modification
			if (this.activeField == 'start')  {
				// launch the update of duration fields
				this.updateDuration();
			}
		}
16035364   Benjamin Renard   First commit
192
	},
10200969   Roipoussiere   Remove whitespace...
193

ecced9f7   Elena.Budnik   redmine #5395 and...
194
195
196
197
198
199
200
	onChangeStopField: function(field, newValue, oldValue)
	{
		if (field.isValid() && this.activeField == 'stop') {
			// launch the update of duration fields
			this.updateDuration();
		}
	},
10200969   Roipoussiere   Remove whitespace...
201

16035364   Benjamin Renard   First commit
202
203
204
205
	getDateField : function(fieldName,fieldText,fieldId,onChangeField)
	{
		return {
			layout: {type: 'hbox', align: 'middle'},
ecced9f7   Elena.Budnik   redmine #5395 and...
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
			items: [{
				xtype: 'datefield',
				name: fieldName,
				emptyText: 'YYYY/MM/DD hh:mm:ss',
				tip: 'Date formated as YYYY/MM/DD hh:mm:ss',
				format: 'Y/m/d H:i:s',
				enforceMaxLength: true,
				maxLength: 19,
				fieldLabel: fieldText,
				labelAlign: 'left',
				labelWidth: 60,
				listeners: {
					change: onChangeField,
					focus: function(field) {
							this.activeField = fieldId;
					},
					render: function(c) {
							Ext.create('Ext.tip.ToolTip', { target: c.getEl(), html: c.tip });
					},
					scope : this
				}
			}]
		};
16035364   Benjamin Renard   First commit
229
	},
10200969   Roipoussiere   Remove whitespace...
230

16035364   Benjamin Renard   First commit
231
232
	getStartField : function()
	{
b185823c   Nathanael Jourdane   Use IntervalUI mo...
233
		return this.getDateField('startDate','Start Time','start', this.onChangeStartField);
16035364   Benjamin Renard   First commit
234
	},
10200969   Roipoussiere   Remove whitespace...
235

16035364   Benjamin Renard   First commit
236
237
	getStopField : function()
	{
ecced9f7   Elena.Budnik   redmine #5395 and...
238
		return this.getDateField('stopDate','Stop Time','stop', this.onChangeStopField);
16035364   Benjamin Renard   First commit
239
	},
10200969   Roipoussiere   Remove whitespace...
240

16035364   Benjamin Renard   First commit
241
242
	getDurationField : function()
	{
ecced9f7   Elena.Budnik   redmine #5395 and...
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
		return {
			layout: {type: 'hbox', align: 'middle'},
			margin: 0,
			defaults: {
				xtype: 'numberfield',
				minValue: 0,
				maxLength: 2,
				enforceMaxLength: true,
				decimalPrecision: 0,
				allowExponential: false,
				autoStripChars: true,
				hideTrigger: true,
				labelAlign: 'left',
				width: 32,
				margin: '0 5 0 0',
				listeners: {
					change: function(field, newValue, oldValue) {
						var form = this.findParentByType('form').getForm();
						var start = form.findField('startDate').getValue();
						if (this.isValidDuration() && start!=null && this.activeField == 'duration')  {
								this.updateStop();
						}
					},
					focus: function(field) {
						this.activeField = 'duration';
					},
					render: function(c) {
						Ext.create('Ext.tip.ToolTip', { target: c.getEl(), html: c.tip });
					},
					scope : this
				}
			},
			items:[
					{ name: 'durationDay',  emptyText: 'Days', tip: 'Days',    maxValue: 73000, maxLength: 5, fieldLabel: 'Duration', labelWidth: 60, width: 110},
					{ name: 'durationHour', emptyText: 'Hrs',  tip: 'Hours',   maxValue: 23},
					{ name: 'durationMin',  emptyText: 'Mins', tip: 'Minutes', maxValue: 59},
					{ name: 'durationSec',  emptyText: 'Secs', tip: 'Seconds', maxValue: 59}
			]
		};
16035364   Benjamin Renard   First commit
282
	},
10200969   Roipoussiere   Remove whitespace...
283

ecced9f7   Elena.Budnik   redmine #5395 and...
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
	init : function(config) 
	{
		this.durationLimit = config.durationLimit == null ? 73000 : config.durationLimit; // Set duration limit to 200 years by default

		var me = this;
		var myConf = {
			border: false,
			plain: true,
			flex: 1,
			layout: 'anchor',
			defaults: { margin: '0 0 5 0', xtype : 'container'},
			items: [
				me.getStartField(),
				me.getStopField(),
				me.getDurationField()
			]
		};
		Ext.apply (this, Ext.apply(arguments, myConf));
16035364   Benjamin Renard   First commit
302
303
	}
});