SuiteCRM-Core/include/ListView/ListViewDisplay.php
Clemente Raposo 588534d022 Squashed 'public/legacy/' changes from 4f401678fd..5a66316965
5a66316965 SuiteCRM 7.12.3 Release
1cfaf51831 Fix #9454 - Avoid duplicate results in basic search
7eb52791f1 Fix #9455 - Popup metadata override removed when filtered
a21463bee1 Fix #8155 - Removed Unused PDF Settings
7f3c59f382 Fix #8948 - Make Project Tasks Importable
ac4a1e79a7 Fix #9191 - Add utf normalization repair command
bcb784eef7 Fix #9434 - Cron notion unit test fails
2e4aa8f594 Fix #8309 - Delete button showing for users with no delete access
bf5fe39148 Fix #8525 - Bulk Action label not showing for users without delete access
1a45a93b5c Fix #9398 - Consistently store dropdowns in $app_list_strings rather than $GLOBALS
664b2d5c74 Fix #9406 - Validation displayed static message isn't correct
de192fa845 Fix #9271 - Primary Email property is kept after ading an extra Email address
206db24eaa Fix #9378 - Filter by Email1 Field Through the API
6c39d73580 Fix #9312 - Declaring object within StudioClass to remove Strict Warnings
be2044b341 Fix #9387 - Correct Variable Names
7e3c96d5b4 Fix #9387 - Clean Cron Historic and Failed Jobs
b3e0556482 Fix #9387 - Display Actual Job Result in Subpanel
90b4e0423a Fix issue #9380 where date action in workflow fails to save Add check on if value is array, if is array don't attempt date formatting
864d614945 Fix #9408 - adding fix for deleting emails
7b442f10ca Merge next into suite 8
b522a5acf3 [Legacy] Meeting Module Styling Fixes
4e4d4e7d86 [Legacy] Admin Import Styling Fixes
e320acd63c [Legacy] Popup Selector Styling Fixes
60acfc36f5 [Legacy] Backup Modules Styling Fixes
73cc52ce14 [Legacy] Jotpad Dashlet Styling Fixes
0128df2e63 [Legacy] User Name Longtext styling fixes
f12c72e8f6 [Legacy] Diagnostic Tool Whitespace Styling Fixes
841b16e033 [Legacy] Dashboard Dashlet Styling Fixes
e274de5a58 [Legacy] Scheduler Styling Fixes
0c330bc280 [Legacy] Reports Subpanels Styling Fixes
0730d433b2 [Legacy] Meeting Popup Selector Styling Fixes
a22626df09 [Legacy] Bump version to 8.0.0
ebde6fb8cc [Legacy] Apply set-timezone styling ot the the users set-timezone page
55f1e360df [Legacy] Add name mapping for SetTimezone action
44fa660c65 [Legacy] Define summary templates for contacts, leads, prospects
f363b741f9 [Legacy] Change Contacts detailviewdefs to use full name
8afde55218 [Legacy] Fix .htaccess build to take the full CRM url into account
8373995c26 [Legacy] Admin diagnostic tool styling fixes
03593b259c [Legacy] Disable upgrade wizard in admin
66c9fe4d8f [Legacy] Remove lucene and AOD_index
21f9844286 [Legacy] Fix event invite mod_strings handling
04bdfd8975 [Legacy] Forgot Password Page Styling Fixes
ba459af407 [Legacy] fix redirect from projects subpanel
0f19a141d1 [Legacy] Add Default Link Item Mapper - add relate module injection on backend bean field_defs
efc2083eaf [Legacy] Email Body Styling Fixes
648a1d9350 Merge next into suite 8
a0cfd72ab3 [Legacy] Remove deprecated spots module
103fd1076f [Legacy] Fix capitalized url on user profile calendar options
97fca254bd [Legacy] Re-add user module reset password modal
864c35c4ad [Legacy] Remove echo on user save
169a15a6c9 [Legacy] Close user action dropdown on password reset
e8c400ab24 [Legacy] Fix user triggered password reset
e38f48c6d4 [Legacy] Fix password recovery templates setup on install
927969c9a3 [Legacy] Bump version to 8.0.0-rc.2
b27584577d [Legacy] UserProfile Settings Modal Styling Fixes
2aba88dfe8 [Legacy] Meetings Styling Fixes
13d743e598 [Legacy] Password & System Settings Action Button Fixes
cfb0bcc86d [Legacy] User Setup Modal Styling Fixes
d05f3aa4f5 [Legacy] Fix legacy widget acl definitions
e469e337f8 [Legacy] Suite 8 extensions to legacy plugins
41e84b1d17 [Legacy] Override server variables when doing kernel bypass
7f5d03f280 Merge commit '75ea167930' into suite7merge
c5f43d6c88 [Legacy] Popup Selector Styling Fixes
0445c1c0ab [Legacy] update install language label
eb3fe0472b [Legacy] Dashlet Settings Modal Styling Fixes
6f0918b73d [Legacy] User Profile Mobile Styling Fixes
5af790f7fa [Legacy] Add acls calculation on legacy list data calls
096a59a7cf [Legacy] Get list of visible modules from module name mapper
c2d618e631 Fix valid module check
aa79de3a31 [Legacy] add widget acl metadata - update acl config for top widget
315b554b7e [Legacy] Subpanels Action Button Styling Fixes
c87e66a262 remove photo widgets for contacts and leads
433940a72f [Legacy] Admin Release Styling Fixes
c0a1378873 Suite8 ChangeLog ModalPopup Styling Fixes
aa484f3f9e [Legacy] Add close menu label
8f81b47c65 [Legacy] Add not module selected label
36a0b05eb2 [Legacy] Add parent type ApiBeanMapper
7e02d1d23c [Legacy] Fix username display for unauthorized users
2ea8f210a1 [Legacy] DetailView Header Title Overlaps fixes
2a25edd6c4 [Legacy] Fix htaccess generation
34500ba791 Fix Date Filed for Targets
211ce6bfbb [Legacy] Remove Button Hover Fixes
223adf26bc [Legacy] Reports footer button removed fixes
c567777afe [Legacy] Reports Styling Fixes
6f71ed31c2 [Legacy] Maps Button Position Fixes
c5d5936c22 [Legacy] Add Tab Dashlet Sapcing Fixes
018c11c562 [Legacy] Dashlet Setting Modal Label Fix & Button Fixes
9645c68ca6 [Legacy] Activity Stream Post Button Hover color fixes
445ab52dae [Legacy] Bump version to 8.0.0-rc
e10b872b21 [Legacy] Remove license from install app strings
e5c21ca68c Merge commit 'dd455a1c2d' into legacy_update_2
3886e3cfa6 Fix ignore system checks valitation
415cdd57b0 [Legacy] Add install labels
70ae186de5 [Legacy] add new install labels
7e05e69580 [Legacy] add install validator class
4c4ed83f3d [Legacy] Add Label for Subpanel Edit Line Action
17d8f4e7e9 [Legacy] Dashboard Mobile Styling Fixes
abd914702a [Legacy] History Subpanel Button Styling Fixes
34a0dac449 [Legacy] Workflow Stying Fixes
32c4827895 [Legacy] Convert Lead Styling Fixes
f1ca14c009 [Legacy] Roles Styling Fixes
3dbdce8055 [Legacy] Admin Modules label font fixes
36a38a1c44 [Legacy] HomePage Mobile Fixes
a5b451ab12 update legacy handlers to apply new logic considering - base actions - action resolvers - fix url navigation issue in classic view
87e6e239ce [Legacy] Module framework - move suite 8 module config to legacy
ee973e74f6 [Legacy] Add support for more metadata on listviewdefs
ad312c45fd [Legacy] Add Support for all modules with parent css classes
a409d81e2b [Legacy] Security Group Styling Fixes
5171ae319f [Legacy] Password Management Mobile Fixes
d0eca8193d [Leagcy] Email Settings Fixes
766af5f4e6 [Legacy] Products Modules Buttons fixes
99ec9e30f9 [Legacy] OAUTH2 Clients and tokens fixes
54c962a532 [Legacy] adapt legacy install scripts to work with Suite8 install
d6f20e38e6 [Legacy] add labels for S8 Installer
83b00b6a94 [Legacy] Add widget not found label
3ac807db61 Merge commit '114b895b6d' into merge_develop
1feeb409f8 [Legacy] Email Action DropDown Styling Fixes

git-subtree-dir: public/legacy
git-subtree-split: 5a663169652b57bb561de74a7e3a8051c9330a83
2022-01-26 12:07:37 +00:00

771 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.');
} 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']}&nbsp;&#x28;{$pageTotal}&#x29;&#x200E;</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']}&nbsp;&#x28;{$total_label}&#x29;&#x200E;</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[session_name()]);
$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']);
}
}
}
}