fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2011-05-17 02:15 am

[dw-free] jQuerify cut expander

[commit: http://hg.dwscoalition.org/dw-free/rev/2127ee88cfd3]

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

Make expand all cut tags work (jquery beta)

Patch by [personal profile] exor674.

Files modified:
  • htdocs/js/jquery.cuttag-ajax.js
--------------------------------------------------------------------------------
diff -r 6bd4705a82f8 -r 2127ee88cfd3 htdocs/js/jquery.cuttag-ajax.js
--- a/htdocs/js/jquery.cuttag-ajax.js	Tue May 17 00:57:20 2011 +0800
+++ b/htdocs/js/jquery.cuttag-ajax.js	Tue May 17 10:15:43 2011 +0800
@@ -1,5 +1,9 @@
 (function($,Site) {
 
+var isExpandingAll = 0;
+
+var loadPending = 0;
+
 $.widget("dw.cuttag", {
     options: {
         journal: undefined,
@@ -50,12 +54,16 @@
         self.element.append(a);
 
         a.click(function(e) {
+            isExpandingAll = 0;
             e.stopPropagation();
             e.preventDefault();
             self.toggle();
         });
 
         self.element.css("display","inline");
+
+        if ( isExpandingAll )
+            this.open();
     },
     isOpen: function() {
         return this.element.hasClass("cuttag-open") ? 1 : 0;
@@ -68,6 +76,10 @@
     },
     open: function() {
         var self = this;
+        if ( self.isOpen() )
+            return;
+
+        loadPending++;
         self._setArrow("/ajax-loader.gif", self.config.text.loading);
         $.ajax({
             "method": "GET",
@@ -81,11 +93,15 @@
         });
     },
     close: function() {
+        if ( ! this.isOpen() )
+            return;
         this.element.removeClass("cuttag-open");
         this._setArrow("/collapse.gif", this.config.text.expand);
 
         this.tag.div.empty();
         this.tag.div.css("display","none");
+
+        $.dw.cuttag_controls.updateAll();
     },
     _setArrow: function(path,str) {
         var i = this.tag.img;
@@ -133,10 +149,130 @@
 
             replaceDiv.trigger( "updatedcontent.entry" );
             $.dw.cuttag.initLinks(replaceDiv);
+
+            loadPending--;
+
+            if ( loadPending == 0 ) {
+                isExpandingAll = 0;
+            }
+
+            $.dw.cuttag_controls.updateAll();
         }
     }
 });
 
+$.widget("dw.cuttag_controls", {
+    config: {
+        text: {
+            collapse: 'Collapse All Cut Tags',
+            expand: 'Expand All Cut Tags',
+            expanding: 'Expanding All Cut Tags'
+        },
+        image_style: {
+            enabled: "border: 0;",
+            disabled: "border: 0; opacity: 0.4; filter: alpha(opacity=40); zoom: 1;"
+        }
+    },
+    _create: function() {
+        var self = this;
+        var cuttags = $("span.cuttag");
+
+        if ( cuttags.size() == 0 ) return;
+
+        self.update();
+    },
+    update: function() {
+        var self = this;
+        self.element.empty();
+
+        var cuttags = $("span.cuttag");
+
+        var aria_open = "";
+        var aria_closed = "";
+
+        cuttags.each(function (_,element) {
+            var el = $(element).data("cuttag");
+            if ( el.isOpen() ) {
+                aria_open += " div-cuttag_" + el.identifier;
+            } else {
+                aria_closed += " div-cuttag_" + el.identifier;
+            }
+        });
+
+        var el_exp = $("<img>", {
+            alt: self.config.text.expand,
+            title: self.config.text.expand,
+            src: Site.imgprefix + "/collapseAll.gif",
+            style: aria_closed ? self.config.image_style.enabled : self.config.image_style.disabled
+        });
+
+        if ( isExpandingAll ) {
+            el_exp.attr("src",Site.imgprefix + "/ajax-loader.gif");
+            el_exp.attr("style",self.config.image_style.enabled);
+            el_exp.attr("title",self.config.text.expanding);
+            el_exp.attr("alt",self.config.text.expanding);
+        }
+
+        if ( aria_closed ) {
+            var a_exp = $("<a>",{
+                'aria-controls': aria_closed,
+            });
+            a_exp.append(el_exp);
+            el_exp = a_exp;
+
+            a_exp.click(function() {
+                isExpandingAll = 1;
+                var cuttags = $("span.cuttag");
+                cuttags.each(function (_,element) {
+                    $(element).data("cuttag").open();
+                });
+            });
+        }
+        self.element.append(el_exp);
+
+        var el_col = $("<img>", {
+            alt: self.config.text.collapse,
+            title: self.config.text.collapse,
+            src: Site.imgprefix + "/expandAll.gif",
+            style: aria_open ? self.config.image_style.enabled : self.config.image_style.disabled
+        });
+        if ( aria_open ) {
+            var a_col = $("<a>",{
+                'aria-controls': aria_open,
+            });
+            a_col.append(el_col);
+            el_col = a_col;
+            a_col.click(function() {
+                isExpandingAll = 0;
+                to_do = 1;
+                cuttags.each(function (_,element) {
+                    var widget = $(element).data("cuttag");
+                    if ( widget )
+                        widget.close();
+                });
+            });
+        }
+        self.element.append(el_col);
+    }
+});
+
+$.extend( $.dw.cuttag_controls, {
+    initControls: function() {
+        var controls = $(".cutTagControls");
+
+        controls.each(function (_,element) {
+            $(element).cuttag_controls();
+        });
+    },
+    updateAll: function() {
+        var controls = $(".cutTagControls");
+
+        controls.each(function (_,element) {
+            $(element).data("cuttag_controls").update();
+        });
+    }
+});
+
 $.extend( $.dw.cuttag, {
     initLinks: function(context) {
         var cuttags = $("span.cuttag",context);
@@ -151,4 +287,5 @@
 
 jQuery(document).ready(function($) {
     $.dw.cuttag.initLinks(document);
+    $.dw.cuttag_controls.initControls();
 });
--------------------------------------------------------------------------------

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