Ext.define('Proxmox.DateTimeField', { extend: 'Ext.form.FieldContainer', xtype: 'promxoxDateTimeField', layout: 'hbox', referenceHolder: true, submitFormat: 'U', getValue: function() { var me = this; var d = me.lookupReference('dateentry').getValue(); if (d === undefined || d === null) { return null; } var t = me.lookupReference('timeentry').getValue(); if (t === undefined || t === null) { return null; } var offset = (t.getHours()*3600+t.getMinutes()*60)*1000; return new Date(d.getTime() + offset); }, getSubmitValue: function() { var me = this; var format = me.submitFormat; var value = me.getValue(); return value ? Ext.Date.format(value, format) : null; }, items: [ { xtype: 'datefield', editable: false, reference: 'dateentry', flex: 1, format: 'Y-m-d' }, { xtype: 'timefield', reference: 'timeentry', format: 'H:i', width: 80, value: '00:00', increment: 60 } ], setMinValue: function(value) { let me = this; let current = me.getValue(); if (!value || !current) { return; } let minhours = value.getHours(); let minminutes = value.getMinutes(); let hours = current.getHours(); let minutes = current.getMinutes(); value.setHours(0); value.setMinutes(0); value.setSeconds(0); current.setHours(0); current.setMinutes(0); current.setSeconds(0); let time = new Date(); if (current-value > 0) { time.setHours(0); time.setMinutes(0); time.setSeconds(0); time.setMilliseconds(0); } else { time.setHours(minhours); time.setMinutes(minminutes); } me.lookup('timeentry').setMinValue(time); // current time is smaller than the time part of the new minimum // so we have to add 1 to the day if ((minhours*60+minminutes) > (hours*60+minutes)) { value.setDate(value.getDate()+1); } me.lookup('dateentry').setMinValue(value); }, setMaxValue: function(value) { let me = this; let current = me.getValue(); if (!value || !current) { return; } let maxhours = value.getHours(); let maxminutes = value.getMinutes(); let hours = current.getHours(); let minutes = current.getMinutes(); value.setHours(0); value.setMinutes(0); current.setHours(0); current.setMinutes(0); let time = new Date(); if (value-current > 0) { time.setHours(23); time.setMinutes(59); time.setSeconds(59); } else { time.setHours(maxhours); time.setMinutes(maxminutes); } me.lookup('timeentry').setMaxValue(time); // current time is biger than the time part of the new maximum // so we have to subtract 1 to the day if ((maxhours*60+maxminutes) < (hours*60+minutes)) { value.setDate(value.getDate()-1); } me.lookup('dateentry').setMaxValue(value); }, initComponent: function() { var me = this; me.callParent(); var value = me.value || new Date(); me.lookupReference('dateentry').setValue(value); me.lookupReference('timeentry').setValue(value); if (me.minValue) { me.setMinValue(me.minValue); } if (me.maxValue) { me.setMaxValue(me.maxValue); } me.relayEvents(me.lookupReference('dateentry'), ['change']); me.relayEvents(me.lookupReference('timeentry'), ['change']); } });