== Server-Side Pagination == Currently we do all pagination client-side which won't be possible to keep doing as we accumulate more data This will be needed for: * [wiki:HaitiRMSToDo Request Management System] * [wiki:HaitiOrgsToDo Organisation Registry] * [wiki:HaitiVolToDo Volunteer Registry] fractalis has offered to look at this === Status === * The Back-end is now done for HTML representation * The Back-end was already done for JSON representation * The Front-end still needs doing === Front-end implementation === * http://datatables.net/examples/data_sources/server_side.html * We'll also need to hand-off the Searching & Sorting! Client-side, we need to add these options to {{{views/dataTables.html}}} [make them Optional per-REST Controller?]: {{{ "bProcessing": true, "bServerSide": true, "sAjaxSource": "{{=URL(r=request, c='module', r='resource', vars={'...':'...'})}}" }}} Server-side, we need to understand these vars: {{{ # Pagination iDisplayStart - maps to 'start' iDisplayLength - maps to 'limit' # Ordering iSortCol_0 iSortingCols iSortCol_x iSortDir_x # Filtering (Search) - across all fields! sSearch }}} === JSON Back-end implementation === * Support already present in {{{modules\s3xrc.py}}} * {{{http://S3_PUBLIC_URL/module/resource.json?limit=x&start=y}}} * needs patching for dataTables-expectationsL {{{ if "start" in self.request.vars: start = int(self.request.vars["start"]) elif "iDisplayStart" in self.request.vars: # dataTables start = int(self.request.vars["iDisplayStart"]) else: start = None if "limit" in self.request.vars: limit = int(self.request.vars["limit"]) elif "iDisplayLength" in self.request.vars: # dataTables limit = int(self.request.vars["iDisplayLength"]) else: limit = None }}} === HTML Back-end implementation === Patched the {{{models\01_RESTlike_Controller}}} to support {{{http://S3_PUBLIC_URL/module/resource?limit=x&start=y}}} {{{ shn_list() ... if request.vars.limit: limit = int(request.vars.limit) if request.vars.start: start = int(request.vars.start) limitby = (start, start + limit) else: limitby = (0, limit) else: limitby = None ... items = crud.select(table, query=query, ... limitby=limitby, ... ) }}} === Other Options === * Maybe look at the currently-unused {{{modules/webgrid.py}}}. * pagenav in {{{models\01_RESTlike_Controller}}} seems unused currently...was an older implementation of a webgrid...can probably be removed. ---- [wiki:Haiti]