(ns auto-ap.views.components.paginator (:require [re-frame.core :as re-frame] [auto-ap.subs :as subs] [auto-ap.views.utils :refer [date->str]] [reagent.core :as reagent] [clojure.string :as str] [cljs-time.format :as format])) (defn bound [x y z] (cond (< z x) x (< y x) x (> y z) z :else y)) (defn paginator [{:keys [start end count total on-change]}] (let [per-page 100 max-buttons 5 buttons-before (Math/floor (/ max-buttons 2)) total-pages (Math/ceil (/ total per-page)) current-page (Math/floor (/ start per-page)) first-page-button (bound 0 (- current-page buttons-before) (- total-pages max-buttons)) all-buttons (into [] (for [x (range total-pages)] ^{:key x} [:li [:a.pagination-link {:class (when (= current-page x) "is-current") :on-click (fn [e] (on-change {:start (* x per-page)}))} (inc x)]])) last-page-button (Math/min total-pages (+ max-buttons first-page-button)) extended-last-page-button (when (not= last-page-button total-pages) (list ^ {:key -1} [:li [:span.pagination-ellipsis "…"]] ^ {:key -2} (last all-buttons))) extended-first-page-button (when (not= first-page-button 0) (list ^{:key -1} (first all-buttons) ^{:key -2} [:li [:span.pagination-ellipsis "…"]]))] [:nav.pagination {:role "pagination"} [:ul.pagination-list extended-first-page-button (apply list (subvec all-buttons first-page-button last-page-button)) extended-last-page-button "Showing " (Math/min (inc start) total) "-" end "/" total]]))