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 );
+    }
+        
 };
--------------------------------------------------------------------------------