Skip to content

Commit

Permalink
Support a multiple select for activity types to include & exclude
Browse files Browse the repository at this point in the history
  • Loading branch information
eileenmcnaughton committed Mar 28, 2019
1 parent 3c6f1a0 commit c1d3e30
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 10 deletions.
4 changes: 2 additions & 2 deletions CRM/Activity/Form/ActivityFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public function buildQuickForm() {
$activityOptions = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, FALSE, 'label', TRUE);
asort($activityOptions);

$this->add('select', 'activity_type_filter_id', ts('Include'), array('' => ts('- all activity type(s) -')) + $activityOptions);
$this->add('select', 'activity_type_exclude_filter_id', ts('Exclude'), array('' => ts('- select activity type -')) + $activityOptions);
$this->add('select', 'activity_type_filter_id', ts('Include'), $activityOptions, FALSE, ['class' => 'crm-select2', 'multiple' => TRUE, 'placeholder' => ts('- all activity type(s) -')]);
$this->add('select', 'activity_type_exclude_filter_id', ts('Exclude'), $activityOptions, FALSE, ['class' => 'crm-select2', 'multiple' => TRUE, 'placeholder' => ts('- no types excluded -')]);
$this->addDatePickerRange('activity_date_time', ts('Date'));
$this->addSelect('status_id',
array('entity' => 'activity', 'multiple' => 'multiple', 'option_url' => NULL, 'placeholder' => ts('- any -'))
Expand Down
5 changes: 1 addition & 4 deletions CRM/Activity/Page/AJAX.php
Original file line number Diff line number Diff line change
Expand Up @@ -437,17 +437,14 @@ public static function getContactActivity() {
$formSearchField = 'activity_type_exclude_filter_id';
}
if (!empty($params[$searchField])) {
$activityFilter[$formSearchField] = CRM_Utils_Type::escape($params[$searchField], $dataType);
$activityFilter[$formSearchField] = $params[$searchField];
if (in_array($searchField, array('activity_date_time_low', 'activity_date_time_high'))) {
$activityFilter['activity_date_time_relative'] = 0;
}
elseif ($searchField == 'activity_status_id') {
$activityFilter['status_id'] = explode(',', $activityFilter[$searchField]);
}
}
elseif (in_array($searchField, array('activity_type_id', 'activity_type_exclude_id'))) {
$activityFilter[$formSearchField] = '';
}
}

Civi::contactSettings()->set('activity_tab_filter', $activityFilter);
Expand Down
9 changes: 8 additions & 1 deletion CRM/Core/Page/AJAX.php
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,14 @@ public static function validateParams($requiredParams = array(), $optionalParams

foreach ($optionalParams as $param => $type) {
if (CRM_Utils_Array::value($param, $_GET)) {
$params[$param] = CRM_Utils_Type::validate(CRM_Utils_Array::value($param, $_GET), $type);
if (!is_array($_GET[$param])) {
$params[$param] = CRM_Utils_Type::validate(CRM_Utils_Array::value($param, $_GET), $type);
}
else {
foreach ($_GET[$param] as $index => $value) {
$params[$param][$index] = CRM_Utils_Type::validate($value, $type);
}
}
}
}

Expand Down
4 changes: 1 addition & 3 deletions tests/phpunit/CRM/Activity/BAO/ActivityTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,6 @@ public function testActivityFilters() {
);
$expectedFilters = array(
'activity_type_filter_id' => 1,
'activity_type_exclude_filter_id' => '',
);

list($activities, $activityFilter) = CRM_Activity_Page_AJAX::getContactActivity();
Expand All @@ -414,11 +413,10 @@ public function testActivityFilters() {
$this->assertContains('Meeting', $value['activity_type']);
}
unset($_GET['activity_type_id']);
$expectedFilters['activity_type_filter_id'] = '';

$_GET['activity_type_exclude_id'] = $expectedFilters['activity_type_exclude_filter_id'] = 1;
list($activities, $activityFilter) = CRM_Activity_Page_AJAX::getContactActivity();
$this->checkArrayEquals($expectedFilters, $activityFilter);
$this->assertEquals(['activity_type_exclude_filter_id' => 1], $activityFilter);
// None of the activities should be of type Meeting.
foreach ($activities['data'] as $value) {
$this->assertNotContains('Meeting', $value['activity_type']);
Expand Down

0 comments on commit c1d3e30

Please sign in to comment.