Skip to content

Commit

Permalink
(js) Improve dates constraints of vacation reply
Browse files Browse the repository at this point in the history
Fixes #3841
  • Loading branch information
cgx committed Oct 19, 2016
1 parent 7ef245e commit 58ee225
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 36 deletions.
26 changes: 14 additions & 12 deletions UI/Templates/PreferencesUI/UIxPreferences.wox
Expand Up @@ -818,6 +818,7 @@
ng-model="app.preferences.defaults.Vacation.enabled"
ng-true-value="1"
ng-false-value="0"
ng-change="app.updateVacationDates()"
label:aria-label="Enable vacation auto reply">
<var:string label:value="Enable vacation auto reply"/>
</md-checkbox>
Expand Down Expand Up @@ -894,16 +895,16 @@
ng-model="app.preferences.defaults.Vacation.startDateEnabled"
ng-true-value="1"
ng-false-value="0"
ng-change="app.updateVacationDates()">
ng-change="app.toggleVacationStartDate()">
<var:string label:value="Enable auto reply on" />
</md-checkbox>
<md-input-container>
<md-datepicker
ng-disabled="app.preferences.defaults.Vacation.startDateEnabled == 0"
ng-model="app.preferences.defaults.Vacation.startDate"
ng-change="app.updateVacationDates()"
md-min-date="app.vacationStartDateMin"
md-max-date="app.vacationEndDate"><!-- datepicker --></md-datepicker>
name="vacationStartDate"
ng-disabled="!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>

Expand All @@ -912,15 +913,16 @@
ng-model="app.preferences.defaults.Vacation.endDateEnabled"
ng-true-value="1"
ng-false-value="0"
ng-change="app.updateVacationDates()">
ng-change="app.toggleVacationEndDate()">
<var:string label:value="Disable auto reply on" />
</md-checkbox>
<md-input-container>
<md-datepicker
ng-disabled="app.preferences.defaults.Vacation.endDateEnabled == 0"
ng-model="app.preferences.defaults.Vacation.endDate"
ng-change="app.updateVacationDates()"
md-min-date="app.vacationStartDate"><!-- datepicker --></md-datepicker>
<md-datepicker
name="vacationEndDate"
ng-disabled="!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>

Expand Down
50 changes: 50 additions & 0 deletions UI/WebServerResources/js/Common/sgResetOnDisabled.directive.js
@@ -0,0 +1,50 @@
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */

(function() {
'use strict';

/**
* sgResetOnDisabled - A directive to reset any error of a datepicker when marked
* as disabled.
* @memberof SOGo.Common
* @ngInject
* @example:
<md-datepicker
ng-model="myDate"
ng-disabled="!myDateEnabled"
sg-reset-on-disabled>
*/
function sgResetOnDisabled() {
return {
link: postLink,
require: 'mdDatepicker',
restrict: 'A'
};

function postLink(scope, element, attrs, datepickerCtrl) {
function getInput() {
return element.find('input').eq(0);
}

// We need to wait for the datepicker directive to be compiled
var listener = scope.$watch(getInput, function (input) {
var ngModel;

if (input.length) {
listener(); // self release
datepickerCtrl.$scope.$watch('ctrl.isDisabled', function(isDisabled) {
if (isDisabled)
if (datepickerCtrl.ngModelCtrl.$invalid)
// Trigger the event that will reset the errors and the model value
datepickerCtrl.$scope.$emit('md-calendar-change', datepickerCtrl.date);
});
}
});
}
}

angular
.module('SOGo.Common')
.directive('sgResetOnDisabled', sgResetOnDisabled);
})();
99 changes: 75 additions & 24 deletions UI/WebServerResources/js/Preferences/PreferencesController.js
Expand Up @@ -9,7 +9,7 @@
*/
PreferencesController.$inject = ['$q', '$window', '$state', '$mdMedia', '$mdSidenav', '$mdDialog', '$mdToast', 'sgFocus', 'Dialog', 'User', 'Account', 'statePreferences', 'Authentication'];
function PreferencesController($q, $window, $state, $mdMedia, $mdSidenav, $mdDialog, $mdToast, focus, Dialog, User, Account, statePreferences, Authentication) {
var vm = this, account, mailboxes = [], today = new Date(), tomorrow = today.addDays(1);
var vm = this, account, mailboxes = [], today = new Date(), tomorrow = today.beginOfDay().addDays(1);

vm.preferences = statePreferences;
vm.passwords = { newPassword: null, newPasswordConfirmation: null };
Expand Down Expand Up @@ -39,6 +39,11 @@
vm.timeZonesSearchText = '';
vm.sieveVariablesCapability = ($window.sieveCapabilities.indexOf('variables') >= 0);
vm.updateVacationDates = updateVacationDates;
vm.toggleVacationStartDate = toggleVacationStartDate;
vm.toggleVacationEndDate = toggleVacationEndDate;
vm.validateVacationStartDate = validateVacationStartDate;
vm.validateVacationEndDate = validateVacationEndDate;


// Fetch a flatten version of the mailboxes list of the main account (0)
// This list will be forwarded to the Sieve filter controller
Expand Down Expand Up @@ -370,32 +375,78 @@
}

