Skip to content

Commit

Permalink
Fix salesagility#10364 - Adding now option in Datetime fields
Browse files Browse the repository at this point in the history
  • Loading branch information
SinergiaCRM committed Feb 23, 2024
1 parent b39d961 commit 88f617d
Show file tree
Hide file tree
Showing 7 changed files with 233 additions and 29 deletions.
6 changes: 3 additions & 3 deletions include/MassUpdate.php
Original file line number Diff line number Diff line change
Expand Up @@ -601,7 +601,7 @@ public function getMassUpdateForm(
break;
case "datetimecombo":
$even = !$even;
$newhtml .= $this->addDatetime($displayname, $field["name"]);
$newhtml .= $this->addDatetime($displayname, $field["name"],$field["display_default"]);
break;
case "datetime":
case "date":
Expand Down Expand Up @@ -1296,7 +1296,7 @@ public function addRadioenum($displayname, $varname, $options)
* @param displayname Name to display in the popup window
* @param varname name of the variable
*/
public function addDatetime($displayname, $varname)
public function addDatetime($displayname, $varname, $fieldtimeformat)
{
global $timedate, $app_strings, $app_list_strings, $theme, $current_user;
$userformat = $timedate->get_user_time_format();
Expand All @@ -1318,7 +1318,7 @@ public function addDatetime($displayname, $varname)
<input type="hidden" id="{$varname}" name="{$varname}">
$dtscript
<script type="text/javascript">
var combo_{$varname} = new Datetimecombo(" ", "$varname", "$userformat", '','','',1);
var combo_{$varname} = new Datetimecombo(" ", "$varname", "$userformat", '','','',1,"$fieldtimeformat");
//Render the remaining widget fields
text = combo_{$varname}.html('');
document.getElementById('{$varname}_time_section').innerHTML = text;
Expand Down
215 changes: 195 additions & 20 deletions include/SugarFields/Fields/Datetimecombo/Datetimecombo.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,23 +35,198 @@
* SugarCRM" logo and "Supercharged by SuiteCRM" logo. If the display of the logos is not
* reasonably feasible for technical reasons, the Appropriate Legal Notices must
* display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM".
*/function Datetimecombo(datetime,field,timeformat,tabindex,showCheckbox,checked,allowEmptyHM){this.datetime=datetime;this.allowEmptyHM=allowEmptyHM;if(typeof this.datetime=="undefined"||datetime==''||trim(datetime).length<10){this.datetime='';var d=new Date();var month=d.getMonth();var date=d.getDate();var year=d.getYear();var hours=d.getHours();var minutes=d.getMinutes();}
this.fieldname=field;if(datetime!=''){parts=datetime.split(' ');this.hrs=parseInt(parts[1].substring(0,2),10);this.mins=parseInt(parts[1].substring(3,5),10);}
this.timeformat=timeformat;this.tabindex=tabindex==null||isNaN(tabindex)?1:tabindex;this.timeseparator=this.timeformat.substring(2,3);this.has12Hours=/^11/.test(this.timeformat);this.hasMeridiem=/am|pm/i.test(this.timeformat);if(this.hasMeridiem){this.pm=/pm/.test(this.timeformat);}
this.meridiem=this.hasMeridiem?trim(this.datetime.substring(16)):'';this.datetime=this.datetime.substr(0,10);this.showCheckbox=showCheckbox;this.checked=parseInt(checked);YAHOO.util.Selector.query('input#'+this.fieldname+'_date')[0].value=this.datetime;if(this.mins>0&&this.mins<15){this.mins=15;}else if(this.mins>15&&this.mins<30){this.mins=30;}else if(this.mins>30&&this.mins<45){this.mins=45;}else if(this.mins>45){this.hrs+=1;this.mins=0;if(this.hasMeridiem&&this.hrs==12){if(this.meridiem=="pm"||this.meridiem=="am"){if(this.meridiem=="pm"){this.meridiem="am";}else{this.meridiem="pm";}}else{if(this.meridiem=="PM"){this.meridiem="AM";}else{this.meridiem="PM";}}}
if(this.hasMeridiem&&this.hrs>12){this.hrs=this.hrs-12;}}}
Datetimecombo.prototype.jsscript=function(callback){text='\nfunction update_'+this.fieldname+'(calendar) {';text+='\nd = YAHOO.util.Selector.query("input#'+this.fieldname+'_date")[0].value;';text+='\nh = YAHOO.util.Selector.query("select#'+this.fieldname+'_hours")[0].value;';text+='\nm = YAHOO.util.Selector.query("select#'+this.fieldname+'_minutes")[0].value;';text+='\nnewdate = d + " " + h + "'+this.timeseparator+'" + m;';if(this.hasMeridiem){text+='\nif(typeof YAHOO.util.Selector.query("select#'+this.fieldname+'_meridiem")[0] != "undefined") {';text+='\n newdate += YAHOO.util.Selector.query("select#'+this.fieldname+'_meridiem")[0].value;';text+='\n}';}
text+='\nif(trim(newdate) =="'+this.timeseparator+'") newdate="";';text+='\nYAHOO.util.Selector.query("select#'+this.fieldname+'")[0].value = newdate;';text+='\n'+callback;text+='\n}';return text;}
Datetimecombo.prototype.html=function(callback){var text='<span><select class="datetimecombo_time" size="1" id="'+this.fieldname+'_hours" tabindex="'+this.tabindex+'" onchange="combo_'+this.fieldname+'.update(); '+callback+'">';var h1=this.has12Hours?1:0;var h2=this.has12Hours?12:23;if(this.allowEmptyHM){text+='<option></option>';}
for(i=h1;i<=h2;i++){val=i<10?"0"+i:i;text+='<option value="'+val+'" '+(i==this.hrs?"SELECTED":"")+'>'+val+'</option>';}
text+='\n</select>&nbsp;';text+=this.timeseparator;text+='\n&nbsp;<select class="datetimecombo_time" size="1" id="'+this.fieldname+'_minutes" tabindex="'+this.tabindex+'" onchange="combo_'+this.fieldname+'.update(); '+callback+'">';if(this.allowEmptyHM){text+='\n<option></option>';}
text+='\n<option value="00" '+(this.mins==0?"SELECTED":"")+'>00</option>';text+='\n<option value="15" '+(this.mins==15?"SELECTED":"")+'>15</option>';text+='\n<option value="30" '+(this.mins==30?"SELECTED":"")+'>30</option>';text+='\n<option value="45" '+(this.mins==45?"SELECTED":"")+'>45</option>';text+='\n</select>';if(this.hasMeridiem){text+='\n&nbsp;';text+='\n<select class="datetimecombo_time" size="1" id="'+this.fieldname+'_meridiem" tabindex="'+this.tabindex+'" onchange="combo_'+this.fieldname+'.update(); '+callback+'">';if(this.allowEmptyHM){text+='\n<option></option>';}
text+='\n<option value="'+(this.pm?"am":"AM")+'" '+(/am/i.test(this.meridiem)?"SELECTED":"")+'>'+(this.pm?"am":"AM")+'</option>';text+='\n<option value="'+(this.pm?"pm":"PM")+'" '+(/pm/i.test(this.meridiem)?"SELECTED":"")+'>'+(this.pm?"pm":"PM")+'</option>';text+='\n</select>';}
if(this.showCheckbox){text+='\n<input style="visibility:hidden;" type="checkbox" name="'+this.fieldname+'_flag" id="'+this.fieldname+'_flag" tabindex="'+this.tabindex+'" onchange="combo_'+this.fieldname+'.update(); '+callback+'" '+(this.checked?'CHECKED':'')+'>';}
text+='</span>';return text;};Datetimecombo.prototype.update=function(updateListeners){if(typeof(updateListeners)=="undefined")
updateListeners=true;var d=YAHOO.util.Selector.query('input#'+this.fieldname+'_date')[0];var h=YAHOO.util.Selector.query('select#'+this.fieldname+'_hours')[0];var m=YAHOO.util.Selector.query('select#'+this.fieldname+'_minutes')[0];var mer=YAHOO.util.Selector.query('select#'+this.fieldname+"_meridiem")[0];if(d.value==""){h.selectedIndex=0;m.selectedIndex=0;if(mer)mer.selectedIndex=0;}else{if(this.allowEmptyHM){if(h.selectedIndex==0)h.selectedIndex=12;if(m.selectedIndex==0)m.selectedIndex=1;if(mer&&(mer.selectedIndex==0))mer.selectedIndex=1;}}
var newdate=d.value+' '+h.value+this.timeseparator+m.value;if(this.hasMeridiem){ampm=YAHOO.util.Selector.query('select#'+this.fieldname+"_meridiem")[0].value;newdate+=ampm;}
if(trim(newdate)==""+this.timeseparator+""){newdate='';}
YAHOO.util.Selector.query('input#'+this.fieldname)[0].value=newdate;if(updateListeners)
SUGAR.util.callOnChangeListers(this.fieldname);if(this.showCheckbox){flag=this.fieldname+'_flag';date=this.fieldname+'_date';hours=this.fieldname+'_hours';mins=this.fieldname+'_minutes';if(YAHOO.util.Selector.query('input#'+flag)[0].checked){YAHOO.util.Selector.query('input#'+flag)[0].value=1;YAHOO.util.Selector.query('input#'+this.fieldname)[0].value='';YAHOO.util.Selector.query('input#'+date)[0].disabled=true;YAHOO.util.Selector.query('select#'+hours)[0].disabled=true;YAHOO.util.Selector.query('select#'+mins)[0].disabled=true;}
else{YAHOO.util.Selector.query('input#'+flag)[0].value=0;YAHOO.util.Selector.query('input#'+date)[0].disabled=false;YAHOO.util.Selector.query('select#'+hours)[0].disabled=false;YAHOO.util.Selector.query('select#'+mins)[0].disabled=false;}}};
*/

function Datetimecombo(datetime, field, timeformat, tabindex, showCheckbox, checked, allowEmptyHM,defaultValue = "") {
this.defaultValue = defaultValue;
this.datetime = datetime;
this.allowEmptyHM = allowEmptyHM;
if (typeof this.datetime == "undefined" || datetime == "" || trim(datetime).length < 10) {
this.datetime = "";
var d = new Date();
var month = d.getMonth();
var date = d.getDate();
var year = d.getYear();
var hours = d.getHours();
var minutes = d.getMinutes();
}

this.fieldname = field;

if (datetime != "") {
parts = datetime.split(" ");
this.hrs = parseInt(parts[1].substring(0, 2), 10);
this.mins = parseInt(parts[1].substring(3, 5), 10);
}

this.timeformat = timeformat;
this.tabindex = tabindex == null || isNaN(tabindex) ? 1 : tabindex;
this.timeseparator = this.timeformat.substring(2, 3);
this.has12Hours = /^11/.test(this.timeformat);
this.hasMeridiem = /am|pm/i.test(this.timeformat);

if (this.hasMeridiem) {
this.pm = /pm/.test(this.timeformat);
}

this.meridiem = this.hasMeridiem ? trim(this.datetime.substring(16)) : "";
this.datetime = this.datetime.substr(0, 10);
this.showCheckbox = showCheckbox;
this.checked = parseInt(checked);
YAHOO.util.Selector.query("input#" + this.fieldname + "_date")[0].value = this.datetime;
}
Datetimecombo.prototype.jsscript = function (callback) {
text = "\nfunction update_" + this.fieldname + "(calendar) {";
text +=
'\nd = YAHOO.util.Selector.query("input#' + this.fieldname + '_date")[0].value;';
text +=
'\nh = YAHOO.util.Selector.query("select#' + this.fieldname + '_hours")[0].value;';
text +=
'\nm = YAHOO.util.Selector.query("select#' + this.fieldname + '_minutes")[0].value;';
text += '\nnewdate = d + " " + h + "' + this.timeseparator + '" + m;';
if (this.hasMeridiem) {
text +=
'\nif(typeof YAHOO.util.Selector.query("select#' + this.fieldname + '_meridiem")[0] != "undefined") {';
text +=
'\n newdate += YAHOO.util.Selector.query("select#' + this.fieldname + '_meridiem")[0].value;';
text += "\n}";
}
text += '\nif(trim(newdate) =="' + this.timeseparator + '") newdate="";';
text +=
'\nYAHOO.util.Selector.query("select#' +
this.fieldname +
'")[0].value = newdate;';
text += "\n" + callback;
text += "\n}";
return text;
};
Datetimecombo.prototype.html = function (callback) {
var text =
'<span><select class="datetimecombo_time" size="1" id="' +
this.fieldname +
'_hours" tabindex="' +
this.tabindex +
'" onchange="combo_' +
this.fieldname +
".update(); " +
callback +
'">';
var h1 = this.has12Hours ? 1 : 0;
var h2 = this.has12Hours ? 12 : 23;
if (this.allowEmptyHM) {
text += "<option></option>";
}
for (i = h1; i <= h2; i++) {
val = i < 10 ? "0" + i : i;
text +=
'<option value="' + val + '" ' + (i == this.hrs ? "SELECTED" : "") + ">" + val +"</option>";
}
text += "\n</select>&nbsp;";
text += this.timeseparator;
text += '\n&nbsp;<select class="datetimecombo_time" size="1" id="' +
this.fieldname + '_minutes" tabindex="' +
this.tabindex + '" onchange="combo_' +
this.fieldname + ".update(); " +
callback + '">';

if (this.allowEmptyHM) {
text += "\n<option></option>";
}
//cuustom 708
// text += '\n<option value="00" ' + (this.mins == 0 ? "SELECTED" : "") + ">00</option>";
// text += '\n<option value="15" ' + (this.mins == 15 ? "SELECTED" : "") + ">15</option>";
// text += '\n<option value="30" ' + (this.mins == 30 ? "SELECTED" : "") + ">30</option>";
// text += '\n<option value="45" ' + (this.mins == 45 ? "SELECTED" : "") + ">45</option>";
var minuteSteps = parseInt(SUGAR.config.datetime_combo_minute_interval);
if (this.defaultValue.includes('now')) {
minuteSteps = 1;
}
for (i = 0; i < 60; i += minuteSteps) {
text += '\n<option value="' + (i < 10 ? '0' : '') + i + '" ' + (this.mins == i ? "SELECTED" : "") + '>' + (i < 10 ? '0' : '') + i + '</option>';
}

text += "\n</select>";
if (this.hasMeridiem) {
text += "\n&nbsp;";
text += '\n<select class="datetimecombo_time" size="1" id="' + this.fieldname + '_meridiem" tabindex="' + this.tabindex +
'" onchange="combo_' + this.fieldname + ".update(); " + callback + '">';

if (this.allowEmptyHM) {
text += "\n<option></option>";
}

text += '\n<option value="' + (this.pm ? "am" : "AM") + '" ' + (/am/i.test(this.meridiem) ? "SELECTED" : "") +
">" + (this.pm ? "am" : "AM") + "</option>";
text += '\n<option value="' + (this.pm ? "pm" : "PM") + '" ' + (/pm/i.test(this.meridiem) ? "SELECTED" : "") +
">" + (this.pm ? "pm" : "PM") + "</option>";
text += "\n</select>";
}

if (this.showCheckbox) {
text +=
'\n<input style="visibility:hidden;" type="checkbox" name="' +
this.fieldname +
'_flag" id="' +
this.fieldname +
'_flag" tabindex="' +
this.tabindex +
'" onchange="combo_' +
this.fieldname +
".update(); " +
callback +
'" ' +
(this.checked ? "CHECKED" : "") +
">";
}
text += "</span>";
return text;
};
Datetimecombo.prototype.update = function (updateListeners) {
if (typeof updateListeners == "undefined") updateListeners = true;
var d = YAHOO.util.Selector.query("input#" + this.fieldname + "_date")[0];
var h = YAHOO.util.Selector.query("select#" + this.fieldname + "_hours")[0];
var m = YAHOO.util.Selector.query("select#" + this.fieldname + "_minutes")[0];
var mer = YAHOO.util.Selector.query("select#" + this.fieldname + "_meridiem")[0];

if (d.value == "") {
h.selectedIndex = 0;
m.selectedIndex = 0;
if (mer) mer.selectedIndex = 0;
} else {
if (this.allowEmptyHM) {
if (h.selectedIndex == 0) h.selectedIndex = 12;
if (m.selectedIndex == 0) m.selectedIndex = 1;
if (mer && mer.selectedIndex == 0) mer.selectedIndex = 1;
}
}
var newdate = d.value + " " + h.value + this.timeseparator + m.value;
if (this.hasMeridiem) {
ampm = YAHOO.util.Selector.query(
"select#" + this.fieldname + "_meridiem"
)[0].value;
newdate += ampm;
}
if (trim(newdate) == "" + this.timeseparator + "") {
newdate = "";
}
YAHOO.util.Selector.query("input#" + this.fieldname)[0].value = newdate;
if (updateListeners) SUGAR.util.callOnChangeListers(this.fieldname);
if (this.showCheckbox) {
flag = this.fieldname + "_flag";
date = this.fieldname + "_date";
hours = this.fieldname + "_hours";
mins = this.fieldname + "_minutes";
if (YAHOO.util.Selector.query("input#" + flag)[0].checked) {
YAHOO.util.Selector.query("input#" + flag)[0].value = 1;
YAHOO.util.Selector.query("input#" + this.fieldname)[0].value = "";
YAHOO.util.Selector.query("input#" + date)[0].disabled = true;
YAHOO.util.Selector.query("select#" + hours)[0].disabled = true;
YAHOO.util.Selector.query("select#" + mins)[0].disabled = true;
} else {
YAHOO.util.Selector.query("input#" + flag)[0].value = 0;
YAHOO.util.Selector.query("input#" + date)[0].disabled = false;
YAHOO.util.Selector.query("select#" + hours)[0].disabled = false;
YAHOO.util.Selector.query("select#" + mins)[0].disabled = false;
}
}
};
2 changes: 1 addition & 1 deletion include/SugarFields/Fields/Datetimecombo/EditView.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ function set_{{$idname}}_values(form) {ldelim}
{{/if}}
<script type="text/javascript" src="{sugar_getjspath file="include/SugarFields/Fields/Datetimecombo/Datetimecombo.js"}"></script>
<script type="text/javascript">
var combo_{{$idname}} = new Datetimecombo("{$fields[{{sugarvar key='name' stringFormat=true}}].value}", "{{$idname}}", "{$TIME_FORMAT}", "{{$tabindex}}", '{{$displayParams.showNoneCheckbox}}', false, true);
var combo_{{$idname}} = new Datetimecombo("{$fields[{{sugarvar key='name' stringFormat=true}}].value}", "{{$idname}}", "{$TIME_FORMAT}", "{{$tabindex}}", '{{$displayParams.showNoneCheckbox}}', false, true,"{$fields[{{sugarvar key='name' stringFormat=true}}].display_default}");
//Render the remaining widget fields
text = combo_{{$idname}}.html('{{$displayParams.updateCallback}}');
document.getElementById('{{$idname}}_time_section').innerHTML = text;
Expand Down
7 changes: 6 additions & 1 deletion include/utils.php
Original file line number Diff line number Diff line change
Expand Up @@ -575,7 +575,12 @@ function get_sugar_config_defaults(): array
'legacy_email_behaviour' => false,
'valid_imap_ports' => [
'110', '143', '993', '995'
]
],
'datetime_combo_minute_interval' => 15,
'js_available' => array(
0 => 'datetime_combo_minute_interval',
),

];

