From 53f3162b4aed08b547f46ae4299b5043985ac12f Mon Sep 17 00:00:00 2001 From: jvelilla Date: Tue, 19 May 2015 18:40:57 -0300 Subject: [PATCH 1/6] Inital page builder implementation to add paging support to cms_nodes. --- modules/node/handler/node_page_builder.e | 37 +++++++++++++ modules/node/handler/nodes_handler.e | 64 +++++++++++++++++++++- modules/node/handler/page_builder.e | 70 ++++++++++++++++++++++++ modules/node/node_module.e | 6 +- 4 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 modules/node/handler/node_page_builder.e create mode 100644 modules/node/handler/page_builder.e diff --git a/modules/node/handler/node_page_builder.e b/modules/node/handler/node_page_builder.e new file mode 100644 index 0000000..f6f7715 --- /dev/null +++ b/modules/node/handler/node_page_builder.e @@ -0,0 +1,37 @@ +note + description: "Summary description for {NODE_PAGE_BUILDER}." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + NODE_PAGE_BUILDER + +inherit + + PAGE_BUILDER [CMS_NODE] + rename + make as page_make + end +create + + make + +feature {NONE} -- Initialization + + make (a_api: CMS_API; a_module_api: CMS_NODE_API) + do + page_make (a_api, a_module_api) + limit := 5 + offset := 0 + end + +feature -- Pager + + list: LIST[CMS_NODE] + do + create {ARRAYED_LIST[CMS_NODE]}Result.make (0) + Result := node_api.recent_nodes (offset.as_integer_32, limit.as_integer_32) + end + +end diff --git a/modules/node/handler/nodes_handler.e b/modules/node/handler/nodes_handler.e index 18462d2..6f33259 100644 --- a/modules/node/handler/nodes_handler.e +++ b/modules/node/handler/nodes_handler.e @@ -41,6 +41,9 @@ feature -- HTTP Methods s: STRING n: CMS_NODE lnk: CMS_LOCAL_LINK + pager: NODE_PAGE_BUILDER + number_of_pages: INTEGER_64 + current_page: INTEGER do -- At the moment the template is hardcoded, but we can -- get them from the configuration file and load them into @@ -49,10 +52,68 @@ feature -- HTTP Methods create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api) l_page.add_variable (node_api.nodes, "nodes") + create pager.make (api, node_api) + number_of_pages := (node_api.nodes_count // pager.limit) + 1 + + -- Size:limit + if + attached {WSF_STRING} req.query_parameter ("size") as l_size and then + l_size.is_integer + then + pager.set_limit (l_size.integer_value.to_natural_32) + end + + + + --Page:offset + if + attached {WSF_STRING} req.query_parameter ("page") as ll_page and then + ll_page.is_integer + then + current_page := ll_page.integer_value + if current_page > 1 then + pager.set_offset (((current_page-1)*(pager.limit.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 ("

Nodes:

") - if attached node_api.nodes as lst then + + s.append ("

Current Page:" + current_page.out + " of " + number_of_pages.out + " pages

" ) + -- pager + s.append ("
%N") + s.append ("%N") + s.append ("
%N") + + if attached pager.list as lst then s.append ("
    %N") across lst as ic @@ -61,7 +122,6 @@ feature -- HTTP Methods lnk := node_api.node_link (n) s.append ("
  • ") s.append (l_page.link (lnk.title, lnk.location, Void)) --- s.append (l_page.link (n.title + " (#" + n.id.out + ")", node_api.node_path (n), Void)) s.append ("
  • %N") end s.append ("
%N") diff --git a/modules/node/handler/page_builder.e b/modules/node/handler/page_builder.e new file mode 100644 index 0000000..61319c6 --- /dev/null +++ b/modules/node/handler/page_builder.e @@ -0,0 +1,70 @@ +note + description: "Generic Page Builder Interface" + date: "$Date$" + revision: "$Revision$" + +deferred class + PAGE_BUILDER [G->CMS_NODE] + +inherit + CMS_NODE_HANDLER + +feature -- Access + + set_limit (a_limit: NATURAL) + -- Set limit with `a_limit'. + do + limit := a_limit + ensure + limit_set: limit = a_limit + end + + set_offset (a_offset: NATURAL) + -- Set offset with `a_offset'. + do + offset := a_offset + ensure + limit_set: offset = a_offset + end + + set_order_by_asc (a_field: READABLE_STRING_32) + -- Pager with a order_by `a_field' asc. + do + order_by := a_field + order_ascending := True + ensure + order_by_set: attached order_by as l_order_by implies l_order_by = a_field + asc_true: order_ascending + end + + set_order_by_desc (a_field: READABLE_STRING_32) + -- Pager with a order_by `a_field' desc. + do + order_by := a_field + order_ascending := False + ensure + order_by_set: attached order_by as l_order_by implies l_order_by = a_field + asc_fasle: not order_ascending + end + +feature -- Pager + + list: LIST[G] + -- List of G with filters. + deferred + end + +feature -- Access + + limit: NATURAL + -- Number of rows per page. + + offset: NATURAL + -- rows starting from the next row to the given OFFSET. + + order_by: detachable STRING + -- field to order by + + order_ascending: BOOLEAN + -- is ascending ordering? +end diff --git a/modules/node/node_module.e b/modules/node/node_module.e index 366b34b..67fadac 100644 --- a/modules/node/node_module.e +++ b/modules/node/node_module.e @@ -186,10 +186,12 @@ feature -- Hooks create lnk.make ("List of nodes", "nodes") a_menu_system.primary_menu.extend (lnk) - create lnk.make ("Trash", a_response.url ("trash", Void)) +-- create lnk.make ("Trash", a_response.url ("trash/", Void)) + create lnk.make ("Trash", "trash") a_menu_system.primary_menu.extend (lnk) - create lnk.make ("Create ..", a_response.url ("node/", Void)) +-- create lnk.make ("Create ..", a_response.url ("node/", Void)) + create lnk.make ("Create ..", "node") a_menu_system.primary_menu.extend (lnk) end From 306b39ab7829edb48cdf18a18c7688ea6eec57ca Mon Sep 17 00:00:00 2001 From: jvelilla Date: Thu, 21 May 2015 16:46:06 -0300 Subject: [PATCH 2/6] Updated code based on Jocelyn's suggestions. --- modules/node/handler/node_page_builder.e | 25 ++++++++++++------- ...ge_builder.e => node_pagination_builder.e} | 7 ++---- 2 files changed, 18 insertions(+), 14 deletions(-) rename modules/node/handler/{page_builder.e => node_pagination_builder.e} (92%) diff --git a/modules/node/handler/node_page_builder.e b/modules/node/handler/node_page_builder.e index f6f7715..923caa2 100644 --- a/modules/node/handler/node_page_builder.e +++ b/modules/node/handler/node_page_builder.e @@ -1,6 +1,5 @@ note - description: "Summary description for {NODE_PAGE_BUILDER}." - author: "" + description: "Paginator builder for CMS nodes." date: "$Date$" revision: "$Revision$" @@ -9,28 +8,36 @@ class inherit - PAGE_BUILDER [CMS_NODE] - rename - make as page_make + NODE_PAGINATION_BUILDER [CMS_NODE] + + CMS_NODE_HANDLER + redefine + make end create - make feature {NONE} -- Initialization make (a_api: CMS_API; a_module_api: CMS_NODE_API) + -- Create an object. do - page_make (a_api, a_module_api) + Precursor (a_api, a_module_api) limit := 5 offset := 0 + ensure then + limit_set: limit = 5 + offset_set: offset = 0 end feature -- Pager - list: LIST[CMS_NODE] + list: LIST [CMS_NODE] + -- . do - create {ARRAYED_LIST[CMS_NODE]}Result.make (0) + --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, limit.as_integer_32) end diff --git a/modules/node/handler/page_builder.e b/modules/node/handler/node_pagination_builder.e similarity index 92% rename from modules/node/handler/page_builder.e rename to modules/node/handler/node_pagination_builder.e index 61319c6..25fbbf8 100644 --- a/modules/node/handler/page_builder.e +++ b/modules/node/handler/node_pagination_builder.e @@ -1,13 +1,10 @@ note - description: "Generic Page Builder Interface" + description: "Generic Node Pagination Builder Interface" date: "$Date$" revision: "$Revision$" deferred class - PAGE_BUILDER [G->CMS_NODE] - -inherit - CMS_NODE_HANDLER + NODE_PAGINATION_BUILDER [G] feature -- Access From 323ac598d0e86b5db7a886e8aeb4de7f39caeeb6 Mon Sep 17 00:00:00 2001 From: jvelilla Date: Tue, 26 May 2015 20:24:05 -0300 Subject: [PATCH 3/6] Updated code based on comments --- modules/node/handler/node_page_builder.e | 44 ------------ .../node/handler/node_pagination_builder.e | 67 ------------------- modules/node/handler/nodes_handler.e | 2 +- 3 files changed, 1 insertion(+), 112 deletions(-) delete mode 100644 modules/node/handler/node_page_builder.e delete mode 100644 modules/node/handler/node_pagination_builder.e diff --git a/modules/node/handler/node_page_builder.e b/modules/node/handler/node_page_builder.e deleted file mode 100644 index 923caa2..0000000 --- a/modules/node/handler/node_page_builder.e +++ /dev/null @@ -1,44 +0,0 @@ -note - description: "Paginator builder for CMS nodes." - date: "$Date$" - revision: "$Revision$" - -class - NODE_PAGE_BUILDER - -inherit - - NODE_PAGINATION_BUILDER [CMS_NODE] - - CMS_NODE_HANDLER - redefine - make - end -create - make - -feature {NONE} -- Initialization - - make (a_api: CMS_API; a_module_api: CMS_NODE_API) - -- Create an object. - do - Precursor (a_api, a_module_api) - limit := 5 - offset := 0 - ensure then - limit_set: limit = 5 - offset_set: offset = 0 - end - -feature -- Pager - - list: LIST [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, limit.as_integer_32) - end - -end diff --git a/modules/node/handler/node_pagination_builder.e b/modules/node/handler/node_pagination_builder.e deleted file mode 100644 index 25fbbf8..0000000 --- a/modules/node/handler/node_pagination_builder.e +++ /dev/null @@ -1,67 +0,0 @@ -note - description: "Generic Node Pagination Builder Interface" - date: "$Date$" - revision: "$Revision$" - -deferred class - NODE_PAGINATION_BUILDER [G] - -feature -- Access - - set_limit (a_limit: NATURAL) - -- Set limit with `a_limit'. - do - limit := a_limit - ensure - limit_set: limit = a_limit - end - - set_offset (a_offset: NATURAL) - -- Set offset with `a_offset'. - do - offset := a_offset - ensure - limit_set: offset = a_offset - end - - set_order_by_asc (a_field: READABLE_STRING_32) - -- Pager with a order_by `a_field' asc. - do - order_by := a_field - order_ascending := True - ensure - order_by_set: attached order_by as l_order_by implies l_order_by = a_field - asc_true: order_ascending - end - - set_order_by_desc (a_field: READABLE_STRING_32) - -- Pager with a order_by `a_field' desc. - do - order_by := a_field - order_ascending := False - ensure - order_by_set: attached order_by as l_order_by implies l_order_by = a_field - asc_fasle: not order_ascending - end - -feature -- Pager - - list: LIST[G] - -- List of G with filters. - deferred - end - -feature -- Access - - limit: NATURAL - -- Number of rows per page. - - offset: NATURAL - -- rows starting from the next row to the given OFFSET. - - order_by: detachable STRING - -- field to order by - - order_ascending: BOOLEAN - -- is ascending ordering? -end diff --git a/modules/node/handler/nodes_handler.e b/modules/node/handler/nodes_handler.e index 6f33259..53288a6 100644 --- a/modules/node/handler/nodes_handler.e +++ b/modules/node/handler/nodes_handler.e @@ -41,7 +41,7 @@ feature -- HTTP Methods s: STRING n: CMS_NODE lnk: CMS_LOCAL_LINK - pager: NODE_PAGE_BUILDER + pager: CMS_NODE_PAGINATION_BUILDER number_of_pages: INTEGER_64 current_page: INTEGER do From ad9dd01f22ce1876bd19dc68af4c0216c1eb9641 Mon Sep 17 00:00:00 2001 From: jvelilla Date: Tue, 26 May 2015 20:25:45 -0300 Subject: [PATCH 4/6] Update based on comments --- .../handler/cms_node_pagination_builder.e | 44 ++++++++++++ modules/node/handler/cms_pagination_builder.e | 67 +++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 modules/node/handler/cms_node_pagination_builder.e create mode 100644 modules/node/handler/cms_pagination_builder.e diff --git a/modules/node/handler/cms_node_pagination_builder.e b/modules/node/handler/cms_node_pagination_builder.e new file mode 100644 index 0000000..5fb641a --- /dev/null +++ b/modules/node/handler/cms_node_pagination_builder.e @@ -0,0 +1,44 @@ +note + description: "Paginator builder for CMS nodes." + date: "$Date$" + revision: "$Revision$" + +class + CMS_NODE_PAGINATION_BUILDER + +inherit + + CMS_PAGINATION_BUILDER [CMS_NODE] + + CMS_NODE_HANDLER + redefine + make + end +create + make + +feature {NONE} -- Initialization + + make (a_api: CMS_API; a_module_api: CMS_NODE_API) + -- Create an object. + do + Precursor (a_api, a_module_api) + limit := 5 + offset := 0 + ensure then + limit_set: limit = 5 + offset_set: offset = 0 + end + +feature -- Pager + + list: 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, limit.as_integer_32) + end + +end diff --git a/modules/node/handler/cms_pagination_builder.e b/modules/node/handler/cms_pagination_builder.e new file mode 100644 index 0000000..cd9d20f --- /dev/null +++ b/modules/node/handler/cms_pagination_builder.e @@ -0,0 +1,67 @@ +note + description: "Generic Pagination Builder Interface" + date: "$Date$" + revision: "$Revision$" + +deferred class + CMS_PAGINATION_BUILDER [G] + +feature -- Access + + set_limit (a_limit: NATURAL) + -- Set limit with `a_limit'. + do + limit := a_limit + ensure + limit_set: limit = a_limit + end + + set_offset (a_offset: NATURAL) + -- Set offset with `a_offset'. + do + offset := a_offset + ensure + limit_set: offset = a_offset + end + + set_ascending_order (a_field: READABLE_STRING_32) + -- Pager with a order_by `a_field' asc. + do + order_by := a_field + order_ascending := True + ensure + order_by_set: attached order_by as l_order_by implies l_order_by = a_field + asc_true: order_ascending + end + + set_descending_order (a_field: READABLE_STRING_32) + -- Pager with a order_by `a_field' desc. + do + order_by := a_field + order_ascending := False + ensure + order_by_set: attached order_by as l_order_by implies l_order_by = a_field + asc_fasle: not order_ascending + end + +feature -- Pager + + list: ITERABLE[G] + -- Iterable of G with filters. + deferred + end + +feature -- Access + + limit: NATURAL + -- Number of rows per page. + + offset: NATURAL + -- rows starting from the next row to the given OFFSET. + + order_by: detachable STRING + -- field to order by + + order_ascending: BOOLEAN + -- is ascending ordering? +end From 957ca96bc5a6e30037660e20f83e270bbdf140af Mon Sep 17 00:00:00 2001 From: jvelilla Date: Wed, 27 May 2015 11:26:49 -0300 Subject: [PATCH 5/6] Updated code based on comments. --- .../handler/cms_node_pagination_builder.e | 22 ++++---- modules/node/handler/cms_pagination_builder.e | 18 +++--- modules/node/handler/nodes_handler.e | 55 ++++++++++--------- 3 files changed, 50 insertions(+), 45 deletions(-) diff --git a/modules/node/handler/cms_node_pagination_builder.e b/modules/node/handler/cms_node_pagination_builder.e index 5fb641a..b19f32a 100644 --- a/modules/node/handler/cms_node_pagination_builder.e +++ b/modules/node/handler/cms_node_pagination_builder.e @@ -10,35 +10,35 @@ inherit CMS_PAGINATION_BUILDER [CMS_NODE] - CMS_NODE_HANDLER - redefine - make - end create make feature {NONE} -- Initialization - make (a_api: CMS_API; a_module_api: CMS_NODE_API) + make (a_api: CMS_NODE_API) -- Create an object. do - Precursor (a_api, a_module_api) - limit := 5 + node_api := a_api + count := 5 offset := 0 - ensure then - limit_set: limit = 5 + 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 - list: ITERABLE [CMS_NODE] + 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, limit.as_integer_32) + Result := node_api.recent_nodes (offset.as_integer_32, count.as_integer_32) end end diff --git a/modules/node/handler/cms_pagination_builder.e b/modules/node/handler/cms_pagination_builder.e index cd9d20f..7ca2be3 100644 --- a/modules/node/handler/cms_pagination_builder.e +++ b/modules/node/handler/cms_pagination_builder.e @@ -8,12 +8,12 @@ deferred class feature -- Access - set_limit (a_limit: NATURAL) - -- Set limit with `a_limit'. + set_count (a_count: NATURAL) + -- Set `count' with `a_count'. do - limit := a_limit + count := a_count ensure - limit_set: limit = a_limit + count_set: count = a_count end set_offset (a_offset: NATURAL) @@ -46,21 +46,21 @@ feature -- Access feature -- Pager - list: ITERABLE[G] + items: ITERABLE [G] -- Iterable of G with filters. deferred end feature -- Access - limit: NATURAL - -- Number of rows per page. + count: NATURAL + -- Number of items per page. offset: NATURAL - -- rows starting from the next row to the given OFFSET. + -- lower index of `items' pagination. order_by: detachable STRING - -- field to order by + -- field to order by. order_ascending: BOOLEAN -- is ascending ordering? diff --git a/modules/node/handler/nodes_handler.e b/modules/node/handler/nodes_handler.e index 53288a6..eddc92d 100644 --- a/modules/node/handler/nodes_handler.e +++ b/modules/node/handler/nodes_handler.e @@ -37,7 +37,7 @@ feature -- HTTP Methods do_get (req: WSF_REQUEST; res: WSF_RESPONSE) -- local - l_page: CMS_RESPONSE + l_response: CMS_RESPONSE s: STRING n: CMS_NODE lnk: CMS_LOCAL_LINK @@ -49,30 +49,30 @@ feature -- HTTP Methods -- get them from the configuration file and load them into -- the setup class. - create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api) - l_page.add_variable (node_api.nodes, "nodes") + create {GENERIC_VIEW_CMS_RESPONSE} l_response.make (req, res, api) + l_response.add_variable (node_api.nodes, "nodes") - create pager.make (api, node_api) - number_of_pages := (node_api.nodes_count // pager.limit) + 1 + create pager.make (node_api) + number_of_pages := (node_api.nodes_count // pager.count) + 1 -- Size:limit if attached {WSF_STRING} req.query_parameter ("size") as l_size and then l_size.is_integer then - pager.set_limit (l_size.integer_value.to_natural_32) + pager.set_count (l_size.integer_value.to_natural_32) end --Page:offset if - attached {WSF_STRING} req.query_parameter ("page") as ll_page and then - ll_page.is_integer + attached {WSF_STRING} req.query_parameter ("page") as l_page and then + l_page.is_integer then - current_page := ll_page.integer_value + current_page := l_page.integer_value if current_page > 1 then - pager.set_offset (((current_page-1)*(pager.limit.to_integer_32)).to_natural_32) + pager.set_offset (((current_page-1)*(pager.count.to_integer_32)).to_natural_32) end else current_page := 1 @@ -81,39 +81,44 @@ feature -- HTTP Methods -- NOTE: for development purposes we have the following hardcode output. - create s.make_from_string ("

Nodes:

") + 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

") - s.append ("

Current Page:" + current_page.out + " of " + number_of_pages.out + " pages

" ) -- pager s.append ("
%N") s.append ("
    %N") - create lnk.make ("First", "nodes/?page=1&size="+pager.limit.out) + create lnk.make ("First", "nodes/?page=1&size="+pager.count.out) s.append ("
  • ") - s.append (l_page.link (lnk.title, lnk.location, Void)) + 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.limit.out) + create lnk.make ("Prev", "nodes/?page="+ (current_page-1).out +"&size="+pager.count.out) s.append ("
  • ") - s.append (l_page.link (lnk.title, lnk.location, Void)) + 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.limit.out) + create lnk.make ("Next", "nodes/?page="+ (current_page+1).out +"&size="+pager.count.out) s.append ("
  • ") - s.append (l_page.link (lnk.title, lnk.location, Void)) + 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.limit.out) + create lnk.make ("Last", "nodes/?page="+ number_of_pages.out +"&size="+pager.count.out) s.append ("
  • ") - s.append (l_page.link (lnk.title, lnk.location, Void)) + s.append (l_response.link (lnk.title, lnk.location, Void)) s.append ("
  • ") s.append ("
%N") s.append ("
%N") - if attached pager.list as lst then + if attached pager.items as lst then s.append ("
    %N") across lst as ic @@ -121,15 +126,15 @@ feature -- HTTP Methods n := ic.item lnk := node_api.node_link (n) s.append ("
  • ") - s.append (l_page.link (lnk.title, lnk.location, Void)) + s.append (l_response.link (lnk.title, lnk.location, Void)) s.append ("
  • %N") end s.append ("
%N") end - l_page.set_main_content (s) - l_page.add_block (create {CMS_CONTENT_BLOCK}.make ("nodes_warning", Void, "/nodes/ is not yet fully implemented
", Void), "highlighted") - l_page.execute + 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 end end From f056b43ddc4aabd8aad74e53d5b61769a26bc11f Mon Sep 17 00:00:00 2001 From: jvelilla Date: Fri, 29 May 2015 09:25:28 -0300 Subject: [PATCH 6/6] 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