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); });