Click here to Skip to main content
15,892,298 members
Articles / AngularJs

AngularJS + ASP.NET Web API: Building a Simple Grid in AngularJS with Server-side Paging, Sorting, Searching (Part 6)

Rate me:
Please Sign up or sign in to vote.
5.00/5 (4 votes)
2 Mar 2015CPOL 12.2K   8   3
In this post, I'll incorporate the ability to sort the grid based on either the last name or the first name.

In this post, I’ll incorporate the ability to sort the grid based on either the last name or the first name.

First, modify the API GetStudents method to be as follows:

C#
public StudentsContainer GetStudents
   (int currentPage, int recordsPerPage, string sortKey, string sortOrder)
       {

           var pageNumber = currentPage;
           var pageSize = recordsPerPage;
           var begin = (pageNumber - 1) * pageSize;

           var totalNumberOfRecords = db.Students.Count();
           List results = null;
           switch (sortOrder)
           {
               case "ASC":
                   switch (sortKey)
                   {
                       case "lastName":
                           results = db.Students.OrderBy
                   (r =>r.LastName).Skip(begin).Take(pageSize).ToList();
                           break;
                       case "firstName":
                           results = db.Students.OrderBy
                   (r =>r.FirstMidName).Skip(begin).Take(pageSize).ToList();
                           break;
                   }
                   break;
               case "DESC":
                   switch (sortKey)
                   {
                       case "lastName":
                           results = db.Students.OrderByDescending
                   (r =>r.LastName).Skip(begin).Take(pageSize).ToList();
                           break;
                       case "firstName":
                           results = db.Students.OrderByDescending
                   (r => r.FirstMidName).Skip(begin).Take(pageSize).ToList();
                           break;
                   }
                   break; ;
           }

           var students =
               results.Select(
                   r =>
                       new Student
                       {
                           EnrollmentDate = r.EnrollmentDate,
                           FirstMidName = r.FirstMidName,
                           LastName = r.LastName,
                           ID = r.ID
                       }).ToList();

           var studentsContainer = new StudentsContainer
       { Students = students, RecordCount = totalNumberOfRecords };

           return studentsContainer;
       }

Next, modify the student controller to look as follows:

JavaScript
.controller("studentCtrl", ["$scope", "dataService", "localStorageService",
        function ($scope, dataService, localStorageService) {
            $scope.data = dataService.students;

            var sortKeyOrder = {
                key: '',
                order: '',
            };
            
            $scope.totalItems = 0;
            $scope.currentPage = 1;
            $scope.maxSize = 5;
            $scope.recordsPerPage = 5;
            $scope.numberOfPageButtons = 5;
          
            getData($scope, dataService, localStorageService);

            $scope.sort = function (col) {

                sortKeyOrder = localStorageService.get('sortKeyOrder');

                if (sortKeyOrder !== null && sortKeyOrder.key === col) {

                    if (sortKeyOrder.order == 'ASC')
                        sortKeyOrder.order = 'DESC';
                    else
                        sortKeyOrder.order = 'ASC';

                    localStorageService.set('sortKeyOrder', sortKeyOrder);

                } else {
                    
                    sortKeyOrder = {
                        key: col,
                        order: 'ASC',
                    };
                    
                    localStorageService.set('sortKeyOrder', sortKeyOrder);

                }
            };

            $scope.pageChanged = function () {

                getData($scope, dataService, localStorageService);
            };


        }]);

In line 1, localStorageService is being injected as a dependency & then in line 18, a new sort function has been added. Also in line 16, the getData function has an additional localStorageService param.

Modify the getData function to look as follows:

JavaScript
var getData = function ($scope, dataService, localStorageService) {

    var sortKeyOrder = localStorageService.get('sortKeyOrder');

    if (sortKeyOrder == null) {
        sortKeyOrder = {
            key: 'lastName',
            order: 'ASC',
        };
    }
    
    $scope.sortKeyOrder = sortKeyOrder;

    var options = {
        currentPage: $scope.currentPage,
        recordsPerPage: $scope.recordsPerPage,
        sortKeyOrder: sortKeyOrder,
    };


    dataService.getStudents(options)
    .then(function (totalItems) {

        $scope.totalItems = totalItems;
    },
    function () {

        alert("an error occured: unable to get data");
    });

};

Modify the students.tpl.html to look as follows:

XML
<div class="row top-buffer">
  <table class="table table-bordered table-striped table-responsive">
    <thead>
      <tr>
        <th>
        </th>
        <th>
        </th>
        <th>
        </th>

        <th>
          <a href="#" ng-click="sort('lastName')" 
          target="_self">Last Name</a>
          <i ng-class="{'glyphicon glyphicon-chevron-up':sortKeyOrder.order=='ASC' 
          && sortKeyOrder.key=='lastName'}"></i>
          <i ng-class="{'glyphicon glyphicon-chevron-down':sortKeyOrder.order=='DESC' 
          && sortKeyOrder.key=='lastName'}"></i>

        </th>
        <th>
          <a href="#" ng-click="sort('firstName')" 
          target="_self">First Name</a>
          <i ng-class="{'glyphicon glyphicon-chevron-up':sortKeyOrder.order=='ASC' 
          && sortKeyOrder.key=='firstName'}"></i>
          <i ng-class="{'glyphicon glyphicon-chevron-down':sortKeyOrder.order=='DESC' 
          && sortKeyOrder.key=='firstName'}"></i>
        </th>
        <th>
          Date of Enrollment
        </th>

      </tr>
    </thead>
    <tbody data-ng-repeat="i in data">
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>
          <textarea class="form-control" style="width: 300px;height: 65px" 
          ng-model="i.lastName"></textarea>
        </td>
        <td>
          <textarea class="form-control" style="width: 300px;height: 65px" 
          ng-model="i.firstMidName"></textarea>
        </td>
        <td>
          <input type="text" class="form-control" 
          style="width: 150px;height: 65px" ng-model="i.enrollmentDate" />
        </td>
      </tr>

    </tbody>
  </table>

  <span data-pagination data-total-items="totalItems" 
  data-ng-model="currentPage" data-max-size="numberOfPageButtons" 
  class=" pagination-sm" data-boundary-links="true" data-rotate="false" 
  data-ng-change="pageChanged()" data-items-per-page="recordsPerPage"></span>

</div>

In the next post, I’ll implement the ability to search based on first name or last name.

As always, the code is here and you can view the changes I made in this post by looking at this commit.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
United States United States
I write software, both in the traditional .net space as well as with client side frameworks such as AngularJS

Comments and Discussions

 
QuestionFinal code working? Pin
kiquenet.com9-Mar-15 5:13
professionalkiquenet.com9-Mar-15 5:13 
AnswerRe: Final code working? Pin
Sangeet Agarwal9-Mar-15 13:49
Sangeet Agarwal9-Mar-15 13:49 
AnswerRe: Final code working? Pin
Sangeet Agarwal5-Apr-15 3:31
Sangeet Agarwal5-Apr-15 3:31 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.