diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox index 435914f906..0e84e8cf62 100644 --- a/UI/Templates/PreferencesUI/UIxPreferences.wox +++ b/UI/Templates/PreferencesUI/UIxPreferences.wox @@ -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"> @@ -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()"> + 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"> @@ -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()"> - + diff --git a/UI/WebServerResources/js/Common/sgResetOnDisabled.directive.js b/UI/WebServerResources/js/Common/sgResetOnDisabled.directive.js new file mode 100644 index 0000000000..8ba6d43438 --- /dev/null +++ b/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: + + + */ + 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); +})(); diff --git a/UI/WebServerResources/js/Preferences/PreferencesController.js b/UI/WebServerResources/js/Preferences/PreferencesController.js index f23b11fff7..71b716fbe0 100644 --- a/UI/WebServerResources/js/Preferences/PreferencesController.js +++ b/UI/WebServerResources/js/Preferences/PreferencesController.js @@ -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 }; @@ -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 @@ -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; } }