CRM-20397 Allow for up to 4 hours tollarence in setting the date as valid or not...
authorSeamus Lee <seamuslee001@gmail.com>
Mon, 9 Oct 2017 14:41:11 +0000 (01:41 +1100)
committerSeamus Lee <seamuslee001@gmail.com>
Mon, 9 Oct 2017 16:11:56 +0000 (03:11 +1100)
ang/crmMailing/RadioDate.js

index 5ed5b204d0b4bcb793e2a2a661a6d801553e2e96..037b6e22ba9695e2988bd79b4d26617e1b331700 100644 (file)
@@ -1,4 +1,17 @@
 (function(angular, $, _) {
+  // "YYYY-MM-DD hh:mm:ss" => Date()
+  function parseYmdHms(d) {
+    var parts = d.split(/[\-: ]/);
+    return new Date(parts[0], parts[1]-1, parts[2], parts[3], parts[4], parts[5]);
+  }
+
+  function isDateBefore(tgt, cutoff, tolerance) {
+    var ad = parseYmdHms(tgt), bd = parseYmdHms(cutoff);
+    // We'll allow a little leeway, where tgt is considered before cutoff
+    // even if technically misses the cutoff by a little.
+    return  ad < bd-tolerance;
+  }
+
   // Represent a datetime field as if it were a radio ('schedule.mode') and a datetime ('schedule.datetime').
   // example: <div crm-mailing-radio-date="mySchedule" ng-model="mailing.scheduled_date">...</div>
   angular.module('crmMailing').directive('crmMailingRadioDate', function(crmUiAlert) {
@@ -64,7 +77,7 @@
               date = [year, month, day].join('-');
               time = [hours, minutes, "00"].join(':');
               currentDate = date + ' ' + time;
-              var isInPast = ($(this).val().length && submittedDate < currentDate);
+              var isInPast = (submittedDate.length && submittedDate.match(/^[0-9\-]+ [0-9\:]+$/) && isDateBefore(submittedDate, currentDate, 4*60*60*1000));
               ngModel.$setValidity('dateTimeInThePast', !isInPast);
               if (lastAlert && lastAlert.isOpen) {
                 lastAlert.close();