'CiviMail', 'translatedName' => ts('CiviMail'), 'title' => 'CiviCRM Mailing Engine', 'search' => 1, 'showActivitiesInCore' => 1, ); } /** * Get AngularJS modules and their dependencies * * @return array * list of modules; same format as CRM_Utils_Hook::angularModules(&$angularModules) * @see CRM_Utils_Hook::angularModules */ public function getAngularModules() { $result = array(); $result['crmMailing'] = array( 'ext' => 'civicrm', 'js' => array( 'js/angular-crmMailing.js', 'js/angular-crmMailing/*.js', ), 'css' => array('css/angular-crmMailing.css'), 'partials' => array('partials/crmMailing'), ); $result['crmMailingAB'] = array( 'ext' => 'civicrm', 'js' => array( 'js/angular-crmMailingAB.js', 'js/angular-crmMailingAB/*.js', ), 'css' => array('css/angular-crmMailingAB.css'), 'partials' => array('partials/crmMailingAB'), ); $result['crmD3'] = array( 'ext' => 'civicrm', 'js' => array( 'js/angular-crmD3.js', 'bower_components/d3/d3.min.js', ), ); $config = CRM_Core_Config::singleton(); $session = CRM_Core_Session::singleton(); $contactID = $session->get('userID'); // Get past mailings // CRM-16155 - Limit to a reasonable number $civiMails = civicrm_api3('Mailing', 'get', array( 'is_completed' => 1, 'mailing_type' => array('IN' => array('standalone', 'winner')), 'return' => array('id', 'name', 'scheduled_date'), 'sequential' => 1, 'options' => array( 'limit' => 500, 'sort' => 'is_archived asc, scheduled_date desc', ), )); // Generic params $params = array( 'options' => array('limit' => 0), 'sequential' => 1, ); $groupNames = civicrm_api3('Group', 'get', $params + array( 'is_active' => 1, 'return' => array('title', 'visibility', 'group_type', 'is_hidden'), )); $headerfooterList = civicrm_api3('MailingComponent', 'get', $params + array( 'is_active' => 1, 'return' => array('name', 'component_type', 'is_default', 'body_html', 'body_text'), )); $emailAdd = civicrm_api3('Email', 'get', array( 'sequential' => 1, 'return' => "email", 'contact_id' => $contactID, )); // FIXME: Loading the contents of every template into the dom does not scale well $mesTemplate = civicrm_api3('MessageTemplate', 'get', $params + array( 'sequential' => 1, 'is_active' => 1, 'return' => array("msg_html", "id", "msg_title", "msg_subject", "msg_text"), 'workflow_id' => array('IS NULL' => ""), )); $mailGrp = civicrm_api3('MailingGroup', 'get', $params); $mailTokens = civicrm_api3('Mailing', 'gettokens', array( 'entity' => array('contact', 'mailing'), 'sequential' => 1, )); $fromAddress = civicrm_api3('OptionValue', 'get', $params + array( 'option_group_id' => "from_email_address", )); CRM_Core_Resources::singleton() ->addSetting(array( 'crmMailing' => array( 'civiMails' => $civiMails['values'], 'campaignEnabled' => in_array('CiviCampaign', $config->enableComponents), 'groupNames' => $groupNames['values'], 'headerfooterList' => $headerfooterList['values'], 'mesTemplate' => $mesTemplate['values'], 'emailAdd' => $emailAdd['values'], 'mailGrp' => $mailGrp['values'], 'mailTokens' => $mailTokens['values'], 'contactid' => $contactID, 'requiredTokens' => CRM_Utils_Token::getRequiredTokens(), 'enableReplyTo' => (int) CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME, 'replyTo'), 'fromAddress' => $fromAddress['values'], 'defaultTestEmail' => civicrm_api3('Contact', 'getvalue', array( 'id' => 'user_contact_id', 'return' => 'email', )), 'visibility' => CRM_Utils_Array::makeNonAssociative(CRM_Core_SelectValues::groupVisibility()), 'workflowEnabled' => CRM_Mailing_Info::workflowEnabled(), ), )) ->addPermissions(array( 'view all contacts', 'access CiviMail', 'create mailings', 'schedule mailings', 'approve mailings', 'delete in CiviMail', )); return $result; } /** * @return bool */ public static function workflowEnabled() { $config = CRM_Core_Config::singleton(); // early exit, since not true for most if (!$config->userSystem->is_drupal || !function_exists('module_exists') ) { return FALSE; } if (!module_exists('rules')) { return FALSE; } $enableWorkflow = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME, 'civimail_workflow', NULL, FALSE ); return ($enableWorkflow && $config->userSystem->is_drupal ) ? TRUE : FALSE; } /** * @inheritDoc * @param bool $getAllUnconditionally * @param bool $descriptions * Whether to return permission descriptions * * @return array */ public function getPermissions($getAllUnconditionally = FALSE, $descriptions = FALSE) { $permissions = array( 'access CiviMail' => array( ts('access CiviMail'), ), 'access CiviMail subscribe/unsubscribe pages' => array( ts('access CiviMail subscribe/unsubscribe pages'), ts('Subscribe/unsubscribe from mailing list group'), ), 'delete in CiviMail' => array( ts('delete in CiviMail'), ts('Delete Mailing'), ), 'view public CiviMail content' => array( ts('view public CiviMail content'), ), ); if (self::workflowEnabled() || $getAllUnconditionally) { $permissions[] = array( 'create mailings' => array( ts('create mailings'), ), ); $permissions[] = array( 'schedule mailings' => array( ts('schedule mailings'), ), ); $permissions[] = array( 'approve mailings' => array( ts('approve mailings'), ), ); } if (!$descriptions) { foreach ($permissions as $name => $attr) { $permissions[$name] = array_shift($attr); } } return $permissions; } /** * @inheritDoc * @return null */ public function getUserDashboardElement() { // no dashboard element for this component return NULL; } /** * @return null */ public function getUserDashboardObject() { // no dashboard element for this component return NULL; } /** * @inheritDoc * @return array */ public function registerTab() { return array( 'title' => ts('Mailings'), 'id' => 'mailing', 'url' => 'mailing', 'weight' => 45, ); } /** * @inheritDoc * @return array */ public function registerAdvancedSearchPane() { return array( 'title' => ts('Mailings'), 'weight' => 20, ); } /** * @inheritDoc * @return null */ public function getActivityTypes() { return NULL; } /** * add shortcut to Create New. * @param $shortCuts */ public function creatNewShortcut(&$shortCuts) { } }