Blame view

js/app/views/IntervalUI.js 8.29 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
	getDateField : function(fieldName,fieldText,fieldId,onChangeField)
	{
		return {
ecced9f7   Elena.Budnik   redmine #5395 and...
205
				xtype: 'datefield',
adcbf81b   Elena.Budnik   redmine 6828 - de...
206
			//	margin : '10 0 5 5', // (top, right, bottom, left).
4715a800   Elena.Budnik   redmine 6828 - la...
207
208
				name: fieldName, 
			//	width : 220,
ecced9f7   Elena.Budnik   redmine #5395 and...
209
				emptyText: 'YYYY/MM/DD hh:mm:ss',
4210d375   Elena.Budnik   redmine 6828 - In...
210
				tip: 'Date formatted as YYYY/MM/DD hh:mm:ss',
ecced9f7   Elena.Budnik   redmine #5395 and...
211
				format: 'Y/m/d H:i:s',
4210d375   Elena.Budnik   redmine 6828 - In...
212
213
			 	enforceMaxLength: true,
			 	maxLength: 19,
ecced9f7   Elena.Budnik   redmine #5395 and...
214
215
216
217
218
219
220
221
222
223
224
225
226
				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
				}
ecced9f7   Elena.Budnik   redmine #5395 and...
227
		};
16035364   Benjamin Renard   First commit
228
	},
10200969   Roipoussiere   Remove whitespace...
229

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

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

16035364   Benjamin Renard   First commit
240
241
	getDurationField : function()
	{
ecced9f7   Elena.Budnik   redmine #5395 and...
242
243
		return {
			layout: {type: 'hbox', align: 'middle'},
4715a800   Elena.Budnik   redmine 6828 - la...
244
		//	margin: 0,
ecced9f7   Elena.Budnik   redmine #5395 and...
245
246
247
248
249
250
251
252
253
254
255
			defaults: {
				xtype: 'numberfield',
				minValue: 0,
				maxLength: 2,
				enforceMaxLength: true,
				decimalPrecision: 0,
				allowExponential: false,
				autoStripChars: true,
				hideTrigger: true,
				labelAlign: 'left',
				width: 32,
d341347d   Elena.Budnik   Plot Mgr ameliora...
256
				margin : '0 0 0 5',
ecced9f7   Elena.Budnik   redmine #5395 and...
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
				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
281
	},
10200969   Roipoussiere   Remove whitespace...
282

ecced9f7   Elena.Budnik   redmine #5395 and...
283
284
285
286
287
288
289
290
291
292
	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',
adcbf81b   Elena.Budnik   redmine 6828 - de...
293
			defaults: { margin: '10 0 5 5', xtype : 'container'},
ecced9f7   Elena.Budnik   redmine #5395 and...
294
295
296
297
298
299
300
			items: [
				me.getStartField(),
				me.getStopField(),
				me.getDurationField()
			]
		};
		Ext.apply (this, Ext.apply(arguments, myConf));
16035364   Benjamin Renard   First commit
301
302
	}
});