From 75825230abcc5f303a29f1f74b29c36e6140a064 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sun, 13 Sep 2015 22:46:48 +0200 Subject: Implement package details page --- brep/page.cxx | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 brep/page.cxx (limited to 'brep/page.cxx') diff --git a/brep/page.cxx b/brep/page.cxx new file mode 100644 index 0000000..70c6d8c --- /dev/null +++ b/brep/page.cxx @@ -0,0 +1,103 @@ +// file : brep/page.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include + +#include // move() +#include // min() + +#include + +#include + +using namespace std; +using namespace xml; +using namespace web::xhtml; + +namespace brep +{ + // pager + // + pager:: + pager (size_t current_page, + size_t item_count, + size_t item_per_page, + size_t page_number_count, + get_url_type get_url) + : current_page_ (current_page), + item_count_ (item_count), + item_per_page_ (item_per_page), + page_number_count_ (page_number_count), + get_url_ (move (get_url)) + { + } + + void pager:: + operator() (serializer& s) const + { + if (item_count_ == 0 || item_per_page_ == 0) + return; + + size_t pc (item_count_ / item_per_page_); // Page count. + + if (item_count_ % item_per_page_) + ++pc; + + if (pc > 1) + { + // Can consider customizing class names if use-case appear. + // + s << DIV(CLASS="pager"); + + if (current_page_ > 0) + s << A(CLASS="pg-prev") + << HREF << get_url_ (current_page_ - 1) << ~HREF + << "<<" + << ~A + << " "; + + if (page_number_count_) + { + size_t offset (page_number_count_ / 2); + size_t fp (current_page_ > offset ? current_page_ - offset : 0); + size_t tp (min (fp + page_number_count_, pc)); + + for (size_t p (fp); p < tp; ++p) + { + if (p == current_page_) + s << SPAN(CLASS="pg-cpage") + << p + 1 + << ~SPAN; + else + s << A(CLASS="pg-page") + << HREF << get_url_ (p) << ~HREF + << p + 1 + << ~A; + + s << " "; + } + } + + if (current_page_ < pc - 1) + s << A(CLASS="pg-next") + << HREF << get_url_ (current_page_ + 1) << ~HREF + << ">>" + << ~A; + + s << ~DIV; + } + } + + // pager_style + // + void pager_style:: + operator() (xml::serializer& s) const + { + const char* ident ("\n "); + s << ".pager {margin: 0.5em 0 0;}" << ident + << ".pg-prev {padding: 0 0.3em 0 0;}" << ident + << ".pg-page {padding: 0 0.3em 0 0;}" << ident + << ".pg-cpage {padding: 0 0.3em 0 0; font-weight: bold;}"; + } +} -- cgit v1.1