Mercurial > urweb
diff demo/more/grid.ur @ 964:fbc3a0eef45a
Paging mostly working; just need to get it working properly with filtering
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Sat, 19 Sep 2009 14:21:25 -0400 |
parents | 6f9d1565de56 |
children | e9c5992bc9bc |
line wrap: on
line diff
--- a/demo/more/grid.ur Sat Sep 19 13:55:37 2009 -0400 +++ b/demo/more/grid.ur Sat Sep 19 14:21:25 2009 -0400 @@ -37,6 +37,8 @@ con aggregates :: {Type} val aggregates : $(map (aggregateMeta row) aggregates) val aggFolder : folder aggregates + + val pageLength : option int end) = struct style tabl style tr @@ -59,7 +61,8 @@ Selected : source bool}, Selection : source bool, Filters : $(map thd3 M.cols), - Sort : source (option (M.row -> M.row -> bool))} + Sort : source (option (M.row -> M.row -> bool)), + Position : source int} fun newRow cols row = rowS <- source row; @@ -89,12 +92,14 @@ rows <- Dlist.create; sel <- source False; sort <- source None; + pos <- source 0; return {Cols = cols, Rows = rows, Selection = sel, Filters = filters, - Sort = sort} + Sort = sort, + Position = pos} fun sync {Cols = cols, Rows = rows, ...} = Dlist.clear rows; @@ -216,8 +221,8 @@ [_] M.folder grid.Cols M.cols cols)}/> </tr></xml> end) - {StartPosition = return (Some 1), - MaxLength = return (Some 2), + {StartPosition = Monad.mp Some (signal grid.Position), + MaxLength = return M.pageLength, Filter = fn all => row <- signal all.Row; foldR3 [colMeta M.row] [fst3] [thd3] [fn _ => M.row -> signal bool] @@ -258,6 +263,42 @@ [_] M.folder M.cols grid.Cols grid.Filters} </tr> </table> + + {case M.pageLength of + None => <xml/> + | Some plen => <xml> + <dyn signal={avail <- Dlist.size grid.Rows; + return (if avail <= plen then + <xml/> + else + let + val numPages = avail / plen + val numPages = if numPages * plen < avail then + numPages + 1 + else + numPages + + fun pages n = + if n * plen >= avail then + <xml/> + else + <xml> + <dyn signal={pos <- signal grid.Position; + return (if n * plen = pos then + <xml><b>{[n + 1]}</b></xml> + else + <xml> + <button value={show (n + 1)} + onclick={set grid.Position + (n * plen) + }/></xml>)}/> + {if (n + 1) * plen >= avail then <xml/> else <xml>|</xml>} + {pages (n + 1)} + </xml> + in + <xml><p><b>Pages:</b> {pages 0}</p></xml> + end)}/> + </xml>} <button value="New row" onclick={row <- rpc M.new; addRow grid.Cols grid.Rows row}/>