if (!is_object($locale)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ function get_body(&$ss, $vardef)
}
}
$ss->assign('default_date', $date);
} elseif($vardef['display_default'] == 'now') {
$ss->assign('default_date', $vardef['display_default']);
}
$ss->assign('default_hours', $hours);
$ss->assign('default_minutes', $minitues);
Expand Down
25 changes: 22 additions & 3 deletions modules/DynamicFields/templates/Fields/Forms/datetimecombo.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,27 @@
</tr>
{/if}
<script>
addToValidateBinaryDependency('popup_form',"defaultDate_date", 'alpha', false, "{$APP.ERR_MISSING_REQUIRED_FIELDS} {$APP.LBL_DATE} {$APP.LBL_OR} {$APP.LBL_HOURS}" ,"defaultTime_hours");
addToValidateBinaryDependency('popup_form',"defaultTime_hours", 'alpha', false, "{$APP.ERR_MISSING_REQUIRED_FIELDS} {$APP.LBL_HOURS} {$APP.LBL_OR} {$APP.LBL_MINUTES}" ,"defaultTime_minutes");
addToValidateBinaryDependency('popup_form', "defaultTime_minutes", 'alpha', false, "{$APP.ERR_MISSING_REQUIRED_FIELDS} {$APP.LBL_MINUTES} {$APP.LBL_OR} {$APP.LBL_MERIDIEM}","defaultTime_meridiem");
{literal}
toggleDateValidation();
$('#defaultDate_date', 'form').on("change", function() {
toggleDateValidation();
});
function toggleDateValidation() {
if ($('#defaultDate_date', 'form').val() == 'now' || $('#defaultDate_date', 'form').val() == '') {
removeFromValidate('popup_form', "defaultDate_date");
$('#defaultTime_hours').parent().closest('tr').hide();
$('#defaultTime_hours').val('');
$('#defaultTime_minutes').val('');
$('#defaultTime').val('');
} else {
$('#defaultTime_hours').parent().closest('tr').show();
{/literal}
addToValidateBinaryDependency('popup_form',"defaultDate_date", 'alpha', false, "{$APP.ERR_MISSING_REQUIRED_FIELDS} {$APP.LBL_DATE} {$APP.LBL_OR} {$APP.LBL_HOURS}" ,"defaultTime_hours");
addToValidateBinaryDependency('popup_form',"defaultTime_hours", 'alpha', false, "{$APP.ERR_MISSING_REQUIRED_FIELDS} {$APP.LBL_HOURS} {$APP.LBL_OR} {$APP.LBL_MINUTES}" ,"defaultTime_minutes");
addToValidateBinaryDependency('popup_form', "defaultTime_minutes", 'alpha', false, "{$APP.ERR_MISSING_REQUIRED_FIELDS} {$APP.LBL_MINUTES} {$APP.LBL_OR} {$APP.LBL_MERIDIEM}","defaultTime_meridiem");
{literal}
}
}
{/literal}
</script>
{include file="modules/DynamicFields/templates/Fields/Forms/coreBottom.tpl"}
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ class TemplateDatetimecombo extends TemplateRange
public $len = '';
public $dateStrings = array(
'-none-' => '',
'today'=>'now',
'now' => 'now',
'today'=> 'today',
'yesterday'=> '-1 day',
'tomorrow'=>'+1 day',
'next week'=> '+1 week',
Expand Down Expand Up @@ -167,6 +168,8 @@ public function populateFromPost()
//lets format the string to make sure the leading 0's are added back in for hours and minutes
$_REQUEST['default'] = $_REQUEST['defaultDate'] . '&' . sprintf('%02d:%02d%s', $hours, $minutes, $meridiem);
}
} elseif ($_REQUEST['defaultDate'] == 'now') {
$_REQUEST['default'] = 'now';
} else {
$_REQUEST['default'] = '';
}
Expand Down

0 comments on commit 88f617d

Please sign in to comment.