feat(mail): enable autoreply on specific days or at a specific time

Fixes #5328
This commit is contained in:
Francis Lachapelle
2021-12-02 14:20:47 -05:00
parent 6807d1df8b
commit 2ecd441f32
10 changed files with 498 additions and 141 deletions
@@ -44,11 +44,18 @@
"Add default email addresses" = "Add default email addresses";
"Days between responses" = "Days between responses";
"Do not send responses to mailing lists" = "Do not send responses to mailing lists";
"Activation Constraints" = "Activation Constraints";
"Enable auto reply on" = "Enable auto reply on";
"First day of vacation" = "First day of vacation";
"Disable auto reply on" = "Disable auto reply on";
"Last day of vacation" = "Last day of vacation";
"Enter date" = "Enter date";
/* Enable auto reply at this time of the day */
"Enable auto reply at" = "Enable auto reply at";
"Enter time" = "Enter time";
/* Disable auto reply at this time of the day */
"Disable auto reply at" = "Disable auto reply at";
"Enable auto reply on these days" = "Enable auto reply on these days";
"Always send vacation message response" = "Always send vacation message response";
"The vacation message is sent prior to apply your filters." = "The vacation message is sent prior to apply your filters.";
"Discard incoming mails during vacation" = "Discard incoming mails during vacation";
+9
View File
@@ -506,6 +506,15 @@ static NSArray *reminderValues = nil;
return iCalWeekDayString[i];
}
- (int) numberForWeekDay
{
unsigned int i;
i = [[self shortWeekDaysList] indexOfObject: item];
return i;
}
//
// Used by wox template
//
+128 -55
View File
@@ -636,6 +636,16 @@
</md-checkbox>
</div>
<div>
<md-checkbox
ng-model="app.preferences.defaults.SOGoMailMarkAsReadDelay"
ng-true-value="1"
ng-false-value="0"
label:aria-label="Automatically mark messages as read">
<var:string label:value="Automatically mark messages as read"/>
</md-checkbox>
</div>
<div class="hide-xs" layout="row" layout-align="start center" flex="50">
<md-checkbox
class="md-align-top-left"
@@ -1031,17 +1041,17 @@
</div>
<div layout="row">
<md-input-container class="md-block" flex="50" flex-xs="100">
<label><var:string label:value="Days between responses"/></label>
<md-select label:aria-label="Days between responses"
ng-model="app.preferences.defaults.Vacation.daysBetweenResponse">
<var:foreach list="daysBetweenResponsesList" item="item">
<md-option var:value="item">
<var:string value="item"/>
</md-option>
</var:foreach>
</md-select>
</md-input-container>
<md-input-container class="md-block" flex="50" flex-xs="100">
<label><var:string label:value="Days between responses"/></label>
<md-select label:aria-label="Days between responses"
ng-model="app.preferences.defaults.Vacation.daysBetweenResponse">
<var:foreach list="daysBetweenResponsesList" item="item">
<md-option var:value="item">
<var:string value="item"/>
</md-option>
</var:foreach>
</md-select>
</md-input-container>
</div>
<div>
@@ -1053,50 +1063,6 @@
</md-checkbox>
</div>
<var:if condition="isVacationPeriodEnabled">
<div>
<md-checkbox
ng-model="app.preferences.defaults.Vacation.startDateEnabled"
ng-true-value="1"
ng-false-value="0"
ng-change="app.toggleVacationStartDate()">
<var:string label:value="Enable auto reply on" />
</md-checkbox>
<md-input-container>
<label class="md-no-truncate"><var:string label:value="First day of vacation"/></label>
<md-datepicker
name="vacationStartDate"
label:md-placeholder="Enter date"
ng-disabled="!app.preferences.defaults.Vacation.startDateEnabled"
ng-required="app.preferences.defaults.Vacation.startDateEnabled"
ng-model="app.preferences.defaults.Vacation.startDate"
md-date-filter="app.validateVacationStartDate"
sg-reset-on-disabled="sg-reset-on-disabled"><!-- datepicker --></md-datepicker>
</md-input-container>
</div>
<div>
<md-checkbox
ng-model="app.preferences.defaults.Vacation.endDateEnabled"
ng-true-value="1"
ng-false-value="0"
ng-change="app.toggleVacationEndDate()">
<var:string label:value="Disable auto reply on" />
</md-checkbox>
<md-input-container>
<label class="md-no-truncate"><var:string label:value="Last day of vacation"/></label>
<md-datepicker
name="vacationEndDate"
label:md-placeholder="Enter date"
ng-disabled="!app.preferences.defaults.Vacation.endDateEnabled"
ng-required="app.preferences.defaults.Vacation.endDateEnabled"
ng-model="app.preferences.defaults.Vacation.endDate"
md-date-filter="app.validateVacationEndDate"
sg-reset-on-disabled="sg-reset-on-disabled"><!-- datepicker --></md-datepicker>
</md-input-container>
</div>
</var:if>
<div>
<md-checkbox
ng-model="app.preferences.defaults.Vacation.alwaysSend"
@@ -1117,6 +1083,113 @@
</md-checkbox>
</div>
<var:if condition="isVacationPeriodEnabled">
<h4 class="md-title"><var:string label:value="Activation Constraints"/></h4>
<div layout="row" layout-wrap="layout-wrap">
<div class="md-block" flex="50" flex-xs="100">
<md-checkbox
ng-model="app.preferences.defaults.Vacation.startDateEnabled"
ng-true-value="1"
ng-false-value="0"
ng-change="app.toggleVacationStartDate()">
<var:string label:value="Enable auto reply on" />
</md-checkbox>
<md-input-container>
<label class="md-no-truncate"><var:string label:value="First day of vacation"/></label>
<md-datepicker
name="vacationStartDate"
label:md-placeholder="Enter date"
ng-disabled="!app.preferences.defaults.Vacation.startDateEnabled"
ng-required="app.preferences.defaults.Vacation.startDateEnabled"
ng-model="app.preferences.defaults.Vacation.startDate"
md-date-filter="app.validateVacationStartDate"
sg-reset-on-disabled="sg-reset-on-disabled"><!-- datepicker --></md-datepicker>
</md-input-container>
</div>
<div class="md-block" flex="50" flex-xs="100">
<md-checkbox
ng-model="app.preferences.defaults.Vacation.endDateEnabled"
ng-true-value="1"
ng-false-value="0"
ng-change="app.toggleVacationEndDate()">
<var:string label:value="Disable auto reply on" />
</md-checkbox>
<md-input-container>
<label class="md-no-truncate"><var:string label:value="Last day of vacation"/></label>
<md-datepicker
name="vacationEndDate"
label:md-placeholder="Enter date"
ng-disabled="!app.preferences.defaults.Vacation.endDateEnabled"
ng-required="app.preferences.defaults.Vacation.endDateEnabled"
ng-model="app.preferences.defaults.Vacation.endDate"
md-date-filter="app.validateVacationEndDate"
sg-reset-on-disabled="sg-reset-on-disabled"><!-- datepicker --></md-datepicker>
</md-input-container>
</div>
</div>
<div layout="row" layout-wrap="layout-wrap">
<div class="md-block" flex="50" flex-xs="100">
<md-checkbox
ng-model="app.preferences.defaults.Vacation.startTimeEnabled"
ng-true-value="1"
ng-false-value="0"
ng-change="app.toggleVacationStartTime()">
<var:string label:value="Enable auto reply at" />
</md-checkbox>
<md-input-container>
<sg-timepicker
name="vacationStartTime"
label:md-placeholder="Enter time"
ng-disabled="!app.preferences.defaults.Vacation.startTimeEnabled"
ng-required="app.preferences.defaults.Vacation.startTimeEnabled"
ng-model="app.preferences.defaults.Vacation.startTime"><!-- timepicker --></sg-timepicker>
</md-input-container>
</div>
<div class="md-block" flex="50" flex-xs="100">
<md-checkbox
ng-disabled="!app.preferences.defaults.Vacation.startTimeEnabled"
ng-model="app.preferences.defaults.Vacation.endTimeEnabled"
ng-true-value="1"
ng-false-value="0"
ng-change="app.toggleVacationEndTime()">
<var:string label:value="Disable auto reply at" />
</md-checkbox>
<md-input-container>
<sg-timepicker
name="vacationEndTime"
label:md-placeholder="Enter time"
ng-disabled="!app.preferences.defaults.Vacation.endTimeEnabled"
ng-required="app.preferences.defaults.Vacation.endTimeEnabled"
ng-model="app.preferences.defaults.Vacation.endTime"><!-- timepicker --></sg-timepicker>
</md-input-container>
</div>
</div>
<div class="sg-padded--bottom" layout="row" layout-align="start end">
<md-checkbox
ng-model="app.preferences.defaults.Vacation.weekdaysEnabled"
ng-true-value="1"
ng-false-value="0">
</md-checkbox>
<div class="pseudo-input-container layout-padding" flex="50" flex-sm="80" flex-xs="100">
<label class="pseudo-input-label"><var:string label:value="Enable auto reply on these days"/></label>
<md-grid-list md-cols="7" md-row-height="2em" md-gutter="0.5em"
ng-model="app.preferences.defaults.Vacation.days"
ng-disabled="app.preferences.defaults.Vacation.weekdaysEnabled"
sg-toggle-grid="sg-toggle-grid">
<var:foreach list="shortWeekDaysList" item="item">
<md-grid-tile var:value="numberForWeekDay"><var:string value="item"/></md-grid-tile>
</var:foreach>
</md-grid-list>
</div>
</div>
</var:if>
</div>
</div>
</md-tab>
@@ -9,7 +9,7 @@
* @constructor
*/
function Preferences() {
var _this = this, defaultsElement, settingsElement, data;
var _this = this, defaultsElement, settingsElement, data, time;
this.nextAlarm = null;
this.nextInboxPoll = null;
@@ -90,6 +90,28 @@
data.Vacation.endDate = new Date(data.Vacation.startDate.getTime());
data.Vacation.endDate.addDays(1);
}
if (data.Vacation.startTime) {
time = data.Vacation.startTime.split(':');
data.Vacation.startTime = new Date();
data.Vacation.startTime.setHours(parseInt(time[0]), parseInt(time[1]));
}
else {
data.Vacation.startTimeEnabled = 0;
data.Vacation.startTime = new Date();
data.Vacation.startTime.setHours(parseInt(data.SOGoDayEndTime));
data.Vacation.startTime.setMinutes(0);
}
if (data.Vacation.endTime) {
time = data.Vacation.endTime.split(':');
data.Vacation.endTime = new Date();
data.Vacation.endTime.setHours(parseInt(time[0]), parseInt(time[1]));
}
else {
data.Vacation.endTimeEnabled = 0;
data.Vacation.endTime = new Date();
data.Vacation.endTime.setHours(parseInt(data.SOGoDayStartTime));
data.Vacation.endTime.setMinutes(0);
}
if (data.Vacation.autoReplyEmailAddresses &&
angular.isString(data.Vacation.autoReplyEmailAddresses) &&
data.Vacation.autoReplyEmailAddresses.length)
@@ -97,6 +119,9 @@
} else
data.Vacation = {};
if (angular.isUndefined(data.Vacation.days))
data.Vacation.days = [];
if ((angular.isUndefined(data.Vacation.autoReplyEmailAddresses) ||
data.Vacation.autoReplyEmailAddresses.length == 0) &&
angular.isDefined(window.defaultEmailAddresses))
@@ -413,7 +438,19 @@
if (this.inboxSyncToken)
params.syncToken = this.inboxSyncToken;
Preferences.$$resource.post('Mail', '0/folderINBOX/changes', params).then(function(data) {
/**
* @ngInject
*/
toastController.$inject = ['scope', '$mdToast', 'title', 'body'];
function toastController (scope, $mdToast, title, body) {
scope.title = title;
scope.body = body;
scope.close = function() {
$mdToast.hide('ok');
};
}
return Preferences.$$resource.post('Mail', '0/folderINBOX/changes', params).then(function(data) {
if (data.syncToken) {
_this.inboxSyncToken = data.syncToken;
Preferences.$log.debug("New syncToken is " + _this.inboxSyncToken);
@@ -489,18 +526,6 @@
if (refreshViewCheck && refreshViewCheck != 'manually')
_this.nextInboxPoll = Preferences.$timeout(angular.bind(_this, _this.pollInbox), refreshViewCheck.timeInterval()*1000);
});
/**
* @ngInject
*/
toastController.$inject = ['scope', '$mdToast', 'title', 'body'];
function toastController (scope, $mdToast, title, body) {
scope.title = title;
scope.body = body;
scope.close = function() {
$mdToast.hide('ok');
};
}
};
/**
@@ -734,8 +759,9 @@
delete preferences.defaults.SOGoMailComposeFontSizeEnabled;
if (preferences.defaults.Vacation) {
if (preferences.defaults.Vacation.startDateEnabled)
if (preferences.defaults.Vacation.startDateEnabled) {
preferences.defaults.Vacation.startDate = preferences.defaults.Vacation.startDate.getTime()/1000;
}
else {
delete preferences.defaults.Vacation.startDateEnabled;
preferences.defaults.Vacation.startDate = 0;
@@ -747,6 +773,23 @@
preferences.defaults.Vacation.endDate = 0;
}
if (preferences.defaults.Vacation.startTimeEnabled) {
preferences.defaults.Vacation.startTime = preferences.defaults.Vacation.startTime.format(this.$mdDateLocaleProvider, '%H:%M');
// Set an end time only if a start time is defined
if (preferences.defaults.Vacation.endTimeEnabled)
preferences.defaults.Vacation.endTime = preferences.defaults.Vacation.endTime.format(this.$mdDateLocaleProvider, '%H:%M');
else {
delete preferences.defaults.Vacation.endTimeEnabled;
preferences.defaults.Vacation.endTime = 0;
}
}
else {
delete preferences.defaults.Vacation.startTimeEnabled;
preferences.defaults.Vacation.startTime = 0;
delete preferences.defaults.Vacation.endTimeEnabled;
preferences.defaults.Vacation.endTime = 0;
}
if (preferences.defaults.Vacation.autoReplyEmailAddresses)
preferences.defaults.Vacation.autoReplyEmailAddresses = _.compact(preferences.defaults.Vacation.autoReplyEmailAddresses);
else
@@ -587,6 +587,32 @@
return r;
};
this.toggleVacationStartTime = function() {
var v;
v = this.preferences.defaults.Vacation;
if (v.startTimeEnabled) {
// Enabling the start date
if (!v.startTime) {
v.startTime = new Date();
}
}
};
this.toggleVacationEndTime = function() {
var v;
v = this.preferences.defaults.Vacation;
if (v.endTimeEnabled) {
// Enabling the end date
if (!v.endTime) {
v.endTime = new Date();
}
}
};
}
angular