Search code examples
angularjsdrop-down-menuangular-ui-grid

Angular UI Grid: How to create a pre-populated dropdown menu for column filtering


I am looking for some help regarding a feature of the Angular UI Grid. Specifically I am exploring filtering and while I was able to successfully implement sorting using free form text field(s) in my application as they do in the example on their site I would like some help finding a way to instead sort using a pre-populated drop-down menu for certain columns.

To clarify: By pre-populated I mean I would like the drop-down to be populated through my code. I am ok if the solution contains hard-coded data but my eventual goal would be to have the pre-population be comprised of the unique data value set of the column being sorted :)

I have seen this functionality in (for example) the Kendo UI (kendodropdownlist) but I am not interested in the price tag that comes along with that solution. I would like to stick with the Angular UI-grid mentioned (and linked) above. On StackOverflow I found one similar question but unfortunately it didn't seem to have gotten much traction. I am hoping that by giving a more detailed explanation of what I am looking for I will receive a more complete answer than I found there.

Here is what is currently in my controller:

var simpleMessagingApp = angular.module('MainAppCtrl', [ 'ngAnimate',
                                                         'ngTouch', 'ui.grid' ]);

simpleMessagingApp.controller('CacheTableCtrl', [ '$scope', '$http',
                                                  'uiGridConstants', function($scope, $http, uiGridConstants) {
    $scope.columns = [ {
        field : 'trans_detail',
        displayName : 'Transaction'
    }, {
        field : 'cust_name',
        displayName : 'Customer'
    }, {
        field : 'quantity',
        displayName : 'Quantity',
        filters : [ {
            condition : uiGridConstants.filter.GREATER_THAN,
            placeholder : 'greater than'
        }, {
            condition : uiGridConstants.filter.LESS_THAN,
            placeholder : 'less than'
        }
        ]
    }, {
        field : 'today_date',
        displayName : 'Current Date'
    } ];
    $scope.gridOptions1 = {
            enableSorting : true,
            enableFiltering : true,
            columnDefs : $scope.columns,
            onRegisterApi : function(gridApi) {
                $scope.grid1Api = gridApi;
            }
    };

    $http.get("../services/Coherence/Cache").success(function(data) {
        $scope.gridOptions1.data = data;
    });

} ]);

Below is the output - with the free-form text fields

Example Table with free form filters

For this specific example columns Customer, Quantity, and Current Date I would probably leave as free form drop downs, but I would really like to be able to filter using a pre-populated drop down for the transactions (and to have it in my toolbox for future projects of course!).

Thanks!


Solution

  • You can use the built in selectOptions filter feature documented here: http://ui-grid.info/docs/#/tutorial/103_filtering

    Example:

    angular.module('exampleApp', ['ui.grid'])
      .controller('exampleCtrl', ['$scope', 'uiGridConstants', function($scope, uiGridConstants) {
        var animals = [
          { id: 1, type: 'Mammal', name: 'Elephant' },
          { id: 2, type: 'Reptile', name: 'Turtle' },
          { id: 3, type: 'Mammal', name: 'Human' }
        ];
                                                              
        var animalTypes = [
          { value: 'Mammal', label: 'Mammal' },
          { value: 'Reptile', label: 'Reptile'}
        ];
      
        $scope.animalGrid = {
          enableFiltering: true,
          columnDefs: [
            {
              name: 'type', 
              field: 'type', 
              filter: { selectOptions: animalTypes, type: uiGridConstants.filter.SELECT }
            },
            { name: 'name', name: 'name'}
          ],
          data: animals
        };
          
      }]);
    <link href="http://ui-grid.info/release/ui-grid.css" rel="stylesheet" />
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <script src="http://ui-grid.info/release/ui-grid.js"></script>
    
    <div ng-app="exampleApp">
      <div ng-controller="exampleCtrl">
        <h1>UI Grid Dropdown Filter Example</h1>
        <div ui-grid="animalGrid" class="grid"></div>
      </div>
    </div>