1.1 --- a/actions/EventAggregatorNewEvent.py Wed Aug 10 01:03:14 2011 +0200
1.2 +++ b/actions/EventAggregatorNewEvent.py Wed Aug 31 01:56:22 2011 +0200
1.3 @@ -13,6 +13,7 @@
1.4 from MoinMoin.action import ActionBase
1.5 from MoinMoin.Page import Page
1.6 from MoinMoin.PageEditor import PageEditor
1.7 +from MoinMoin import config
1.8 from EventAggregatorSupport import *
1.9
1.10 try:
1.11 @@ -169,6 +170,7 @@
1.12 # Prepare the output HTML.
1.13
1.14 html = '''
1.15 +<input name="update-form-only" value="false" type="hidden" />
1.16 <table>
1.17 <tr>
1.18 <td class="label"><label>%(title_label)s</label></td>
1.19 @@ -445,7 +447,71 @@
1.20 %(buttons_html)s
1.21 </td>
1.22 </tr>
1.23 -</table>''' % d
1.24 +</table>
1.25 +<script type="text/javascript">
1.26 +function replaceDialog(url, button) {
1.27 + var form = findForm();
1.28 + var dialog = findDialog(document);
1.29 + if (form != null && dialog != null) {
1.30 + var xmlhttp = new XMLHttpRequest();
1.31 + xmlhttp.open("POST", url, false);
1.32 + xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
1.33 +
1.34 + var requestBody = encodeURIComponent(button.name) + "=" + encodeURIComponent(button.value);
1.35 + for (var i = 0; i < form.elements.length; i++) {
1.36 + var element = form.elements[i];
1.37 + if (element.type != "submit") {
1.38 + requestBody += "&" + encodeURIComponent(element.name) + "=" + encodeURIComponent(element.value);
1.39 + }
1.40 + }
1.41 + xmlhttp.send(requestBody);
1.42 +
1.43 + var newDialog = xmlhttp.responseText;
1.44 +
1.45 + if (newDialog != null) {
1.46 + dialog.parentNode.innerHTML = newDialog;
1.47 + initForm();
1.48 + return false;
1.49 + }
1.50 + }
1.51 +}
1.52 +
1.53 +function findDialog(d) {
1.54 + var elements = d.getElementsByTagName("div");
1.55 + for (var i = 0; i < elements.length; i++) {
1.56 + var element = elements[i];
1.57 + var cls = element.getAttribute("class");
1.58 + if (cls == "dialog") {
1.59 + return element;
1.60 + }
1.61 + }
1.62 + return null;
1.63 +}
1.64 +
1.65 +function findForm() {
1.66 + for (var i = 0; i < document.forms.length; i++) {
1.67 + var form = document.forms[i];
1.68 + if (form["update-form-only"] != null) {
1.69 + return form;
1.70 + }
1.71 + }
1.72 + return null;
1.73 +}
1.74 +
1.75 +function initForm() {
1.76 + var form = findForm();
1.77 + var url = form.getAttribute("action");
1.78 + form["update-form-only"].value = "true";
1.79 + for (var i = 0; i < form.length; i++) {
1.80 + var element = form[i];
1.81 + if (element.type == "submit" && element.name != "doit" && element.name != "cancel") {
1.82 + element.setAttribute("onclick", "return replaceDialog('" + url + "', this);");
1.83 + }
1.84 + }
1.85 +}
1.86 +
1.87 +initForm();
1.88 +</script>''' % d
1.89
1.90 return html
1.91
1.92 @@ -469,12 +535,32 @@
1.93
1.94 return self.create_event(self.request)
1.95
1.96 - def render_success(self, msg, msgtype=None):
1.97 + def render_msg(self, msg, msgtype):
1.98 +
1.99 + """
1.100 + Render 'msg' and 'msgtype'. If 'msgtype' is "dialog" then the form is
1.101 + rendered, and if only part of the form is being requested, the output
1.102 + will be only the form HTML fragment and not the entire page.
1.103 + """
1.104 +
1.105 + # Either render the form as a fragment of a page.
1.106 +
1.107 + print >>open("/tmp/out.txt", "a"), self.get_form().get("update-form-only")
1.108 + if msgtype == "dialog" and self.get_form().get("update-form-only", ["false"])[0] == "true":
1.109 + send_headers = get_send_headers(self.request)
1.110 + send_headers(["Content-Type: text/html; charset=%s" % config.charset])
1.111 + self.request.write(msg.render())
1.112 +
1.113 + # Or render the message/form within an entire page.
1.114 +
1.115 + else:
1.116 + ActionBase.render_msg(self, msg, msgtype)
1.117 +
1.118 + def render_success(self, msg, msgtype):
1.119
1.120 """
1.121 Render neither 'msg' nor 'msgtype' since redirection should occur
1.122 instead.
1.123 - NOTE: msgtype is optional because MoinMoin 1.5.x does not support it.
1.124 """
1.125
1.126 pass