diff --git a/application/Espo/Core/SelectManagers/Base.php b/application/Espo/Core/SelectManagers/Base.php index ca55eabd8e..fba3c9766f 100644 --- a/application/Espo/Core/SelectManagers/Base.php +++ b/application/Espo/Core/SelectManagers/Base.php @@ -875,6 +875,14 @@ class Base $dt->setTimezone(new \DateTimeZone('UTC')); $where['value'] = $dt->format($format); break; + case 'afterXDays': + $where['type'] = 'after'; + $number = strval(intval($item['value'])); + $dt->modify('+'.$number.' day'); + $dt->setTime(0, 0, 0); + $dt->setTimezone(new \DateTimeZone('UTC')); + $where['value'] = $dt->format($format); + break; case 'on': $where['type'] = 'between'; @@ -1063,6 +1071,12 @@ class Base $dt1->modify('-'.$number.' days'); $part[$attribute . '<'] = $dt1->format('Y-m-d'); break; + case 'afterXDays': + $dt1 = new \DateTime(); + $number = strval(intval($item['value'])); + $dt1->modify('+'.$number.' days'); + $part[$attribute . '>'] = $dt1->format('Y-m-d'); + break; case 'currentMonth': $dt = new \DateTime(); $part['AND'] = array( diff --git a/application/Espo/Resources/i18n/en_US/Global.json b/application/Espo/Resources/i18n/en_US/Global.json index 20a3bab1bd..cc6e476506 100644 --- a/application/Espo/Resources/i18n/en_US/Global.json +++ b/application/Espo/Resources/i18n/en_US/Global.json @@ -498,7 +498,8 @@ "nextXDays": "Next X Days", "ever": "Ever", "isEmpty": "Is Empty", - "olderThanXDays": "Older Than X Days" + "olderThanXDays": "Older Than X Days", + "afterXDays": "After X Days" }, "searchRanges": { "is": "Is", diff --git a/client/src/views/fields/date.js b/client/src/views/fields/date.js index dbce0c38af..77f54dc858 100644 --- a/client/src/views/fields/date.js +++ b/client/src/views/fields/date.js @@ -42,7 +42,7 @@ Espo.define('views/fields/date', 'views/fields/base', function (Dep) { validations: ['required', 'date', 'after', 'before'], - searchTypeList: ['lastSevenDays', 'ever', 'isEmpty', 'currentMonth', 'lastMonth', 'currentQuarter', 'lastQuarter', 'currentYear', 'lastYear', 'today', 'past', 'future', 'lastXDays', 'nextXDays', 'olderThanXDays', 'on', 'after', 'before', 'between'], + searchTypeList: ['lastSevenDays', 'ever', 'isEmpty', 'currentMonth', 'lastMonth', 'currentQuarter', 'lastQuarter', 'currentYear', 'lastYear', 'today', 'past', 'future', 'lastXDays', 'nextXDays', 'olderThanXDays', 'afterXDays', 'on', 'after', 'before', 'between'], setup: function () { Dep.prototype.setup.call(this); @@ -187,7 +187,7 @@ Espo.define('views/fields/date', 'views/fields/base', function (Dep) { if (~['on', 'notOn', 'after', 'before'].indexOf(type)) { this.$el.find('div.primary').removeClass('hidden'); - } else if (~['lastXDays', 'nextXDays', 'olderThanXDays'].indexOf(type)) { + } else if (~['lastXDays', 'nextXDays', 'olderThanXDays', 'afterXDays'].indexOf(type)) { this.$el.find('div.additional-number').removeClass('hidden'); } else if (type == 'between') { this.$el.find('div.primary').removeClass('hidden'); @@ -229,7 +229,7 @@ Espo.define('views/fields/date', 'views/fields/base', function (Dep) { dateValue: value, dateValueTo: valueTo }; - } else if (~['lastXDays', 'nextXDays', 'olderThanXDays'].indexOf(type)) { + } else if (~['lastXDays', 'nextXDays', 'olderThanXDays', 'afterXDays'].indexOf(type)) { var number = this.$el.find('[name="' + this.name + '-number"]').val(); data = { type: type, diff --git a/client/src/views/fields/datetime.js b/client/src/views/fields/datetime.js index c246a68dd7..af0ffb2aa5 100644 --- a/client/src/views/fields/datetime.js +++ b/client/src/views/fields/datetime.js @@ -36,7 +36,7 @@ Espo.define('views/fields/datetime', 'views/fields/date', function (Dep) { validations: ['required', 'datetime', 'after', 'before'], - searchTypeList: ['lastSevenDays', 'ever', 'isEmpty', 'currentMonth', 'lastMonth', 'currentQuarter', 'lastQuarter', 'currentYear', 'lastYear', 'today', 'past', 'future', 'lastXDays', 'nextXDays', 'olderThanXDays', 'on', 'after', 'before', 'between'], + searchTypeList: ['lastSevenDays', 'ever', 'isEmpty', 'currentMonth', 'lastMonth', 'currentQuarter', 'lastQuarter', 'currentYear', 'lastYear', 'today', 'past', 'future', 'lastXDays', 'nextXDays', 'olderThanXDays', 'afterXDays', 'on', 'after', 'before', 'between'], timeFormatMap: { 'HH:mm': 'H:i',