From f056b43ddc4aabd8aad74e53d5b61769a26bc11f Mon Sep 17 00:00:00 2001 From: jvelilla Date: Fri, 29 May 2015 09:25:28 -0300 Subject: [PATCH] Updated CMS PAGINATION with the last Jocelyn's suggestion. Added a node pagination helper, to build the html links and header related to pagination. --- modules/node/cms_node_api.e | 4 +- .../handler/cms_node_pagination_builder.e | 44 ------ .../node/handler/cms_node_pagination_helper.e | 138 ++++++++++++++++++ modules/node/handler/cms_pagination_builder.e | 28 +++- modules/node/handler/nodes_handler.e | 78 +--------- 5 files changed, 168 insertions(+), 124 deletions(-) delete mode 100644 modules/node/handler/cms_node_pagination_builder.e create mode 100644 modules/node/handler/cms_node_pagination_helper.e diff --git a/modules/node/cms_node_api.e b/modules/node/cms_node_api.e index 5f328df..b720daf 100644 --- a/modules/node/cms_node_api.e +++ b/modules/node/cms_node_api.e @@ -220,10 +220,10 @@ feature -- Access: Node Result := node_storage.trashed_nodes (a_user.id) end - recent_nodes (a_offset, a_rows: INTEGER): LIST [CMS_NODE] + recent_nodes (a_pagination: CMS_PAGINATION_BUILDER): ITERABLE [CMS_NODE] -- List of the `a_rows' most recent nodes starting from `a_offset'. do - Result := node_storage.recent_nodes (a_offset, a_rows) + Result := node_storage.recent_nodes (a_pagination.offset.to_integer_32, a_pagination.count.to_integer_32) end node (a_id: INTEGER_64): detachable CMS_NODE diff --git a/modules/node/handler/cms_node_pagination_builder.e b/modules/node/handler/cms_node_pagination_builder.e deleted file mode 100644 index b19f32a..0000000 --- a/modules/node/handler/cms_node_pagination_builder.e +++ /dev/null @@ -1,44 +0,0 @@ -note - description: "Paginator builder for CMS nodes." - date: "$Date$" - revision: "$Revision$" - -class - CMS_NODE_PAGINATION_BUILDER - -inherit - - CMS_PAGINATION_BUILDER [CMS_NODE] - -create - make - -feature {NONE} -- Initialization - - make (a_api: CMS_NODE_API) - -- Create an object. - do - node_api := a_api - count := 5 - offset := 0 - ensure - node_api_set: node_api = a_api - limit_set: count = 5 - offset_set: offset = 0 - end - - node_api: CMS_NODE_API - -- CMS API. - -feature -- Pager - - items: ITERABLE [CMS_NODE] - -- . - do - --NOTE: the current implementation does not use - -- order by and ordering. - create {ARRAYED_LIST [CMS_NODE]} Result.make (0) - Result := node_api.recent_nodes (offset.as_integer_32, count.as_integer_32) - end - -end diff --git a/modules/node/handler/cms_node_pagination_helper.e b/modules/node/handler/cms_node_pagination_helper.e new file mode 100644 index 0000000..7eb04d2 --- /dev/null +++ b/modules/node/handler/cms_node_pagination_helper.e @@ -0,0 +1,138 @@ +note + description: "Helper class to build the html pagination links and header summary" + date: "$Date$" + revision: "$Revision$" + +class + CMS_NODE_PAGINATION_HELPER + + +create + make + +feature {NONE} -- Initialization + + make (a_req: WSF_REQUEST; a_response: CMS_RESPONSE; a_nodes_count: INTEGER_64) + -- Create an object with default values. + do + make_size (a_req, a_response, a_nodes_count, 5) + end + + make_size (a_req: WSF_REQUEST; a_response: CMS_RESPONSE; a_nodes_count: INTEGER_64; a_size: NATURAL) + -- Create an object with a pages of size `a_size'. + do + req := a_req + number_of_nodes := a_nodes_count + create pager + pager.set_count (a_size) + response := a_response + process + end + + req: WSF_REQUEST + -- Current request. + + process + -- Process request query paraments to build the pager. + do + --TODO: at the moment the code looks for hardcoded parameters + -- sie and page, maybe we can parametrize these names. + -- Size:limit. + if + attached {WSF_STRING} req.query_parameter ("size") as l_size and then + l_size.is_integer + then + pager.set_count (l_size.integer_value.to_natural_32) + end + + --Page:offset + if + attached {WSF_STRING} req.query_parameter ("page") as l_page and then + l_page.is_integer + then + current_page := l_page.integer_value + if current_page > 1 then + pager.set_offset (((current_page-1)*(pager.count.to_integer_32)).to_natural_32) + end + else + current_page := 1 + end + end + +feature -- Access + + pager: CMS_PAGINATION_BUILDER + -- Paginator. + + current_page: INTEGER + -- current page. + + number_of_pages: INTEGER_64 + -- total number of pages. + do + Result := (number_of_nodes // pager.count.as_integer_32) + 1 + end + + number_of_nodes: INTEGER_64 + -- number of nodes. + + response: CMS_RESPONSE + -- cms response + +feature -- Paginator + + paging_summary: STRING + -- Header summary + -- Current page 1 of n pages. + do + create Result.make_from_string ("

Items:

") + + Result.append ("

Current Page:") + Result.append_integer (current_page) + Result.append (" of ") + Result.append_integer_64 (number_of_pages) + Result.append (" pages

