From cdac61b18d1e06aebbe93ea7141e7673145bfd2e Mon Sep 17 00:00:00 2001 From: "chris.watts90@outlook.com" Date: Sun, 12 Feb 2017 22:26:00 +0000 Subject: [PATCH] added pagination to the repository GetUser method. added pagesixe to userlist object. added total user count to enable PageCount to work correctly. added GET_TOTAL_USER_COUNT and GET_ALL_USERS_PAGINATE sqlite procedures to support pagination. updated methods in SQLiteRepository to support pagination procedures and pagination properties of UserList. updated UsersController to support pagination parameters. tidied html script tags. added pagination buttons at the bottom of user page. including drop down to select PageSize added setPageSize, goToUserPage and setPagination methods to the viewmodel. updated other methods for sammy etc to work with pagesize and PageNumber params. #11 --- .../Interfaces/IRepository.cs | 12 +++- .../WindowsDataCenter/Interfaces/UserList.cs | 13 ++++ .../SQLiteRepository/SQLiteProcedures.cs | 4 ++ .../SQLiteRepository/SQLiteRepository.cs | 43 +++++++++++--- .../Controllers/UsersController.cs | 17 +++++- .../WindowsDataCenter/www/index.html | 54 +++++++++++------ .../WindowsDataCenter/www/spa.js | 59 +++++++++++++++---- 7 files changed, 161 insertions(+), 41 deletions(-) diff --git a/DataCenter_Windows/WindowsDataCenter/Interfaces/IRepository.cs b/DataCenter_Windows/WindowsDataCenter/Interfaces/IRepository.cs index 6a53b7f..b376c7f 100644 --- a/DataCenter_Windows/WindowsDataCenter/Interfaces/IRepository.cs +++ b/DataCenter_Windows/WindowsDataCenter/Interfaces/IRepository.cs @@ -11,7 +11,17 @@ namespace Interfaces /// Returns with full list of users, /// plus a total user count. Pagination options are supported. /// - UserList GetUsers(); + UserList GetUsers(int pageNumber=-1, int pageSize=-1); + ///// + ///// Get a paginated list of users + ///// + ///// The number of the page to retrieve + ///// The size of the pages + ///// + ///// Returns with full list of users, + ///// plus a total user count. Pagination options are supported. + ///// + //UserList GetUsers(int pageNumber, int pageSize); /// /// Search the user list for the following string /// diff --git a/DataCenter_Windows/WindowsDataCenter/Interfaces/UserList.cs b/DataCenter_Windows/WindowsDataCenter/Interfaces/UserList.cs index 701dfe7..ef5de0f 100644 --- a/DataCenter_Windows/WindowsDataCenter/Interfaces/UserList.cs +++ b/DataCenter_Windows/WindowsDataCenter/Interfaces/UserList.cs @@ -7,10 +7,23 @@ namespace Interfaces public UserList() { Users = new List(); + PageSize = 10; } public string Query { get; set; } public int UserCount { get { return Users.Count; } } + public int TotalUserCount { get; set; } public List Users { get; set; } + + public int PageCount + { + get + { + if (TotalUserCount < PageSize) + return 1; + return (TotalUserCount / PageSize); + } + } + public int PageSize { get; set; } public int PageNumber { get; set; } } diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteProcedures.cs b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteProcedures.cs index 871bba2..f9ad682 100644 --- a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteProcedures.cs +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteProcedures.cs @@ -18,5 +18,9 @@ namespace SQLiteRepository public const string SEARCH_USER_LIST = "SELECT * FROM " + nameof(UserIdentity) + " where(" + nameof(UserIdentity.FirstName) + " Like ? OR " + nameof(UserIdentity.LastName) + " Like ?)"; public const string GET_LAST_TIMELOG_DIRECTION = "SELECT * FROM " + nameof(TimeLogDb) + " where " + nameof(TimeLogDb.UserId_FK) + " = ? order by " + nameof(TimeLogDb.SwipeEventDateTime) + " LIMIT 1"; + + public const string GET_ALL_USERS_PAGINATE = "select * from "+ nameof(UserIdentity)+" limit ? offset ?"; + + public const string GET_TOTAL_USER_COUNT = "select Max("+nameof(UserIdentity.Id)+") from " + nameof(UserIdentity); } } \ No newline at end of file diff --git a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs index f07e277..3da2464 100644 --- a/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs +++ b/DataCenter_Windows/WindowsDataCenter/SQLiteRepository/SQLiteRepository.cs @@ -23,16 +23,35 @@ namespace SQLiteRepository _connection.CreateTable(); } - public UserList GetUsers() + public UserList GetUsers(int pageNumber=-1, int pageSize=-1) { var ret = new UserList(); - - var users = _connection.Query(SQLiteProcedures.GET_ALL_USERS); + List users; + int userCount = -1; + if (pageNumber == -1 && pageSize == -1) + { + users = _connection.Query(SQLiteProcedures.GET_ALL_USERS); + userCount = users.Count; + } + else + { + users = _connection.Query(SQLiteProcedures.GET_ALL_USERS_PAGINATE, + pageSize, (pageNumber-1)*pageSize); + userCount = _connection.ExecuteScalar(SQLiteProcedures.GET_TOTAL_USER_COUNT); + } if (!users.Any()) { - ret.PageNumber = 1; - ret.PageSize = 20; + if (pageNumber == -1 && pageSize == -1) + { + ret.PageNumber = 1; + ret.PageSize = 20; + } + else + { + ret.PageNumber = pageNumber; + ret.PageSize = pageSize; + } return ret; } @@ -54,9 +73,17 @@ namespace SQLiteRepository } ret.Users.Add(userObj); } - ret.PageSize = 20; - ret.PageNumber = 1; - + if (pageNumber == -1 && pageSize == -1) + { + ret.PageSize = 1; //TODO: switch to ret.UserCount + ret.PageNumber = 1; + } + else + { + ret.PageSize = pageSize; + ret.PageNumber = pageNumber; + } + ret.TotalUserCount = userCount; return ret; } diff --git a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/Controllers/UsersController.cs b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/Controllers/UsersController.cs index 73de953..2c85d61 100644 --- a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/Controllers/UsersController.cs +++ b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/Controllers/UsersController.cs @@ -24,8 +24,21 @@ namespace WindowsDataCenter [CacheControl(MaxAge = 0)] public IHttpActionResult GetUsers([FromUri] string query = "",[FromUri] int pageSize = -1, [FromUri] int pageNumber =-1) { - var userList = query == string.Empty ? _repo.GetUsers() : _repo.Search(query); - userList.Query = query == string.Empty ? null : query; + UserList userList = new UserList(); + pageNumber = pageNumber == -1 ? 1 : pageNumber; + pageSize = pageSize == -1 ? 1 : pageSize; + userList = query == string.Empty ? _repo.GetUsers(pageNumber, pageSize) : _repo.Search(query); + if (query != string.Empty) + { + userList.Query = query; + userList.PageNumber = 1; + userList.PageSize = userList.UserCount; + } + else + userList.Query = null; + + userList.PageNumber = pageNumber; + userList.PageSize = pageSize; var msg = Request.CreateResponse(HttpStatusCode.OK, userList); return ResponseMessage(msg); diff --git a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/index.html b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/index.html index d1257fa..667f93f 100644 --- a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/index.html +++ b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/index.html @@ -1,9 +1,7 @@  Flexi Time Data Viewer - - + @@ -61,28 +59,46 @@
- - - - - - + + + + + + - - - - - - - - + + + + + + + +
IDUserIdfirstNamelastName - -
IDUserIdfirstNamelastName + +
+
+
    +
  • +
