mirror of
https://github.com/salesagility/SuiteCRM.git
synced 2024-11-21 23:47:57 +00:00
773 lines
31 KiB
PHP
Executable File
773 lines
31 KiB
PHP
Executable File
<?php
|
|
/**
|
|
*
|
|
* 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".
|
|
*/
|
|
|
|
if (!defined('sugarEntry') || !sugarEntry) {
|
|
die('Not A Valid Entry Point');
|
|
}
|
|
|
|
require_once('include/ListView/ListViewData.php');
|
|
require_once('include/MassUpdate.php');
|
|
|
|
class ListViewDisplay
|
|
{
|
|
public static $listViewCounter = 0;
|
|
|
|
public $show_mass_update_form = false;
|
|
public $show_action_dropdown = true;
|
|
|
|
public $rowCount;
|
|
public $mass = null;
|
|
public $seed;
|
|
public $multi_select_popup;
|
|
public $lvd;
|
|
public $moduleString;
|
|
public $export = true;
|
|
public $multiSelect = true;
|
|
public $mailMerge = true;
|
|
public $should_process = true;
|
|
public $show_plus = false;
|
|
/*
|
|
* Used in view.popup.php. Sometimes there are fields on the search form that are not referenced in the listviewdefs. If this
|
|
* is the case, then the filterFields will be set and the related fields will not be referenced when calling create_new_list_query.
|
|
*/
|
|
public $mergeDisplayColumns = false;
|
|
public $actionsMenuExtraItems = array();
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct()
|
|
{
|
|
$this->lvd = new ListViewData();
|
|
$this->searchColumns = array() ;
|
|
}
|
|
|
|
|
|
|
|
|
|
public function shouldProcess($moduleDir)
|
|
{
|
|
$searching = false;
|
|
$sessionSearchQuery = "{$moduleDir}2_QUERY_QUERY";
|
|
if (!empty($_SESSION[$sessionSearchQuery])) {
|
|
$searching = true;
|
|
}
|
|
if (!empty($GLOBALS['sugar_config']['save_query']) && $GLOBALS['sugar_config']['save_query'] == 'populate_only') {
|
|
if (empty($GLOBALS['displayListView'])
|
|
&& (!empty($_REQUEST['clear_query'])
|
|
|| $_REQUEST['module'] == $moduleDir
|
|
&& ((empty($_REQUEST['query']) || $_REQUEST['query'] == 'MSI')
|
|
&& (!$searching)))) {
|
|
$_SESSION['last_search_mod'] = $_REQUEST['module'] ;
|
|
$this->should_process = false;
|
|
return false;
|
|
}
|
|
}
|
|
$this->should_process = true;
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Setup the class
|
|
* @param SugarBean $seed Seed SugarBean to use
|
|
* @param File $file Template file to use
|
|
* @param string $where
|
|
* @param int $offset :0 offset to start at
|
|
* @param int :-1 $limit
|
|
* @param string []:array() $filter_fields
|
|
* @param array :array() $params Array
|
|
* $params = [
|
|
* 'distinct' => bool Whether to use distinct key word,
|
|
* 'include_custom_fields' => bool :true,
|
|
* 'massupdate' => bool :true Whether a mass update, true by default,
|
|
* 'handleMassupdate' => string :true Have massupdate.php handle massupdates?,
|
|
* ]
|
|
* @param string :'id' $id_field
|
|
*/
|
|
public function setup(
|
|
$seed,
|
|
$file,
|
|
$where,
|
|
$params = array(),
|
|
$offset = 0,
|
|
$limit = -1,
|
|
$filter_fields = array(),
|
|
$id_field = 'id',
|
|
$id = null
|
|
) {
|
|
$this->should_process = true;
|
|
if (isset($seed->module_dir) && !$this->shouldProcess($seed->module_dir)) {
|
|
return false;
|
|
}
|
|
if (isset($params['export'])) {
|
|
$this->export = $params['export'];
|
|
}
|
|
if (!empty($params['multiSelectPopup'])) {
|
|
$this->multi_select_popup = $params['multiSelectPopup'];
|
|
}
|
|
if (!empty($params['massupdate']) && $params['massupdate'] != false) {
|
|
$this->show_mass_update_form = true;
|
|
$this->mass = $this->getMassUpdate();
|
|
$this->mass->setSugarBean($seed);
|
|
if (!empty($params['handleMassupdate']) || !isset($params['handleMassupdate'])) {
|
|
$this->mass->handleMassUpdate();
|
|
}
|
|
}
|
|
$this->seed = $seed;
|
|
|
|
$filter_fields = $this->setupFilterFields($filter_fields);
|
|
|
|
$data = $this->lvd->getListViewData(
|
|
$seed,
|
|
$where,
|
|
$offset,
|
|
$limit,
|
|
$filter_fields,
|
|
$params,
|
|
$id_field,
|
|
true,
|
|
$id
|
|
);
|
|
|
|
$this->fillDisplayColumnsWithVardefs();
|
|
|
|
$this->process($file, $data, $seed->object_name);
|
|
|
|
return true;
|
|
}
|
|
|
|
public function setupFilterFields($filter_fields = array())
|
|
{
|
|
// create filter fields based off of display columns
|
|
if (empty($filter_fields) || $this->mergeDisplayColumns) {
|
|
if (!is_array($this->displayColumns)) {
|
|
LoggerManager::getLogger()->warn('displayColumns is not an array');
|
|
}
|
|
|
|
foreach ((array)$this->displayColumns as $columnName => $def) {
|
|
$filter_fields[strtolower($columnName)] = true;
|
|
|
|
if (isset($this->seed->field_defs[strtolower($columnName)]['type']) &&
|
|
strtolower($this->seed->field_defs[strtolower($columnName)]['type']) == 'currency' &&
|
|
isset($this->seed->field_defs['currency_id'])) {
|
|
$filter_fields['currency_id'] = true;
|
|
}
|
|
|
|
if (!empty($def['related_fields'])) {
|
|
foreach ($def['related_fields'] as $field) {
|
|
//id column is added by query construction function. This addition creates duplicates
|
|
//and causes issues in oracle. #10165
|
|
if ($field != 'id') {
|
|
$filter_fields[$field] = true;
|
|
}
|
|
}
|
|
}
|
|
if (!empty($this->seed->field_defs[strtolower($columnName)]['db_concat_fields'])) {
|
|
foreach ($this->seed->field_defs[strtolower($columnName)]['db_concat_fields'] as $index=>$field) {
|
|
if (!isset($filter_fields[strtolower($field)]) || !$filter_fields[strtolower($field)]) {
|
|
$filter_fields[strtolower($field)] = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
foreach ($this->searchColumns as $columnName => $def) {
|
|
$filter_fields[strtolower($columnName)] = true;
|
|
}
|
|
}
|
|
|
|
|
|
return $filter_fields;
|
|
}
|
|
|
|
/**
|
|
* Any additional processing
|
|
*
|
|
* @param $file (legacy, unused) File template file to use
|
|
* @param array $data array row data
|
|
* @param string $htmlVar html string to be passed back and forth
|
|
* @return bool
|
|
*/
|
|
public function process($file, $data, $htmlVar)
|
|
{
|
|
if (!is_array($data)) {
|
|
LoggerManager::getLogger()->warn('Row data must be an array, ' . gettype($data) . ' given.');
|
|
$data = [];
|
|
} else if (is_array($data) && !is_array($data['data'])) {
|
|
LoggerManager::getLogger()->warn('Row data must be an array, ' . gettype($data['data']) . ' given and converting to an array.');
|
|
}
|
|
$this->rowCount = count((array)($data['data'] ?? []));
|
|
if (!isset($data['pageData']['bean'])) {
|
|
$GLOBALS['log']->warn("List view process error: Invalid data, bean is not set");
|
|
return false;
|
|
}
|
|
$this->moduleString = ($data['pageData']['bean']['moduleDir'] ?? '') . '2_' . strtoupper($htmlVar) . '_offset';
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Display the listview
|
|
* @return string ListView contents
|
|
*/
|
|
public function display()
|
|
{
|
|
if (!$this->should_process) {
|
|
return '';
|
|
}
|
|
|
|
$str = '';
|
|
if ($this->show_mass_update_form) {
|
|
$str = $this->mass->getDisplayMassUpdateForm(true, $this->multi_select_popup).$this->mass->getMassUpdateFormHeader($this->multi_select_popup);
|
|
}
|
|
|
|
return $str;
|
|
}
|
|
/**
|
|
* Display the select link
|
|
* @return string select link html
|
|
* @param echo Bool set true if you want it echo'd, set false to have contents returned
|
|
*/
|
|
public function buildSelectLink($id = 'select_link', $total=0, $pageTotal=0, $location="top")
|
|
{
|
|
global $app_strings;
|
|
if ($pageTotal < 0) {
|
|
$pageTotal = $total;
|
|
}
|
|
|
|
|
|
$total_label = "";
|
|
if (!empty($GLOBALS['sugar_config']['disable_count_query']) && $GLOBALS['sugar_config']['disable_count_query'] === true && $total > $pageTotal) {
|
|
$this->show_plus = true;
|
|
$total_label = $pageTotal.'+';
|
|
$total = $pageTotal;
|
|
} else {
|
|
$total_label = $total;
|
|
}
|
|
|
|
$close_inline_img = SugarThemeRegistry::current()->getImage('close_inline', 'border=0', null, null, ".gif", $app_strings['LBL_CLOSEINLINE']);
|
|
$selectObjectSpan = $this->buildSelectedObjectsSpan();
|
|
$menuItems = array(
|
|
"<label class=\"hidden glyphicon bootstrap-checkbox glyphicon-unchecked\"><span class='suitepicon suitepicon-action-caret'></span></label><input title=\"".$app_strings['LBL_SELECT_ALL_TITLE']."\" type='checkbox' class='bootstrap-checkbox-hidden checkbox massall' name='massall' id='massall_".$location."' value='' onclick='sListView.check_all(document.MassUpdate, \"mass[]\", this.checked);' />$selectObjectSpan<a id='$id' href='javascript: void(0);'></a>",
|
|
"<a name='thispage' id='button_select_this_page_".$location."' class='menuItem' onmouseover='hiliteItem(this,\"yes\");' onmouseout='unhiliteItem(this);' onclick='sListView.check_all(document.MassUpdate, \"mass[]\", true, $pageTotal);' href='#'>{$app_strings['LBL_LISTVIEW_OPTION_CURRENT']} ({$pageTotal})‎</a>",
|
|
"<a name='selectall' id='button_select_all_".$location."' class='menuItem' onmouseover='hiliteItem(this,\"yes\");' onmouseout='unhiliteItem(this);' onclick='sListView.check_entire_list(document.MassUpdate, \"mass[]\",true,{$total});' href='#'>{$app_strings['LBL_LISTVIEW_OPTION_ENTIRE']} ({$total_label})‎</a>",
|
|
"<a name='deselect' id='button_deselect_".$location."' class='menuItem' onmouseover='hiliteItem(this,\"yes\");' onmouseout='unhiliteItem(this);' onclick='sListView.clear_all(document.MassUpdate, \"mass[]\", false);' href='#'>{$app_strings['LBL_LISTVIEW_NONE']}</a>",
|
|
);
|
|
|
|
$link = array(
|
|
'class' => 'clickMenu selectmenu',
|
|
'id' => 'selectLink',
|
|
'buttons' => $menuItems,
|
|
'flat' => false,
|
|
);
|
|
return $link;
|
|
}
|
|
|
|
/**
|
|
* Display the actions link
|
|
*
|
|
* @param string $id link id attribute, defaults to 'actions_link'
|
|
* @global $app_strings
|
|
* @global $mod_strings
|
|
* @return string HTML source
|
|
*/
|
|
protected function buildActionsLink($id = 'actions_link', $location = 'top')
|
|
{
|
|
global $app_strings;
|
|
global $mod_strings;
|
|
|
|
$closeText = SugarThemeRegistry::current()->getImage(
|
|
'close_inline',
|
|
'border=0',
|
|
null,
|
|
null,
|
|
".gif",
|
|
$app_strings['LBL_CLOSEINLINE']
|
|
);
|
|
$moreDetailImage = SugarThemeRegistry::current()->getImageURL('MoreDetail.png');
|
|
$menuItems = array();
|
|
|
|
if (isset($this->templateMeta['form']['actions'])) {
|
|
// override bulk actions
|
|
foreach ($this->templateMeta['form']['actions'] as $action) {
|
|
if (isset($action['customCode'])) {
|
|
$template = new Sugar_Smarty();
|
|
$template->assign('APP', $app_strings);
|
|
$template->assign('MOD', $mod_strings);
|
|
$template->assign('id', $id);
|
|
$template->assign('location', $location);
|
|
$template->assign('customCode', $action['customCode']);
|
|
|
|
$menuItems[] = $template->fetch("include/ListView/ListViewEval.tpl");
|
|
}
|
|
}
|
|
} else {
|
|
// Bulk Action label
|
|
$menuItems[] = $this->buildBulkActionButton($location);
|
|
|
|
// Compose email
|
|
if (isset($this->email) && $this->email === true) {
|
|
$menuItems[] = $this->buildComposeEmailLink($this->data['pageData']['offsets']['total'], $location);
|
|
}
|
|
|
|
// mass update
|
|
$mass = $this->getMassUpdate();
|
|
$mass->setSugarBean($this->seed);
|
|
if (
|
|
(
|
|
ACLController::checkAccess($this->seed->module_dir, 'edit', true)
|
|
&& ACLController::checkAccess($this->seed->module_dir, 'massupdate', true)
|
|
)
|
|
&& $this->showMassupdateFields && $mass->doMassUpdateFieldsExistForFocus()
|
|
) {
|
|
$menuItems[] = $this->buildMassUpdateLink($location);
|
|
}
|
|
|
|
// merge
|
|
if ($this->mailMerge) {
|
|
$menuItems[] = $this->buildMergeLink(null, $location);
|
|
}
|
|
|
|
if ($this->mergeduplicates) {
|
|
$menuItems[] = $this->buildMergeDuplicatesLink($location);
|
|
}
|
|
|
|
// add to target list
|
|
if (
|
|
$this->targetList
|
|
&& ACLController::checkAccess('ProspectLists', 'edit', true)
|
|
) {
|
|
$menuItems[] = $this->buildTargetList($location);
|
|
}
|
|
|
|
// export
|
|
if (
|
|
ACLController::checkAccess($this->seed->module_dir, 'export', true)
|
|
&& $this->export
|
|
) {
|
|
$menuItems[] = $this->buildExportLink($location);
|
|
}
|
|
|
|
foreach ($this->actionsMenuExtraItems as $item) {
|
|
$menuItems[] = $item;
|
|
}
|
|
|
|
|
|
if (
|
|
$this->delete &&
|
|
ACLController::checkAccess($this->seed->module_dir, 'delete', true)
|
|
) {
|
|
$menuItems[] = $this->buildDeleteLink($location);
|
|
} else {
|
|
$menuItems[] = "<a style='display:none'></a>";
|
|
}
|
|
}
|
|
$link = array(
|
|
'class' => 'clickMenu selectActions fancymenu',
|
|
'id' => 'selectActions',
|
|
'name' => 'selectActions',
|
|
'buttons' => $menuItems,
|
|
'flat' => false,
|
|
);
|
|
return $link;
|
|
}
|
|
/**
|
|
* Builds the export link
|
|
*
|
|
* @return string HTML
|
|
*/
|
|
protected function buildExportLink($loc = 'top')
|
|
{
|
|
global $app_strings;
|
|
return "<a href='javascript:void(0)' class=\"parent-dropdown-action-handler\" id=\"export_listview_". $loc ." \" onclick=\"return sListView.send_form(true, '{$this->seed->module_dir}', 'index.php?entryPoint=export','{$app_strings['LBL_LISTVIEW_NO_SELECTED']}')\">{$app_strings['LBL_EXPORT']}</a>";
|
|
}
|
|
|
|
/**
|
|
* Builds the massupdate link
|
|
*
|
|
* @return string HTML
|
|
*/
|
|
protected function buildMassUpdateLink($loc = 'top')
|
|
{
|
|
global $app_strings;
|
|
|
|
$onClick = "document.getElementById('massupdate_form').style.display = ''; var yLoc = YAHOO.util.Dom.getY('massupdate_form'); scroll(0,yLoc);";
|
|
return "<a href='javascript:void(0)' class=\"parent-dropdown-action-handler\" id=\"massupdate_listview_". $loc ."\" onclick=\"$onClick\">{$app_strings['LBL_MASS_UPDATE']}</a>";
|
|
}
|
|
|
|
/**
|
|
* Builds the compose email link
|
|
*
|
|
* @param int $totalCount
|
|
* @param string $loc
|
|
* @global
|
|
* @return string HTML
|
|
*/
|
|
protected function buildComposeEmailLink($totalCount, $loc = 'top')
|
|
{
|
|
global $app_strings;
|
|
global $dictionary;
|
|
|
|
if (!is_array($this->seed->field_defs)) {
|
|
return '';
|
|
}
|
|
|
|
$foundEmailField = false;
|
|
// Search for fields that look like an email address
|
|
foreach ($this->seed->field_defs as $field) {
|
|
if (
|
|
isset($field['type'])
|
|
&& $field['type'] === 'link'
|
|
&& isset($field['relationship'])
|
|
&& isset($dictionary[$this->seed->object_name]['relationships'][$field['relationship']])
|
|
&& $dictionary[$this->seed->object_name]['relationships'][$field['relationship']]['rhs_module'] === 'EmailAddresses'
|
|
) {
|
|
$foundEmailField = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!$foundEmailField) {
|
|
return '';
|
|
}
|
|
|
|
|
|
$client = $GLOBALS['current_user']->getEmailClient();
|
|
|
|
if ($client === 'sugar') {
|
|
require_once 'modules/Emails/EmailUI.php';
|
|
$emailUI = new EmailUI();
|
|
$script = $emailUI->createBulkActionEmailLink();
|
|
} else {
|
|
$script = "<a href='javascript:void(0)' " .
|
|
"class=\"parent-dropdown-action-handler\" id=\"composeemail_listview_" . $loc . "\"" .
|
|
"onclick=\"return sListView.use_external_mail_client('{$app_strings['LBL_LISTVIEW_NO_SELECTED']}', '{$_REQUEST['module']}');\">" .
|
|
$app_strings['LBL_EMAIL_COMPOSE'] . '</a>';
|
|
}
|
|
|
|
return $script;
|
|
} // fn
|
|
/**
|
|
* Builds the delete link
|
|
*
|
|
* @return string HTML
|
|
*/
|
|
protected function buildDeleteLink($loc = 'top')
|
|
{
|
|
global $app_strings;
|
|
return "<a href='javascript:void(0)' class=\"parent-dropdown-action-handler\" id=\"delete_listview_". $loc ."\" onclick=\"return sListView.send_mass_update('selected', '{$app_strings['LBL_LISTVIEW_NO_SELECTED']}', 1)\">{$app_strings['LBL_DELETE_BUTTON_LABEL']}</a>";
|
|
}
|
|
|
|
/**
|
|
* Generate Bulk Action button
|
|
*
|
|
* @param string $loc position on list view
|
|
* @return string HTML of Bulk Action Button
|
|
*/
|
|
protected function buildBulkActionButton($loc = 'top')
|
|
{
|
|
global $app_strings;
|
|
return "<a href='javascript:void(0)' class=\"parent-dropdown-handler\" id=\"delete_listview_". $loc ."\" onclick=\"return false;\"><label class=\"selected-actions-label hidden-mobile\">{$app_strings['LBL_BULK_ACTION_BUTTON_LABEL_MOBILE']}<span class='suitepicon suitepicon-action-caret'></span></label><label class=\"selected-actions-label hidden-desktop\">{$app_strings['LBL_BULK_ACTION_BUTTON_LABEL']}<span class='suitepicon suitepicon-action-caret'></span></label></a>";
|
|
}
|
|
|
|
/**
|
|
* Display the selected object span object
|
|
*
|
|
* @return string select object span
|
|
*/
|
|
public function buildSelectedObjectsSpan($echo = true, $total=0)
|
|
{
|
|
global $app_strings;
|
|
|
|
$displayStyle = $total > 0 ? "" : "display: none;";
|
|
$template = new Sugar_Smarty();
|
|
|
|
$template->assign('DISPLAY_STYLE', $displayStyle);
|
|
$template->assign('APP', $app_strings);
|
|
$template->assign('TOTAL_ITEMS_SELECTED', $total);
|
|
$selectedObjectSpan = $template->fetch('include/ListView/ListViewSelectObjects.tpl');
|
|
|
|
return $selectedObjectSpan;
|
|
}
|
|
/**
|
|
* Builds the mail merge link
|
|
* The link can be disabled by setting module level duplicate_merge property to false
|
|
* in the moudle's vardef file.
|
|
*
|
|
* @return string HTML
|
|
*/
|
|
protected function buildMergeDuplicatesLink($loc = 'top')
|
|
{
|
|
global $app_strings, $dictionary;
|
|
|
|
$return_string='';
|
|
$return_string.= isset($_REQUEST['module']) ? "&return_module={$_REQUEST['module']}" : "";
|
|
$return_string.= isset($_REQUEST['action']) ? "&return_action={$_REQUEST['action']}" : "";
|
|
$return_string.= isset($_REQUEST['record']) ? "&return_id={$_REQUEST['record']}" : "";
|
|
//need delete and edit access.
|
|
if (!(ACLController::checkAccess($this->seed->module_dir, 'edit', true)) or !(ACLController::checkAccess($this->seed->module_dir, 'delete', true))) {
|
|
return "";
|
|
}
|
|
|
|
if (isset($dictionary[$this->seed->object_name]['duplicate_merge']) && $dictionary[$this->seed->object_name]['duplicate_merge']==true) {
|
|
return "<a href='javascript:void(0)' ".
|
|
"class=\"parent-dropdown-action-handler\" id='mergeduplicates_listview_". $loc ."'".
|
|
"onclick='if (sugarListView.get_checks_count()> 1) {sListView.send_form(true, \"MergeRecords\", \"index.php\", \"{$app_strings['LBL_LISTVIEW_NO_SELECTED']}\", \"{$this->seed->module_dir}\",\"$return_string\");} else {alert(\"{$app_strings['LBL_LISTVIEW_TWO_REQUIRED']}\");return false;}'>".
|
|
$app_strings['LBL_MERGE_DUPLICATES'].'</a>';
|
|
}
|
|
|
|
return "";
|
|
}
|
|
/**
|
|
* Builds the mail merge link
|
|
*
|
|
* @return string HTML
|
|
*/
|
|
protected function buildMergeLink(array $modules_array = null, $loc = 'top')
|
|
{
|
|
if (empty($modules_array)) {
|
|
require('modules/MailMerge/modules_array.php');
|
|
}
|
|
global $current_user, $app_strings;
|
|
|
|
$admin = BeanFactory::newBean('Administration');
|
|
$admin->retrieveSettings('system');
|
|
$user_merge = $current_user->getPreference('mailmerge_on');
|
|
$module_dir = (!empty($this->seed->module_dir) ? $this->seed->module_dir : '');
|
|
$str = '';
|
|
|
|
if ($user_merge == 'on' && isset($admin->settings['system_mailmerge_on']) && $admin->settings['system_mailmerge_on'] && !empty($modules_array[$module_dir])) {
|
|
return "<a href='javascript:void(0)' " .
|
|
"id='merge_listview_". $loc ."'" .
|
|
'onclick="if (document.MassUpdate.select_entire_list.value==1){document.location.href=\'index.php?action=index&module=MailMerge&entire=true\'} else {return sListView.send_form(true, \'MailMerge\',\'index.php\',\''.$app_strings['LBL_LISTVIEW_NO_SELECTED'].'\');}">' .
|
|
$app_strings['LBL_MAILMERGE'].'</a>';
|
|
}
|
|
return $str;
|
|
}
|
|
|
|
/**
|
|
* Builds the add to target list link
|
|
*
|
|
* @return string HTML
|
|
*/
|
|
protected function buildTargetList($loc = 'top')
|
|
{
|
|
global $app_strings;
|
|
unset($_REQUEST[session_name()]);
|
|
unset($_REQUEST['PHPSESSID']);
|
|
$current_query_by_page = htmlentities(json_encode($_REQUEST));
|
|
|
|
$js = <<<EOF
|
|
if(sugarListView.get_checks_count() < 1) {
|
|
alert('{$app_strings['LBL_LISTVIEW_NO_SELECTED']}');
|
|
return false;
|
|
}
|
|
if ( document.forms['targetlist_form'] ) {
|
|
var form = document.forms['targetlist_form'];
|
|
form.reset;
|
|
} else
|
|
var form = document.createElement ( 'form' ) ;
|
|
form.setAttribute ( 'name' , 'targetlist_form' );
|
|
form.setAttribute ( 'method' , 'post' ) ;
|
|
form.setAttribute ( 'action' , 'index.php' );
|
|
document.body.appendChild ( form ) ;
|
|
if ( !form.module ) {
|
|
var input = document.createElement('input');
|
|
input.setAttribute ( 'name' , 'module' );
|
|
input.setAttribute ( 'value' , '{$this->seed->module_dir}' );
|
|
input.setAttribute ( 'type' , 'hidden' );
|
|
form.appendChild ( input ) ;
|
|
var input = document.createElement('input');
|
|
input.setAttribute ( 'name' , 'action' );
|
|
input.setAttribute ( 'value' , 'TargetListUpdate' );
|
|
input.setAttribute ( 'type' , 'hidden' );
|
|
form.appendChild ( input ) ;
|
|
}
|
|
if ( !form.uids ) {
|
|
var input = document.createElement('input');
|
|
input.setAttribute ( 'name' , 'uids' );
|
|
input.setAttribute ( 'type' , 'hidden' );
|
|
form.appendChild ( input ) ;
|
|
}
|
|
if ( !form.prospect_list ) {
|
|
var input = document.createElement('input');
|
|
input.setAttribute ( 'name' , 'prospect_list' );
|
|
input.setAttribute ( 'type' , 'hidden' );
|
|
form.appendChild ( input ) ;
|
|
}
|
|
if ( !form.return_module ) {
|
|
var input = document.createElement('input');
|
|
input.setAttribute ( 'name' , 'return_module' );
|
|
input.setAttribute ( 'type' , 'hidden' );
|
|
form.appendChild ( input ) ;
|
|
}
|
|
if ( !form.return_action ) {
|
|
var input = document.createElement('input');
|
|
input.setAttribute ( 'name' , 'return_action' );
|
|
input.setAttribute ( 'type' , 'hidden' );
|
|
form.appendChild ( input ) ;
|
|
}
|
|
if ( !form.select_entire_list ) {
|
|
var input = document.createElement('input');
|
|
input.setAttribute ( 'name' , 'select_entire_list' );
|
|
input.setAttribute ( 'value', document.MassUpdate.select_entire_list.value);
|
|
input.setAttribute ( 'type' , 'hidden' );
|
|
form.appendChild ( input ) ;
|
|
}
|
|
if ( !form.current_query_by_page ) {
|
|
var input = document.createElement('input');
|
|
input.setAttribute ( 'name' , 'current_query_by_page' );
|
|
input.setAttribute ( 'value', '{$current_query_by_page}' );
|
|
input.setAttribute ( 'type' , 'hidden' );
|
|
form.appendChild ( input ) ;
|
|
}
|
|
open_popup('ProspectLists','600','400','',true,false,{ 'call_back_function':'set_return_and_save_targetlist','form_name':'targetlist_form','field_to_name_array':{'id':'prospect_list'} } );
|
|
EOF;
|
|
$js = str_replace(array("\r","\n"), '', $js);
|
|
return "<a href='javascript:void(0)' class=\"parent-dropdown-action-handler\" id=\"targetlist_listview_". $loc ." \" onclick=\"$js\">{$app_strings['LBL_ADD_TO_PROSPECT_LIST_BUTTON_LABEL']}</a>";
|
|
}
|
|
/**
|
|
* Display the bottom of the ListView (ie MassUpdate
|
|
* @return string contents
|
|
*/
|
|
public function displayEnd()
|
|
{
|
|
$str = '';
|
|
if ($this->show_mass_update_form) {
|
|
$str .= $this->mass->getMassUpdateForm(true);
|
|
$str .= $this->mass->endMassUpdateForm();
|
|
}
|
|
|
|
return $str;
|
|
}
|
|
|
|
/**
|
|
* Display the multi select data box etc.
|
|
* @return string contents
|
|
*/
|
|
public function getMultiSelectData()
|
|
{
|
|
$str = "<script>YAHOO.util.Event.addListener(window, \"load\", sListView.check_boxes);</script>\n";
|
|
|
|
$massUpdateRun = isset($_REQUEST['massupdate']) && $_REQUEST['massupdate'] == 'true';
|
|
$uids = empty($_REQUEST['uid']) || $massUpdateRun ? '' : $_REQUEST['uid'];
|
|
$select_entire_list = ($massUpdateRun) ? 0 : (isset($_POST['select_entire_list']) ? $_POST['select_entire_list'] : (isset($_REQUEST['select_entire_list']) ? $_REQUEST['select_entire_list'] : 0));
|
|
|
|
$str .= "<textarea style='display: none' name='uid'>{$uids}</textarea>\n" .
|
|
"<input type='hidden' name='select_entire_list' value='{$select_entire_list}'>\n".
|
|
"<input type='hidden' name='{$this->moduleString}' value='0'>\n".
|
|
"<input type='hidden' name='show_plus' value='{$this->show_plus}'>\n";
|
|
return $str;
|
|
}
|
|
|
|
/**
|
|
* @return MassUpdate instance
|
|
*/
|
|
protected function getMassUpdate()
|
|
{
|
|
return new MassUpdate();
|
|
}
|
|
|
|
/**
|
|
* Fill displayColumns with additional field values from vardefs of the current bean seed.
|
|
* We need vardefs to be in displayColumns for a further processing (e.g. in SugarField)
|
|
* Similar vardef field values do not override field values from displayColumns, only necessary and missing ones are added
|
|
*/
|
|
protected function fillDisplayColumnsWithVardefs()
|
|
{
|
|
if (!is_array($this->displayColumns)) {
|
|
LoggerManager::getLogger()->warn('displayColumns is not an array');
|
|
}
|
|
|
|
foreach ((array)$this->displayColumns as $columnName => $def) {
|
|
$seedName = strtolower($columnName);
|
|
if (!empty($this->lvd->seed->field_defs[$seedName])) {
|
|
$seedDef = $this->lvd->seed->field_defs[$seedName];
|
|
}
|
|
|
|
if (empty($this->displayColumns[$columnName]['type'])) {
|
|
if (!empty($seedDef['type'])) {
|
|
$this->displayColumns[$columnName]['type'] = (!empty($seedDef['custom_type']))?$seedDef['custom_type']:$seedDef['type'];
|
|
} else {
|
|
$this->displayColumns[$columnName]['type'] = '';
|
|
}
|
|
}//fi empty(...)
|
|
|
|
if (!empty($seedDef['options'])) {
|
|
$this->displayColumns[$columnName]['options'] = $seedDef['options'];
|
|
}
|
|
|
|
//C.L. Fix for 11177
|
|
if ($this->displayColumns[$columnName]['type'] == 'html') {
|
|
$cField = $this->seed->custom_fields;
|
|
if (isset($cField) && isset($cField->bean->$seedName)) {
|
|
$seedName2 = strtoupper($columnName);
|
|
$htmlDisplay = html_entity_decode($cField->bean->$seedName);
|
|
$count = 0;
|
|
while ($count < count($data['data'])) {
|
|
$data['data'][$count][$seedName2] = &$htmlDisplay;
|
|
$count++;
|
|
}
|
|
}
|
|
}//fi == 'html'
|
|
|
|
//Bug 40511, make sure relate fields have the correct module defined
|
|
if ($this->displayColumns[$columnName]['type'] == "relate" && !empty($seedDef['link']) && empty($this->displayColumns[$columnName]['module'])) {
|
|
$link = $seedDef['link'];
|
|
if (!empty($this->lvd->seed->field_defs[$link]) && !empty($this->lvd->seed->field_defs[$seedDef['link']]['module'])) {
|
|
$this->displayColumns[$columnName]['module'] = $this->lvd->seed->field_defs[$seedDef['link']]['module'];
|
|
}
|
|
}
|
|
|
|
if (!empty($seedDef['sort_on'])) {
|
|
$this->displayColumns[$columnName]['orderBy'] = $seedDef['sort_on'];
|
|
}
|
|
|
|
if (isset($seedDef)) {
|
|
// Merge the two arrays together, making sure the seedDef doesn't override anything explicitly set in the displayColumns array.
|
|
$this->displayColumns[$columnName] = $this->displayColumns[$columnName] + $seedDef;
|
|
}
|
|
|
|
//C.L. Bug 38388 - ensure that ['id'] is set for related fields
|
|
if (!isset($this->displayColumns[$columnName]['id']) && isset($this->displayColumns[$columnName]['id_name'])) {
|
|
$this->displayColumns[$columnName]['id'] = strtoupper($this->displayColumns[$columnName]['id_name']);
|
|
}
|
|
}
|
|
}
|
|
}
|