Ext.namespace('Zarafa.mail.dialogs'); /** * @class Zarafa.mail.dialogs.DelayedDeliveryPanel * @extends Ext.Panel * @xtype zarafa.delayeddeliverypanel * * Panel for users to set the deferred_send_time on a given {@link Zarafa.mail.MailRecord record} */ Zarafa.mail.dialogs.DelayedDeliveryPanel = Ext.extend(Ext.Panel, { /** * @cfg {Date} scheduledMailDateTime which is date and time when mail should be delivered */ scheduledMailDateTime: undefined, /** * @constructor * @param config Configuration structure */ constructor: function (config) { config = config || {}; config = Ext.applyIf(config, { xtype: 'zarafa.delayeddeliverypanel', border: false, cls : 'zarafa-delayeddeliverypanel', items: [{ xtype: 'zarafa.radiospinnerfield', cls : 'zarafa-delayeddeliverypanel-radiospinnerfield', type: 'hours', value: _('hour(s)'), listeners: { focus: this.onFieldFocus, change: this.onFieldChange, scope: this } }, { xtype: 'zarafa.radiospinnerfield', type: 'days', cls : 'zarafa-delayeddeliverypanel-radiospinnerfield', value: _('day(s)'), listeners: { focus: this.onFieldFocus, change: this.onFieldChange, scope: this } }, { xtype: 'zarafa.radiospinnerfield', type: 'months', cls : 'zarafa-delayeddeliverypanel-radiospinnerfield', value: _('month(s)'), listeners: { focus: this.onFieldFocus, change: this.onFieldChange, scope: this } }, { xtype: 'displayfield', value: _('at a specific time'), cls:'zarafa-delayeddeliverypanel-displayfield' }, { xtype: 'zarafa.radiodatetimefield', ref: 'delayedDeliveryDateTimeField', cls :'zarafa-delayeddeliverypanel-radiodatetimefield', listeners: { focus: this.onFieldFocus, change: this.onFieldChange, scope: this } }, { xtype: 'displayfield', cls : 'zarafa-delayeddeliverypanel-fields', ref: 'timeInfofield' }], listeners: { afterrender: this.setDefaultValue } }); Zarafa.mail.dialogs.DelayedDeliveryPanel.superclass.constructor.call(this, config); }, /** * Event handler which is called when the {@link Zarafa.common.ui.RadioDateTimeField radioDateTimeField} or * {@link Zarafa.common.ui.RadioSpinnerField radioSpinnerField} field receives input focus, * this will call {@link #createMessage} for updating the delayInfoMessage value * @param {Zarafa.common.ui.RadioSpinnerField|Zarafa.common.ui.RadioDateTimeField} field The field which fired the event */ onFieldFocus: function (field) { this.createMessage(field.getDateTime()); }, /** * Event handler which is called when the {@link Zarafa.common.ui.RadioDateTimeField radioDateTimeField} or * {@link Zarafa.common.ui.RadioSpinnerField radioSpinnerField} value has changed, * this will call {@link #createMessage} for updating the delayInfoMessage value * @param {Zarafa.common.ui.RadioSpinnerField|Zarafa.common.ui.RadioDateTimeField} field The field which fired the event * @param {Date} dateTime The date and time which is specified by user. */ onFieldChange: function (field, dateTime) { this.createMessage(dateTime); }, /** * Function is use to create and display delayInfoMessage. * this will call {@link #getMessageDate} and {@link #showMessage} for getting the delayInfoMessage value and display delayInfoMessage * @param {Date} value which is selected date and time */ createMessage: function (value) { var dateTime = new Date(value); this.scheduledMailDateTime = dateTime; var delayInfoMessage = this.getMessageDate(dateTime); this.showMessage(delayInfoMessage); }, /** * Function check date and create appropriate delayInfoMessage using the date. * @param {Date} dateTime The date and time which is specified by user. * @returns {string} delayInfoMessage which is display when record will be send. */ getMessageDate: function (dateTime) { var delayInfoMessage = ''; this.ownerCt.setDisabled(true); if (isNaN(dateTime.getTime())) { return delayInfoMessage; } else if (this.isPastDate(dateTime)) { //If user select past time then return sorry delayInfoMessage and disable send button. delayInfoMessage = _('The time you entered is in the past. Please reschedule your mail.'); this.delayedDeliveryDateTimeField.addClass('zarafa-delayeddelivery-invalid-date'); return delayInfoMessage; } else { //Create appropriate delayInfoMessage base on scheduled date and time // We now have 4 possible cases: // 1) When the date is scheduled for today, the delayInfoMessage will be shown as // "Your email will be sent today at [xx:xx]" // 2) When the date is scheduled for tomorrow, the delayInfoMessage will be shown as // "Your email will be sent tomorrow at [xx:xx]" // 3) When the date is scheduled within a week, the delayInfoMessage will be shown as // “Your email will be sent [Day] at [xx:xx]" // 4) All other dates further than one week, the delayInfoMessage will be shown as // “Your email will be sent at [Month] [dd]th [yyyy], [xx:xx]" var date = ''; var time = dateTime.format('H:i'); if (this.isTodayDate(dateTime)) { date = _('today at '); } else if (this.isTomorrowDate(dateTime)) { date = _('tomorrow at '); } else if (this.isDayInCurrentWeek(dateTime)) { date = String.format(_('{0} at '), dateTime.format('l ')); } else { date = String.format(_('at {0}'), dateTime.format('F jS Y, ')); } delayInfoMessage = String.format(_('Your email will be sent {0}{1}'), date, time); this.ownerCt.setDisabled(false); this.delayedDeliveryDateTimeField.removeClass('zarafa-delayeddelivery-invalid-date'); return delayInfoMessage; } }, /** * Function check whether specified date and time is in past or not. * @param {Date} mailDateTime Specified date and time. * @returns {boolean} true if date and time is in past */ isPastDate: function (mailDateTime) { var currentDateTime = new Date().getTime(); var mailDate = mailDateTime.getTime(); return mailDate < (currentDateTime - 3000); }, /** * Function check whether specified date is today's date or not. * @param {Date} mailDateTime Specified date and time. * @returns {boolean} true if date is today's date */ isTodayDate: function (mailDateTime) { var todayDate = new Date().clearTime(true); var mailDate = new Date(mailDateTime).clearTime(true); return todayDate.getTime() === mailDate.getTime(); }, /** * Function check whether specified date is tomorrow's date or not. * @param {Date} mailDateTime Specified date and time. * @returns {boolean} true if date is tomorrow's date */ isTomorrowDate: function (mailDateTime) { var date = new Date().clearTime(true); var mailDate = new Date(mailDateTime).clearTime(true); var tomorrowDateTime = new Date(date.add(Date.DAY, 1)); return tomorrowDateTime.getTime() === mailDate.getTime(); }, /** * Function check whether specified date is in current week or not. * @param {Date} mailDateTime Specified date and time. * @returns {boolean} true if date is in current week else false */ isDayInCurrentWeek: function (mailDateTime) { var currentDateTime = new Date(); var first = currentDateTime.getDate() - currentDateTime.getDay(); var firstDayOfWeek = new Date(currentDateTime.setDate(first)); var lastDayOfWeek = firstDayOfWeek.add(Date.DAY,6); var mailDate = new Date(mailDateTime).clearTime(true); return mailDate.between(firstDayOfWeek, lastDayOfWeek); }, /** * Function display delayInfoMessage when user select the date. * delayInfoMessage content when your mail will be send. * @param {String} delayInfoMessage Message string created using specified date. */ showMessage: function (delayInfoMessage) { this.timeInfofield.setValue(delayInfoMessage); }, /** * Function set default value in {@link Zarafa.common.ui.RadioDateTimeField radioDateTimeField} * If record has deferred_send_time then set this date and time otherwise set current date and time */ setDefaultValue: function () { var deferredSendTime = this.ownerCt.record.get('deferred_send_time'); if (Ext.isEmpty(deferredSendTime)) { this.delayedDeliveryDateTimeField.setValue(new Date()); } else { this.delayedDeliveryDateTimeField.setValue(deferredSendTime); } var initialDateTime = this.delayedDeliveryDateTimeField.getDateTime(); this.createMessage(initialDateTime); }, /** * Function return date and time which is selected by user. * @returns {Date} The date object */ getMailDateTime: function () { return this.scheduledMailDateTime; } }); Ext.reg('zarafa.delayeddeliverypanel', Zarafa.mail.dialogs.DelayedDeliveryPanel);