mark: A photo of Mark kneeling on top of the Taal Volcano in the Philippines. It was a long hike. (Default)
Mark Smith ([staff profile] mark) wrote in [site community profile] changelog2009-10-26 02:28 am

[dw-free] Make AJAX work on text links in S2

[commit: http://hg.dwscoalition.org/dw-free/rev/490a701da881]

http://bugs.dwscoalition.org/show_bug.cgi?id=1953

Enable AJAX on text based links in S2.

Patch by [personal profile] wyntarvox.

Files modified:
  • bin/upgrading/s2layers/core2.s2
  • cgi-bin/LJ/S2.pm
  • htdocs/js/commentmanage.js
  • htdocs/js/esn.js
--------------------------------------------------------------------------------
diff -r c1ab80df65e0 -r 490a701da881 bin/upgrading/s2layers/core2.s2
--- a/bin/upgrading/s2layers/core2.s2	Mon Oct 26 02:07:27 2009 +0000
+++ b/bin/upgrading/s2layers/core2.s2	Mon Oct 26 02:28:07 2009 +0000
@@ -207,6 +207,7 @@ class Link
     var Image icon
     "A suggestion from the server as to which icon to use. layouts/users can override this of course.
     alt text works similarly to [member[Link.caption]].";
+    var readonly string{} extra "Extra attributes passed to the link";
 
     function print_button
     "Output this Link as a clickable button using [member[Link.icon]]";
@@ -4191,13 +4192,18 @@ function Comment::print_management_links
     """<ul class="comment-management-links">""";
     var Link link;
     var int count;
+    var string extras;
     $count = 0;
     foreach var string k ($.link_keyseq) {
         $link = $this->get_link($k);
         if ($link.url) {
             $count ++;
             if ($*comment_management_links == "text") {
-                """<li class="link $k""" + ( ($count == 1) ? " first-item" : "" ) + """"><a href="$link.url">$link.caption</a></li>\n""";
+                foreach var string extra ( $link.extra ) {
+                    var string value = $link.extra{$extra};
+                    $extras = $extras + "$extra='$value' ";
+                }
+                """<li class="link $k""" + ( ($count == 1) ? " first-item" : "" ) + """"><a href="$link.url" $extras>$link.caption</a></li>\n""";
             }
             else { ## if ($*comment_management_links == "icon")
                 """<li class="link $k""" + ( ($count == 1) ? " first-item" : "" ) + """">$link</li>\n""";
@@ -4259,6 +4265,7 @@ function Entry::print_management_links()
 
     var Page p = get_page();
     var int count;
+    var string extras;
     $count = 0;
     """<ul class="entry-management-links">""";
     var bool show_interentry = ($p.view == "entry" or $p.view == "reply");
@@ -4274,7 +4281,11 @@ function Entry::print_management_links()
         if ($link.url) {
             $count ++;
             if ($*entry_management_links == "text") {
-                """<li class="link $k""" + ( $count == 1 ? " first-item" : "" ) + """"><a href="$link.url">$link.caption</a></li>\n""";
+                foreach var string extra ( $link.extra ) {
+                    var string value = $link.extra{$extra};
+                    $extras = $extras + "$extra='$value' ";
+                }
+                """<li class="link $k""" + ( $count == 1 ? " first-item" : "" ) + """"><a href="$link.url" $extras>$link.caption</a></li>\n""";
             }
             else { ## if ($*entry_management_links == "icon")
                 """<li class="link $k""" + ( $count == 1 ? " first-item" : "" ) + """">$link</li>\n""";
@@ -4850,14 +4861,20 @@ function Link::as_string() [fixed] : str
 function Link::as_string() [fixed] : string {
     if ($.url == "") { return ""; }
     var string ealt = ehtml($.caption);
-    var string{} extra = $.icon.extra;
-    var string extraParams = "";
-
-    foreach var string extraKey ($extra) {
-        $extraParams = $extraParams + """$extraKey="$extra{$extraKey}" """;
-    }
-
-    return """<a href="$.url"><img border='0' width="$.icon.width" height="$.icon.height" alt="$ealt" title="$ealt" src="$.icon.url" $extraParams /></a>""";
+    var string{} extraLink = $.extra;
+    var string{} extraImg = $.icon.extra;
+    var string extraParamsLink = "";
+    var string extraParamsImg = "";
+
+    foreach var string extraKeyLink ($extraLink) {
+        $extraParamsLink = $extraParamsLink + """$extraKeyLink="$extraLink{$extraKeyLink}" """;
+    }
+
+    foreach var string extraKeyImg ($extraImg) {
+        $extraParamsImg = $extraParamsImg + """$extraKeyImg="$extraImg{$extraKeyImg}" """;
+    }
+
+    return """<a href="$.url" $extraParamsLink><img border='0' width="$.icon.width" height="$.icon.height" alt="$ealt" title="$ealt" src="$.icon.url" $extraParamsImg /></a>""";
 }
 
 # Redirector
diff -r c1ab80df65e0 -r 490a701da881 cgi-bin/LJ/S2.pm
--- a/cgi-bin/LJ/S2.pm	Mon Oct 26 02:07:27 2009 +0000
+++ b/cgi-bin/LJ/S2.pm	Mon Oct 26 02:28:07 2009 +0000
@@ -2105,13 +2105,14 @@ sub Page
 }
 
 sub Link {
-    my ($url, $caption, $icon) = @_;
+    my ($url, $caption, $icon, %extra) = @_;
 
     my $lnk = {
         '_type'   => 'Link',
         'caption' => $caption,
         'url'     => $url,
         'icon'    => $icon,
+        'extra'   => {%extra},
     };
 
     return $lnk;
@@ -2995,17 +2996,18 @@ sub _Comment__get_link
 
             my $etypeid = 'LJ::Event::JournalNewComment'->etypeid;
 
-            return LJ::S2::Link("$LJ::SITEROOT/manage/subscriptions/comments?journal=$u->{'user'}&amp;talkid=" . $comment->dtalkid,
+            return LJ::S2::Link( "$LJ::SITEROOT/manage/subscriptions/comments?journal=$u->{'user'}&amp;talkid=" . $comment->dtalkid,
                                 $ctx->[S2::PROPS]->{"text_multiform_opt_untrack"},
-                                LJ::S2::Image("$LJ::IMGPREFIX/silk/entry/untrack.png", 16, 16, 'Untrack this',
-                                              'lj_etypeid'    => $etypeid,
-                                              'lj_journalid'  => $u->id,
-                                              'lj_subid'      => $subscr->id,
-                                              'class'         => 'TrackButton',
-                                              'id'            => 'lj_track_btn_' . $dtalkid,
-                                              'lj_dtalkid'    => $dtalkid,
-                                              'lj_arg2'       => $comment->jtalkid,
-                                              'lj_auth_token' => $auth_token));
+                                LJ::S2::Image( "$LJ::IMGPREFIX/silk/entry/untrack.png", 16, 16, 'Untrack this' ),
+                                'lj_etypeid'    => $etypeid,
+                                'lj_journalid'  => $u->id,
+                                'lj_subid'      => $subscr->id,
+                                'class'         => 'TrackButton',
+                                'id'            => 'lj_track_btn_' . $dtalkid,
+                                'lj_dtalkid'    => $dtalkid,
+                                'lj_arg2'       => $comment->jtalkid,
+                                'lj_auth_token' => $auth_token,
+                                'js_swapname' => $ctx->[S2::PROPS]->{text_multiform_opt_track} );
         }
 
         return $null_link if $remote->has_subscription(journal => $u, event => "JournalNewComment", arg2 => $comment->jtalkid);
@@ -3048,16 +3050,17 @@ sub _Comment__get_link
         $btn_params{'lj_subid'}      = 0;
         $btn_params{'lj_dtalkid'}    = $dtalkid;
         $btn_params{'id'}            = "lj_track_btn_" . $dtalkid;
+        $btn_params{'js_swapname'}   = $ctx->[S2::PROPS]->{text_multiform_opt_untrack};
 
         if ($key eq "watch_thread" && !$watching_parent) {
-            return LJ::S2::Link("$LJ::SITEROOT/manage/subscriptions/comments?journal=$u->{'user'}&amp;talkid=$dtalkid",
+            return LJ::S2::Link( "$LJ::SITEROOT/manage/subscriptions/comments?journal=$u->{'user'}&amp;talkid=$dtalkid&amp;doodah",
                                 $ctx->[S2::PROPS]->{"text_multiform_opt_track"},
-                                LJ::S2::Image("$LJ::IMGPREFIX/silk/entry/track.png", 16, 16, 'Track This', %btn_params));
+                                LJ::S2::Image( "$LJ::IMGPREFIX/silk/entry/track.png", 16, 16, 'Track This' ), %btn_params );
         }
         if ($key eq "watching_parent" && $watching_parent) {
-            return LJ::S2::Link("$LJ::SITEROOT/manage/subscriptions/comments?journal=$u->{'user'}&amp;talkid=$dtalkid",
+            return LJ::S2::Link( "$LJ::SITEROOT/manage/subscriptions/comments?journal=$u->{'user'}&amp;talkid=$dtalkid",
                                 $ctx->[S2::PROPS]->{"text_multiform_opt_track"},
-                                LJ::S2::Image("$LJ::IMGPREFIX/silk/entry/untrack.png", 16, 16, 'Untrack This', %btn_params));
+                                LJ::S2::Image( "$LJ::IMGPREFIX/silk/entry/untrack.png", 16, 16, 'Untrack This' ), %btn_params );
         }
         return $null_link;
     }
@@ -3618,18 +3621,19 @@ sub _Entry__get_link
                                                    arg1      => $this->{itemid},
                                                    );
 
-        return LJ::S2::Link("$LJ::SITEROOT/manage/subscriptions/entry?journal=$journal&amp;itemid=$this->{'itemid'}",
+        return LJ::S2::Link( "$LJ::SITEROOT/manage/subscriptions/entry?journal=$journal&amp;itemid=$this->{'itemid'}",
                             $ctx->[S2::PROPS]->{"text_watch_comments"},
-                            LJ::S2::Image("$LJ::IMGPREFIX/silk/entry/track.png", 16, 16, 'Track This',
-                                          'lj_journalid'        => $journalu->id,
-                                          'lj_etypeid'          => $etypeid,
-                                          'lj_subid'            => 0,
-                                          'lj_arg1'             => $this->{itemid},
-                                          'lj_auth_token'       => $auth_token,
-                                          'lj_newentry_etypeid' => $newentry_etypeid,
-                                          'lj_newentry_token'   => $newentry_auth_token,
-                                          'lj_newentry_subid'   => $newentry_sub ? $newentry_sub->id : 0,
-                                          'class'               => 'TrackButton'));
+                            LJ::S2::Image( "$LJ::IMGPREFIX/silk/entry/track.png", 16, 16, 'Track This' ),
+                            'lj_journalid'        => $journalu->id,
+                            'lj_etypeid'          => $etypeid,
+                            'lj_subid'            => 0,
+                            'lj_arg1'             => $this->{itemid},
+                            'lj_auth_token'       => $auth_token,
+                            'lj_newentry_etypeid' => $newentry_etypeid,
+                            'lj_newentry_token'   => $newentry_auth_token,
+                            'lj_newentry_subid'   => $newentry_sub ? $newentry_sub->id : 0,
+                            'class'               => 'TrackButton',
+                            'js_swapname'         => $ctx->[S2::PROPS]->{text_unwatch_comments} );
     }
     if ($key eq "unwatch_comments") {
         return $null_link unless LJ::is_enabled('esn');
@@ -3648,18 +3652,19 @@ sub _Entry__get_link
                                                    subid  => $subscr->id,
                                                    action => 'delsub' );
 
-        return LJ::S2::Link("$LJ::SITEROOT/manage/subscriptions/entry?journal=$journal&amp;itemid=$this->{'itemid'}",
+        return LJ::S2::Link( "$LJ::SITEROOT/manage/subscriptions/entry?journal=$journal&amp;itemid=$this->{'itemid'}",
                             $ctx->[S2::PROPS]->{"text_unwatch_comments"},
-                            LJ::S2::Image("$LJ::IMGPREFIX/silk/entry/untrack.png", 16, 16, 'Untrack this',
-                                          'lj_journalid'        => $journalu->id,
-                                          'lj_subid'            => $subscr->id,
-                                          'lj_etypeid'          => $etypeid,
-                                          'lj_arg1'             => $this->{itemid},
-                                          'lj_auth_token'       => $auth_token,
-                                          'lj_newentry_etypeid' => $newentry_etypeid,
-                                          'lj_newentry_token'   => $newentry_auth_token,
-                                          'lj_newentry_subid'   => $newentry_sub ? $newentry_sub->id : 0,
-                                          'class'               => 'TrackButton'));
+                            LJ::S2::Image( "$LJ::IMGPREFIX/silk/entry/untrack.png", 16, 16, 'Untrack this' ),
+                            'lj_journalid'        => $journalu->id,
+                            'lj_subid'            => $subscr->id,
+                            'lj_etypeid'          => $etypeid,
+                            'lj_arg1'             => $this->{itemid},
+                            'lj_auth_token'       => $auth_token,
+                            'lj_newentry_etypeid' => $newentry_etypeid,
+                            'lj_newentry_token'   => $newentry_auth_token,
+                            'lj_newentry_subid'   => $newentry_sub ? $newentry_sub->id : 0,
+                            'class'               => 'TrackButton',
+                            'js_swapname'         => $ctx->[S2::PROPS]->{text_watch_comments} );
     }
 }
 
