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