+ +
diff --git a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/spa.js b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/spa.js index 6adf91d..ce38a02 100644 --- a/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/spa.js +++ b/DataCenter_Windows/WindowsDataCenter/WindowsDataCenter/www/spa.js @@ -35,11 +35,7 @@ } var url = "timelogs" + "/" + userId; if (args) { - var appender = "?"; - args.forEach(function(arg) { - url += appender + arg.key + "=" + arg.value; - appender = "&"; - }); + url = self.createRequestUrl(url, args, false, true); } location.hash = url; }; @@ -80,16 +76,16 @@ * @param {string} routePath * @param {Array} params - Key, Value object detailing the param name (key) and value (value). * @param {boolean} requiresCallback - True - add callback function for JSONP/CORS. - * @param {boolean} isRelativePath - True, create a relative URL (without root). + * @param {boolean} isAbsolutePath - True, create a relative URL (without root). * @returns {string} the url generated * @example * createRequestUrl("/api/endpoint", [{key:"param", value:"value"}], true, false); * returns: "http://192.168.2.2/api/endpoint?param=value&callback=?" */ - self.createRequestUrl = function (routePath, params, requiresCallback, isRelativePath) { + self.createRequestUrl = function (routePath, params, requiresCallback, isAbsoluteUrl) { var appender = "?"; var url = ""; - if (isRelativePath) { + if (isAbsoluteUrl) { url = self.apiEndpoints.root; } url = url + routePath; @@ -136,6 +132,32 @@ self.dismissAlert = function(data, event) { self.errorData(null); }; + self.setPageSize = function(data) { + if (self.userList().PageSize !== data && self.userList().PageSize !== -1) { + self.setPagination(data, 1); + } + }; + self.goToUserPage = function (data) { + if (self.userList().PageNumber !== data && self.userList().PageNumber !== -1) { + self.setPagination(self.userList().PageSize, data); + } + }; + self.setPagination = function(pageSize, pageNumber) { + var args = [ + { + key: "pageSize", + value: pageSize + }, + { + key: "pageNumber", + value: pageNumber + } + ]; + + var url = self.createRequestUrl("users", args, false, false); + location.hash = url; + console.log(url); + }; self.initDatePicker = function (selectedDate) { $("#weeklyDatePicker").datepicker({ weekStart: 1, @@ -170,8 +192,21 @@ }); } } - self.getUserList = function () { - var url = self.createRequestUrl(self.apiEndpoints.getUserList, null, false); + self.getUserList = function (pageSize, pageNumber) { + var args = null; + if (pageSize && pageNumber) { + args = [ + { + key: "pageSize", + value: pageSize + }, + { + key: "pageNumber", + value: pageNumber + } + ]; + } + var url = self.createRequestUrl(self.apiEndpoints.getUserList, args, false); $.getJSON(url, function (res) { self.userList(res); }).fail(function (response, status, error) { @@ -251,6 +286,8 @@ Sammy(function () { this.get("#users", function () { var query = this.params.query; + var pageSize = this.params.pageSize; + var pageNumber = this.params.pageNumber; self.chosenMenuItemId("Users"); self.chosenUserDetails(null); self.userList(null); @@ -258,7 +295,7 @@ if (query) self.searchUsers(query); else - self.getUserList(); + self.getUserList(pageSize, pageNumber); self.assignErrorObject(101, "An Error has occurred.. run away!!!", "test"); //$.get("http://localhost:3000", { menu: this.params.menu }, self.chosenMenuData); });