Commit c0e3a41035b5feeaf9909333483e4c236ce0ec34
1 parent
49b8cd88
State name is now provided to the 'compute_page' function.
Improving Dojo API
Showing
2 changed files
with
206 additions
and
60 deletions
Show diff stats
calexium_lib/web/CXM_dojo.anubis
| @@ -6,20 +6,21 @@ | @@ -6,20 +6,21 @@ | ||
| 6 | * | 6 | * |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | -read calexium_lib/web/CXM_making_a_web_site.anubis | 9 | +read tools/basis.anubis |
| 10 | read tools/base64.anubis | 10 | read tools/base64.anubis |
| 11 | -read tools/basis.anubis // required for 'make_directory' | ||
| 12 | read locale/L3LanguageInfo.anubis | 11 | read locale/L3LanguageInfo.anubis |
| 12 | +read system/string.anubis | ||
| 13 | 13 | ||
| 14 | -read mailfountain_constants.anubis | ||
| 15 | -read mailfountain_types.anubis | ||
| 16 | read calexium_lib/web/CXM_common.anubis | 14 | read calexium_lib/web/CXM_common.anubis |
| 17 | read calexium_lib/web/CXM_making_a_web_site.anubis | 15 | read calexium_lib/web/CXM_making_a_web_site.anubis |
| 18 | read calexium_lib/web/CXM_multihost_http_server.anubis | 16 | read calexium_lib/web/CXM_multihost_http_server.anubis |
| 17 | +read calexium_lib/net_services_protocols/logger_service.anubis | ||
| 18 | + | ||
| 19 | +read mailfountain_constants.anubis | ||
| 20 | +read mailfountain_types.anubis | ||
| 19 | read common/language_management.anubis | 21 | read common/language_management.anubis |
| 20 | 22 | ||
| 21 | read tools/mf_loggers.anubis | 23 | read tools/mf_loggers.anubis |
| 22 | -read calexium_lib/net_services_protocols/logger_service.anubis | ||
| 23 | read system/logger.anubis | 24 | read system/logger.anubis |
| 24 | 25 | ||
| 25 | public type Dojo_Grid_Data : | 26 | public type Dojo_Grid_Data : |
| @@ -72,26 +73,132 @@ public define HTML_Off_Form | @@ -72,26 +73,132 @@ public define HTML_Off_Form | ||
| 72 | // </div><br />") | 73 | // </div><br />") |
| 73 | ] | 74 | ] |
| 74 | . | 75 | . |
| 76 | +public type DojoGridEditor: | ||
| 77 | + inputEditor, | ||
| 78 | + boolEditor, | ||
| 79 | + selectEditor(List(String) options), | ||
| 80 | + alwaysOnEditor. | ||
| 81 | + | ||
| 82 | +public type DojoGridDefaultColumn: | ||
| 83 | + dojo_grid_default_column( | ||
| 84 | + String styles, | ||
| 85 | + Maybe(String) width, | ||
| 86 | + Maybe(DojoGridEditor) editor). | ||
| 87 | + | ||
| 88 | +public type DojoGridColumn: | ||
| 89 | + dojo_grid_column( String label, | ||
| 90 | + String field_name, | ||
| 91 | + Maybe(String) width, | ||
| 92 | + Maybe(DojoGridEditor) editor). | ||
| 93 | + | ||
| 94 | +public type DojoGridView: | ||
| 95 | + dojo_grid_view( | ||
| 96 | + Maybe(DojoGridDefaultColumn) default_column, | ||
| 97 | + List(DojoGridColumn) columns). | ||
| 98 | + | ||
| 99 | +public type DojoGridLayout: | ||
| 100 | + dojo_grid_layout( | ||
| 101 | + Maybe(String) selectable_row_header_width, | ||
| 102 | + List(DojoGridView) views). | ||
| 103 | + | ||
| 104 | +define String to_String(DojoGridEditor editor) = | ||
| 105 | + "editor: " + | ||
| 106 | + if editor is | ||
| 107 | + { | ||
| 108 | + inputEditor then "dojox.grid.editors.Input", | ||
| 109 | + boolEditor then "dojox.grid.editors.Bool", | ||
| 110 | + selectEditor(options) then "dojox.grid.editors.Select, options: [" + join(",", map((String o) |-> "\"" + o + "\"", options)) + "]", | ||
| 111 | + alwaysOnEditor then "dojox.grid.editors.AlwaysOn" | ||
| 112 | + }. | ||
| 113 | + | ||
| 114 | +define String to_String(DojoGridView view) = | ||
| 115 | + "{ " + (if view.default_column is success(col) then | ||
| 116 | + (if col is dojo_grid_default_column(styles, mb_width, mb_editor) then | ||
| 117 | + "defaultCell: {" | ||
| 118 | + + "styles: \"" + styles + "\"" | ||
| 119 | + + (if mb_width is success(w) then ", width=\"" + w + "\"" else "") | ||
| 120 | + + (if mb_editor is success(e) then ", " + to_String(e) else "") | ||
| 121 | + + "}, ") | ||
| 122 | + else "") | ||
| 123 | + + "cells: [[" + join(",", map((DojoGridColumn col) |-> | ||
| 124 | + if col is dojo_grid_column(label, field, mb_width, mb_editor) then | ||
| 125 | + "{" | ||
| 126 | + + "name: \"" + label + "\"" | ||
| 127 | + + "field: \"" + field + "\"" | ||
| 128 | + + (if mb_width is success(w) then ", width=\"" + w + "\"" else "") | ||
| 129 | + + (if mb_editor is success(e) then ", " + to_String(e) else "") | ||
| 130 | + + "}", | ||
| 131 | + view.columns)) + "]]" | ||
| 132 | + +"}". | ||
| 133 | + | ||
| 134 | + | ||
| 135 | +public define String | ||
| 136 | + dojo_make_grid_script | ||
| 137 | + ( | ||
| 138 | + HtmlId html_id, | ||
| 139 | + DojoGridLayout layout, | ||
| 140 | + String layout_name, | ||
| 141 | + String store_name, | ||
| 142 | + Bool can_edit | ||
| 143 | + ) | ||
| 144 | + = | ||
| 145 | +"<script type=\"text/javascript\"> | ||
| 146 | + " + layout_name + " = [" | ||
| 147 | + + (if layout.selectable_row_header_width is success(w) then "{ type: 'dojox.GridRowView', width: '" + w + "'}, " else "") | ||
| 148 | + + join(", ", map(to_String, layout.views)) | ||
| 149 | + + "]; | ||
| 150 | +</script>". | ||
| 151 | + | ||
| 152 | +public define HTML_Off_Form | ||
| 153 | + dojo_make_grid_script | ||
| 154 | + ( | ||
| 155 | + HtmlId html_id, | ||
| 156 | + List(String) columns, | ||
| 157 | + Bool can_edit | ||
| 158 | + ) | ||
| 159 | + = | ||
| 160 | + literal( | ||
| 161 | +"<script type=\"text/javascript\"> | ||
| 162 | + var cols = ["+join(",", map((String col) |-> "\"" + col + "\"", columns)) + "]; | ||
| 163 | + dojo.addOnLoad(function(){ | ||
| 164 | + init_dojo_grid(\""+html_id.id+"\", cols, "+ (if can_edit then "1" else "0")+"); | ||
| 165 | + }); | ||
| 166 | +</script>"). | ||
| 75 | 167 | ||
| 76 | public define HTML_Off_Form | 168 | public define HTML_Off_Form |
| 77 | dojo_grid | 169 | dojo_grid |
| 78 | ( | 170 | ( |
| 79 | - String id, | 171 | + HtmlId html_id, |
| 172 | + List(CoreAttrs) attributes, | ||
| 173 | + ) | ||
| 174 | + = | ||
| 175 | + div_empty([id(html_id.id), attr("dojoType", "dojox.Grid") . attributes ]). | ||
| 176 | + | ||
| 177 | + | ||
| 178 | +public define HTML_Off_Form | ||
| 179 | + dojo_grid | ||
| 180 | + ( | ||
| 181 | + HtmlId html_id, | ||
| 182 | + List(CoreAttrs) attributes, | ||
| 183 | +// List(GridColumn) columns, | ||
| 80 | String colum1, | 184 | String colum1, |
| 81 | String colum2, | 185 | String colum2, |
| 82 | String colum3, | 186 | String colum3, |
| 83 | String colum4, | 187 | String colum4, |
| 84 | - Bool can_edit | 188 | + Bool can_edit |
| 85 | ) | 189 | ) |
| 86 | = | 190 | = |
| 87 | - literal("<script type=\"text/javascript\"> | ||
| 88 | - dojo.addOnLoad(function(){ | ||
| 89 | - init_dojo_grid(\""+colum1+"\",\""+colum2+"\", \""+colum3+"\", \""+colum4+"\", "+ (if can_edit then "1" else "0")+"); | ||
| 90 | - } | ||
| 91 | - ); | ||
| 92 | - </script> | ||
| 93 | -<div id=\"gridContainer\"></div>") | ||
| 94 | -. | 191 | + sequence([ |
| 192 | + literal( | ||
| 193 | + | ||
| 194 | +"<script type=\"text/javascript\"> | ||
| 195 | + dojo.addOnLoad(function(){ | ||
| 196 | + init_dojo_grid(\""+html_id.id+"\", \""+colum1+"\",\""+colum2+"\", \""+colum3+"\", \""+colum4+"\", "+ (if can_edit then "1" else "0")+"); | ||
| 197 | + }); | ||
| 198 | +</script>"), | ||
| 199 | + div_empty([id(html_id.id) . attributes /*attr("dojoType", "dojox.Grid"), */]), | ||
| 200 | + ]). | ||
| 201 | +//<div id=\"gridContainer\"></div>"). | ||
| 95 | 202 | ||
| 96 | 203 | ||
| 97 | public define HTML_Off_Form | 204 | public define HTML_Off_Form |
| @@ -123,83 +230,118 @@ public define HTML_Off_Form | @@ -123,83 +230,118 @@ public define HTML_Off_Form | ||
| 123 | //actioner(same, same, push_button([id("dojo_tip_" + keyword), class("in"), event(onclick,"new_search(this)")], keyword), "", [], []). | 230 | //actioner(same, same, push_button([id("dojo_tip_" + keyword), class("in"), event(onclick,"new_search(this)")], keyword), "", [], []). |
| 124 | 231 | ||
| 125 | 232 | ||
| 233 | +public type BorderContainerRegion: | ||
| 234 | + center, | ||
| 235 | + top, | ||
| 236 | + bottom, | ||
| 237 | + leading, | ||
| 238 | + trailing, | ||
| 239 | + left, | ||
| 240 | + right. | ||
| 241 | + | ||
| 242 | +define String | ||
| 243 | + to_String | ||
| 244 | + ( | ||
| 245 | + BorderContainerRegion region | ||
| 246 | + )= | ||
| 247 | + if region is | ||
| 248 | + { | ||
| 249 | + center then "center", | ||
| 250 | + top then "top", | ||
| 251 | + bottom then "bottom", | ||
| 252 | + leading then "leading", | ||
| 253 | + trailing then "trailing", | ||
| 254 | + left then "left", | ||
| 255 | + right then "right" | ||
| 256 | + }. | ||
| 257 | + | ||
| 258 | + | ||
| 126 | public define HTML_Off_Form | 259 | public define HTML_Off_Form |
| 127 | dojo_ContentPane | 260 | dojo_ContentPane |
| 128 | ( | 261 | ( |
| 129 | - String id, | ||
| 130 | - String region, | ||
| 131 | - Bool splitter, | ||
| 132 | - HTML_Off_Form content | 262 | + List(CoreAttrs) attributes, |
| 263 | + BorderContainerRegion region, | ||
| 264 | + Bool splitter, | ||
| 265 | + HTML_Off_Form content | ||
| 133 | ) = | 266 | ) = |
| 134 | - sequence([ | ||
| 135 | - literal("<div id=\"" + id + "\" dojoType=\"dijit.layout.ContentPane\" region=\"" + region + "\" splitter=\"" | ||
| 136 | - +( | ||
| 137 | - if splitter then "true" | ||
| 138 | - else "false" | ||
| 139 | - )+ | ||
| 140 | - // "\" style=\"overflow: auto;\""+ | ||
| 141 | - // "\" minSize=\"20em\""+ | ||
| 142 | - "\">"), | ||
| 143 | - content, | ||
| 144 | - literal("</div>") | ||
| 145 | - ]). | 267 | + div([ attr("dojoType", "dijit.layout.ContentPane"), |
| 268 | + attr("region", to_String(region)), | ||
| 269 | + attr("splitter", if splitter then "true" else "false") . attributes ], | ||
| 270 | + content). | ||
| 271 | +// sequence([ | ||
| 272 | +// literal("<div id=\"" + id + "\" dojoType=\"dijit.layout.ContentPane\" region=\"" + to_String(region) + "\" splitter=\"" | ||
| 273 | +// +( | ||
| 274 | +// if splitter then "true" | ||
| 275 | +// else "false" | ||
| 276 | +// )+ | ||
| 277 | +// // "\" style=\"overflow: auto;\""+ | ||
| 278 | +// // "\" minSize=\"20em\""+ | ||
| 279 | +// "\">"), | ||
| 280 | +// content, | ||
| 281 | +// literal("</div>") | ||
| 282 | +// ]). | ||
| 146 | 283 | ||
| 147 | public define HTML_Off_Form | 284 | public define HTML_Off_Form |
| 148 | dojo_TabContainer | 285 | dojo_TabContainer |
| 149 | ( | 286 | ( |
| 150 | - String id, | ||
| 151 | - HTML_Off_Form content | 287 | + List(CoreAttrs) attributes, |
| 288 | + HTML_Off_Form content | ||
| 152 | ) = | 289 | ) = |
| 153 | - sequence([ | ||
| 154 | - literal("<div id=\"" + id + "\" dojoType=\"dijit.layout.TabContainer\" style=\"width:70em;height:50em\">"), | ||
| 155 | - content, | ||
| 156 | - literal("</div>") | ||
| 157 | - ]). | 290 | + div([attr("dojoType", "dijit.layout.TabContainer") . attributes ], |
| 291 | + content). | ||
| 292 | +// sequence([ | ||
| 293 | +// literal("<div id=\"" + id + "\" dojoType=\"dijit.layout.TabContainer\" style=\"width:70em;height:50em\">"), | ||
| 294 | +// content, | ||
| 295 | +// literal("</div>") | ||
| 296 | +// ]). | ||
| 158 | 297 | ||
| 159 | public define HTML_Off_Form | 298 | public define HTML_Off_Form |
| 160 | dojo_BorderContainer | 299 | dojo_BorderContainer |
| 161 | ( | 300 | ( |
| 162 | - String id, | ||
| 163 | - String title, | ||
| 164 | - HTML_Off_Form content | 301 | + List(CoreAttrs) attributes, |
| 302 | + String the_title, | ||
| 303 | + Bool live_splitter, | ||
| 304 | + Bool persist, | ||
| 305 | + HTML_Off_Form content | ||
| 165 | ) = | 306 | ) = |
| 166 | - sequence([ | ||
| 167 | - literal("<div id=\"" + id + "\" dojoType=\"dijit.layout.BorderContainer\" title=\"" + title + "\" design=\"sidebar\">"), | ||
| 168 | - content, | ||
| 169 | - literal("</div>") | ||
| 170 | - ]). | 307 | + div([attr("dojoType", "dijit.layout.BorderContainer"), title(the_title), |
| 308 | + attr("design", "sidebar"), attr("liveSplitters", live_splitter), attr("persist", persist) . attributes ], | ||
| 309 | + content). | ||
| 171 | 310 | ||
| 172 | 311 | ||
| 173 | public define HTML_Off_Form | 312 | public define HTML_Off_Form |
| 174 | dojo_tree | 313 | dojo_tree |
| 175 | ( | 314 | ( |
| 176 | - String id, | 315 | + List(CoreAttrs) attributes, |
| 177 | )= | 316 | )= |
| 178 | - literal("<div id=\"" + id + "\"</div>"). | 317 | + div_empty(attributes). |
| 318 | +// literal("<div id=\"" + id + "\"</div>"). | ||
| 179 | 319 | ||
| 180 | 320 | ||
| 181 | public define HTML_Off_Form | 321 | public define HTML_Off_Form |
| 182 | dojo_Toolbar | 322 | dojo_Toolbar |
| 183 | ( | 323 | ( |
| 184 | - String id, | 324 | + List(CoreAttrs) attributes, |
| 185 | HTML_Off_Form content | 325 | HTML_Off_Form content |
| 186 | )= | 326 | )= |
| 187 | - sequence([ | ||
| 188 | - literal("<div dojoType=\"dijit.Toolbar\" region=\"top\" id =\"" + id + "\">"), | ||
| 189 | - content, | ||
| 190 | - literal("</div>") | ||
| 191 | - ]). | 327 | + div([attr("dojoType", "dijit.Toolbar") . attributes ], |
| 328 | + content). | ||
| 329 | +// sequence([ | ||
| 330 | +// literal("<div dojoType=\"dijit.Toolbar\" region=\"top\" id =\"" + id + "\">"), | ||
| 331 | +// content, | ||
| 332 | +// literal("</div>") | ||
| 333 | +// ]). | ||
| 192 | 334 | ||
| 193 | 335 | ||
| 194 | public define HTML_Off_Form | 336 | public define HTML_Off_Form |
| 195 | dojo_button | 337 | dojo_button |
| 196 | ( | 338 | ( |
| 197 | - String id, | 339 | + HtmlId html_id, |
| 198 | String name, | 340 | String name, |
| 199 | String iconclass, | 341 | String iconclass, |
| 200 | String tip_msg, | 342 | String tip_msg, |
| 201 | ) | 343 | ) |
| 202 | = | 344 | = |
| 203 | literal(" | 345 | literal(" |
| 204 | - <button dojoType=\"dijit.form.Button\" id=\"" + id + "\" iconClass=\"" + iconclass + "\">" + name + "</button> | ||
| 205 | - <span dojoType=\"dijit.Tooltip\" connectId=\"" + id + "\">" + tip_msg + "</span>"). | 346 | + <button dojoType=\"dijit.form.Button\" id=\"" + html_id.id + "\" iconClass=\"" + iconclass + "\">" + name + "</button> |
| 347 | + <span dojoType=\"dijit.Tooltip\" connectId=\"" + html_id.id + "\">" + tip_msg + "</span>"). |
calexium_lib/web/CXM_making_a_web_site.anubis
| @@ -439,7 +439,7 @@ public define Web_Site | @@ -439,7 +439,7 @@ public define Web_Site | ||
| 439 | List(Web_arg), | 439 | List(Web_arg), |
| 440 | Bool is_https) -> (Maybe($SessionTicket), Maybe($State), List(HTTP_header)) ticket_lost_state, | 440 | Bool is_https) -> (Maybe($SessionTicket), Maybe($State), List(HTTP_header)) ticket_lost_state, |
| 441 | List(Web_Action($SessionTicket, $State)) actions, | 441 | List(Web_Action($SessionTicket, $State)) actions, |
| 442 | - (Maybe($SessionTicket), Maybe($State), List(Web_arg) lwa) -> HTTP_Answer compute_page, | 442 | + (Maybe($SessionTicket), Maybe($State), String state_name, List(Web_arg) lwa) -> HTTP_Answer compute_page, |
| 443 | Int timeout, // seconds (todo: minutes) | 443 | Int timeout, // seconds (todo: minutes) |
| 444 | List(Redirection) redirections, | 444 | List(Redirection) redirections, |
| 445 | String charset, | 445 | String charset, |
| @@ -734,6 +734,8 @@ public type CoreAttrs: | @@ -734,6 +734,8 @@ public type CoreAttrs: | ||
| 734 | attr (String, String), | 734 | attr (String, String), |
| 735 | event (HtmlEvents, String). | 735 | event (HtmlEvents, String). |
| 736 | 736 | ||
| 737 | +public define CoreAttrs attr(String name, Bool value) = attr(name, if value then "true" else "false"). | ||
| 738 | + | ||
| 737 | public type InputAttrs: | 739 | public type InputAttrs: |
| 738 | class (String), | 740 | class (String), |
| 739 | style (String), | 741 | style (String), |
| @@ -745,6 +747,8 @@ public type InputAttrs: | @@ -745,6 +747,8 @@ public type InputAttrs: | ||
| 745 | attr (String, String), | 747 | attr (String, String), |
| 746 | event (HtmlEvents, String). | 748 | event (HtmlEvents, String). |
| 747 | 749 | ||
| 750 | +public define InputAttrs attr(String name, Bool value) = attr(name, if value then "true" else "false"). | ||
| 751 | + | ||
| 748 | public define CoreAttrs | 752 | public define CoreAttrs |
| 749 | tooltip(String s) = title(s). | 753 | tooltip(String s) = title(s). |
| 750 | public define InputAttrs | 754 | public define InputAttrs |
| @@ -2219,7 +2223,7 @@ public define Web_Site | @@ -2219,7 +2223,7 @@ public define Web_Site | ||
| 2219 | List(Web_arg), | 2223 | List(Web_arg), |
| 2220 | Bool is_https) -> (Maybe($SessionTicket), Maybe($State), List(HTTP_header)) ticket_lost_state, | 2224 | Bool is_https) -> (Maybe($SessionTicket), Maybe($State), List(HTTP_header)) ticket_lost_state, |
| 2221 | List(Web_Action($SessionTicket, $State)) actions, | 2225 | List(Web_Action($SessionTicket, $State)) actions, |
| 2222 | - (Maybe($SessionTicket), Maybe($State), List(Web_arg) lwa) -> HTTP_Answer compute_page, | 2226 | + (Maybe($SessionTicket), Maybe($State), String state_name, List(Web_arg) lwa) -> HTTP_Answer compute_page, |
| 2223 | Int timeout, | 2227 | Int timeout, |
| 2224 | Redirections redirections, | 2228 | Redirections redirections, |
| 2225 | String charset, | 2229 | String charset, |
| @@ -2295,7 +2299,7 @@ public define Web_Site | @@ -2295,7 +2299,7 @@ public define Web_Site | ||
| 2295 | format(info(host_name, http_port, https_port, site_directory, secret), | 2299 | format(info(host_name, http_port, https_port, site_directory, secret), |
| 2296 | state_name, | 2300 | state_name, |
| 2297 | headers, | 2301 | headers, |
| 2298 | - compute_page(session_ticket, mb_new_state, operands), | 2302 | + compute_page(session_ticket, mb_new_state, state_name, operands), |
| 2299 | is_https, | 2303 | is_https, |
| 2300 | charset) | 2304 | charset) |
| 2301 | }), | 2305 | }), |