diff --git a/UI/Templates/PreferencesUI/UIxPreferences.wox b/UI/Templates/PreferencesUI/UIxPreferences.wox
index 435914f90..0e84e8cf6 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 000000000..8ba6d4343
--- /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 f23b11fff..71b716fbe 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) {
+ var d = vm.preferences.defaults;
- // Determine minimum dates
- vm.vacationStartDateMin = undefined;
- if (statePreferences.defaults.Vacation.startDateEnabled) {
- vm.vacationStartDateMin = tomorrow;
- vm.vacationStartDate = statePreferences.defaults.Vacation.startDate;
+ 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);
}
- else if (statePreferences.defaults.Vacation.endDateEnabled)
- vm.vacationStartDate = tomorrow;
- else
- vm.vacationStartDate = undefined;
+ if (v.startDate.getTime() < tomorrow.getTime()) {
+ v.startDate = new Date(tomorrow.getTime());
+ }
+ }
+ }
- // Determine maximum value of start date
- if (statePreferences.defaults.Vacation.endDateEnabled)
- vm.vacationEndDate = statePreferences.defaults.Vacation.endDate;
- else
- vm.vacationEndDate = undefined;
+ 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());
+ }
}
- else {
- vm.vacationStartDateMin = undefined;
- vm.vacationStartDate = undefined;
- vm.vacationEndDate = undefined;
+ }
+
+ 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();
+ }
}
+
+ 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;
}
}