comparison demo/more/grid.ur @ 1833:be0c4e2e488a

Allow any FFI module to declare new HTML tags
author Adam Chlipala <adam@chlipala.net>
date Wed, 28 Nov 2012 16:56:45 -0500
parents e6bc6bbd7a32
children
comparison
equal deleted inserted replaced
1832:373e2c3f03b2 1833:be0c4e2e488a
38 val aggregates : $(map (aggregateMeta row) aggregates) 38 val aggregates : $(map (aggregateMeta row) aggregates)
39 val aggFolder : folder aggregates 39 val aggFolder : folder aggregates
40 40
41 val pageLength : option int 41 val pageLength : option int
42 end) = struct 42 end) = struct
43 style tabl 43 style tab
44 style tr 44 style row
45 style th 45 style header
46 style td 46 style data
47 style agg 47 style agg
48 48
49 fun make (row : M.row) [input] [filter] (m : colMeta' M.row input filter) : transaction input = m.Project row 49 fun make (row : M.row) [input] [filter] (m : colMeta' M.row input filter) : transaction input = m.Project row
50 50
51 fun makeAll cols row = @@Monad.exec [transaction] _ [map snd3 M.cols] 51 fun makeAll cols row = @@Monad.exec [transaction] _ [map snd3 M.cols]
120 return (previous && this)) 120 return (previous && this))
121 (fn _ => return True) 121 (fn _ => return True)
122 M.folder M.cols grid.Cols grid.Filters row 122 M.folder M.cols grid.Cols grid.Filters row
123 123
124 fun render (grid : grid) = <xml> 124 fun render (grid : grid) = <xml>
125 <table class={tabl}> 125 <table class={tab}>
126 <tr class={tr}> 126 <tr class={row}>
127 <th/> <th/> <th><button value="No sort" onclick={fn _ => set grid.Sort None}/></th> 127 <th/> <th/> <th><button value="No sort" onclick={fn _ => set grid.Sort None}/></th>
128 {@mapX2 [fst3] [colMeta M.row] [tr] 128 {@mapX2 [fst3] [colMeta M.row] [tr]
129 (fn [nm :: Name] [p :: (Type * Type * Type)] [rest :: {(Type * Type * Type)}] [[nm] ~ rest] 129 (fn [nm :: Name] [p :: (Type * Type * Type)] [rest :: {(Type * Type * Type)}] [[nm] ~ rest]
130 data (meta : colMeta M.row p) => 130 data (meta : colMeta M.row p) =>
131 <xml><th class={th}> 131 <xml><th class={header}>
132 {case (meta.Handlers data).Sort of 132 {case (meta.Handlers data).Sort of
133 None => txt (meta.Handlers data).Header 133 None => txt (meta.Handlers data).Header
134 | sort => <xml><button value={(meta.Handlers data).Header} 134 | sort => <xml><button value={(meta.Handlers data).Header}
135 onclick={fn _ => set grid.Sort sort}/></xml>} 135 onclick={fn _ => set grid.Sort sort}/></xml>}
136 </th></xml>) 136 </th></xml>)
183 set rowS row'; 183 set rowS row';
184 184
185 cols <- makeAll grid.Cols row'; 185 cols <- makeAll grid.Cols row';
186 set colsS cols 186 set colsS cols
187 in 187 in
188 <xml><tr class={tr}> 188 <xml><tr class={row}>
189 <td> 189 <td>
190 <dyn signal={b <- signal grid.Selection; 190 <dyn signal={b <- signal grid.Selection;
191 return (if b then 191 return (if b then
192 <xml><ccheckbox source={sd}/></xml> 192 <xml><ccheckbox source={sd}/></xml>
193 else 193 else
211 211
212 <dyn signal={cols <- signal colsS; 212 <dyn signal={cols <- signal colsS;
213 return (@mapX3 [fst3] [colMeta M.row] [snd3] [_] 213 return (@mapX3 [fst3] [colMeta M.row] [snd3] [_]
214 (fn [nm :: Name] [t :: (Type * Type * Type)] 214 (fn [nm :: Name] [t :: (Type * Type * Type)]
215 [rest :: {(Type * Type * Type)}] 215 [rest :: {(Type * Type * Type)}]
216 [[nm] ~ rest] data meta v => 216 [[nm] ~ rest] dat meta v =>
217 <xml><td class={td}> 217 <xml><td class={data}>
218 <dyn signal={b <- signal ud; 218 <dyn signal={b <- signal ud;
219 return (if b then 219 return (if b then
220 (meta.Handlers data).Edit v 220 (meta.Handlers dat).Edit v
221 else 221 else
222 (meta.Handlers data).Display 222 (meta.Handlers dat).Display
223 v)}/> 223 v)}/>
224 <dyn signal={b <- signal ud; 224 <dyn signal={b <- signal ud;
225 if b then 225 if b then
226 valid <- 226 valid <-
227 (meta.Handlers data).Validate v; 227 (meta.Handlers dat).Validate v;
228 return (if valid then 228 return (if valid then
229 <xml/> 229 <xml/>
230 else 230 else
231 <xml>!</xml>) 231 <xml>!</xml>)
232 else 232 else