Commit 5bac4a0f authored by catch's avatar catch
Browse files

Issue #3073518 by mohit_aghera, rkostov, Eugene Bocharov, rensingh99,...

Issue #3073518 by mohit_aghera, rkostov, Eugene Bocharov, rensingh99, wturrell, smustgrave, quietone, pameeela: 'Is not equal to' operator ignored on exposed, grouped filter

(cherry picked from commit 3e4a47a1)
parent 1d7d7d98
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -1400,13 +1400,17 @@ public function convertExposedInput(&$input, $selected_group_id = NULL) {
        return FALSE;
      }
      if (isset($selected_group) && isset($this->options['group_info']['group_items'][$selected_group])) {
        $input[$this->options['expose']['operator']] = $this->options['group_info']['group_items'][$selected_group]['operator'];
        $selected_group_options = $this->options['group_info']['group_items'][$selected_group];

        $operator_id = $this->options['expose']['operator'];
        $input[$operator_id] = $selected_group_options['operator'];
        $this->options['expose']['operator_id'] = $operator_id;
        $this->options['expose']['use_operator'] = TRUE;

        // Value can be optional, For example for 'empty' and 'not empty' filters.
        if (isset($this->options['group_info']['group_items'][$selected_group]['value']) && $this->options['group_info']['group_items'][$selected_group]['value'] !== '') {
          $input[$this->options['group_info']['identifier']] = $this->options['group_info']['group_items'][$selected_group]['value'];
        if (isset($selected_group_options['value']) && $selected_group_options['value'] !== '') {
          $input[$this->options['group_info']['identifier']] = $selected_group_options['value'];
        }
        $this->options['expose']['use_operator'] = TRUE;

        $this->group_info = $input[$this->options['group_info']['identifier']];
        return TRUE;
+191 −0
Original line number Diff line number Diff line
langcode: en
status: true
dependencies:
  module:
    - node
    - user
id: test_boolean_grouped_filter_view
label: 'Test Boolean Grouped Filter View'
module: views
description: ''
tag: ''
base_table: node_field_data
base_field: nid
display:
  default:
    id: default
    display_title: Default
    display_plugin: default
    position: 0
    display_options:
      fields:
        title:
          id: title
          table: node_field_data
          field: title
          relationship: none
          group_type: group
          admin_label: ''
          entity_type: node
          entity_field: title
          plugin_id: field
          label: ''
          exclude: false
          alter:
            alter_text: false
            make_link: false
            absolute: false
            word_boundary: false
            ellipsis: false
            strip_tags: false
            trim: false
            html: false
          element_type: ''
          element_class: ''
          element_label_type: ''
          element_label_class: ''
          element_label_colon: true
          element_wrapper_type: ''
          element_wrapper_class: ''
          element_default_classes: true
          empty: ''
          hide_empty: false
          empty_zero: false
          hide_alter_empty: true
          click_sort_column: value
          type: string
          settings:
            link_to_entity: true
          group_column: value
          group_columns: {  }
          group_rows: true
          delta_limit: 0
          delta_offset: 0
          delta_reversed: false
          delta_first_last: false
          multi_type: separator
          separator: ', '
          field_api_classes: false
      pager:
        type: none
        options:
          offset: 0
      exposed_form:
        type: basic
        options:
          submit_button: Apply
          reset_button: false
          reset_button_label: Reset
          exposed_sorts_label: 'Sort by'
          expose_sort_order: true
          sort_asc_label: Asc
          sort_desc_label: Desc
      access:
        type: perm
        options:
          perm: 'access content'
      cache:
        type: tag
        options: {  }
      empty: {  }
      sorts: {  }
      arguments: {  }
      filters:
        field_test_boolean_field_value:
          id: field_test_boolean_field_value
          table: node__field_test_boolean_field
          field: field_test_boolean_field_value
          relationship: none
          group_type: group
          admin_label: ''
          plugin_id: boolean
          operator: '='
          value: ''
          group: 1
          exposed: true
          expose:
            operator_id: ''
            label: 'Test Boolean Field (field_test_boolean_field)'
            description: null
            use_operator: false
            operator: field_test_boolean_field_value_op
            operator_limit_selection: false
            operator_list: {  }
            identifier: field_test_boolean_field_value
            required: true
            remember: false
            multiple: false
            remember_roles:
              authenticated: authenticated
          is_grouped: true
          group_info:
            label: 'Test Boolean Field (field_test_boolean_field)'
            description: ''
            identifier: field_test_boolean_field_value
            optional: true
            widget: select
            multiple: false
            remember: false
            default_group: All
            default_group_multiple: {  }
            group_items:
              1:
                title: 'True'
                operator: '='
                value: '1'
              2:
                title: 'Not True'
                operator: '!='
                value: '1'
      style:
        type: default
        options:
          grouping: {  }
          row_class: ''
          default_row_class: true
          uses_fields: false
      row:
        type: fields
        options:
          default_field_elements: true
          inline: {  }
          separator: ''
          hide_empty: false
      query:
        type: views_query
        options:
          query_comment: ''
          disable_sql_rewrite: false
          distinct: false
          replica: false
          query_tags: {  }
      relationships: {  }
      header: {  }
      footer: {  }
      display_extenders: {  }
    cache_metadata:
      max-age: -1
      contexts:
        - 'languages:language_content'
        - 'languages:language_interface'
        - url
        - 'user.node_grants:view'
        - user.permissions
      tags: {  }
  page_1:
    id: page_1
    display_title: Page
    display_plugin: page
    position: 1
    display_options:
      display_extenders: {  }
      path: test0page
    cache_metadata:
      max-age: -1
      contexts:
        - 'languages:language_content'
        - 'languages:language_interface'
        - url
        - 'user.node_grants:view'
        - user.permissions
      tags: {  }
+122 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

namespace Drupal\Tests\views\Kernel\Handler;

use Drupal\field\Entity\FieldConfig;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\node\Entity\Node;
use Drupal\node\Entity\NodeType;
use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
use Drupal\views\Views;

/**
 * Tests the core Drupal\views\Plugin\views\filter\BooleanOperator handler.
 *
 * @group views
 * @see \Drupal\views\Plugin\views\filter\BooleanOperator
 */
class FilterBooleanOperatorGroupTest extends ViewsKernelTestBase {

  /**
   * The modules to enable for this test.
   *
   * @var array
   */
  protected static $modules = [
    'system',
    'field',
    'text',
    'node',
    'user',
    'views_test_config',
  ];

  /**
   * Views used by this test.
   *
   * @var array
   */
  public static $testViews = ['test_boolean_grouped_filter_view'];

  /**
   * {@inheritdoc}
   */
  public function setUp($import_test_views = TRUE): void {
    parent::setUp($import_test_views);

    $this->installEntitySchema('node');
    $this->installEntitySchema('user');
    $this->installSchema('node', ['node_access']);
    $this->installConfig(['node']);

    $node_type = NodeType::create(['type' => 'page']);
    $node_type->setDisplaySubmitted(FALSE);
    $node_type->save();

    FieldStorageConfig::create([
      'entity_type' => 'node',
      'type' => 'boolean',
      'field_name' => 'field_test_boolean_field',
    ])->save();
    FieldConfig::create([
      'entity_type' => 'node',
      'bundle' => 'page',
      'field_name' => 'field_test_boolean_field',
    ])->save();

    Node::create([
      'title' => 'Checked',
      'type' => 'page',
      'field_test_boolean_field' => 1,
      'status' => TRUE,
    ])->save();

    Node::create([
      'title' => 'Un-checked',
      'type' => 'page',
      'field_test_boolean_field' => 0,
      'status' => TRUE,
    ])->save();
  }

  /**
   * Tests that grouped boolean exposed form works as expected.
   */
  public function testViewsBooleanGroupedFilter(): void {
    /** @var \Drupal\views\ViewExecutable $view */
    $view = Views::getView('test_boolean_grouped_filter_view');
    $view->setDisplay('page_1');
    $view->setExposedInput(['field_test_boolean_field_value' => 'All']);
    $view->execute();
    $this->assertEquals(2, count($view->result));

    $build = $view->rowPlugin->render($view->result[0]);
    $output = \Drupal::service('renderer')->renderRoot($build);
    $this->assertStringContainsString('Checked', $output->__toString());

    $build = $view->rowPlugin->render($view->result[1]);
    $output = \Drupal::service('renderer')->renderRoot($build);
    $this->assertStringContainsString('Un-checked', $output->__toString());

    $view = Views::getView('test_boolean_grouped_filter_view');
    $view->setDisplay('page_1');
    $view->setExposedInput(['field_test_boolean_field_value' => 1]);
    $view->execute();
    $this->assertEquals(1, count($view->result));
    $build = $view->rowPlugin->render($view->result[0]);
    $output = \Drupal::service('renderer')->renderRoot($build);
    $this->assertStringContainsString('Checked', $output->__toString());

    $view = Views::getView('test_boolean_grouped_filter_view');
    $view->setDisplay('page_1');
    $view->setExposedInput(['field_test_boolean_field_value' => '2']);
    $view->execute();
    $this->assertEquals(1, count($view->result));
    $build = $view->rowPlugin->render($view->result[0]);
    $output = \Drupal::service('renderer')->renderRoot($build);
    $this->assertStringContainsString('Un-checked', $output->__toString());
  }

}