mirror of
https://github.com/SuiteCRM/SuiteCRM-Core.git
synced 2025-09-02 08:09:19 +08:00
Merge next into suite 8
This commit is contained in:
commit
f808beab75
56 changed files with 3168 additions and 2213 deletions
|
@ -2,7 +2,7 @@
|
|||
<img width="180px" height="41px" src="https://suitecrm.com/wp-content/uploads/2017/12/logo.png" align="right" />
|
||||
</a>
|
||||
|
||||
# SuiteCRM 7.14.0
|
||||
# SuiteCRM 7.14.1
|
||||
|
||||
[](https://travis-ci.org/salesagility/SuiteCRM)
|
||||
[](https://codecov.io/gh/salesagility/SuiteCRM/branch/hotfix)
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -53,18 +53,12 @@ onchange='document.{$form_name}.{{sugarvar key='name'}}.value="";document.{$form
|
|||
{assign var="keepParent" value = 1}
|
||||
{/if}
|
||||
<input type="text" name="{{sugarvar key='name'}}" id="{{sugarvar key='name'}}" class="sqsEnabled" tabindex="{{$tabindex}}"
|
||||
size="{{$displayParams.size}}" {if $keepParent}value="{{sugarvar key='value'}}"{/if} autocomplete="off"><input type="hidden" name="{{sugarvar memberName='vardef.id_name' key='name'}}" id="{{sugarvar memberName='vardef.id_name' key='name'}}"
|
||||
size="{{$displayParams.size}}" {if $keepParent}value="{{sugarvar key='value'}}"{/if} autocomplete="off"><input type="hidden" name="{{sugarvar memberName='vardef.id_name' key='name'}}" id="{{sugarvar memberName='vardef.id_name' key='name'}}"
|
||||
{if $keepParent}value="{{sugarvar memberName='vardef.id_name' key='value'}}"{/if}>
|
||||
<span class="id-ff multiple selectcrossbtn">
|
||||
<button type="button" name="btn_{{sugarvar key='name'}}" id="btn_{{sugarvar key='name'}}" tabindex="{{$tabindex}}"
|
||||
title="{sugar_translate label="{{$displayParams.accessKeySelectTitle}}"}" class="firstChild" value="{sugar_translate label="{{$displayParams.accessKeySelectLabel}}"}"
|
||||
onclick='open_popup(document.{$form_name}.parent_type.value, 600, 400, "", true, false, {{$displayParams.popupData}}, "single", true);' {{if isset($displayParams.javascript.btn)}}{{$displayParams.javascript.btn}}{{/if}}>
|
||||
{sugar_getimage name="cursor" attr='border="0"'}
|
||||
</button>
|
||||
{{if empty($displayParams.selectOnly)}}
|
||||
<button type="button" name="btn_clr_{{sugarvar key='name'}}" id="btn_clr_{{sugarvar key='name'}}" tabindex="{{$tabindex}}" title="{sugar_translate label="{{$displayParams.accessKeyClearTitle}}"}" class="lastChild" onclick="this.form.{{sugarvar key='name'}}.value = ''; this.form.{{sugarvar memberName='vardef.id_name' key='name'}}.value = '';" value="{sugar_translate label="{{$displayParams.accessKeyClearLabel}}"}" {{if isset($displayParams.javascript.btn_clear)}}{{$displayParams.javascript.btn_clear}}{{/if}}>
|
||||
{sugar_getimage name="cross" attr='border="0"'}
|
||||
</button>
|
||||
<button type="button" name="btn_{{sugarvar key='name'}}" id="btn_{{sugarvar key='name'}}" tabindex="{{$tabindex}}"
|
||||
title="{sugar_translate label="{{$displayParams.accessKeySelectTitle}}"}" class="button firstChild" value="{sugar_translate label="{{$displayParams.accessKeySelectLabel}}"}"
|
||||
onclick='open_popup(document.{$form_name}.parent_type.value,600, 400, "{{$displayParams.initial_filter}}", true, false, {{$displayParams.popupData}}, "single", true);' {{if isset($displayParams.javascript.btn)}}{{$displayParams.javascript.btn}}{{/if}}><span class="suitepicon suitepicon-action-select"></span></button>{{if empty($displayParams.selectOnly)}}<button type="button" name="btn_clr_{{sugarvar key='name'}}" id="btn_clr_{{sugarvar key='name'}}" tabindex="{{$tabindex}}" title="{sugar_translate label="{{$displayParams.accessKeyClearTitle}}"}" class="button lastChild" onclick="this.form.{{sugarvar key='name'}}.value = ''; this.form.{{sugarvar memberName='vardef.id_name' key='name'}}.value = '';" value="{sugar_translate label="{{$displayParams.accessKeyClearLabel}}"}" {{if isset($displayParams.javascript.btn_clear)}}{{$displayParams.javascript.btn_clear}}{{/if}}><span class="suitepicon suitepicon-action-clear"></span></button>
|
||||
</span>
|
||||
{{/if}}
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ onchange='document.{{$form_name}}.{{sugarvar key='name'}}.value="";document.{{$f
|
|||
<span class="id-ff multiple">
|
||||
<button type="button" name="btn_{{sugarvar key='name'}}" {{if !empty($tabindex)}} tabindex="{{$tabindex}}" {{/if}} title="{$APP.LBL_SELECT_BUTTON_TITLE}"
|
||||
class="button{{if empty($displayParams.selectOnly)}} firstChild{{/if}}" value="{$APP.LBL_SELECT_BUTTON_LABEL}"
|
||||
onclick='if(document.{{$form_name}}.{{$vardef.type_name}}.value != "") open_popup(document.{{$form_name}}.{{$vardef.type_name}}.value, 600, 400, "", true, false, {{$displayParams.popupData}}, "single", true);'><span class="suitepicon suitepicon-action-select"></span></button>
|
||||
onclick='if(document.{{$form_name}}.{{$vardef.type_name}}.value != "") open_popup(document.{{$form_name}}.{{$vardef.type_name}}.value, 600, 400, "{{$displayParams.initial_filter}}", true, false, {{$displayParams.popupData}}, "single", true);'><span class="suitepicon suitepicon-action-select"></span></button>
|
||||
{{if empty($displayParams.selectOnly)}}
|
||||
<button type="button" name="btn_clr_{{sugarvar key='name'}}" {{if !empty($tabindex)}} tabindex="{{$tabindex}}" {{/if}} title="{$APP.LBL_CLEAR_BUTTON_TITLE}" class="button lastChild" onclick="this.form.{{sugarvar key='name'}}.value = ''; this.form.{{sugarvar key='id_name'}}.value = '';" value="{$APP.LBL_CLEAR_BUTTON_LABEL}">
|
||||
<span class="suitepicon suitepicon-action-clear"></span>
|
||||
|
@ -102,4 +102,4 @@ YAHOO.util.Event.onContentReady(
|
|||
});
|
||||
</script>
|
||||
{{$displayParams.disabled_parent_types}}
|
||||
{/literal}
|
||||
{/literal}
|
||||
|
|
|
@ -98,9 +98,9 @@ class SugarFieldText extends SugarFieldBase
|
|||
public function setup($parentFieldArray, $vardef, $displayParams, $tabindex, $twopass = true)
|
||||
{
|
||||
parent::setup($parentFieldArray, $vardef, $displayParams, $tabindex, $twopass);
|
||||
$editor = "";
|
||||
$initiate = "";
|
||||
|
||||
if (isset($vardef['editor']) && $vardef['editor'] == "html") {
|
||||
if (isset($vardef['editor']) && $vardef['editor'] === "html") {
|
||||
if (!isset($displayParams['htmlescape'])) {
|
||||
$displayParams['htmlescape'] = false;
|
||||
}
|
||||
|
@ -109,12 +109,30 @@ class SugarFieldText extends SugarFieldBase
|
|||
}
|
||||
|
||||
if ($_REQUEST['action'] === "EditView") {
|
||||
require_once(__DIR__ . "/../../../../include/SugarTinyMCE.php");
|
||||
$tiny = new SugarTinyMCE();
|
||||
$editor = $tiny->getInstance($vardef['name'], 'email_compose_light');
|
||||
$form_name = $displayParams['formName'] ?? '';
|
||||
|
||||
if (!empty($this->ss->_tpl_vars['displayParams']['formName'])) {
|
||||
$form_name = $this->ss->_tpl_vars['displayParams']['formName'];
|
||||
}
|
||||
|
||||
$config = [];
|
||||
$config['height'] = 250;
|
||||
$config['menubar'] = false;
|
||||
$config['plugins'] = 'code, table, link, image, wordcount';
|
||||
|
||||
if ($form_name !== '') {
|
||||
$config['selector'] = "#{$form_name} " . "#" . $vardef['name'];
|
||||
} else {
|
||||
$config['selector'] = "#" . $vardef['name'];
|
||||
}
|
||||
|
||||
$config['toolbar1'] = 'fontselect | fontsizeselect | bold italic underline | forecolor backcolor | styleselect | outdent indent | link image | code table';
|
||||
|
||||
$jsConfig = json_encode($config);
|
||||
$initiate = '<script type="text/javascript"> tinyMCE.init(' . $jsConfig . ')</script>';
|
||||
}
|
||||
}
|
||||
|
||||
$this->ss->assign("tinymce", $editor);
|
||||
$this->ss->assign("tinymce", $initiate);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ class SugarFieldWysiwyg extends SugarFieldBase {
|
|||
{
|
||||
$this->setup($parentFieldArray, $vardef, $displayParams, $tabindex);
|
||||
|
||||
$form_name = '';
|
||||
$form_name = $displayParams['formName'] ?? '';
|
||||
|
||||
if (!empty($this->ss->_tpl_vars['displayParams']['formName'])) {
|
||||
$form_name = $this->ss->_tpl_vars['displayParams']['formName'];
|
||||
|
@ -64,7 +64,11 @@ class SugarFieldWysiwyg extends SugarFieldBase {
|
|||
$config['height'] = 250;
|
||||
$config['menubar'] = false;
|
||||
$config['plugins'] = 'code, table, link, image, wordcount';
|
||||
$config['selector'] = "#{$form_name} "."#".$vardef['name'];
|
||||
if ($form_name !== '') {
|
||||
$config['selector'] = "#{$form_name} " . "#" . $vardef['name'];
|
||||
} else {
|
||||
$config['selector'] = "#" . $vardef['name'];
|
||||
}
|
||||
$config['toolbar1'] = 'fontselect | fontsizeselect | bold italic underline | forecolor backcolor | styleselect | outdent indent | link image | code table';
|
||||
|
||||
$jsConfig = json_encode($config);
|
||||
|
|
|
@ -85,7 +85,6 @@ class DetailViewMetaParser extends MetaParser
|
|||
|
||||
// Remove \n,\r characters to allow for better text parsing
|
||||
$contents = $this->trimHTML($contents);
|
||||
$contents = $this->stripFlavorTags($contents);
|
||||
|
||||
|
||||
// Notes DetailView.html file is messed up
|
||||
|
|
|
@ -242,13 +242,13 @@ class MetaParser
|
|||
* stripFlavorTags
|
||||
* This method accepts the file contents and uses the $GLOBALS['sugar_flavor'] value
|
||||
* to remove the flavor tags in the file contents if present. If $GLOBALS['sugar_flavor']
|
||||
* is not set, it defaults to PRO flavor
|
||||
* is not set, it defaults to CE flavor
|
||||
* @param $contents The file contents as a String value
|
||||
* @param $result The file contents with non-matching flavor tags and their nested comments removed
|
||||
*/
|
||||
public function stripFlavorTags($contents)
|
||||
{
|
||||
$flavor = isset($GLOBALS['sugar_flavor']) ? $GLOBALS['sugar_flavor'] : 'PRO';
|
||||
$flavor = isset($GLOBALS['sugar_flavor']) ? $GLOBALS['sugar_flavor'] : 'CE';
|
||||
$isPro = ($flavor == 'ENT' || $flavor == 'PRO') ? true : false;
|
||||
if ($isPro) {
|
||||
$contents = preg_replace('/<!-- BEGIN: open_source -->.*?<!-- END: open_source -->/', '', $contents);
|
||||
|
|
|
@ -489,8 +489,8 @@ var selectedIndex=0;var nodeCount=-1;for(i in left_side.childNodes){if(typeof le
|
|||
selectedIndex=nodeCount;}}
|
||||
document.getElementById('orderBySelect').selectedIndex=selectedIndex;};SUGAR.tabChooser.movementCallback(document.getElementById('display_tabs_td').getElementsByTagName('select')[0]);if(document.search_form.orderBy){if(document.search_form.orderBy.length>1&&document.search_form.orderBy[1].type=='select-one'){document.search_form.orderBy[1].options.value=SUGAR.savedViews.selectedOrderBy;}
|
||||
else{document.search_form.orderBy.options.value=SUGAR.savedViews.selectedOrderBy;}}
|
||||
if(SUGAR.savedViews.selectedSortOrder=='DESC')document.getElementById('sort_order_desc_radio').checked=true;else document.getElementById('sort_order_asc_radio').checked=true;var sortableColumnsCount=0;var columnDefs=SUGAR.savedViews.columnsMeta;if(columnDefs&&typeof columnDefs==='object'&&Object.keys(columnDefs)){Object.keys(columnDefs).forEach(function(columnKey){var column=columnDefs[columnKey];if(!column||!column.sortable){return;}
|
||||
if(column.sortable===true){sortableColumnsCount++;}})}
|
||||
if(SUGAR.savedViews.selectedSortOrder=='DESC')document.getElementById('sort_order_desc_radio').checked=true;else document.getElementById('sort_order_asc_radio').checked=true;var sortableColumnsCount=0;var columnDefs=SUGAR.savedViews.columnsMeta;if(columnDefs&&typeof columnDefs==='object'&&Object.keys(columnDefs)){Object.keys(columnDefs).forEach(function(columnKey){var column=columnDefs[columnKey];if(!column){return;}
|
||||
if(column.sortable!==false){sortableColumnsCount++;}})}
|
||||
if(sortableColumnsCount<1){$('.saved-search-sort-column-config-row').hide();}}};}();SUGAR.searchForm=function(){var url;return{searchFormSelect:function(view,previousView){var module=view.split('|')[0];var theView=view.split('|')[1];var handleDisplay=function(){document.search_form.searchFormTab.value=theView;patt=module+"(.*)SearchForm$";divId=document.search_form.getElementsByTagName('div');for(i=0;i<divId.length;i++){if(divId[i].id.match(module)==module){if(divId[i].id.match('SearchForm')=='SearchForm'){if(document.getElementById(divId[i].id).style.display==''){previousTab=divId[i].id.match(patt)[1];}
|
||||
document.getElementById(divId[i].id).style.display='none';}}}
|
||||
adv=document.getElementById('advanced_search_link');bas=document.getElementById('basic_search_link');if(adv!==null){adv.setAttribute('accesskey','');}
|
||||
|
|
|
@ -1180,6 +1180,8 @@ $app_strings = array(
|
|||
'LBL_EMAIL_ACCOUNTS_SMTPUSER' => 'SMTP Username',
|
||||
'LBL_EMAIL_ACCOUNTS_SMTPDEFAULT' => 'Default',
|
||||
'LBL_EMAIL_WARNING_MISSING_USER_CREDS' => 'Warning: Missing username and password for outgoing mail account.',
|
||||
'LBL_OAUTH_CONNECTION_NOT_SET' => 'Please set an External OAuth Connection.',
|
||||
'LBL_EMAIL_PASSWORD_NOT_SET' => 'Warning: A password has not been set.',
|
||||
'LBL_EMAIL_WARNING_MISSING_CREDS' => 'Warning: Missing credentials',
|
||||
'LBL_EMAIL_ACCOUNTS_SUBTITLE' => 'Set up Mail Accounts to view incoming emails from your email accounts.',
|
||||
'LBL_EMAIL_ACCOUNTS_OUTBOUND_SUBTITLE' => 'Provide SMTP mail server information to use for outgoing email in Mail Accounts.',
|
||||
|
|
|
@ -2010,6 +2010,10 @@ function get_select_options_with_id_separate_key($label_list, $key_list, $select
|
|||
//create the type dropdown domain and set the selected value if $opp value already exists
|
||||
foreach ($key_list as $option_key => $option_value) {
|
||||
$selected_string = '';
|
||||
|
||||
if (is_string($selected_key)) {
|
||||
$option_key = strval($option_key);
|
||||
}
|
||||
// the system is evaluating $selected_key == 0 || '' to true. Be very careful when changing this. Test all cases.
|
||||
// The bug was only happening with one of the users in the drop down. It was being replaced by none.
|
||||
if (
|
||||
|
|
|
@ -235,7 +235,11 @@ function sugar_file_put_contents_atomic($filename, $data, $mode = 'wb')
|
|||
}
|
||||
|
||||
if (file_exists($filename)) {
|
||||
$result = sugar_chmod($filename, 0755);
|
||||
if (!empty($GLOBALS['sugar_config']['default_permissions']['file_mode'])) {
|
||||
$result = sugar_chmod($filename, $GLOBALS['sugar_config']['default_permissions']['file_mode']);
|
||||
}else{
|
||||
$result = sugar_chmod($filename, 0755);
|
||||
}
|
||||
if ((new SplFileInfo($filename))->getExtension() == 'php') {
|
||||
SugarCache::cleanFile($filename);
|
||||
}
|
||||
|
|
|
@ -3678,11 +3678,11 @@ SUGAR.savedViews = function () {
|
|||
if(columnDefs && typeof columnDefs === 'object' && Object.keys(columnDefs)) {
|
||||
Object.keys(columnDefs).forEach(function (columnKey) {
|
||||
var column = columnDefs[columnKey];
|
||||
if (!column || !column.sortable) {
|
||||
if (!column) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (column.sortable === true) {
|
||||
if (column.sortable !== false) {
|
||||
sortableColumnsCount++;
|
||||
}
|
||||
})
|
||||
|
|
|
@ -115,7 +115,7 @@ function getEncryptedPassword(login, password, mailbox) {
|
|||
return words;
|
||||
} // fn
|
||||
|
||||
function ie_test_open_popup_with_submit(module_name, action, pageTarget, width, height, mail_server, protocol, port, login, password, mailbox, ssl, personal, formName, ie_id, connectionString)
|
||||
function ie_test_open_popup_with_submit(module_name, action, pageTarget, width, height, mail_server, protocol, port, login, password, mailbox, ssl, personal, formName, ie_id, connectionString, auth_type, externalOauthConnectionName, externalOauthConnectionId)
|
||||
{
|
||||
if (!formName) formName = "testSettingsView";
|
||||
var words = getEncryptedPassword(login, password, mailbox);
|
||||
|
@ -143,7 +143,13 @@ function ie_test_open_popup_with_submit(module_name, action, pageTarget, width,
|
|||
+ '&mailbox=' + words[2]
|
||||
+ '&ssl=' + ssl
|
||||
+ '&ie_id=' + ie_id
|
||||
+ '&personal=' + isPersonal;
|
||||
+ '&personal=' + isPersonal
|
||||
+ '&auth_type=' + auth_type;
|
||||
|
||||
if (externalOauthConnectionName && externalOauthConnectionId){
|
||||
URL += '&externalOauthConnectionName=' + externalOauthConnectionName
|
||||
+ '&externalOauthConnectionId=' + externalOauthConnectionId;
|
||||
}
|
||||
|
||||
if(connectionString) {
|
||||
URL += '&connection_string=' + encodeURIComponent(connectionString);
|
||||
|
@ -203,6 +209,31 @@ function isDataValid(formName, validateMonitoredFolder) {
|
|||
errors.push(SUGAR.language.get('app_strings', 'LBL_EMAIL_ERROR_MONITORED_FOLDER'));
|
||||
} // if
|
||||
}
|
||||
|
||||
if(formObject.auth_type && formObject.email_password){
|
||||
if(formObject.auth_type.value === 'oauth'){
|
||||
|
||||
if (!formObject.external_oauth_connection_name.value || !formObject.external_oauth_connection_id.value){
|
||||
errors.push(SUGAR.language.get('app_strings', 'LBL_OAUTH_CONNECTION_NOT_SET'));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(formObject.auth_type.value === 'basic'){
|
||||
if (formObject.external_oauth_connection_name){
|
||||
formObject.external_oauth_connection_name = '';
|
||||
}
|
||||
|
||||
if (formObject.external_oauth_connection_id){
|
||||
formObject.external_oauth_connection_id = '';
|
||||
}
|
||||
|
||||
if (formObject.email_password.value === '' && !formObject.email_password.dataset.isValueSet){
|
||||
errors.push(SUGAR.language.get('app_strings', 'LBL_EMAIL_PASSWORD_NOT_SET'));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
if(formObject.port.value == "") {
|
||||
errors.push(SUGAR.language.get('app_strings', 'LBL_EMAIL_ERROR_PORT'));
|
||||
}
|
||||
|
|
|
@ -1723,7 +1723,7 @@ class AOR_Report extends Basic
|
|||
} else {
|
||||
$params = base64_decode($condition->value);
|
||||
}
|
||||
$value = '"' . getPeriodDate($params)->format('Y-m-d H:i:s') . '"';
|
||||
$value = '"' . getPeriodDate($params, $data['type'])->format('Y-m-d H:i:s') . '"';
|
||||
break;
|
||||
case "CurrentUserID":
|
||||
global $current_user;
|
||||
|
@ -1879,8 +1879,8 @@ class AOR_Report extends Basic
|
|||
} else {
|
||||
$params = base64_decode($condition->value);
|
||||
}
|
||||
$date = getPeriodEndDate($params)->format('Y-m-d H:i:s');
|
||||
$value = "'" . $this->db->quote(getPeriodDate($params)->format('Y-m-d H:i:s')) . "'";
|
||||
$date = getPeriodEndDate($params, $data['type'])->format('Y-m-d H:i:s');
|
||||
$value = "'" . $this->db->quote(getPeriodDate($params, $data['type'])->format('Y-m-d H:i:s')) . "'";
|
||||
|
||||
$query['where'][] = ($tiltLogicOp ? '' : ($condition->logic_op ? $condition->logic_op . ' ' : 'AND '));
|
||||
$tiltLogicOp = false;
|
||||
|
|
|
@ -226,7 +226,7 @@ function getConditionsAsParameters($report, $override = array())
|
|||
* @param $date_time_period_list_selected
|
||||
* @return DateTime
|
||||
*/
|
||||
function getPeriodDate($date_time_period_list_selected)
|
||||
function getPeriodDate($date_time_period_list_selected, $type = '')
|
||||
{
|
||||
global $sugar_config, $timedate;
|
||||
$datetime_period = new DateTime();
|
||||
|
@ -324,7 +324,9 @@ function getPeriodDate($date_time_period_list_selected)
|
|||
// set time to 00:00:00
|
||||
$datetime_period = $datetime_period->setTime(0, 0, 0);
|
||||
|
||||
$datetime_period->sub(DateInterval::createFromDateString($timedate->getUserUTCOffset().' minutes'));
|
||||
if($type === 'datetime') {
|
||||
$datetime_period->sub(DateInterval::createFromDateString($timedate->getUserUTCOffset() . ' minutes'));
|
||||
}
|
||||
|
||||
return $datetime_period;
|
||||
}
|
||||
|
@ -334,7 +336,7 @@ function getPeriodDate($date_time_period_list_selected)
|
|||
* @param $date_time_period_list_selected
|
||||
* @return DateTime
|
||||
*/
|
||||
function getPeriodEndDate($dateTimePeriodListSelected)
|
||||
function getPeriodEndDate($dateTimePeriodListSelected, $type = '')
|
||||
{
|
||||
global $timedate;
|
||||
|
||||
|
@ -346,43 +348,61 @@ function getPeriodEndDate($dateTimePeriodListSelected)
|
|||
break;
|
||||
case 'yesterday':
|
||||
$datetimePeriod = new DateTime("yesterday");
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
break;
|
||||
case 'this_week':
|
||||
$datetimePeriod = new DateTime("next week monday");
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime("this week sunday");
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
break;
|
||||
case 'last_week':
|
||||
$datetimePeriod = new DateTime("this week monday");
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime("last week sunday");
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
break;
|
||||
case 'this_month':
|
||||
$datetimePeriod = new DateTime('first day of next month');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('last day of this month');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
break;
|
||||
case 'last_month':
|
||||
$datetimePeriod = new DateTime("first day of this month");
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime("last day of last month");
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
break;
|
||||
case 'this_quarter':
|
||||
$thisMonth = new DateTime('first day of this month');
|
||||
$thisMonth = $thisMonth->format('n');
|
||||
if ($thisMonth < 4) {
|
||||
// quarter 1
|
||||
$datetimePeriod = new DateTime('first day of april');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('last day of march');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
} elseif ($thisMonth > 3 && $thisMonth < 7) {
|
||||
// quarter 2
|
||||
$datetimePeriod = new DateTime('first day of july');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('last day of june');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
} elseif ($thisMonth > 6 && $thisMonth < 10) {
|
||||
// quarter 3
|
||||
$datetimePeriod = new DateTime('first day of october');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('last day of september');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
} elseif ($thisMonth > 9) {
|
||||
// quarter 4
|
||||
$datetimePeriod = new DateTime('next year first day of january');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('this year last day of december');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'last_quarter':
|
||||
|
@ -390,32 +410,48 @@ function getPeriodEndDate($dateTimePeriodListSelected)
|
|||
$thisMonth = $thisMonth->format('n');
|
||||
if ($thisMonth < 4) {
|
||||
// previous quarter 1
|
||||
$datetimePeriod = new DateTime('this year first day of january');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('this year last day of december');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
} elseif ($thisMonth > 3 && $thisMonth < 7) {
|
||||
// previous quarter 2
|
||||
$datetimePeriod = new DateTime('first day of april');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('last day of march');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
} elseif ($thisMonth > 6 && $thisMonth < 10) {
|
||||
// previous quarter 3
|
||||
$datetimePeriod = new DateTime('first day of july');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('last day of june');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
} elseif ($thisMonth > 9) {
|
||||
// previous quarter 4
|
||||
$datetimePeriod = new DateTime('first day of october');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('last day of september');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'this_year':
|
||||
$datetimePeriod = new DateTime('next year first day of january');
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime('this year last day of december');
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
break;
|
||||
case 'last_year':
|
||||
$datetimePeriod = new DateTime("this year first day of january");
|
||||
$datetimePeriod->setTime(0, 0, 0);
|
||||
$datetimePeriod = new DateTime("last year last day of december");
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->setTime(23, 59, 59);
|
||||
}
|
||||
break;
|
||||
}
|
||||
$datetimePeriod->sub(DateInterval::createFromDateString($timedate->getUserUTCOffset().' minutes'));
|
||||
|
||||
if($type === 'datetime') {
|
||||
$datetimePeriod->sub(DateInterval::createFromDateString($timedate->getUserUTCOffset() . ' minutes'));
|
||||
}
|
||||
|
||||
return $datetimePeriod;
|
||||
}
|
||||
|
||||
|
|
|
@ -99,6 +99,7 @@ class AOS_Contracts extends AOS_Contracts_sugar
|
|||
|
||||
public function createReminder()
|
||||
{
|
||||
global $mod_strings;
|
||||
require_once('modules/Calls/Call.php');
|
||||
$call = new call();
|
||||
|
||||
|
@ -112,7 +113,7 @@ class AOS_Contracts extends AOS_Contracts_sugar
|
|||
$call->parent_id = $this->id;
|
||||
$call->parent_type = 'AOS_Contracts';
|
||||
$call->date_start = $this->renewal_reminder_date;
|
||||
$call->name = $this->name . ' Contract Renewal Reminder';
|
||||
$call->name = $this->name . $mod_strings['LBL_RENEWAL_REMINDER'];
|
||||
$call->assigned_user_id = $this->assigned_user_id;
|
||||
$call->status = 'Planned';
|
||||
$call->direction = 'Outbound';
|
||||
|
|
|
@ -76,6 +76,7 @@ $mod_strings = array(
|
|||
'LBL_STATUS' => 'Status',
|
||||
'LBL_CUSTOMER_SIGNED_DATE' => 'Customer Signed Date',
|
||||
'LBL_COMPANY_SIGNED_DATE' => 'Company Signed Date',
|
||||
'LBL_RENEWAL_REMINDER' => ' Contract Renewal Reminder',
|
||||
'LBL_RENEWAL_REMINDER_DATE' => 'Renewal Reminder Date',
|
||||
'LBL_CONTRACT_TYPE' => 'Contract Type',
|
||||
'LBL_CONTACT' => 'Contact',
|
||||
|
|
|
@ -109,7 +109,18 @@ class AOW_Action extends Basic
|
|||
if ($post_data[$key . 'param'][$i]['value_type'][$p_id] == 'Value' && is_array($p_value)) {
|
||||
$param_value[$p_id] = encodeMultienumValue($p_value);
|
||||
}elseif($post_data[$key . 'param'][$i]['value_type'][$p_id] == 'Value'){
|
||||
$param_value[$p_id] = fixUpFormatting($params["record_type"], $post_data[$key . 'param'][$i]["field"][$p_id], $p_value);
|
||||
if (isset($params['rel_type']) && !empty($params['rel_type']) && ($params['rel_type'] !== $params['record_type'])) {
|
||||
$relName = $params['rel_type'];
|
||||
$moduleBean = BeanFactory::getBean($params['record_type']);
|
||||
if (!$moduleBean->load_relationship($relName)) {
|
||||
$GLOBALS['log']->fatal('Line '.__LINE__.': '.__METHOD__.': '."Relationship ".$relName." doesn't exist.");
|
||||
continue;
|
||||
}
|
||||
$moduleName = $moduleBean->$relName->getRelatedModuleName();
|
||||
} else {
|
||||
$moduleName = $params["record_type"];
|
||||
}
|
||||
$param_value[$p_id] = fixUpFormatting($moduleName, $post_data[$key . 'param'][$i]["field"][$p_id], $p_value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -45,6 +45,8 @@ document.getElementById('flow_module').addEventListener("change", showActions, f
|
|||
|
||||
function showActions(){
|
||||
|
||||
clearActionLines();
|
||||
|
||||
var flow_module = document.getElementById('flow_module').value;
|
||||
|
||||
if(flow_module != ''){
|
||||
|
@ -161,4 +163,16 @@ function getView(ln, id){
|
|||
var module = document.getElementById('flow_module').value;
|
||||
|
||||
YAHOO.util.Connect.asyncRequest ("GET", "index.php?module=AOW_WorkFlow&action=getAction&id="+id+"&aow_action="+action+"&line="+ln+"&aow_module="+module,callback);
|
||||
}
|
||||
}
|
||||
|
||||
function clearActionLines(){
|
||||
|
||||
if(document.getElementById('actionLines') != null){
|
||||
var actionLines_rows = document.getElementById('actionLines').getElementsByTagName('tr');
|
||||
for (var i = 0; i < actionLines_rows.length; i++) {
|
||||
if(document.getElementById('aow_actions_delete_line' + i) != null){
|
||||
document.getElementById('aow_actions_delete_line' + i).click();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -187,7 +187,7 @@ class AOW_WorkFlow extends Basic
|
|||
*/
|
||||
public function run_flows()
|
||||
{
|
||||
$flows = AOW_WorkFlow::get_full_list('', " aow_workflow.status = 'Active' AND (aow_workflow.run_when = 'Always' OR aow_workflow.run_when = 'In_Scheduler' OR aow_workflow.run_when = 'Create') ");
|
||||
$flows = $this->get_full_list('', " aow_workflow.status = 'Active' AND (aow_workflow.run_when = 'Always' OR aow_workflow.run_when = 'In_Scheduler' OR aow_workflow.run_when = 'Create') ");
|
||||
|
||||
if (empty($flows)) {
|
||||
LoggerManager::getLogger()->warn('There is no any workflow to run');
|
||||
|
|
|
@ -613,7 +613,7 @@ function getModuleField(
|
|||
$fieldlist[$fieldname]['value'] = $timedate->to_display($value, $convert_format, $params['date_format']);
|
||||
} else {
|
||||
if ($fieldlist[$fieldname]['type'] == 'date') {
|
||||
$fieldlist[$fieldname]['value'] = $timedate->to_display_date($value, true, true);
|
||||
$fieldlist[$fieldname]['value'] = $timedate->to_display_date($value, false);
|
||||
} else {
|
||||
$fieldlist[$fieldname]['value'] = $timedate->to_display_date_time($value, true, true);
|
||||
}
|
||||
|
|
|
@ -221,4 +221,6 @@ $mod_strings = array(
|
|||
'LBL_LAST_CALL' => 'Your last interaction was a call on :',
|
||||
'LBL_LAST_EMAIL' => 'Your last interaction was an email on :',
|
||||
'LBL_NO_INTERACTION' => 'You have yet to interact with this contact.',
|
||||
|
||||
'LBL_LIST_INVITE_STATUS' => 'Invite Status',
|
||||
);
|
||||
|
|
|
@ -906,7 +906,7 @@
|
|||
form = document.getElementById('ieAccount');
|
||||
|
||||
if (SE.accounts.checkIeCreds()) {
|
||||
ie_test_open_popup_with_submit("InboundEmail", "Popup", "Popup", 400, 300, trim(form.server_url.value), form.protocol.value, trim(form.port.value), trim(form.email_user.value), Rot13.write(form.email_password.value), trim(form.mailbox.value), form.ssl.checked, true, "ieAccount", form.ie_id.value);
|
||||
ie_test_open_popup_with_submit("InboundEmail", "Popup", "Popup", 400, 300, trim(form.server_url.value), form.protocol.value, trim(form.port.value), trim(form.email_user.value), Rot13.write(form.email_password.value), trim(form.mailbox.value), form.ssl.checked, true, "ieAccount", form.ie_id.value, form.ie_id.auth_type, '', '');
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -2193,14 +2193,14 @@
|
|||
|
||||
if (a_active_accnts == "")
|
||||
a_active_accnts = "&ieIdShow[]=";
|
||||
|
||||
|
||||
getRequestedParameter = function (name) {
|
||||
if (name = (new RegExp('[?&]' + encodeURIComponent(name) + '=([^&]*)')).exec(location.search))
|
||||
return decodeURIComponent(name[1]);
|
||||
}
|
||||
|
||||
var currentUserRecord = getRequestedParameter('record');
|
||||
|
||||
|
||||
if(typeof currentUserRecord === 'undefined') {
|
||||
currentUserRecord = $('input[name="record"]').val();
|
||||
}
|
||||
|
|
|
@ -99,7 +99,7 @@ class ImportFile extends ImportDataSource
|
|||
* Enclosure string we are using (i.e. ' or ")
|
||||
*/
|
||||
private $_enclosure;
|
||||
|
||||
|
||||
/**
|
||||
* File encoding, used to translate the data into UTF-8 for display and import
|
||||
*/
|
||||
|
@ -226,7 +226,7 @@ class ImportFile extends ImportDataSource
|
|||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
global $locale;
|
||||
foreach ($this->_currentRow as $key => $value) {
|
||||
// If encoding is set, convert all values from it
|
||||
|
@ -234,12 +234,12 @@ class ImportFile extends ImportDataSource
|
|||
// Convert all values to UTF-8 for display and import purposes
|
||||
$this->_currentRow[$key] = $locale->translateCharset($value, $this->_encoding);
|
||||
}
|
||||
|
||||
|
||||
// Convert all line endings to the same style as PHP_EOL
|
||||
// Use preg_replace instead of str_replace as str_replace may cause extra lines on Windows
|
||||
$this->_currentRow[$key] = preg_replace("[\r\n|\n|\r]", PHP_EOL, (string) $this->_currentRow[$key]);
|
||||
}
|
||||
|
||||
|
||||
$this->_rowsCount++;
|
||||
|
||||
return $this->_currentRow;
|
||||
|
@ -315,10 +315,10 @@ class ImportFile extends ImportDataSource
|
|||
if (!empty($this->_encoding)) {
|
||||
return $this->_encoding;
|
||||
}
|
||||
|
||||
|
||||
// Move file pointer to start
|
||||
$this->setFpAfterBOM();
|
||||
|
||||
|
||||
global $locale;
|
||||
$user_charset = $locale->getExportCharset();
|
||||
$system_charset = $locale->default_export_charset;
|
||||
|
@ -327,33 +327,33 @@ class ImportFile extends ImportDataSource
|
|||
|
||||
// Bug 26824 - mb_detect_encoding() thinks CP1252 is IS0-8859-1, so use that instead in the encoding list passed to the function
|
||||
$detectable_charsets = str_replace('CP1252', 'ISO-8859-1', $detectable_charsets);
|
||||
|
||||
|
||||
// If we are able to detect encoding
|
||||
if (function_exists('mb_detect_encoding')) {
|
||||
// Retrieve a sample of data set
|
||||
$text = '';
|
||||
|
||||
|
||||
// Read 10 lines from the file and put them all together in a variable
|
||||
$i = 0;
|
||||
while ($i < 10 && $temp = fgets($this->_fp, 8192)) {
|
||||
$text .= $temp;
|
||||
$i++;
|
||||
}
|
||||
|
||||
|
||||
// If we picked any text, try to detect charset
|
||||
if (strlen($text) > 0) {
|
||||
$charset_for_import = mb_detect_encoding($text, $detectable_charsets);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// If we couldn't detect the charset, set it to default export/import charset
|
||||
if (empty($charset_for_import)) {
|
||||
$charset_for_import = $locale->getExportCharset();
|
||||
}
|
||||
|
||||
|
||||
// Reset the fp to after the bom if applicable.
|
||||
$this->setFpAfterBOM();
|
||||
|
||||
|
||||
return $charset_for_import;
|
||||
}
|
||||
|
||||
|
|
|
@ -420,8 +420,6 @@ eoq;
|
|||
foreach ($sampleSet as $v) {
|
||||
if ((is_countable($v) ? count($v) : 0) > $maxColumns) {
|
||||
$maxColumns = is_countable($v) ? count($v) : 0;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -439,13 +437,16 @@ eoq;
|
|||
array_unshift($rows, array_fill(0, 1, ''));
|
||||
}
|
||||
|
||||
foreach ($rows as &$row) {
|
||||
foreach ($rows as $key => &$row) {
|
||||
if (is_array($row)) {
|
||||
foreach ($row as &$val) {
|
||||
$val = strip_tags($val);
|
||||
}
|
||||
}else{
|
||||
unset($rows[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
return $rows;
|
||||
}
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ function getEncryptedPassword(login,password,mailbox){var words=new Array(login,
|
|||
if(word.indexOf('+')>0){fragment1=word.substr(0,word.indexOf('+'));fragment2=word.substr(word.indexOf('+')+1,word.length);newWord=fragment1+'::plus::'+fragment2;words[i]=newWord;word=newWord;fragment1='';fragment2='';}
|
||||
if(word.indexOf('%')>0){fragment1=word.substr(0,word.indexOf('%'));fragment2=word.substr(word.indexOf('%')+1,word.length);newWord=fragment1+'::percent::'+fragment2;words[i]=newWord;word=newWord;fragment1='';fragment2='';}}
|
||||
return words;}
|
||||
function ie_test_open_popup_with_submit(module_name,action,pageTarget,width,height,mail_server,protocol,port,login,password,mailbox,ssl,personal,formName,ie_id,connectionString){if(!formName)formName="testSettingsView";var words=getEncryptedPassword(login,password,mailbox);var isPersonal=(personal)?'true':'false';if(!isDataValid(formName,true)){return;}
|
||||
function ie_test_open_popup_with_submit(module_name,action,pageTarget,width,height,mail_server,protocol,port,login,password,mailbox,ssl,personal,formName,ie_id,connectionString,auth_type,externalOauthConnectionName,externalOauthConnectionId){if(!formName)formName="testSettingsView";var words=getEncryptedPassword(login,password,mailbox);var isPersonal=(personal)?'true':'false';if(!isDataValid(formName,true)){return;}
|
||||
if(typeof(ie_id)=='undefined'||ie_id=='')
|
||||
ie_id=(typeof document.getElementById(formName).ie_id!='undefined')?document.getElementById(formName).ie_id.value:'';URL='index.php?'
|
||||
+'module='+module_name
|
||||
|
@ -60,7 +60,10 @@ ie_id=(typeof document.getElementById(formName).ie_id!='undefined')?document.get
|
|||
+'&mailbox='+words[2]
|
||||
+'&ssl='+ssl
|
||||
+'&ie_id='+ie_id
|
||||
+'&personal='+isPersonal;if(connectionString){URL+='&connection_string='+encodeURIComponent(connectionString);}
|
||||
+'&personal='+isPersonal
|
||||
+'&auth_type='+auth_type;if(externalOauthConnectionName&&externalOauthConnectionId){URL+='&externalOauthConnectionName='+externalOauthConnectionName
|
||||
+'&externalOauthConnectionId='+externalOauthConnectionId;}
|
||||
if(connectionString){URL+='&connection_string='+encodeURIComponent(connectionString);}
|
||||
var SI=SUGAR.inboundEmail;if(!SI.testDlg){SI.testDlg=new YAHOO.widget.SimpleDialog("testSettingsDiv",{fixedcenter:true,width:width+"px",draggable:true,dragOnly:true,close:true,constraintoviewport:true,modal:true,loadingText:SUGAR.language.get("app_strings","LBL_EMAIL_LOADING")});SI.testDlg._updateContent=function(o){var w=this.cfg.config.width.value+"px";this.setBody(o.responseText);if(this.evalJS)
|
||||
SUGAR.util.evalScript(o.responseText);if(!SUGAR.isIE)
|
||||
this.body.style.width=w}}
|
||||
|
@ -70,6 +73,10 @@ function isDataValid(formName,validateMonitoredFolder){var formObject=document.g
|
|||
if(trim(formObject.email_user.value)==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_USER'));}
|
||||
if(formObject.protocol.protocol==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_PROTOCOL'));}
|
||||
if(formObject.protocol.value=='imap'&&validateMonitoredFolder){if(trim(formObject.mailbox.value)==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_MONITORED_FOLDER'));}}
|
||||
if(formObject.auth_type&&formObject.email_password){if(formObject.auth_type.value==='oauth'){if(!formObject.external_oauth_connection_name.value||!formObject.external_oauth_connection_id.value){errors.push(SUGAR.language.get('app_strings','LBL_OAUTH_CONNECTION_NOT_SET'));}}
|
||||
if(formObject.auth_type.value==='basic'){if(formObject.external_oauth_connection_name){formObject.external_oauth_connection_name='';}
|
||||
if(formObject.external_oauth_connection_id){formObject.external_oauth_connection_id='';}
|
||||
if(formObject.email_password.value===''&&!formObject.email_password.dataset.isValueSet){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_PASSWORD_NOT_SET'));}}}
|
||||
if(formObject.port.value==""){errors.push(SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_PORT'));}
|
||||
if(errors.length>0){out=SUGAR.language.get('app_strings','LBL_EMAIL_ERROR_DESC');for(i=0;i<errors.length;i++){if(out!=""){out+="\n";}
|
||||
out+=errors[i];}
|
||||
|
|
|
@ -3334,7 +3334,7 @@ class InboundEmail extends SugarBean
|
|||
// Open the connection and try the test string
|
||||
$this->conn = $this->getImapConnection($serviceTest, $login, $passw, $imapConnectionOptions);
|
||||
|
||||
if (($errors = $this->getImap()->getLastError()) || ($alerts = $this->getImap()->getAlerts())) {
|
||||
if (($errors = $this->getImap()->getLastError()) || ($alerts = $this->getImap()->getAlerts()) || !$this->conn) {
|
||||
// login failure means don't bother trying the rest
|
||||
if ($errors == 'Too many login failures'
|
||||
|| $errors == '[CLOSED] IMAP connection broken (server response)'
|
||||
|
@ -3357,6 +3357,8 @@ class InboundEmail extends SugarBean
|
|||
$GLOBALS['log']->debug($l . ': I-E failed using [' . $serviceTest . '] - error: ' . $errors);
|
||||
$retArray['err'][$k] = $errors;
|
||||
$retArray['bad'][$k] = $serviceTest;
|
||||
|
||||
return $retArray;
|
||||
}
|
||||
} else {
|
||||
$GLOBALS['log']->debug($l . ': I-E found good connect using [' . $serviceTest . ']');
|
||||
|
@ -6381,9 +6383,9 @@ class InboundEmail extends SugarBean
|
|||
|
||||
$useSsl = ($requestSsl == 'true') ? true : false; // TODO: validate the ssl request variable value (for e.g its posibble to give a numeric 1 as true)
|
||||
if ($test) {
|
||||
$this->getImap()->setTimeout(1, 15); // 60 secs is the default
|
||||
$this->getImap()->setTimeout(2, 15);
|
||||
$this->getImap()->setTimeout(3, 15);
|
||||
$this->getImap()->setTimeout(1, 5); // 60 secs is the default
|
||||
$this->getImap()->setTimeout(2, 5);
|
||||
$this->getImap()->setTimeout(3, 5);
|
||||
|
||||
$opts = $this->findOptimumSettings($useSsl);
|
||||
if (!empty($opts) && isset($opts['good']) && empty($opts['good'])) {
|
||||
|
@ -6469,7 +6471,7 @@ class InboundEmail extends SugarBean
|
|||
$errors = '';
|
||||
$alerts = '';
|
||||
$successful = false;
|
||||
if (($errors = $this->getImap()->getLastError()) || ($alerts = $this->getImap()->getAlerts())) {
|
||||
if (($errors = $this->getImap()->getLastError()) || ($alerts = $this->getImap()->getAlerts()) || !$this->conn) {
|
||||
if ($errors === 'Mailbox is empty') { // false positive
|
||||
$successful = true;
|
||||
} else {
|
||||
|
@ -6569,6 +6571,10 @@ class InboundEmail extends SugarBean
|
|||
|
||||
$connection = $this->getImap()->open($mailbox, $username, $password, $options, 0, $params);
|
||||
|
||||
if (!$connection){
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $connection;
|
||||
|
|
|
@ -113,13 +113,23 @@ $ie->email_user = $_REQUEST['email_user'];
|
|||
$ie->server_url = $_REQUEST['server_url'];
|
||||
$ie->port = $_REQUEST['port'];
|
||||
$ie->protocol = $_REQUEST['protocol'];
|
||||
|
||||
if (!empty($_REQUEST['auth_type'])){
|
||||
$ie->auth_type = $_REQUEST['auth_type'];
|
||||
}
|
||||
|
||||
//Bug 23083.Special characters in email password results in IMAP authentication failure
|
||||
if (!empty($_REQUEST['email_password'])) {
|
||||
$ie->email_password = html_entity_decode((string) $_REQUEST['email_password'], ENT_QUOTES);
|
||||
$ie->email_password = str_rot13($ie->email_password);
|
||||
}
|
||||
$ie->mailbox = 'INBOX';
|
||||
|
||||
if ($_REQUEST['externalOauthConnectionName']){
|
||||
$ie->external_oauth_connection_name = $_REQUEST['externalOauthConnectionName'];
|
||||
}
|
||||
if ($_REQUEST['externalOauthConnectionId']){
|
||||
$ie->external_oauth_connection_id = $_REQUEST['externalOauthConnectionId'];
|
||||
}
|
||||
if (!empty($_REQUEST['connection_string'])) {
|
||||
$ie->connection_string = urldecode($_REQUEST['connection_string'] ?? '');
|
||||
}
|
||||
|
|
|
@ -49,6 +49,9 @@ function testInboundConfiguration() {
|
|||
var originId = inboundEmailFields.getValue('origin_id');
|
||||
var record = inboundEmailFields.getValue('record');
|
||||
var connectionString = inboundEmailFields.getValue('connection_string');
|
||||
var auth_type = inboundEmailFields.getValue('auth_type');
|
||||
var externalOauthConnectionName = inboundEmailFields.getValue('external_oauth_connection_name');
|
||||
var externalOauthConnectionId = inboundEmailFields.getValue('external_oauth_connection_id');
|
||||
|
||||
ie_test_open_popup_with_submit(
|
||||
"InboundEmail",
|
||||
|
@ -66,6 +69,9 @@ function testInboundConfiguration() {
|
|||
isPersonal,
|
||||
"EditView",
|
||||
originId ? originId : record,
|
||||
connectionString || ''
|
||||
connectionString || '',
|
||||
auth_type,
|
||||
externalOauthConnectionName ?? '',
|
||||
externalOauthConnectionId ?? '',
|
||||
);
|
||||
}
|
||||
|
|
|
@ -160,8 +160,9 @@ class MBPackage
|
|||
$time = time();
|
||||
$this->description = to_html($this->description);
|
||||
$isUninstallable = ($this->is_uninstallable ? true : false);
|
||||
|
||||
if ($GLOBALS['sugar_flavor'] === 'CE') {
|
||||
$flavors = array('CE', 'PRO', 'ENT');
|
||||
$flavors = array('CE');
|
||||
} else {
|
||||
$flavors = array($GLOBALS['sugar_flavor']);
|
||||
}
|
||||
|
|
|
@ -155,7 +155,7 @@ class ModuleBuilderParser
|
|||
|
||||
// $GLOBALS['log']->debug("parser.modifylayout.php->_writeFile(): out=".print_r($out,true));
|
||||
fwrite($fh, $out);
|
||||
fclose($fh);
|
||||
sugar_fclose($fh);
|
||||
} else {
|
||||
$GLOBALS['log']->fatal("ModuleBuilderParser->_writeFile() Could not write new viewdef file ".$file);
|
||||
}
|
||||
|
|
|
@ -232,7 +232,7 @@ class ParserLabel
|
|||
include $filename;
|
||||
} elseif ($forRelationshipLabel) {
|
||||
$fh = fopen($filename, 'ab');
|
||||
fclose($fh);
|
||||
sugar_fclose($fh);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
|
@ -312,7 +312,7 @@ class ParserLabel
|
|||
try {
|
||||
$file_contents = fopen($extension_filename, 'wb');
|
||||
fwrite($file_contents, $out, strlen($out));
|
||||
fclose($file_contents);
|
||||
sugar_fclose($file_contents);
|
||||
} catch (Exception $e) {
|
||||
static::$logger->fatal("Could not write $filename");
|
||||
static::$logger->fatal('Exception '.$e->getMessage());
|
||||
|
@ -359,7 +359,7 @@ class ParserLabel
|
|||
try {
|
||||
$file_contents = fopen($relationships_filename, 'wb');
|
||||
fwrite($file_contents, $out, strlen($out));
|
||||
fclose($file_contents);
|
||||
sugar_fclose($file_contents);
|
||||
} catch (Exception $e) {
|
||||
static::$logger->fatal("Could not write $filename");
|
||||
static::$logger->fatal('Exception '.$e->getMessage());
|
||||
|
|
|
@ -406,7 +406,7 @@ class AbstractRelationships
|
|||
|
||||
$fh = fopen($filename, 'wb') ;
|
||||
fwrite($fh, $out, strlen($out)) ;
|
||||
fclose($fh) ;
|
||||
sugar_fclose($fh) ;
|
||||
|
||||
|
||||
foreach ($sugar_config['languages'] as $lk => $lv) {
|
||||
|
|
|
@ -212,7 +212,7 @@ class DashletMetaDataParser extends ListLayoutMetaDataParser
|
|||
$out .= "\$dashletData['$writeTodashletName']['searchFields'] = " . var_export_helper($dashletData[$dashletName]['searchFields']) . ";\n";
|
||||
$out .= "\$dashletData['$writeTodashletName']['columns'] = " . var_export_helper($dashletData[$dashletName]['columns']) . ";\n";
|
||||
fwrite($fh, $out);
|
||||
fclose($fh);
|
||||
sugar_fclose($fh);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -104,4 +104,7 @@ $mod_strings = array(
|
|||
'LBL_DATE_MODIFIED' => 'Date Modified',
|
||||
'LBL_DELETED' => 'Deleted',
|
||||
'LBL_FILE_CONTENTS' => 'File Contents',
|
||||
|
||||
'LBL_ASCENDING' => 'Ascending',
|
||||
'LBL_DESCENDING' => 'Descending',
|
||||
);
|
||||
|
|
|
@ -176,4 +176,6 @@ $mod_strings = array(
|
|||
'LBL_AM_PROJECTTEMPLATES_PROJECT_1_FROM_PROJECT_TITLE' => 'Project Templates: Project from Project Title',
|
||||
'LBL_AOS_QUOTES_PROJECT' => 'Quotes: Project',
|
||||
|
||||
'LBL_ASCENDING' => 'Ascending',
|
||||
'LBL_DESCENDING' => 'Descending',
|
||||
);
|
||||
|
|
|
@ -114,4 +114,7 @@ $mod_strings = array(
|
|||
'LBL_DAYS' => 'Days',
|
||||
'LBL_HOURS' => 'Hours',
|
||||
'LBL_RELATIONSHIP_TYPE' => 'Relationship Type',
|
||||
|
||||
'LBL_ASCENDING' => 'Ascending',
|
||||
'LBL_DESCENDING' => 'Descending',
|
||||
);
|
||||
|
|
|
@ -89,4 +89,6 @@ $mod_strings = array(
|
|||
|
||||
'LBL_EMAIL_MARKETING' => 'Email Marketing',
|
||||
|
||||
'LBL_ASCENDING' => 'Ascending',
|
||||
'LBL_DESCENDING' => 'Descending',
|
||||
);
|
||||
|
|
|
@ -362,34 +362,32 @@ function displayDateField($question)
|
|||
|
||||
function displayClosedPage($survey)
|
||||
{
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
$ss = new Sugar_Smarty();
|
||||
|
||||
$header = <<<EOF
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>$survey->name</title>
|
||||
<link href="themes/SuiteP/css/bootstrap.min.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
EOF;
|
||||
|
||||
<title><?= $survey->name ?></title>
|
||||
$footer = <<<EOF
|
||||
<script src="include/javascript/jquery/jquery-min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
EOF;
|
||||
|
||||
<link href="themes/suite8/css/bootstrap.min.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-offset-3 col-md-6">
|
||||
<img height=100 src="modules/Surveys/Entry/survey_logo.jpg"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row well">
|
||||
<div class="col-md-offset-2 col-md-8">
|
||||
<h1><?= $survey->name ?></h1>
|
||||
<p>Thanks for your interest but this survey is now closed.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="include/javascript/jquery/jquery-min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
$ss->assign('MESSAGE', translate('LBL_SURVEY_CLOSE_RESPONSE', $survey->module_name));
|
||||
$ss->assign('HEADER', $header);
|
||||
$ss->assign('SURVEY', $survey);
|
||||
$ss->assign('LOGO', SugarThemeRegistry::current()->getImageURL('company_logo.png') );
|
||||
$ss->assign('FOOTER', $footer);
|
||||
|
||||
echo $ss->fetch('modules/Surveys/tpls/closeSurvey.tpl');
|
||||
}
|
||||
|
|
|
@ -27,7 +27,8 @@ function survey_questions_display_detail(Surveys $focus, $field, $value, $view)
|
|||
);
|
||||
$smarty->assign('questions', $questions);
|
||||
$smarty->assign('message', '');
|
||||
if ($view == 'EditView') {
|
||||
$isDuplicate = $_REQUEST['isDuplicate'] ?? 'false';
|
||||
if ($view == 'EditView' && isFalse($isDuplicate)) {
|
||||
$smarty->assign('message', $mod_strings['LBL_CANT_EDIT_RESPONDED']);
|
||||
}
|
||||
$smarty->assign('APP_LIST', $app_list_strings);
|
||||
|
|
|
@ -104,5 +104,6 @@ $mod_strings = array(
|
|||
'LBL_SURVEY_DISTINCT' => 'Distinct Surveys Sent:',
|
||||
'LBL_DRAFT' => 'Draft',
|
||||
'LBL_SUBMIT' => 'Submit',
|
||||
'LBL_STARS' => 'Stars'
|
||||
'LBL_STARS' => 'Stars',
|
||||
'LBL_SURVEY_CLOSE_RESPONSE' => 'Thanks for your interest but this survey is now closed.',
|
||||
);
|
||||
|
|
20
public/legacy/modules/Surveys/tpls/closeSurvey.tpl
Normal file
20
public/legacy/modules/Surveys/tpls/closeSurvey.tpl
Normal file
|
@ -0,0 +1,20 @@
|
|||
{$HEADER}
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-offset-3 col-md-6">
|
||||
<img src="{$LOGO}"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row well">
|
||||
<div class="col-md-offset-2 col-md-8">
|
||||
<h1>{$SURVEY->name}</h1>
|
||||
<p>
|
||||
<strong>
|
||||
{$MESSAGE}
|
||||
</strong>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{$FOOTER}
|
||||
|
|
@ -868,6 +868,8 @@ class User extends Person implements EmailInterface
|
|||
|
||||
if (isset($_POST['timezone'])) {
|
||||
$this->setPreference('timezone', $_POST['timezone'], 0, 'global');
|
||||
} else {
|
||||
$this->setPreference('timezone', 'UTC', 0, 'global');
|
||||
}
|
||||
if (isset($_POST['ut'])) {
|
||||
$this->setPreference('ut', '0', 0, 'global');
|
||||
|
|
|
@ -4,5 +4,5 @@ if (!defined('sugarEntry') || !sugarEntry) {
|
|||
}
|
||||
|
||||
$suitecrm_version = '8.4.0';
|
||||
$suitecrm_timestamp = '2023-08-29 12:00:00';
|
||||
$suitecrm_legacy = '7.14.0';
|
||||
$suitecrm_timestamp = '2023-10-02 12:00:00';
|
||||
$suitecrm_legacy = '7.14.1';
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Before Width: | Height: | Size: 5.6 KiB |
File diff suppressed because one or more lines are too long
|
@ -1059,8 +1059,7 @@ $navbar-alert-body-bg: $main-bg;
|
|||
$navbar-alert-title-bg: $color-9;
|
||||
$navbar-alert-title-color: $main-font-color;
|
||||
$navbar-alert-separator: $navbar-menu-separator;
|
||||
$navbar-alert-seperator: $navbar-menu-separator;
|
||||
$navbar-alert-count-bg: $color-50;
|
||||
$navbar-alert-count-bg: $color-46;
|
||||
|
||||
$navbar-user-color: $navbar-link-color;
|
||||
$navbar-user-color-hover: $navbar-link-color-hover;
|
||||
|
@ -1204,7 +1203,7 @@ $table-row-bg: $main-alternate-bg;
|
|||
$dashboard-titlt-bg: $midnight-blue;
|
||||
$dashboard-toolbar-bg: $medium-grey;
|
||||
$dashboard-active-tab-bg: $midnight-blue;
|
||||
$dashboard-dropdown-btn : $dropdown-btn-color;
|
||||
$dashboard-dropdown-btn : $dropdown-btn-color;
|
||||
|
||||
$dashlet-title-bg: $color-13;
|
||||
$dashlet-title-color: $color-80;
|
||||
|
|
|
@ -3558,7 +3558,7 @@ select#sales_stage_advanced {
|
|||
}
|
||||
|
||||
.col-sm-12 .col-sm-8.edit-view-field textarea {
|
||||
width: 45%;
|
||||
width: 120%;
|
||||
}
|
||||
|
||||
[field=bool].col-sm-8.edit-view-field {
|
||||
|
@ -3661,7 +3661,7 @@ select#sales_stage_advanced {
|
|||
}
|
||||
|
||||
.col-sm-12 .col-sm-8.edit-view-field textarea {
|
||||
width: 45%;
|
||||
width: 120%;
|
||||
}
|
||||
|
||||
[field=bool].col-sm-8.edit-view-field {
|
||||
|
@ -5727,6 +5727,15 @@ table.subpanel-table .pagination li.single > #formprojects_project_tasks {
|
|||
right: 7px;
|
||||
}
|
||||
|
||||
body.popupBody {
|
||||
input {
|
||||
border-radius: 4px;
|
||||
}
|
||||
.button {
|
||||
border-radius: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.edit-border-bottom {
|
||||
border-top: 1px solid $header-bottom-border;
|
||||
}
|
||||
|
|
|
@ -355,6 +355,8 @@ div.sub-panel {
|
|||
|
||||
.subpanel-table.list tr.pagination span.pageNumbers {
|
||||
position: relative;
|
||||
/*top: 5px;*/
|
||||
bottom: 0.2em;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -89,9 +89,8 @@
|
|||
}
|
||||
|
||||
#panels {
|
||||
position: absolute;
|
||||
position: inherit;
|
||||
padding: 5px;
|
||||
margin-left: 200px;
|
||||
border: 1px solid $panel-default-border;
|
||||
border-radius: $border-radius-base;
|
||||
float: right;
|
||||
|
|
|
@ -134,10 +134,10 @@ advanced tab content goes here
|
|||
<!-- simple hidden start -->
|
||||
<input id="external_auth_only" name="external_auth_only" type="checkbox" class="checkbox" {$EXTERNAL_AUTH_ONLY_CHECKED} disabled>
|
||||
<!-- simple hidden finish -->
|
||||
</div>
|
||||
<div class="edit-dotted-border"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="edit-dotted-border"></div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
<div class="row detail-view-row">
|
||||
<div class="col-xs-12 col-sm-6 detail-view-row-item border-line">
|
||||
|
@ -153,7 +153,7 @@ advanced tab content goes here
|
|||
<!-- simple hidden start -->
|
||||
{include file="modules/Reminders/tpls/remindersDefaults.tpl"}
|
||||
<!-- simple hidden finish -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-6 detail-view-row-item">
|
||||
<!-- [hide!!] -->
|
||||
|
@ -217,7 +217,7 @@ advanced tab content goes here
|
|||
<!-- DIV inside - colspan != 3 -->
|
||||
<div class="col-xs-12 col-sm-4 label col-1-label">
|
||||
<!-- LABEL -->
|
||||
{$MOD.LBL_TIME_FORMAT|strip_semicolon}
|
||||
{$MOD.LBL_TIMEZONE|strip_semicolon}
|
||||
</div>
|
||||
<!-- /DIV inside -->
|
||||
<!-- phone (version 1) -->
|
||||
|
@ -262,22 +262,6 @@ advanced tab content goes here
|
|||
</div>
|
||||
<div class="edit-dotted-border"></div>
|
||||
</div>
|
||||
<div class="col-xs-12 col-sm-6 detail-view-row-item">
|
||||
<!-- [hide!!] -->
|
||||
<!-- DIV inside - colspan != 3 -->
|
||||
<div class="col-xs-12 col-sm-4 label col-1-label">
|
||||
<!-- LABEL -->
|
||||
{$MOD.LBL_NUMBER_GROUPING_SEP|strip_semicolon}
|
||||
</div>
|
||||
<!-- /DIV inside -->
|
||||
<!-- phone (version 1) -->
|
||||
<div class="col-xs-12 col-sm-8 detail-view-field " type="name" field="name">
|
||||
<!-- simple hidden start -->
|
||||
{$NUM_GRP_SEP}
|
||||
<!-- simple hidden finish -->
|
||||
</div>
|
||||
<div class="edit-dotted-border"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row detail-view-row">
|
||||
<div class="col-xs-12 col-sm-6 detail-view-row-item border-line">
|
||||
|
@ -307,7 +291,7 @@ advanced tab content goes here
|
|||
<!-- phone (version 1) -->
|
||||
<div class="col-xs-12 col-sm-8 detail-view-field " type="name" field="name">
|
||||
<!-- simple hidden start -->
|
||||
{$MOD.LBL_DECIMAL_SEP_TEXT}
|
||||
{$DEC_SEP}
|
||||
<!-- simple hidden finish -->
|
||||
</div>
|
||||
<div class="edit-dotted-border"></div>
|
||||
|
@ -330,7 +314,7 @@ advanced tab content goes here
|
|||
</div>
|
||||
<div class="edit-dotted-border"></div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div id='calendar_options_suitep'>
|
||||
|
|
|
@ -0,0 +1,856 @@
|
|||
{*
|
||||
/**
|
||||
*
|
||||
* SugarCRM Community Edition is a customer relationship management program developed by
|
||||
* SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
|
||||
*
|
||||
* SuiteCRM is an extension to SugarCRM Community Edition developed by SalesAgility Ltd.
|
||||
* Copyright (C) 2011 - 2018 SalesAgility Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it under
|
||||
* the terms of the GNU Affero General Public License version 3 as published by the
|
||||
* Free Software Foundation with the addition of the following permission added
|
||||
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
|
||||
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
|
||||
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||
* details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License along with
|
||||
* this program; if not, see http://www.gnu.org/licenses or write to the Free
|
||||
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA.
|
||||
*
|
||||
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
|
||||
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
|
||||
*
|
||||
* The interactive user interfaces in modified source and object code versions
|
||||
* of this program must display Appropriate Legal Notices, as required under
|
||||
* Section 5 of the GNU Affero General Public License version 3.
|
||||
*
|
||||
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
||||
* these Appropriate Legal Notices must retain the display of the "Powered by
|
||||
* 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".
|
||||
*/
|
||||
*}
|
||||
<!--Start Responsive Top Navigation Menu -->
|
||||
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
|
||||
<div class="container-fluid">
|
||||
<div class="navbar-header">
|
||||
<button type="button" class="navbar-toggle collapsed" data-toggle="dropdown">
|
||||
<span class="sr-only">Toggle navigation</span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu mobile_menu" role="menu" id="mobile_menu">
|
||||
{foreach from=$groupTabs item=modules key=group name=groupList}
|
||||
{if $smarty.foreach.groupList.last}
|
||||
{capture name=extraparams assign=extraparams}parentTab={$group}{/capture}
|
||||
{foreach from=$modules.modules item=module key=modulekey}
|
||||
<li role="presentation" data-test="1">
|
||||
{capture name=moduleTabId assign=moduleTabId}moduleTab_{$smarty.foreach.moduleList.index}_{$module}{/capture}
|
||||
<a href="javascript:void(0)" onclick="window.location.href = '{sugar_link id=$moduleTabId module=$modulekey link_only=1 data=$module extraparams=$extraparams}'">
|
||||
{$module}
|
||||
{if $modulekey !='Home' && $modulekey !='Calendar'}
|
||||
<span class="glyphicon glyphicon-plus" onclick="window.location.href = 'index.php?action=EditView&module={$modulekey}'"></span>
|
||||
{*<span class="glyphicon glyphicon-plus" onclick="window.location.href = 'http://google.com'"></span>*}
|
||||
{/if}
|
||||
</a>
|
||||
</li>
|
||||
{/foreach}
|
||||
{foreach from=$modules.extra item=submodulename key=submodule}
|
||||
<li role="presentation" data-test="2">
|
||||
<a href="javascript:void(0)" onclick="window.location.href = '{sugar_link module=$submodule link_only=1 extraparams=$extraparams}'">
|
||||
{$submodulename}
|
||||
<span class="glyphicon glyphicon-plus" onclick="window.location.href = 'index.php?action=EditView&module={$submodule}'"></span>
|
||||
{*<span class="glyphicon glyphicon-plus" onclick="window.location.href = 'http://google.com'"></span>*}
|
||||
</a>
|
||||
</li>
|
||||
{/foreach}
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
<div id="mobileheader" class="mobileheader">
|
||||
<div id="modulelinks" class="modulelinks">
|
||||
{foreach from=$moduleTopMenu item=module key=name name=moduleList}
|
||||
{if $name == $MODULE_TAB}
|
||||
<span class="modulename" data-toggle="dropdown" aria-expanded="false">
|
||||
{sugar_link id="moduleTab_$name" module=$name data=$module caret=true}
|
||||
</span>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
{if $name !='Home'}
|
||||
{if is_array($shortcutTopMenu.$name) && count($shortcutTopMenu.$name) > 0}
|
||||
<li class="mobile-current-actions" role="presentation">
|
||||
<ul class="mobileCurrentTab">
|
||||
{foreach from=$shortcutTopMenu.$name item=item}
|
||||
{if $item.URL == "-"}
|
||||
<li class="mobile-action"><a></a><span> </span></li>
|
||||
{else}
|
||||
<li class="mobile-action"><a href="{$item.URL}">{$item.LABEL}</a></li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</li>
|
||||
{else}
|
||||
<li class="mobile-action"><a>{$APP.LBL_NO_SHORTCUT_MENU}</a></li>
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
{if is_array($recentRecords) && count($recentRecords) > 0}
|
||||
<li class="recent-links-title" role="presentation">
|
||||
<a><strong>{$APP.LBL_LAST_VIEWED}</strong></a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<ul class="recent-list">
|
||||
{foreach from=$recentRecords item=item name=lastViewed }
|
||||
{if $smarty.foreach.lastViewed.iteration < 4} {* limit to 3 results *}
|
||||
<li class="recentlinks" role="presentation">
|
||||
<a title="{sugar_translate module=$item.module_name label=LBL_MODULE_NAME}"
|
||||
accessKey="{$smarty.foreach.lastViewed.iteration}"
|
||||
href="{sugar_link module=$item.module_name action='DetailView' record=$item.item_id link_only=1}" class="recent-links-detail">
|
||||
<span class="suitepicon suitepicon-module-{$item.module_name|lower|replace:'_':'-'}"></span>
|
||||
<span aria-hidden="true">{$item.item_summary_short}</span>
|
||||
</a>
|
||||
{capture assign='access'}{suite_check_access module=$item.module_name action='edit' record=$item.item_id}{/capture}
|
||||
{if $access}
|
||||
<a href="{sugar_link module=$item.module_name action='EditView' record=$item.item_id link_only=1}" class="recent-links-edit"><span class=" glyphicon glyphicon-pencil"></a>
|
||||
{/if}
|
||||
</li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</li>
|
||||
{/if}
|
||||
|
||||
{if is_array($favoriteRecords) && count($favoriteRecords) > 0}
|
||||
<li class="favorite-links-title" role="presentation">
|
||||
<a><strong>{$APP.LBL_FAVORITES}</strong></a>
|
||||
</li>
|
||||
<li>
|
||||
<ul class="favorite-list">
|
||||
{foreach from=$favoriteRecords item=item name=lastViewed}
|
||||
{if $smarty.foreach.lastViewed.iteration < 4} {* limit to 3 results *}
|
||||
<li class="favoritelinks" role="presentation">
|
||||
<a title="{sugar_translate module=$item.module_name label=LBL_MODULE_NAME}"
|
||||
accessKey="{$smarty.foreach.lastViewed.iteration}"
|
||||
href="{sugar_link module=$item.module_name action='DetailView' record=$item.id link_only=1}" class="favorite-links-detail">
|
||||
<span class="suitepicon suitepicon-module-{$item.module_name|lower|replace:'_':'-'}"></span>
|
||||
<span aria-hidden="true">{$item.item_summary_short}</span>
|
||||
</a>
|
||||
{capture assign='access'}{suite_check_access module=$item.module_name action='edit' record=$item.id}{/capture}
|
||||
{if $access}
|
||||
<a href="{sugar_link module=$item.module_name action='EditView' record=$item.id link_only=1}" class="favorite-links-edit"><span class="glyphicon glyphicon-pencil" aria-hidden="true"></a>
|
||||
{/if}
|
||||
</li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</li>
|
||||
{/if}
|
||||
</ul>
|
||||
|
||||
{/if}
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="desktop-toolbar" id="toolbar">
|
||||
{if $USE_GROUP_TABS}
|
||||
<ul class="nav navbar-nav">
|
||||
<li class="navbar-brand-container">
|
||||
<a class="navbar-brand with-home-icon suitepicon suitepicon-action-home" href="index.php?module=Home&action=index"></a>
|
||||
</li>
|
||||
{assign var="groupSelected" value=false}
|
||||
{foreach from=$moduleTopMenu item=module key=name name=moduleList}
|
||||
{if $name == $MODULE_TAB}
|
||||
{if $name != 'Home'}
|
||||
<li class="topnav">
|
||||
<span class="currentTabLeft"> </span>
|
||||
<span class="currentTab">{sugar_link id="moduleTab_$name" module=$name data=$module}</span>
|
||||
<span> </span>
|
||||
{* check, is there any recent items *}
|
||||
{assign var=foundRecents value=false}
|
||||
{foreach from=$recentRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $name}
|
||||
{assign var=foundRecents value=true}
|
||||
{/if}
|
||||
{/foreach}
|
||||
|
||||
|
||||
{* check, is there any favorite items *}
|
||||
{assign var=foundFavorits value=false}
|
||||
{foreach from=$favoriteRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $name}
|
||||
{assign var=foundFavorits value=true}
|
||||
{/if}
|
||||
{/foreach}
|
||||
{if $foundRecents || $foundFavorits
|
||||
|| (is_array($shortcutTopMenu.$name) && count($shortcutTopMenu.$name) > 0)}
|
||||
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li class="current-module-action-links">
|
||||
<ul>
|
||||
{if is_array($shortcutTopMenu.$name)
|
||||
&& count($shortcutTopMenu.$name) > 0}
|
||||
{foreach from=$shortcutTopMenu.$name item=item}
|
||||
{if $item.URL == "-"}
|
||||
{*<li><a></a><span> </span></li>*}
|
||||
{else}
|
||||
<li><a href="{$item.URL}"><span class="topnav-fake-icon">{* fakes the space the icon takes *}</span><span aria-hidden="true">{$item.LABEL}</span></a></li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
{/if}
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
{* when records are found for the current submodule show recent header *}
|
||||
{counter start=0 name="submoduleRecentRecordsTotal" assign="submoduleRecentRecordsTotal" print=false}
|
||||
{foreach from=$recentRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $name and $submoduleRecentRecordsTotal == 0}
|
||||
<li class="recent-links-title"><a><strong>{$APP.LBL_LAST_VIEWED}</strong></a></li>
|
||||
{counter name="submoduleRecentRecordsTotal" print=false}
|
||||
{/if}
|
||||
{/foreach}
|
||||
<li class="current-module-recent-links">
|
||||
<ul>
|
||||
{* when records are found for the current submodule show the first 3 records *}
|
||||
{counter start=0 name="submoduleRecentRecords" assign="submoduleRecentRecords" print=false}
|
||||
{foreach from=$recentRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $name and $submoduleRecentRecords < 3}
|
||||
<li class="recentlinks" role="presentation">
|
||||
<a title="{sugar_translate module=$item.module_name label=LBL_MODULE_NAME}"
|
||||
accessKey="{$smarty.foreach.lastViewed.iteration}"
|
||||
href="{sugar_link module=$item.module_name action='DetailView' record=$item.item_id link_only=1}" class="recent-links-detail">
|
||||
|
||||
<span aria-hidden="true">{$item.item_summary_short}</span>
|
||||
</a>
|
||||
{capture assign='access'}{suite_check_access module=$item.module_name action='edit' record=$item.item_id }{/capture}
|
||||
{if $access}
|
||||
<a href="{sugar_link module=$item.module_name action='EditView' record=$item.item_id link_only=1}" class="recent-links-edit"><span class=" glyphicon glyphicon-pencil"></a>
|
||||
{/if}
|
||||
</li>
|
||||
{counter name="submoduleRecentRecords" print=false}
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
{counter start=0 name="submoduleFavoriteRecordsTotal" assign="submoduleFavoriteRecordsTotal" print=false}
|
||||
{foreach from=$favoriteRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $name and $submoduleFavoriteRecordsTotal == 0}
|
||||
<li class="favorite-links-title"><a><strong>{$APP.LBL_FAVORITES}</strong></a></li>
|
||||
{counter name="submoduleFavoriteRecordsTotal" print=false}
|
||||
{/if}
|
||||
{/foreach}
|
||||
<li class="current-module-favorite-links">
|
||||
<ul>
|
||||
{* when records are found for the current submodule show the first 3 records *}
|
||||
{counter start=0 name="submoduleFavoriteRecords" assign="submoduleFavoriteRecords" print=false}
|
||||
{foreach from=$favoriteRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $name and $submoduleFavoriteRecords < 3}
|
||||
<li class="favoritelinks" role="presentation">
|
||||
<a title="{sugar_translate module=$item.module_name label=LBL_MODULE_NAME}"
|
||||
accessKey="{$smarty.foreach.lastViewed.iteration}"
|
||||
href="{sugar_link module=$item.module_name action='DetailView' record=$item.id link_only=1}" class="favorite-links-detail">
|
||||
<span class="suitepicon suitepicon-module-{$item.module_name|lower|replace:'_':'-'}"></span>
|
||||
<span aria-hidden="true">{$item.item_summary_short}</span>
|
||||
</a>
|
||||
{capture assign='access'}{suite_check_access module=$item.module_name action='edit' record=$item.id }{/capture}
|
||||
{if $access}
|
||||
<a href="{sugar_link module=$item.module_name action='EditView' record=$item.id link_only=1}" class="favorite-links-edit"><span class=" glyphicon glyphicon-pencil" aria-hidden="true"></a>
|
||||
{/if}
|
||||
</li>
|
||||
{counter name="submoduleFavoriteRecords" print=false}
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
{/if}
|
||||
</li>
|
||||
{/if}
|
||||
|
||||
{/if}
|
||||
{/foreach}
|
||||
{foreach from=$groupTabs item=modules key=group name=groupList}
|
||||
{capture name=extraparams assign=extraparams}parentTab={$group}{/capture}
|
||||
<li class="topnav {if $smarty.foreach.groupList.last}all{/if}">
|
||||
<span class="notCurrentTabLeft"> </span><span class="notCurrentTab">
|
||||
<a href="#" id="grouptab_{$smarty.foreach.groupList.index}" class="dropdown-toggle grouptab">{$group}</a>
|
||||
<span class="notCurrentTabRight"> </span>
|
||||
<ul class="dropdown-menu" role="menu" {if $smarty.foreach.groupList.last} class="All"{/if}>
|
||||
{foreach from=$modules.modules item=module key=modulekey}
|
||||
<li>
|
||||
{capture name=moduleTabId assign=moduleTabId}moduleTab_{$smarty.foreach.moduleList.index}_{$module}{/capture}
|
||||
{sugar_link id=$moduleTabId module=$modulekey data=$module extraparams=$extraparams}
|
||||
</li>
|
||||
{/foreach}
|
||||
{foreach from=$modules.extra item=submodulename key=submodule}
|
||||
<li>
|
||||
<a href="{sugar_link module=$submodule link_only=1 extraparams=$extraparams}">{$submodulename}</a>
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
{* 7.8 Hide filter menu items when the window is too small to display them *}
|
||||
{literal}
|
||||
<script>
|
||||
var windowResize = function() {
|
||||
// Since the height can be changed in Sass.
|
||||
// Take a measurement of the initial desktop navigation bar height with just one menu item
|
||||
$('.desktop-toolbar ul.navbar-nav > li').not('.all').addClass('hidden');
|
||||
var dth = $('.desktop-toolbar').outerHeight();
|
||||
|
||||
// Show all desktop menu items
|
||||
$('.desktop-toolbar ul.navbar-nav > li.hidden').removeClass('hidden');
|
||||
|
||||
// Remove the each menu item from the end of the toolbar until
|
||||
// the navigation bar is the matches the initial height.
|
||||
while($('.desktop-toolbar').outerHeight() > dth) {
|
||||
ti = $('.desktop-toolbar ul.navbar-nav > li').not('.hidden').not('.all');
|
||||
$(ti).last().addClass('hidden');
|
||||
}
|
||||
};
|
||||
$(window).resize(windowResize);
|
||||
$(document).ready(windowResize);
|
||||
</script>
|
||||
{/literal}
|
||||
{else}
|
||||
|
||||
<ul class="nav navbar-nav navbar-horizontal-fluid">
|
||||
<li class="navbar-brand-container">
|
||||
<a class="navbar-brand with-home-icon" href="index.php?module=Home&action=index">
|
||||
<span class="suitepicon suitepicon-action-home"></span>
|
||||
</a>
|
||||
</li>
|
||||
{foreach from=$groupTabs item=modules key=group name=groupList}
|
||||
{capture name=extraparams assign=extraparams}parentTab={$group}{/capture}
|
||||
{/foreach}
|
||||
|
||||
<!--nav items with actions -->
|
||||
{foreach from=$modules.modules item=submodulename key=submodule}
|
||||
{if $submodule != "Home"}
|
||||
<li class="topnav with-actions">
|
||||
<span class="notCurrentTabLeft"> </span>
|
||||
<span class="dropdown-toggle headerlinks notCurrentTab"> <a href="{sugar_link module=$submodule link_only=1 extraparams=$extraparams}">{$submodulename}</a> </span>
|
||||
<span class="notCurrentTabRight"> </span>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li>
|
||||
<ul>
|
||||
{if is_array($shortcutTopMenu) && count($shortcutTopMenu) > 0}
|
||||
{foreach from=$shortcutTopMenu.$submodule item=item}
|
||||
{if $item.URL == "-"}
|
||||
{*<li><a></a><span> </span></li>*}
|
||||
{else}
|
||||
<li><a href="{$item.URL}"><span class="topnav-fake-icon">{* fakes the space the icon takes *}</span><span aria-hidden="true">{$item.LABEL}</span></a></li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
{/if}
|
||||
</ul>
|
||||
</li>
|
||||
{* when records are found for the current submodule show recent header *}
|
||||
{counter start=0 name="submoduleRecentRecordsTotal" assign="submoduleRecentRecordsTotal" print=false}
|
||||
{foreach from=$recentRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $submodule and $submoduleRecentRecordsTotal == 0}
|
||||
<li class="recent-links-title"><a><strong>{$APP.LBL_LAST_VIEWED}</strong></a></li>
|
||||
{counter name="submoduleRecentRecordsTotal" print=false}
|
||||
{/if}
|
||||
{/foreach}
|
||||
<li>
|
||||
<ul>
|
||||
{* when records are found for the current submodule show the first 3 records *}
|
||||
{counter start=0 name="submoduleRecentRecords" assign="submoduleRecentRecords" print=false}
|
||||
{foreach from=$recentRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $submodule and $submoduleRecentRecords < 3}
|
||||
<li class="recentlinks" role="presentation">
|
||||
<a title="{sugar_translate module=$item.module_name label=LBL_MODULE_NAME}"
|
||||
accessKey="{$smarty.foreach.lastViewed.iteration}"
|
||||
href="{sugar_link module=$item.module_name action='DetailView' record=$item.item_id link_only=1}" class="recent-links-detail">
|
||||
<span aria-hidden="true">{$item.item_summary_short}</span>
|
||||
</a>
|
||||
{capture assign='access'}{suite_check_access module=$item.module_name action='edit' record=$item.item_id }{/capture}
|
||||
{if $access}
|
||||
<a href="{sugar_link module=$item.module_name action='EditView' record=$item.item_id link_only=1}" class="recent-links-edit"><span class=" glyphicon glyphicon-pencil"></a>
|
||||
{/if}
|
||||
</li>
|
||||
{counter name="submoduleRecentRecords" print=false}
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</li>
|
||||
{* when records are found for the current submodule show favorites header *}
|
||||
{counter start=0 name="submoduleFavoriteRecordsTotal" assign="submoduleFavoriteRecordsTotal" print=false}
|
||||
{foreach from=$favoriteRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $submodule and $submoduleFavoriteRecordsTotal == 0}
|
||||
<li class="favorite-links-title"><a><strong>{$APP.LBL_FAVORITES}</strong></a></li>
|
||||
{counter name="submoduleFavoriteRecordsTotal" print=false}
|
||||
{/if}
|
||||
{/foreach}
|
||||
<li>
|
||||
<ul>
|
||||
{* when records are found for the current submodule show the first 3 records *}
|
||||
{counter start=0 name="submoduleFavoriteRecords" assign="submoduleFavoriteRecords" print=false}
|
||||
{foreach from=$favoriteRecords item=item name=lastViewed}
|
||||
{if $item.module_name == $submodule and $submoduleFavoriteRecords < 3}
|
||||
<li class="favoritelinks" role="presentation">
|
||||
<a title="{sugar_translate module=$item.module_name label=LBL_MODULE_NAME}"
|
||||
accessKey="{$smarty.foreach.lastViewed.iteration}"
|
||||
href="{sugar_link module=$item.module_name action='DetailView' record=$item.id link_only=1}" class="favorite-links-detail">
|
||||
<span aria-hidden="true">{$item.item_summary_short}</span>
|
||||
</a>
|
||||
{capture assign='access'}{suite_check_access module=$item.module_name action='edit' record=$item.id }{/capture}
|
||||
{if $access}
|
||||
<a href="{sugar_link module=$item.module_name action='EditView' record=$item.id link_only=1}" class="favorite-links-edit"><span class=" glyphicon glyphicon-pencil" aria-hidden="true"></a>
|
||||
{/if}
|
||||
</li>
|
||||
{counter name="submoduleFavoriteRecords" print=false}
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
{if count($moduleExtraMenu) > 0}
|
||||
<li class="topnav overflow-toggle-menu">
|
||||
<span class="notCurrentTabLeft"> </span>
|
||||
<span class="dropdown-toggle headerlinks notCurrentTab"><a href="#">{$APP.LBL_MORE}</a></span>
|
||||
<span class="notCurrentTabRight"> </span>
|
||||
<ul id="overflow-menu" class="dropdown-menu" role="menu">
|
||||
<!--nav items without actions -->
|
||||
{foreach from=$modules.extra item=submodulename key=submodule}
|
||||
<li class="topnav without-actions">
|
||||
<span class=" notCurrentTab"> <a href="{sugar_link module=$submodule link_only=1 extraparams=$extraparams}">{$submodulename}</a> </span>
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</li>
|
||||
{/if}
|
||||
</ul>
|
||||
<div class="hidden hidden-actions"></div>
|
||||
{* Hide nav items when the window size is too small to display them *}
|
||||
{literal}
|
||||
<script>
|
||||
var windowResize = function() {
|
||||
// reset navbar
|
||||
var $navCollapsedItems = $('ul#overflow-menu > li.with-actions');
|
||||
if(typeof $navCollapsedItems !== "undefined") {
|
||||
$($navCollapsedItems).each(function() {
|
||||
$(this).addClass('topnav');
|
||||
$(this).insertBefore('.overflow-toggle-menu');
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
var $navItemMore = $('.navbar-horizontal-fluid > li.overflow-toggle-menu'),
|
||||
$navItems = $('.navbar-horizontal-fluid > li.with-actions'),
|
||||
navItemMoreWidth = navItemWidth = $navItemMore.width(),
|
||||
windowWidth = $(window).width() - ($(window).width() * 0.55),
|
||||
navItemMoreLeft, offset, navOverflowWidth;
|
||||
|
||||
$navItems.each(function() {
|
||||
navItemWidth += $(this).width();
|
||||
});
|
||||
|
||||
// Remove nav items that are cause the right hand nav-bar items to wrap
|
||||
while (navItemWidth > windowWidth) {
|
||||
navItemWidth -= $navItems.last().width();
|
||||
$navItems.last().removeClass('topnav');
|
||||
$navItems.last().prependTo('#overflow-menu');
|
||||
$navItems.splice(-1,1);
|
||||
}
|
||||
if(typeof $navItemMoreLeft !== "undefined") {
|
||||
navItemMoreLeft = $('.navbar-horizontal-fluid .overflow-toggle-menu').offset().left;
|
||||
navOverflowWidth = $('#overflow-menu').width();
|
||||
offset = navItemMoreLeft + navItemMoreWidth - navOverflowWidth;
|
||||
}
|
||||
};
|
||||
$(window).resize(windowResize);
|
||||
windowResize();
|
||||
</script>
|
||||
{/literal}
|
||||
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<!-- Right side of the main navigation -->
|
||||
<div class="mobile-bar">
|
||||
<ul id="toolbar" class="toolbar">
|
||||
<li id="quickcreatetop" class="create dropdown nav navbar-nav quickcreatetop">
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||
{$APP.LBL_CREATE_BUTTON_LABEL}<span class="suitepicon suitepicon-action-caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="index.php?module=Accounts&action=EditView&return_module=Accounts&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Accounts" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Contacts&action=EditView&return_module=Contacts&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Contacts" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Opportunities&action=EditView&return_module=Opportunities&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Opportunities" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Leads&action=EditView&return_module=Leads&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Leads" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Documents&action=EditView&return_module=Documents&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Documents" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Calls&action=EditView&return_module=Calls&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Calls" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Tasks&action=EditView&return_module=Tasks&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Tasks" label="LBL_MODULE_NAME"}</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li id="" class="dropdown nav navbar-nav navbar-search">
|
||||
<button id="searchbutton" class="dropdown-toggle btn btn-default searchbutton suitepicon suitepicon-action-search" data-toggle="dropdown" aria-expanded="true">
|
||||
</button>
|
||||
<div class="dropdown-menu" role="menu" aria-labelledby="searchbutton">
|
||||
<form id="searchformdropdown" class="searchformdropdown" name='UnifiedSearch' action='index.php'
|
||||
onsubmit='return SUGAR.unifiedSearchAdvanced.checkUsaAdvanced()'>
|
||||
{search_controller}
|
||||
<input type="hidden" class="form-control" name="module" value="Home">
|
||||
<input type="hidden" class="form-control" name="search_form" value="false">
|
||||
<input type="hidden" class="form-control" name="advanced" value="false">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control query_string" name="query_string" id="query_string"
|
||||
placeholder="{$APP.LBL_SEARCH_BUTTON_TITLE}..." value="{$SEARCH}"/>
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default suitepicon suitepicon-action-search"></button>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</li>
|
||||
<li id="desktop_notifications" class="dropdown nav navbar-nav desktop_notifications">
|
||||
<button class="alertsButton btn dropdown-toggle suitepicon suitepicon-action-alerts" data-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
<span class="alert_count hidden">0</span>
|
||||
</button>
|
||||
<div id="alerts" class="dropdown-menu" role="menu">{$APP.LBL_EMAIL_ERROR_VIEW_RAW_SOURCE}</div>
|
||||
</li>
|
||||
<li>
|
||||
<form id="searchform" class="navbar-form searchform" name='UnifiedSearch' action='index.php'
|
||||
onsubmit='return SUGAR.unifiedSearchAdvanced.checkUsaAdvanced()'>
|
||||
{search_controller}
|
||||
<input type="hidden" class="form-control" name="module" value="Home">
|
||||
<input type="hidden" class="form-control" name="search_form" value="false">
|
||||
<input type="hidden" class="form-control" name="advanced" value="false">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control query_string " name="query_string" id="query_string"
|
||||
placeholder="{$APP.LBL_SEARCH}..." value="{$SEARCH}"/>
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default suitepicon suitepicon-action-search"></button>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
</li>
|
||||
<li id="globalLinks" class="dropdown nav navbar-nav globalLinks-mobile">
|
||||
|
||||
<button id="usermenucollapsed" class="dropdown-toggle btn btn-default usermenucollapsed" data-toggle="dropdown" aria-expanded="true">
|
||||
<span class="suitepicon suitepicon-action-user-small"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu user-dropdown user-menu" role="menu" aria-labelledby="dropdownMenu2">
|
||||
<li role="presentation">
|
||||
<a href='index.php?module=Users&action=EditView&record={$CURRENT_USER_ID}'>
|
||||
{$APP.LBL_PROFILE}
|
||||
</a>
|
||||
</li>
|
||||
{foreach from=$GCLS item=GCL name=gcl key=gcl_key}
|
||||
<li role="presentation">
|
||||
<a id="{$gcl_key}_link"
|
||||
href="{$GCL.URL}"
|
||||
{if !empty($GCL.ONCLICK)}
|
||||
onclick="{$GCL.ONCLICK}"
|
||||
{/if}
|
||||
{if !empty($GCL.TARGET)}
|
||||
target="{$GCL.TARGET}"
|
||||
{/if}
|
||||
>{$GCL.LABEL}</a>
|
||||
</li>
|
||||
{/foreach}
|
||||
<li role="presentation"><a role="menuitem" id="logout_link" href='{$LOGOUT_LINK}'
|
||||
class='utilsLink'>{$LOGOUT_LABEL}</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="tablet-bar">
|
||||
<ul id="toolbar" class="toolbar">
|
||||
<li id="quickcreatetop" class="create dropdown nav navbar-nav quickcreatetop">
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||
{$APP.LBL_CREATE_BUTTON_LABEL}<span class="suitepicon suitepicon-action-caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="index.php?module=Accounts&action=EditView&return_module=Accounts&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Accounts" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Contacts&action=EditView&return_module=Contacts&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Contacts" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Opportunities&action=EditView&return_module=Opportunities&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Opportunities" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Leads&action=EditView&return_module=Leads&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Leads" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Documents&action=EditView&return_module=Documents&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Documents" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Calls&action=EditView&return_module=Calls&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Calls" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Tasks&action=EditView&return_module=Tasks&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Tasks" label="LBL_MODULE_NAME"}</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li id="" class="dropdown nav navbar-nav navbar-search">
|
||||
<button id="searchbutton" class="dropdown-toggle btn btn-default searchbutton suitepicon suitepicon-action-search" data-toggle="dropdown" aria-expanded="true">
|
||||
</button>
|
||||
<div class="dropdown-menu" role="menu" aria-labelledby="searchbutton">
|
||||
<form id="searchformdropdown" class="searchformdropdown" name='UnifiedSearch' action='index.php'
|
||||
onsubmit='return SUGAR.unifiedSearchAdvanced.checkUsaAdvanced()'>
|
||||
{search_controller}
|
||||
<input type="hidden" class="form-control" name="module" value="Home">
|
||||
<input type="hidden" class="form-control" name="search_form" value="false">
|
||||
<input type="hidden" class="form-control" name="advanced" value="false">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control query_string" name="query_string" id="query_string"
|
||||
placeholder="{$APP.LBL_SEARCH}..." value="{$SEARCH}"/>
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default suitepicon suitepicon-action-search"></button>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<form id="searchform" class="navbar-form searchform" name='UnifiedSearch' action='index.php'
|
||||
onsubmit='return SUGAR.unifiedSearchAdvanced.checkUsaAdvanced()'>
|
||||
{search_controller}
|
||||
<input type="hidden" class="form-control" name="module" value="Home">
|
||||
<input type="hidden" class="form-control" name="search_form" value="false">
|
||||
<input type="hidden" class="form-control" name="advanced" value="false">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control query_string" name="query_string" id="query_string"
|
||||
placeholder="{$APP.LBL_SEARCH}..." value="{$SEARCH}"/>
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default suitepicon suitepicon-action-search"></button>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
</li>
|
||||
<li id="desktop_notifications" class="dropdown nav navbar-nav desktop_notifications">
|
||||
<button class="alertsButton btn dropdown-toggle suitepicon suitepicon-action-alerts" data-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
<span class="alert_count hidden">0</span>
|
||||
</button>
|
||||
<div id="alerts" class="dropdown-menu" role="menu">{$APP.LBL_EMAIL_ERROR_VIEW_RAW_SOURCE}</div>
|
||||
</li>
|
||||
<li id="globalLinks" class="dropdown nav navbar-nav globalLinks-mobile">
|
||||
|
||||
<button id="usermenucollapsed" class="dropdown-toggle btn btn-default usermenucollapsed" data-toggle="dropdown"
|
||||
aria-expanded="true">
|
||||
<span class="suitepicon suitepicon-action-current-user"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu user-dropdown user-menu" role="menu" aria-labelledby="dropdownMenu2">
|
||||
<li role="presentation">
|
||||
<a href='index.php?module=Users&action=EditView&record={$CURRENT_USER_ID}'>
|
||||
{$APP.LBL_PROFILE}
|
||||
</a>
|
||||
</li>
|
||||
{foreach from=$GCLS item=GCL name=gcl key=gcl_key}
|
||||
<li role="presentation">
|
||||
<a id="{$gcl_key}_link"
|
||||
href="{$GCL.URL}"
|
||||
{if !empty($GCL.ONCLICK)}
|
||||
onclick="{$GCL.ONCLICK}"
|
||||
{/if}
|
||||
{if !empty($GCL.TARGET)}
|
||||
target="{$GCL.TARGET}"
|
||||
{/if}
|
||||
>{$GCL.LABEL}</a>
|
||||
</li>
|
||||
{/foreach}
|
||||
<li role="presentation"><a role="menuitem" id="logout_link" href='{$LOGOUT_LINK}'
|
||||
class='utilsLink'>{$LOGOUT_LABEL}</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="desktop-bar">
|
||||
<ul id="toolbar" class="toolbar">
|
||||
<li id="quickcreatetop" class="create dropdown nav navbar-nav quickcreatetop">
|
||||
<a class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||
{$APP.LBL_CREATE_BUTTON_LABEL}<span class="suitepicon suitepicon-action-caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu" role="menu">
|
||||
<li><a href="index.php?module=Accounts&action=EditView&return_module=Accounts&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Accounts" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Contacts&action=EditView&return_module=Contacts&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Contacts" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Opportunities&action=EditView&return_module=Opportunities&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Opportunities" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Leads&action=EditView&return_module=Leads&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Leads" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Documents&action=EditView&return_module=Documents&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Documents" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Calls&action=EditView&return_module=Calls&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Calls" label="LBL_MODULE_NAME"}</a></li>
|
||||
<li><a href="index.php?module=Tasks&action=EditView&return_module=Tasks&return_action=DetailView">{$APP.LBL_QUICK_CREATE}{sugar_translate module="Tasks" label="LBL_MODULE_NAME"}</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li id="" class="dropdown nav navbar-nav navbar-search">
|
||||
<button id="searchbutton" class="dropdown-toggle btn btn-default searchbutton suitepicon suitepicon-action-search" data-toggle="dropdown" aria-expanded="true">
|
||||
</button>
|
||||
<div class="dropdown-menu" role="menu" aria-labelledby="searchbutton">
|
||||
<form id="searchformdropdown" class="searchformdropdown" name='UnifiedSearch' action='index.php'
|
||||
onsubmit='return SUGAR.unifiedSearchAdvanced.checkUsaAdvanced()'>
|
||||
{search_controller}
|
||||
<input type="hidden" class="form-control" name="module" value="Home">
|
||||
<input type="hidden" class="form-control" name="search_form" value="false">
|
||||
<input type="hidden" class="form-control" name="advanced" value="false">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control query_string" name="query_string" id="query_string"
|
||||
placeholder="{$APP.LBL_SEARCH}..." value="{$SEARCH}"/>
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default suitepicon suitepicon-action-search"></button>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<form id="searchform" class="navbar-form searchform" name='UnifiedSearch' action='index.php'
|
||||
onsubmit='return SUGAR.unifiedSearchAdvanced.checkUsaAdvanced()'>
|
||||
{search_controller}
|
||||
<input type="hidden" class="form-control" name="module" value="Home">
|
||||
<input type="hidden" class="form-control" name="search_form" value="false">
|
||||
<input type="hidden" class="form-control" name="advanced" value="false">
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control query_string" name="query_string" id="query_string"
|
||||
placeholder="{$APP.LBL_SEARCH}..." value="{$SEARCH}"/>
|
||||
<span class="input-group-btn">
|
||||
<button type="submit" class="btn btn-default suitepicon suitepicon-action-search"></button>
|
||||
</span>
|
||||
</div>
|
||||
</form>
|
||||
</li>
|
||||
<li id="desktop_notifications" class="dropdown nav navbar-nav desktop_notifications">
|
||||
<button class="alertsButton btn dropdown-toggle suitepicon suitepicon-action-alerts" data-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
<span class="alert_count hidden">0</span>
|
||||
</button>
|
||||
<div id="alerts" class="dropdown-menu" role="menu">{$APP.LBL_EMAIL_ERROR_VIEW_RAW_SOURCE}</div>
|
||||
</li>
|
||||
<li id="globalLinks" class="dropdown nav navbar-nav globalLinks-desktop">
|
||||
<button id="with-label" class="dropdown-toggle user-menu-button" title="{$CURRENT_USER}"data-toggle="dropdown" aria-expanded="true">
|
||||
<span class="suitepicon suitepicon-action-current-user"></span>
|
||||
<span class="globallabel-user">{$CURRENT_USER}</span>
|
||||
<span class="suitepicon suitepicon-action-caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu user-dropdown user-menu" role="menu" aria-labelledby="with-label">
|
||||
<li role="presentation">
|
||||
<a href='index.php?module=Users&action=EditView&record={$CURRENT_USER_ID}'>
|
||||
{$APP.LBL_PROFILE}
|
||||
</a>
|
||||
</li>
|
||||
{foreach from=$GCLS item=GCL name=gcl key=gcl_key}
|
||||
<li role="presentation">
|
||||
<a id="{$gcl_key}_link"
|
||||
href="{$GCL.URL}"
|
||||
{if !empty($GCL.ONCLICK)}
|
||||
onclick="{$GCL.ONCLICK}"
|
||||
{/if}
|
||||
{if !empty($GCL.TARGET)}
|
||||
target="{$GCL.TARGET}"
|
||||
{/if}
|
||||
>{$GCL.LABEL}</a>
|
||||
</li>
|
||||
{/foreach}
|
||||
<li role="presentation"><a role="menuitem" id="logout_link" href='{$LOGOUT_LINK}'
|
||||
class='utilsLink'>{$LOGOUT_LABEL}</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</nav>
|
||||
<!--End Responsive Top Navigation Menu -->
|
||||
{if $THEME_CONFIG.display_sidebar}
|
||||
<!--Start Page Container and Responsive Sidebar -->
|
||||
<div id='sidebar_container' class="container-fluid sidebar_container">
|
||||
|
||||
<a id="buttontoggle" class="buttontoggle"><span></span></a>
|
||||
|
||||
<div {if isset($smarty.cookies.sidebartoggle) && $smarty.cookies.sidebartoggle == 'collapsed'}style="display:none"{/if}
|
||||
class="sidebar">
|
||||
|
||||
<div id="actionMenuSidebar" class="actionMenuSidebar">
|
||||
{foreach from=$moduleTopMenu item=module key=name name=moduleList}
|
||||
{if $name == $MODULE_TAB}
|
||||
<ul>
|
||||
{if isset($shortcutTopMenu.$name) && is_array($shortcutTopMenu)
|
||||
&& count($shortcutTopMenu.$name) > 0}
|
||||
<h2 class="recent_h3">{$APP.LBL_LINK_ACTIONS}</h2>
|
||||
{foreach from=$shortcutTopMenu.$name item=item}
|
||||
{if $item.URL == "-"}
|
||||
<li><a></a><span> </span></li>
|
||||
{else}
|
||||
<li class="actionmenulinks" role="presentation">
|
||||
<a href="{$item.URL}" data-action-name="{$item.MODULE_NAME}">
|
||||
<div class="side-bar-action-icon">
|
||||
<span class="suitepicon suitepicon-action-{$item.MODULE_NAME|lower|replace:'_':'-'}"></span>
|
||||
</div>
|
||||
<div class="actionmenulink">{$item.LABEL}</div>
|
||||
</a>
|
||||
</li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
{/if}
|
||||
</ul>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</div>
|
||||
|
||||
<div id="recentlyViewedSidebar" class="recentlyViewedSidebar">
|
||||
{if is_array($recentRecords) && count($recentRecords) > 0}
|
||||
<h2 class="recent_h3">{$APP.LBL_LAST_VIEWED}</h2>
|
||||
{/if}
|
||||
<ul class="nav nav-pills nav-stacked">
|
||||
{foreach from=$recentRecords item=item name=lastViewed}
|
||||
{if $item.module_name != 'Emails' && $item.module_name != 'InboundEmail' && $item.module_name != 'EmailAddresses'}<!--Check to ensure that recently viewed emails or email addresses are not displayed in the recently viewed panel.-->
|
||||
{if $smarty.foreach.lastViewed.index < 5}
|
||||
<div class="recently_viewed_link_container_sidebar">
|
||||
<li class="recentlinks" role="presentation">
|
||||
<a title="{sugar_translate module=$item.module_name label=LBL_MODULE_NAME}"
|
||||
accessKey="{$smarty.foreach.lastViewed.iteration}"
|
||||
href="{sugar_link module=$item.module_name action='DetailView' record=$item.item_id link_only=1}"
|
||||
class="recent-links-detail">
|
||||
<span class="suitepicon suitepicon-module-{$item.module_name|lower|replace:'_':'-'}"></span>
|
||||
<span>{$item.item_summary_short}</span>
|
||||
</a>
|
||||
{capture assign='access'}{suite_check_access module=$item.module_name action='edit' record=$item.item_id }{/capture}
|
||||
{if $access}
|
||||
<a href="{sugar_link module=$item.module_name action='EditView' record=$item.item_id link_only=1}" class="recent-links-edit"><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a>
|
||||
{/if}
|
||||
</li>
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
<div id="favoritesSidebar" class="favoritesSidebar">
|
||||
{if is_array($favoriteRecords) && count($favoriteRecords) > 0}
|
||||
<h2 class="recent_h3">{$APP.LBL_FAVORITES}</h2>
|
||||
{/if}
|
||||
<ul class="nav nav-pills nav-stacked">
|
||||
{foreach from=$favoriteRecords item=item name=lastViewed}
|
||||
{if $smarty.foreach.lastViewed.index < 5}
|
||||
<div class="recently_viewed_link_container_sidebar">
|
||||
<li class="recentlinks" role="presentation">
|
||||
<a title="{sugar_translate module=$item.module_name label=LBL_MODULE_NAME}" accessKey="{$smarty.foreach.lastViewed.iteration}" href="{sugar_link module=$item.module_name action='DetailView' record=$item.id link_only=1}" class="favorite-links-detail">
|
||||
<span class="suitepicon suitepicon-module-{$item.module_name|lower|replace:'_':'-'}"></span>
|
||||
<span aria-hidden="true">{$item.item_summary_short}</span>
|
||||
</a>
|
||||
{capture assign='access'}{suite_check_access module=$item.module_name action='edit' record=$item.id }{/capture}
|
||||
{if $access}
|
||||
<a href="{sugar_link module=$item.module_name action='EditView' record=$item.id link_only=1}" class="favorite-links-edit"><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span></a>
|
||||
{/if}
|
||||
</li>
|
||||
</div>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!--</div>-->
|
||||
</div>
|
||||
<!--End Responsive Sidebar -->
|
||||
{/if}
|
||||
<!--Start Page content -->
|
Loading…
Add table
Add a link
Reference in a new issue