]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
javascript fixes for reply form fetching
authorMikael Nordfeldth <mmn@hethane.se>
Tue, 10 Mar 2015 20:47:28 +0000 (21:47 +0100)
committerMikael Nordfeldth <mmn@hethane.se>
Tue, 10 Mar 2015 20:47:28 +0000 (21:47 +0100)
It doesn't update the ID properly yet, which should be done to avoid
creating duplicate forms which are identical to HTML parsers...

js/util.js
lib/action.php

index cee238836a3515d093174b8483c3db48f8b3aa65..0bda55b602d9cda95dbf832dc3f6b0db491b3812 100644 (file)
@@ -57,6 +57,9 @@ var SN = { // StatusNet
         }
     },
 
+    V: {    // Variables
+    },
+
     /**
      * Map of localized message strings exported to script from the PHP
      * side via Action::getScriptMessages().
@@ -216,6 +219,18 @@ var SN = { // StatusNet
             return url;
         },
 
+        FormNoticeUniqueID: function (form) {
+            var oldId = form.attr('id');
+            var newId = 'form_notice_' + Math.floor(Math.random()*999999999);
+            var attrs = ['name', 'for', 'id'];
+            for (var key in attrs) {
+                form.find("[" + attrs[key] + "~='" + oldId + "']").each(function () {
+                        var newAttr = $(this).attr(attrs[key]).replace(oldId, newId);
+                        $(this).attr(attrs[key], newAttr);
+                    });
+            }
+        },
+
         /**
          * Grabs form data and submits it asynchronously, with 'ajax=1'
          * parameter added to the rest.
@@ -699,27 +714,38 @@ var SN = { // StatusNet
             var replyItem = $('li.notice-reply', list);
             if (replyItem.length == 0) {
                 replyItem = $('<li class="notice-reply"></li>');
+            }
+            replyForm = replyItem.children('form');
+            if (replyForm.length == 0) {
+                // Let's try another trick to avoid fetching by URL
+                var noticeForm = $('#input_form_status > form');
+                if (noticeForm.length == 0) {
+                    // No notice form found on the page, so let's just
+                    // fetch a fresh copy of the notice form over AJAX.
+                    $.ajax({
+                        url: SN.V.urlNewNotice,
+                        data: {ajax: 1, inreplyto: id},
+                        success: function (data, textStatus, xhr) {
+                            var formEl = document._importNode($('form', data)[0], true);
+                            replyForm = $(formEl);
+                            replyItem.append(replyForm);
+                            list.append(replyItem);
 
-                // Fetch a fresh copy of the notice form over AJAX.
-                var url = $('#input_form_status > form').attr('action');
-                $.ajax({
-                    url: url,
-                    data: {ajax: 1, inreplyto: id},
-                    success: function (data, textStatus, xhr) {
-                        var formEl = document._importNode($('form', data)[0], true);
-                        replyForm = $(formEl);
-                        replyItem.append(replyForm);
-                        list.append(replyItem);
-
-                        SN.Init.NoticeFormSetup(replyForm);
-                        nextStep();
-                    },
-                });
-            } else {
-                replyForm = replyItem.children('form');
+                            SN.Init.NoticeFormSetup(replyForm);
+                            nextStep();
+                        },
+                    });
+                    // We do everything relevant in 'success' above
+                    return;
+                }
+                replyForm = noticeForm.clone();
                 SN.Init.NoticeFormSetup(replyForm);
-                nextStep();
+                replyItem.append(replyForm);
+                list.append(replyItem);
             }
+            // replyForm is set, we're not fetching by URL...
+            // Next setp is to configure in-reply-to etc.
+            nextStep();
         },
 
         /**
@@ -1466,6 +1492,7 @@ var SN = { // StatusNet
                 return false;
             }
             SN.U.NoticeLocationAttach(form);
+            SN.U.FormNoticeUniqueID(form);
             SN.U.FormNoticeXHR(form);
             SN.U.FormNoticeEnhancements(form);
             SN.U.NoticeDataAttach(form);
index 14d0fe80579f70eab7915ce7ff31635b93736d66..5627b73b6cd7da6484ecdc0fe5dd67f784f0756c 100644 (file)
@@ -431,6 +431,7 @@ class Action extends HTMLOutputter // lawsuit
                 $this->inlineScript('var _peopletagAC = "' .
                                     common_local_url('peopletagautocomplete') . '";');
                 $this->showScriptMessages();
+                $this->showScriptVariables();
                 // Anti-framing code to avoid clickjacking attacks in older browsers.
                 // This will show a blank page if the page is being framed, which is
                 // consistent with the behavior of the 'X-Frame-Options: SAMEORIGIN'
@@ -473,6 +474,19 @@ class Action extends HTMLOutputter // lawsuit
         return $messages;
     }
 
+    protected function showScriptVariables()
+    {
+        $vars = array();
+
+        if (Event::handle('StartScriptVariables', array($this, &$vars))) {
+            $vars['urlNewNotice'] = common_local_url('newnotice');
+        }
+        if (!empty($vars)) {
+            $this->inlineScript('SN.V = ' . json_encode($vars));
+        }
+        return $vars;
+    }
+
     /**
      * If the action will need localizable text strings, export them here like so:
      *