function updateVacationDates() {
if (statePreferences.defaults &&
statePreferences.defaults.Vacation &&
statePreferences.defaults.Vacation.enabled) {

// Determine minimum dates
vm.vacationStartDateMin = undefined;
if (statePreferences.defaults.Vacation.startDateEnabled) {
vm.vacationStartDateMin = tomorrow;
vm.vacationStartDate = statePreferences.defaults.Vacation.startDate;
var d = vm.preferences.defaults;

if (d &&
d.Vacation &&
d.Vacation.enabled) {
toggleVacationStartDate();
toggleVacationEndDate();
}
}

function toggleVacationStartDate() {
var v;

v = vm.preferences.defaults.Vacation;

if (v.startDateEnabled) {
// Enabling the start date
if (v.endDateEnabled && v.startDate.getTime() > v.endDate.getTime()) {
v.startDate = new Date(v.endDate.getTime());
v.startDate.addDays(-1);
}
if (v.startDate.getTime() < tomorrow.getTime()) {
v.startDate = new Date(tomorrow.getTime());
}
}
}

function toggleVacationEndDate() {
var v;

v = vm.preferences.defaults.Vacation;

if (v.endDateEnabled) {
// Enabling the end date
if (v.startDateEnabled && v.endDate.getTime() < v.startDate.getTime()) {
v.endDate = new Date(v.startDate.getTime());
v.endDate.addDays(1);
}
else if (v.endDate.getTime() < tomorrow.getTime()) {
v.endDate = new Date(tomorrow.getTime());
}
}
}

function validateVacationStartDate(date) {
var d = vm.preferences.defaults, r = true;
if (d &&
d.Vacation &&
d.Vacation.enabled) {
if (d.Vacation.startDateEnabled) {
r = (!d.Vacation.endDateEnabled ||
date.getTime() < d.Vacation.endDate.getTime()) &&
date.getTime() >= tomorrow.getTime();
}
else if (statePreferences.defaults.Vacation.endDateEnabled)
vm.vacationStartDate = tomorrow;
else
vm.vacationStartDate = undefined;

// Determine maximum value of start date
if (statePreferences.defaults.Vacation.endDateEnabled)
vm.vacationEndDate = statePreferences.defaults.Vacation.endDate;
else
vm.vacationEndDate = undefined;
}
else {
vm.vacationStartDateMin = undefined;
vm.vacationStartDate = undefined;
vm.vacationEndDate = undefined;

return r;
}

function validateVacationEndDate(date) {
var d = vm.preferences.defaults, r = true;
if (d &&
d.Vacation &&
d.Vacation.enabled) {
if (d.Vacation.endDateEnabled) {
r = (!d.Vacation.startDateEnabled ||
date.getTime() > d.Vacation.startDate.getTime()) &&
date.getTime() >= tomorrow.getTime();
}
}

return r;
}
}

Expand Down

0 comments on commit 58ee225

Please sign in to comment.