dustin@892: /* Copyright (C) 2013 by Bundesamt fuer Strahlenschutz
dustin@892: * Software engineering by Intevation GmbH
dustin@892: *
dustin@892: * This file is Free Software under the GNU GPL (v>=3)
dustin@892: * and comes with ABSOLUTELY NO WARRANTY! Check out
dustin@892: * the documentation coming with IMIS-Labordaten-Application for details.
dustin@892: */
dustin@892:
dustin@892: /**
dustin@892: * This Widget extends a DateTimePicker in order to create a
dustin@892: * something like a DateTimePicker
dustin@892: */
raimund@649: Ext.define('Lada.view.widget.base.DateTimePicker', {
raimund@649: extend: 'Ext.picker.Date',
raimund@649: alias: 'widget.datetimepicker',
raimund@649: requires: [
raimund@649: 'Ext.picker.Date',
raimund@649: 'Ext.form.field.Number'
raimund@649: ],
raimund@649:
raimund@649: todayText: 'Jetzt',
raimund@649:
raimund@649: renderTpl: [
raimund@649: '
',
raimund@649: '',
raimund@649: '
',
raimund@649: '',
raimund@649: '',
raimund@649: '',
raimund@649: ' {.:this.firstInitial} ',
raimund@649: ' | ',
raimund@649: '',
raimund@649: '
',
raimund@649: '',
raimund@649: '',
raimund@649: '{#:this.isEndOfWeek}',
raimund@649: '',
raimund@649: // the href attribute is required for the :hover selector to work in IE6/7/quirks
raimund@649: '',
raimund@649: ' | ',
raimund@649: '',
raimund@649: '
',
raimund@649: '
',
raimund@649: '',
raimund@649: '
',
raimund@649: {
raimund@649: firstInitial: function(value) {
raimund@649: return Ext.picker.Date.prototype.getDayInitial(value);
raimund@649: },
raimund@649: isEndOfWeek: function(value) {
raimund@649: // convert from 1 based index to 0 based
raimund@649: // by decrementing value once.
raimund@649: value--;
raimund@649: var end = value % 7 === 0 && value !== 0;
raimund@649: return end ? '' : '';
raimund@649: },
raimund@649: renderTodayBtn: function(values, out) {
raimund@649: Ext.DomHelper.generateMarkup(values.$comp.todayBtn.getRenderTree(), out);
raimund@649: },
raimund@649: renderMonthBtn: function(values, out) {
raimund@649: Ext.DomHelper.generateMarkup(values.$comp.monthBtn.getRenderTree(), out);
raimund@649: },
raimund@649: renderTimeLabel: function(values, out) {
raimund@649: Ext.DomHelper.generateMarkup(values.$comp.timeLabel.getRenderTree(), out);
raimund@649: },
raimund@649: renderTimeHour: function(values, out) {
raimund@649: Ext.DomHelper.generateMarkup(values.$comp.hourField.getRenderTree(), out);
raimund@649: },
raimund@649: renderTimeMinute: function(values, out) {
raimund@649: Ext.DomHelper.generateMarkup(values.$comp.minuteField.getRenderTree(), out);
raimund@649: },
raimund@649: renderAcceptBtn: function(values, out) {
raimund@649: Ext.DomHelper.generateMarkup(values.$comp.acceptBtn.getRenderTree(), out);
raimund@649: }
raimund@649: }
raimund@649: ],
raimund@649:
raimund@649: beforeRender: function () {
raimund@649: var me = this;
dustin@667: me.hourField = new Ext.form.field.Number({
raimund@649: ownerCt: me,
raimund@649: ownerLayout: me.getComponentLayout(),
raimund@649: value: 0,
dustin@667: valueToRaw: function (value) {
dustin@667: return (value < 10 ? '0' : '') + value; // add leading Zero
dustin@667: },
raimund@655: maxValue: 23,
dustin@667: maxLength: 2,
dustin@667: enforceMaxLength: true,
raimund@651: onSpinUp: function() {
raimund@651: var value = parseInt(this.getValue());
raimund@651: if (value === 23) {
raimund@651: return;
raimund@651: }
raimund@651: var newValue = value + 1;
dustin@667: this.setValue(newValue);
raimund@651: },
raimund@651: onSpinDown: function() {
raimund@651: var value = parseInt(this.getValue());
raimund@651: if (value === 0) {
raimund@651: return;
raimund@651: }
raimund@651: var newValue = value - 1;
dustin@667: this.setValue(newValue);
raimund@651: },
raimund@649: listeners: {
raimund@649: change: me.changeTimeValue,
raimund@649: scope: me
dustin@667: },
dustin@667: checkChangeEvents: ['change']
raimund@649: });
raimund@649:
dustin@667: me.minuteField = new Ext.form.field.Number({
raimund@649: ownerCt: me,
raimund@649: ownerLayout: me.getComponentLayout(),
raimund@649: value: 0,
raimund@655: maxValue: 59,
dustin@667: valueToRaw: function (value) {
dustin@667: return (value < 10 ? '0' : '') + value; // add leading Zero
dustin@667: },
dustin@667: maxLength: 2,
dustin@667: enforceMaxLength: true,
raimund@651: onSpinUp: function() {
raimund@651: var value = parseInt(this.getValue());
raimund@651: if (value === 59) {
raimund@651: return;
raimund@651: }
raimund@651: var newValue = value + 1;
dustin@667: this.setValue(newValue);
raimund@651: },
raimund@651: onSpinDown: function() {
raimund@651: var value = parseInt(this.getValue());
raimund@651: if (value === 0) {
raimund@651: return;
raimund@651: }
raimund@651: var newValue = value - 1;
dustin@667: this.setValue(newValue);
raimund@651: },
raimund@649: listeners: {
raimund@649: change: me.changeTimeValue,
raimund@649: scope: me
dustin@667: },
dustin@667: checkChangeEvents: ['change']
raimund@649: });
raimund@649:
raimund@649: me.timeLabel = new Ext.form.Label({
raimund@649: ownerCt: me,
raimund@649: ownerLayout: me.getComponentLayout(),
raimund@649: text: 'Zeit'
raimund@649: });
raimund@649: me.acceptBtn = new Ext.button.Button({
raimund@649: ownerCt: me,
raimund@649: ownerLayout: me.getComponentLayout(),
raimund@649: text: 'Übernehmen',
raimund@649: handler: me.acceptDate,
raimund@649: scope: me
raimund@649: });
raimund@649: me.callParent();
raimund@649: },
raimund@649:
raimund@649: finishRenderChildren: function() {
raimund@649: var me = this;
raimund@649: me.callParent();
raimund@649: me.timeLabel.finishRender();
raimund@649: me.hourField.finishRender();
raimund@649: me.minuteField.finishRender();
raimund@649: me.acceptBtn.finishRender();
raimund@649: },
raimund@649:
raimund@649: showTimePicker: function() {
raimund@649: var me = this;
raimund@649: var el = me.el;
raimund@649: Ext.defer(function() {
raimund@649: var xPos = el.getX();
raimund@649: var yPos = el.getY() + el.getHeight();
raimund@649: me.timePicker.setHeight(30);
raimund@649: me.timePicker.setWidth(el.getWidth());
raimund@649: me.timePicker.setPosition(xPos, yPos);
raimund@649: me.timePicker.show();
raimund@649: },1);
raimund@649: },
raimund@649:
raimund@649: beforeDestroy: function() {
raimund@649: var me = this;
raimund@649: if (me.rendered) {
raimund@649: Ext.destroy(
raimund@649: me.minuteField,
raimund@649: me.hourField
raimund@649: );
raimund@649: }
raimund@649: me.callParent();
raimund@649: },
raimund@649:
raimund@655: changeTimeValue: function (field, nValue) {
raimund@655: var value = parseInt(nValue);
raimund@655: if (value > field.maxValue) {
raimund@655: field.setValue(field.maxValue);
raimund@655: }
dustin@667: if (value == null || value == "" || isNaN(value)) {
dustin@667: field.setValue('0');
raimund@655: }
raimund@649: },
raimund@649:
raimund@649: setValue: function(value) {
raimund@649: value.setSeconds(0);
raimund@649: this.value = new Date(value);
raimund@649: return this.update(this.value);
raimund@649: },
raimund@649:
raimund@649: selectToday: function() {
raimund@649: var me = this;
raimund@649: var btn = me.todayBtn;
raimund@649: var handler = me.handler;
raimund@649: var auxDate = new Date();
raimund@649:
raimund@649: if (btn && !btn.disabled) {
raimund@649: me.pickerField.setValue(new Date(auxDate.setSeconds(0)));
raimund@649: me.setValue(new Date(auxDate.setSeconds(0)));
raimund@649: if (handler) {
raimund@649: handler.call(me.scope || me, me, me.value);
raimund@649: }
raimund@649: me.onSelect();
raimund@649: }
raimund@649: return me;
raimund@649: },
raimund@649:
raimund@649: acceptDate: function() {
raimund@649: var me = this;
raimund@649: var hourSet = me.hourField.getValue();
raimund@649: var minuteSet = me.minuteField.getValue();
raimund@649: var currentDate = me.value;
raimund@649: currentDate.setHours(hourSet);
raimund@649: currentDate.setMinutes(minuteSet);
raimund@649: me.setValue(currentDate);
raimund@649: me.fireEvent('select', me, currentDate);
raimund@649: },
raimund@649:
raimund@649: handleDateClick: function(e, t) {
raimund@649: var me = this;
raimund@649: var handler = me.handler;
raimund@649: var hourSet = me.hourField.getValue();
raimund@649: var minuteSet = me.minuteField.getValue();
raimund@649: var auxDate = new Date(t.dateValue);
raimund@649: e.stopEvent();
raimund@649: if (!me.disabled &&
raimund@649: t.dateValue &&
raimund@649: !Ext.fly(t.parentNode).hasCls(me.disabledCellCls)
raimund@649: ) {
raimund@649: me.doCancelFocus = me.focusOnSelect === false;
raimund@649: auxDate.setHours(hourSet, minuteSet, 0);
raimund@649: me.setValue(new Date(auxDate));
raimund@649: delete me.doCancelFocus;
raimund@649: if (handler) {
raimund@649: handler.call(me.scope || me, me, me.value);
raimund@649: }
raimund@649: // event handling is turned off on hide
raimund@649: // when we are using the picker in a field
raimund@649: // therefore onSelect comes AFTER the select
raimund@649: // event.
raimund@649: me.onSelect();
raimund@649: }
raimund@649: },
raimund@649:
raimund@649: selectedUpdate: function(date) {
raimund@649: var me = this;
raimund@649: var dateOnly = Ext.Date.clearTime(date, true);
raimund@649: var t = dateOnly.getTime();
raimund@649: var currentDate = (me.pickerField && me.pickerField.getValue()) || new Date();
raimund@649: var cells = me.cells;
raimund@649: var cls = me.selectedCls;
raimund@649: var cellItems = cells.elements;
raimund@649: var c;
raimund@649: var cLen = cellItems.length;
raimund@649: var cell;
raimund@649:
raimund@649: cells.removeCls(cls);
raimund@649:
raimund@649: for (c = 0; c < cLen; c++) {
raimund@649: cell = Ext.fly(cellItems[c]);
raimund@649:
raimund@649: if (cell.dom.firstChild.dateValue == t) {
raimund@649: me.fireEvent('highlightitem', me, cell);
raimund@649: cell.addCls(cls);
raimund@649:
raimund@649: if (me.isVisible() && !me.doCancelFocus) {
raimund@649: Ext.fly(cell.dom.firstChild).focus(50);
raimund@649: }
raimund@649:
raimund@649: break;
raimund@649: }
raimund@649: }
raimund@649: if (currentDate) {
raimund@649: me.hourField.setValue(currentDate.getHours());
raimund@649: me.minuteField.setValue(currentDate.getMinutes());
raimund@649: }
raimund@649: }
raimund@649: });