diff -r c1ab80df65e0 -r 490a701da881 htdocs/js/commentmanage.js
--- a/htdocs/js/commentmanage.js	Mon Oct 26 02:07:27 2009 +0000
+++ b/htdocs/js/commentmanage.js	Mon Oct 26 02:28:07 2009 +0000
@@ -514,6 +514,11 @@ function updateLink (ae, resObj, clickTa
         clickTarget.setAttribute( 'title', resObj.newalt );
         clickTarget.src = resObj.newimage;
         did_something = 1;
+    };
+
+    if ( ae && typeof clickTarget == "undefined" ) {
+        ae.innerHTML = resObj.newalt;
+        did_something = 1;
     }
 
     if (userhook) {
diff -r c1ab80df65e0 -r 490a701da881 htdocs/js/esn.js
--- a/htdocs/js/esn.js	Mon Oct 26 02:07:27 2009 +0000
+++ b/htdocs/js/esn.js	Mon Oct 26 02:28:07 2009 +0000
@@ -68,7 +68,7 @@ ESN.initTrackBtns = function () {
     if (!Site || !Site.has_remote) return;
 
     // attach to all ljuser head icons
-    var trackBtns = DOM.getElementsByTagAndClassName(document, "img", "TrackButton");
+    var trackBtns = DOM.getElementsByTagAndClassName( document, "a", "TrackButton" );
 
     Array.prototype.forEach.call(trackBtns, function (trackBtn) {
         if (!trackBtn || !trackBtn.getAttribute) return;
@@ -82,7 +82,14 @@ ESN.initTrackBtns = function () {
 
 ESN.trackBtnClickHandler = function (evt) {
     var trackBtn = evt.target;
-    if (! trackBtn || trackBtn.tagName.toLowerCase() != "img") return true;
+    if ( ! trackBtn ) return true;
+
+    trackBtn.isIcon = false;
+
+    if ( trackBtn.tagName.toLowerCase() == "img" ) {
+        trackBtn = trackBtn.parentNode;
+        trackBtn.isIcon = true;
+    }
 
     Event.stop(evt);
 
@@ -261,10 +268,17 @@ ESN.toggleSubscription = function (subIn
 
                 // update subthread tracking icons
                 var dtalkid = btn.getAttribute("lj_dtalkid");
-                if (dtalkid)
+                if ( dtalkid ) {
                     ESN.updateThreadIcons(dtalkid, "on");
-                else // not thread tracking button
-                    btn.src = Site.imgprefix + "/silk/entry/untrack.png";
+                } else { // not thread tracking button
+                    if ( ! btn.isIcon ) {
+                        var swapName = btn.innerHTML;
+                        btn.innerHTML = btn.getAttribute( "js_swapname" );
+                        DOM.setElementAttribute( btn, "js_swapname", swapName );
+                    } else {
+                        btn.firstChild.src = Site.imgprefix + "/silk/entry/untrack.png";
+                    }
+                }
             } else {
                 if (info["event_class"] == "LJ::Event::JournalNewComment")
                     DOM.setElementAttribute(btn, "lj_subid", 0);
@@ -295,12 +309,18 @@ ESN.toggleSubscription = function (subIn
                     }
 
                     ESN.updateThreadIcons(dtalkid, state);
+
                 } else {
                     // not thread tracking button
-                    btn.src = Site.imgprefix + "/silk/entry/track.png";
+                    if ( ! btn.isIcon ) {
+                        var swapName = btn.innerHTML;
+                        btn.innerHTML = btn.getAttribute( "js_swapname" );
+                        DOM.setElementAttribute( btn, "js_swapname", swapName );
+                    } else {
+                        btn.firstChild.src = Site.imgprefix + "/silk/entry/track.png";
+                    }
                 }
             }
-
             if (info.auth_token)
                 DOM.setElementAttribute(btn, "lj_auth_token", info.auth_token);
             if (info.newentry_token)
@@ -388,6 +408,12 @@ ESN.updateThreadIcons = function (dtalki
             alert("Unknown tracking state " + tracking);
             break;
     }
-
-    btn.src = Site.imgprefix + uri;
+    if ( typeof btn.firstChild.tagName != "undefined" && btn.firstChild.tagName.toLowerCase() == "img" ) {
+        btn.firstChild.src = Site.imgprefix + uri;
+    } else {
+        var swapName = btn.innerHTML;
+        btn.innerHTML = btn.getAttribute( "js_swapname" );
+        DOM.setElementAttribute( btn, "js_swapname", swapName );
+    }
+        
 };
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org