mirror of
https://github.com/SuiteCRM/SuiteCRM-Core.git
synced 2025-08-29 08:17:18 +08:00
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
771 lines
31 KiB
PHP
Executable file
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']} ({$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[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']);
|
|
}
|
|
}
|
|
}
|
|
}
|