") + end + + + build_html_node_paging: STRING + -- First, [Prev], [Next], Last. + local + s: STRING + lnk: CMS_LOCAL_LINK + + do + -- NOTE: for development purposes we have the following hardcode output. + create s.make_empty + + -- pager + s.append ("
%N") + s.append ("
    %N") + create lnk.make ("First", "nodes/?page=1&size="+pager.count.out) + s.append ("
  • ") + s.append (response.link (lnk.title, lnk.location, Void)) + s.append ("
  • ") + if (current_page - 1) > 1 then + create lnk.make ("Prev", "nodes/?page="+ (current_page-1).out +"&size="+pager.count.out) + s.append ("
  • ") + s.append (response.link (lnk.title, lnk.location, Void)) + s.append ("
  • ") + end + + if (current_page + 1) < number_of_pages then + create lnk.make ("Next", "nodes/?page="+ (current_page+1).out +"&size="+pager.count.out) + s.append ("
  • ") + s.append (response.link (lnk.title, lnk.location, Void)) + s.append ("
  • ") + end + create lnk.make ("Last", "nodes/?page="+ number_of_pages.out +"&size="+pager.count.out) + s.append ("
  • ") + s.append (response.link (lnk.title, lnk.location, Void)) + s.append ("
  • ") + + + s.append ("
%N") + s.append ("
%N") + Result := s + end +end diff --git a/modules/node/handler/cms_pagination_builder.e b/modules/node/handler/cms_pagination_builder.e index 7ca2be3..9950ff7 100644 --- a/modules/node/handler/cms_pagination_builder.e +++ b/modules/node/handler/cms_pagination_builder.e @@ -3,8 +3,26 @@ note date: "$Date$" revision: "$Revision$" -deferred class - CMS_PAGINATION_BUILDER [G] +class + CMS_PAGINATION_BUILDER + +inherit + + ANY + redefine + default_create + end + +feature {NONE} -- Initialization + + default_create + do + count := 5 + offset := 0 + ensure then + limit_set: count = 5 + offset_set: offset = 0 + end feature -- Access @@ -44,12 +62,6 @@ feature -- Access asc_fasle: not order_ascending end -feature -- Pager - - items: ITERABLE [G] - -- Iterable of G with filters. - deferred - end feature -- Access diff --git a/modules/node/handler/nodes_handler.e b/modules/node/handler/nodes_handler.e index eddc92d..681ca87 100644 --- a/modules/node/handler/nodes_handler.e +++ b/modules/node/handler/nodes_handler.e @@ -41,84 +41,20 @@ feature -- HTTP Methods s: STRING n: CMS_NODE lnk: CMS_LOCAL_LINK - pager: CMS_NODE_PAGINATION_BUILDER - number_of_pages: INTEGER_64 - current_page: INTEGER + l_page_helper: CMS_NODE_PAGINATION_HELPER do -- At the moment the template is hardcoded, but we can -- get them from the configuration file and load them into -- the setup class. create {GENERIC_VIEW_CMS_RESPONSE} l_response.make (req, res, api) - l_response.add_variable (node_api.nodes, "nodes") + create l_page_helper.make (req, l_response, node_api.nodes_count) - create pager.make (node_api) - number_of_pages := (node_api.nodes_count // pager.count) + 1 + create s.make_empty + s.append (l_page_helper.paging_summary) + s.append (l_page_helper.build_html_node_paging) - -- Size:limit - if - attached {WSF_STRING} req.query_parameter ("size") as l_size and then - l_size.is_integer - then - pager.set_count (l_size.integer_value.to_natural_32) - end - - - - --Page:offset - if - attached {WSF_STRING} req.query_parameter ("page") as l_page and then - l_page.is_integer - then - current_page := l_page.integer_value - if current_page > 1 then - pager.set_offset (((current_page-1)*(pager.count.to_integer_32)).to_natural_32) - end - else - current_page := 1 - end - - - - -- NOTE: for development purposes we have the following hardcode output. - create s.make_from_string ("

Items:

") - - s.append ("

Current Page:") - s.append_integer (current_page) - s.append (" of ") - s.append_integer_64 (number_of_pages) - s.append (" pages

") - - -- pager - s.append ("
%N") - s.append ("
    %N") - create lnk.make ("First", "nodes/?page=1&size="+pager.count.out) - s.append ("
  • ") - s.append (l_response.link (lnk.title, lnk.location, Void)) - s.append ("
  • ") - if (current_page - 1) > 1 then - create lnk.make ("Prev", "nodes/?page="+ (current_page-1).out +"&size="+pager.count.out) - s.append ("
  • ") - s.append (l_response.link (lnk.title, lnk.location, Void)) - s.append ("
  • ") - end - - if (current_page + 1) < number_of_pages then - create lnk.make ("Next", "nodes/?page="+ (current_page+1).out +"&size="+pager.count.out) - s.append ("
  • ") - s.append (l_response.link (lnk.title, lnk.location, Void)) - s.append ("
  • ") - end - create lnk.make ("Last", "nodes/?page="+ number_of_pages.out +"&size="+pager.count.out) - s.append ("
  • ") - s.append (l_response.link (lnk.title, lnk.location, Void)) - s.append ("
  • ") - - - s.append ("
%N") - s.append ("
%N") - - if attached pager.items as lst then + if attached node_api.recent_nodes (l_page_helper.pager) as lst then s.append ("
    %N") across lst as ic @@ -132,6 +68,8 @@ feature -- HTTP Methods s.append ("
%N") end + s.append (l_page_helper.build_html_node_paging) + l_response.set_main_content (s) l_response.add_block (create {CMS_CONTENT_BLOCK}.make ("nodes_warning", Void, "/nodes/ is not yet fully implemented
", Void), "highlighted") l_response.execute