Skip to content

Commit

Permalink
Fix date TV parsing bug when time is hidden (#16398)
Browse files Browse the repository at this point in the history
* Update datetime.js

Fixes date parsing issue when time is hidden

Update resource create and update processors

Ensure date TV value is saved with a zero default time when TV's hideTime enabled

* grunt build

---------

Co-authored-by: Jason Coward <[email protected]>
  • Loading branch information
Jim Graham and opengeek authored May 11, 2023
1 parent e057149 commit b16a856
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 47 deletions.
9 changes: 8 additions & 1 deletion core/src/Revolution/Processors/Resource/Create.php
Original file line number Diff line number Diff line change
Expand Up @@ -507,7 +507,14 @@ public function addTemplateVariables()
$value = implode(',', $newTags);
break;
case 'date':
$value = empty($value) ? '' : date('Y-m-d H:i:s', strtotime($value));
$tvProperties = $tv->get('input_properties');
if (!empty($value)) {
$dateTime = new \DateTime($value);
if (array_key_exists('hideTime', $tvProperties) && (bool)$tvProperties['hideTime']) {
$dateTime->setTime(0, 0, 0, 0);
}
$value = $dateTime->format('Y-m-d H:i:s');
}
break;
case 'url':
if ($this->getProperty($tvKey . '_prefix', '--') != '--') {
Expand Down
9 changes: 8 additions & 1 deletion core/src/Revolution/Processors/Resource/Update.php
Original file line number Diff line number Diff line change
Expand Up @@ -745,7 +745,14 @@ public function saveTemplateVariables()
}
break;
case 'date':
$value = empty($value) ? '' : date('Y-m-d H:i:s', strtotime($value));
$tvProperties = $tv->get('input_properties');
if (!empty($value)) {
$dateTime = new \DateTime($value);
if (array_key_exists('hideTime', $tvProperties) && (bool)$tvProperties['hideTime']) {
$dateTime->setTime(0, 0, 0, 0);
}
$value = $dateTime->format('Y-m-d H:i:s');
}
break;
/* ensure tag types trim whitespace from tags */
case 'tag':
Expand Down
2 changes: 1 addition & 1 deletion manager/assets/modext/modx.jsgrps-min.js

Large diffs are not rendered by default.

78 changes: 34 additions & 44 deletions manager/assets/modext/util/datetime.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {
* @cfg {Function} dateValidator A custom validation function to be called during date field
* validation (defaults to null)
*/
dateValidator:null
dateValidator:null
/**
* @cfg {String/Object} defaultAutoCreate DomHelper element spec
* Let superclass to create hidden field instead of textbox. Hidden will be submittend to server
Expand All @@ -30,11 +30,6 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {
* and submitted to server (defaults to 'Y-m-d H:i:s' that is mysql format)
*/
,hiddenFormat:'Y-m-d H:i:s'
/**
* @cfg {String} hiddenFormatForTimeHidden Format of datetime used to store value in hidden field
* and submitted to server when `hideTime` is set to `true` (defaults to 'Y-m-d 00:00:00' that is mysql format)
*/
,hiddenFormatForTimeHidden:'Y-m-d 00:00:00'
/**
* @cfg {Boolean} otherToNow Set other field to now() if not explicly filled in (defaults to true)
*/
Expand Down Expand Up @@ -93,13 +88,9 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {
this.offset_time = 0;
}

if (this.hideTime) {
this.hiddenFormat = this.hiddenFormatForTimeHidden;
}

// create DateField
var dateConfig = Ext.apply({}, {
id:this.id + '-date'
id:this.id + '-date'
,format:this.dateFormat || Ext.form.DateField.prototype.format
,width:this.timeWidth
,selectOnFocus:this.selectOnFocus
Expand All @@ -113,8 +104,8 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {
,allowBlank: this.allowBlank
,msgTarget: this.msgTarget
,listeners:{
blur:{scope:this, fn:this.onBlur}
,focus:{scope:this, fn:this.onFocus}
blur:{scope:this, fn:this.onBlur}
,focus:{scope:this, fn:this.onFocus}
}
}, this.dateConfig);
this.df = new Ext.form.DateField(dateConfig);
Expand All @@ -128,7 +119,7 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {

// create TimeField
var timeConfig = Ext.apply({}, {
id:this.id + '-time'
id:this.id + '-time'
,format:this.timeFormat || Ext.form.TimeField.prototype.format
,width:this.timeWidth
,selectOnFocus:this.selectOnFocus
Expand All @@ -140,8 +131,8 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {
,allowBlank: this.allowBlank
,msgTarget: this.msgTarget
,listeners:{
blur:{scope:this, fn:this.onBlur}
,focus:{scope:this, fn:this.onFocus}
blur:{scope:this, fn:this.onBlur}
,focus:{scope:this, fn:this.onFocus}
}
}, this.timeConfig);
this.tf = new Ext.form.TimeField(timeConfig);
Expand Down Expand Up @@ -176,7 +167,7 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {
var t;
if('below' === this.timePosition || 'bellow' === this.timePosition) {
t = Ext.DomHelper.append(ct, {tag:'table',style:'border-collapse:collapse',children:[
{tag:'tr',children:[{tag:'td', style:'padding-bottom:1px', cls:'ux-datetime-date'}]}
{tag:'tr',children:[{tag:'td', style:'padding-bottom:1px', cls:'ux-datetime-date'}]}
,{tag:'tr',children:[{tag:'td', cls:'ux-datetime-time'}]}
]}, true);
}
Expand Down Expand Up @@ -223,28 +214,29 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {

// create custom message targets for date and time fields
case 'under':
const dateMsgElId = `ux-datetime-date-msg-${this.itemId}`,
dateMsgWidth = Math.ceil(this.dateWidth - 30),
dateMsgEl = Ext.DomHelper.append(this.df.container, {
tag: 'div',
cls: 'x-form-invalid-msg',
style: `display: none; width: ${dateMsgWidth}px;`,
id: dateMsgElId
}),
timeMsgElId = `ux-datetime-time-msg-${this.itemId}`,
timeMsgWidth = Math.ceil(this.timeWidth - 30),
timeMsgEl = Ext.DomHelper.append(this.tf.container, {
tag: 'div',
cls: 'x-form-invalid-msg',
style: `display: none; width: ${timeMsgWidth}px;`,
id: timeMsgElId
})
const dateMsgElId = `ux-datetime-date-msg-${this.itemId}`,
dateMsgWidth = Math.ceil(this.dateWidth - 30),
dateMsgEl = Ext.DomHelper.append(this.df.container, {
tag: 'div',
cls: 'x-form-invalid-msg',
style: `display: none; width: ${dateMsgWidth}px;`,
id: dateMsgElId
}),
timeMsgElId = `ux-datetime-time-msg-${this.itemId}`,
timeMsgWidth = Math.ceil(this.timeWidth - 30),
timeMsgEl = Ext.DomHelper.append(this.tf.container, {
tag: 'div',
cls: 'x-form-invalid-msg',
style: `display: none; width: ${timeMsgWidth}px;`,
id: timeMsgElId
})
;
this.df.container.appendChild(dateMsgEl);
this.tf.container.appendChild(timeMsgEl);
this.df.msgTarget = dateMsgElId;
this.tf.msgTarget = timeMsgElId;
break;
// no default
}

// setup name for submit
Expand Down Expand Up @@ -523,7 +515,7 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {
return;
}
if ('number' === typeof val) {
val = new Date(val);
val = new Date(val);
}
else if('string' === typeof val && this.hiddenFormat) {
val = Date.parseDate(val, this.hiddenFormat);
Expand All @@ -534,8 +526,7 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {
this.setDate(val);
this.setTime(val);
this.dateValue = new Date(Ext.isIE ? val.getTime() : val);
}
else {
} else {
da = val.split(this.dtSeparator);
this.setDate(da[0]);
if(da[1]) {
Expand Down Expand Up @@ -594,22 +585,21 @@ Ext.ux.form.DateTime = Ext.extend(Ext.form.Field, {
* @private
* Updates the time part
*/
,updateTime:function() {
var t = this.tf.getValue();
if(t && !(t instanceof Date)) {
,updateTime: function() {
let t = this.tf.getValue();
if (t && !(t instanceof Date)) {
t = Date.parseDate(t, this.tf.format);
}
if(t && !this.df.getValue()) {
if (t && !this.df.getValue()) {
this.initDateValue();
this.setDate(this.dateValue);
}
if(this.dateValue instanceof Date) {
if(t) {
if (this.dateValue instanceof Date) {
if (t && !this.hideTime) {
this.dateValue.setHours(t.getHours());
this.dateValue.setMinutes(t.getMinutes());
this.dateValue.setSeconds(t.getSeconds());
}
else {
} else {
this.dateValue.setHours(0);
this.dateValue.setMinutes(0);
this.dateValue.setSeconds(0);
Expand Down

0 comments on commit b16a856

Please sign in to comment.