Changeset 33985 in project


Ignore:
Timestamp:
04/16/17 20:13:31 (3 months ago)
Author:
sjamaan
Message:

qwiki: Add paging to history view; history is getting too long sometimes

Location:
release/4/qwiki/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • release/4/qwiki/trunk/qwiki-sxml.scm

    r33983 r33985  
    4242
    4343(use posix srfi-1 srfi-13 data-structures extras irregex)
    44 (use sxml-transforms doctype uri-generic sxpath colorize html-parser)
     44(use sxml-transforms doctype sxpath colorize html-parser)
    4545
    4646;; Try to extract a meaningful title from the page contents
     
    110110      *macro*
    111111      . ,(lambda (tag elements)
    112            (let ((path (car elements))
    113                  (form-url (cadr elements))
    114                  (action (caddr elements))
    115                  (items (cdddr elements)))
     112           (let* ((items-per-page (car elements))
     113                  (path (cadr elements))
     114                  (start-revisions (caddr elements))
     115                  (all-items (cdddr elements))
     116                  (items (if (> (length all-items) items-per-page)
     117                             (take all-items items-per-page)
     118                             all-items))
     119                  (first-item-on-next-page
     120                   (and (> (length all-items) items-per-page)
     121                        (list-ref all-items items-per-page))))
    116122             `(div
    117123               (h3 "Edit history for page: " ,path)
    118                (form (@ (method "get") (action ,form-url))
     124               (form (@ (method "get") (action ""))
    119125                     (input (@ (type "hidden") (name "action")
    120                                (value ,action)))
     126                               (value "diff")))
    121127                     (table
    122128                      (tr (th "revision")
     
    146152                             items))
    147153                     (input (@ (type "submit")
    148                                (value "show diff between selected revisions"))))))))
     154                               (value "show diff between selected revisions")
     155                               (class "diff-selection"))))
     156               ;; Bleeeeergh
     157               (div (@ (class "pager"))
     158                    ,@(if (not (null? start-revisions))
     159                          `((a (@ (href "?action=history"
     160                                        ,(string-join
     161                                          (map ->string
     162                                               (cdr start-revisions))
     163                                          "&rev=" 'prefix))
     164                                  (class "prev-page"))
     165                               "prev page") " ")
     166                          '())
     167                    ,@(if first-item-on-next-page
     168                          (let ((revs (cons (car first-item-on-next-page)
     169                                            start-revisions)))
     170                            `((a (@ (href "?action=history"
     171                                          ,(string-join
     172                                            (map ->string revs)
     173                                            "&rev=" 'prefix))
     174                                    (class "next-page"))
     175                                 "next page")))
     176                          '()))))))
    149177
    150178     (diff
    151179      *macro*
    152180      . ,(lambda (tag elems)
    153            ;; diff-language is a bit weird, but consistent with what
    154            ;; we would emit in a highlight block.
     181           ;; The diff-language class is a bit weird here, but
     182           ;; consistent with what we would emit in a highlight block.
    155183           (let* ((classname "highlight diff-language diff-page")
    156184                  (diff (handle-exceptions exn elems
  • release/4/qwiki/trunk/qwiki.scm

    r33983 r33985  
    22;; qwiki - the quick wiki
    33;;
    4 ;; Copyright (c) 2009-2015 Peter Bex and Ivan Raikov
     4;; Copyright (c) 2009-2017 Peter Bex and Ivan Raikov
    55;;
    66;;  Redistribution and use in source and binary forms, with or without
     
    262262
    263263
     264(define (alist-all key alist)
     265  (fold (lambda (item items)
     266          (if (eq? (car item) key)
     267              (cons (string->number (cdr item)) items)
     268              items))
     269        '() alist))
     270
    264271;;; Actions
    265272(define (qwiki-history path req)
     
    267274    (if (not (file-exists? source-file))
    268275        (redirect-to-qwiki-page req)         ; Default action
    269         (let* ((rev (string->number
    270                     (alist-ref 'rev (uri-query (request-uri req)) eq? "")))
    271               (history (get-history source-file rev #f)) ; no pagination yet
    272               (content (qwiki-sxml-page-template
    273                         `(history ,(string-join path "/")
    274                                   "" "diff" ,@history)
    275                         ;; We could determine the current title by parsing
    276                         ;; the wiki page. That would be a bit wasteful though...
    277                         ;; Perhaps read out svnwiki:title instead?
    278                         `(title ,(sprintf "Edit history for page: ~A"
    279                                           (string-join path "/")))
    280                         (if (frozen? source-file) '(read-only) '(read-write)))))
     276        (let* ((start-revisions
     277                (alist-all 'rev (uri-query (request-uri req))))
     278               (rev (and (pair? start-revisions) (car start-revisions)))
     279               ;; Fake paging: request 26 items, but show 25 per page.
     280               ;; If there's a 26th, we know there's at least 1 more
     281               ;; item on the next "page" :)
     282               ;;
     283               ;; The main disadvantage of this (right now) is that
     284               ;; you can't compare revisions across pages.  You can
     285               ;; hack the URL, though :)
     286               (history (get-history source-file rev 26))
     287               (content (qwiki-sxml-page-template
     288                         `(history 25 ,(string-join path "/")
     289                                   ,start-revisions ,@history)
     290                         ;; We could determine the current title by
     291                         ;; parsing the wiki page. That would be a bit
     292                         ;; wasteful though...  Perhaps read out
     293                         ;; svnwiki:title instead?
     294                         `(title ,(sprintf "Edit history for page: ~A"
     295                                    (string-join path "/")))
     296                         (if (frozen? source-file) '(read-only) '(read-write)))))
    281297          (send-content content)))))
    282298
Note: See TracChangeset for help on using the changeset viewer.