From 2df0b2d1b40d59b36cb0964f1bbfb5247b55178a Mon Sep 17 00:00:00 2001 From: Chris Jaekl <cejaekl@yahoo.com> Date: Wed, 8 Nov 2017 19:25:46 +0900 Subject: [PATCH] Add slider to enable distant paging. --- app/index.html | 11 ++++----- app/lib.css | 2 +- app/lib.js | 61 ++++++++++++++++++++++++++++++++----------------- main/handler.go | 2 -- 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/app/index.html b/app/index.html index 4b246d4..9b33311 100644 --- a/app/index.html +++ b/app/index.html @@ -6,10 +6,6 @@ </head> <body> - <table class="header"> - <tr><td class="box"> </td><td class="title">eBook Library</td></tr> - </table> - <form> <input id="search" onclick="onSearch();" type="button" value="Search"/> Author: <input id="aut" type="text"/> @@ -17,9 +13,10 @@ Series: <input id="ser" type="text"/> </form> - <div class="footer"> - <input id="back" onclick="onPrev();" value="Back" type="button"/> - <input id="forward" onclick="onNext();" value="Forward" type="button"/> + <div class="pager"> + <input id="back" onclick="onPrev();" value="Back" type="button"/> + <input id="forward" onclick="onNext();" value="Forward" type="button"/> + <input id="slider" onchange="onSlide(this.value);" min="1" max="1" type="range" value="0"/> Showing <span id="first">0</span> through <span id="last">0</span> out of <span id="count">0</span> matching books. </div> diff --git a/app/lib.css b/app/lib.css index be1e367..0845b0d 100644 --- a/app/lib.css +++ b/app/lib.css @@ -22,7 +22,7 @@ div.book { border 3px solid #73ad21; } -div.footer { +div.pager { background-color: #004080; border-color: #004080; border-style: solid; diff --git a/app/lib.js b/app/lib.js index 5e2ecf8..50086d0 100644 --- a/app/lib.js +++ b/app/lib.js @@ -7,7 +7,33 @@ g_state = { first: 0, ids: [], last: (-1), - pageSize: 100 + pageSize: 9 +} + +function adjustPos(setting) { + var value = parseInt(setting) + + if (g_state.first === value) { + // No change + return; + } + + var maxFirst = g_state.count - g_state.pageSize; + + if (value < 0) { + g_state.first = 0; + } else if (value > maxFirst) { + g_state.first = maxFirst; + } else { + g_state.first = value; + } + + g_state.last = g_state.first + g_state.pageSize - 1; + if (g_state.last >= g_state.count) { + g_state.last = g_state.count - 1; + } + + refreshData(); } function constructSearchUrl() { @@ -42,28 +68,20 @@ function constructSearchUrl() { function onNext() { if (g_state.last < (g_state.count - 1)) { - g_state.first += g_state.pageSize; - g_state.last += g_state.pageSize; - if (g_state.last >= g_state.count) { - g_state.last = g_state.count - 1; - } - - refreshData(); + adjustPos(g_state.first + g_state.pageSize); } } function onPrev() { if (g_state.first > 0) { - g_state.first -= g_state.pageSize; - if (g_state.first < 0) { - g_state.first = 0; - } - g_state.last = g_state.first + g_state.pageSize; - - refreshData(); + adjustPos(g_state.first - g_state.pageSize); } } +function onSlide(value) { + adjustPos(value); +} + function onSearch() { console.log('onSearch()'); @@ -78,12 +96,13 @@ function onSearch() { console.log('JSON response: ', jsonValue); g_state.ids = jsonValue g_state.count = g_state.ids.length; - g_state.first = 0 - g_state.last = (g_state.ids.length) - 1; - if (g_state.last > g_state.pageSize) { - g_state.last = g_state.pageSize; - } - refreshData() + g_state.first = (-1) + + var elem = document.getElementById('slider'); + elem.max = g_state.count; + elem.value = '0' + + adjustPos(0); }) .catch(err => { var msg = 'Error fetching JSON from URL: ' + url + ': ' + err + ':' + err.stack; diff --git a/main/handler.go b/main/handler.go index 8a74c62..2d8076e 100644 --- a/main/handler.go +++ b/main/handler.go @@ -179,7 +179,6 @@ func handleInfo(w http.ResponseWriter, r *http.Request) { func handleSearch(w http.ResponseWriter, r *http.Request) { var err error - fmt.Println("DEBUG: handleSearch(): " + r.URL.Path) fields := []Field{Author, Title, Series} @@ -190,7 +189,6 @@ func handleSearch(w http.ResponseWriter, r *http.Request) { paramName := fv.String() paramValues := r.Form[paramName] for _, pv := range(paramValues) { - fmt.Println("DEBUG: handleSearch(): ", paramName, "=", pv) if count >= len(terms) { fmt.Printf("WARNING: limit of %d search terms exceeded. One or more terms ignored.", len(terms)) break -- 2.39.2