]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 1280397 - [a11y] Make the component, product, and other latches accessible
authorDavid Lawrence <dkl@mozilla.com>
Thu, 26 Jan 2017 00:37:06 +0000 (00:37 +0000)
committerDavid Lawrence <dkl@mozilla.com>
Thu, 26 Jan 2017 00:37:06 +0000 (00:37 +0000)
extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl
extensions/BugModal/web/bug_modal.js

index d81fb9e92631ef974c43875c7de37d4a901e7d85..314db7c3ad6b66ab41f774e314413267881742ce 100644 (file)
         hide_on_edit = can_edit_product
         help         = "describecomponents.cgi"
     %]
-      <span class="spin-latch" id="product-latch" data-latch="#product-latch" data-for="#product-info">&#9656;</span>
-      <div class="spin-toggle" data-latch="#product-latch" data-for="#product-info">
+      <span aria-hidden="true" class="spin-latch" id="product-latch"
+            data-latch="product" data-for="product">&#9656;</span>
+      <div role="button" aria-label="show product information"
+           title="show product information" tabindex="0"
+           aria-expanded="false" class="spin-toggle" id="product-name"
+           data-latch="product" data-for="product">
         [% bug.product FILTER html %]
       </div>
       <div id="product-info" style="display:none">
         field_type = constants.FIELD_TYPE_SINGLE_SELECT
         help = "describecomponents.cgi"
     %]
-      <span class="spin-latch" id="component-latch" data-latch="#component-latch" data-for="#component-info">&#9656;</span>
-      <div class="spin-toggle" data-latch="#component-latch" data-for="#component-info">
-        [% bug.component FILTER html %]
+      <span aria-hidden="true" class="spin-latch" id="component-latch"
+            data-latch="component" data-for="component">&#9656;</span>
+      <div role="button" aria-label="show component description"
+           title="show component information" tabindex="0"
+           aria-expanded="false" class="spin-toggle" id="component-name"
+           data-latch="#component-latch" data-for="component">
+          [% bug.component FILTER html %]
       </div>
       <div id="component-info" style="display:none">
         <div>[% bug.component_obj.description FILTER html_light %]</div>
       [% END %]
 
       [% IF bug.cc && bug.cc.size %]
-        [% IF user.id %]
-          <input type="hidden" name="removecc" id="removecc">
-          <span id="cc-latch">&#9656;</span>
-        [% END %]
-        <span id="cc-summary" data-count="[% bug.cc.size FILTER none %]">
-          [%
-            IF bug.cc.size == 1;
-              is_cced ? "Just you" : "1 person";
-            ELSE;
-              bug.cc.size _ " people";
-            END;
-          %]
+        <span aria-owns="cc-latch cc-summary">
+          [% IF user.id %]
+            <input type="hidden" name="removecc" id="removecc">
+            <span role="button" aria-label="show cc list" tabindex="0" id="cc-latch">&#9656;</span>
+          [% END %]
+          <span role="button" aria-label="show cc list" tabindex="0"
+                id="cc-summary" data-count="[% bug.cc.size FILTER none %]">
+            [%
+              IF bug.cc.size == 1;
+                is_cced ? "Just you" : "1 person";
+              ELSE;
+                bug.cc.size _ " people";
+              END;
+            %]
+          </span>
         </span>
       [% ELSE %]
         <i>Nobody</i>
index 01be1fd2c8a668671a46a1c1ade250efad1fe174..40d3cd6dde2d29545a106143a7baa02aea9a7fbf 100644 (file)
@@ -163,20 +163,38 @@ $(function() {
     // product/component info
     $('.spin-toggle, #product-latch, #component-latch')
         .click(function(event) {
-            event.preventDefault();
-            var latch = $($(event.target).data('latch'));
-            var el_for = $($(event.target).data('for'));
-
-            if (latch.data('expanded')) {
-                latch.data('expanded', false).html('&#9656;');
-                el_for.hide();
-            }
-            else {
-                latch.data('expanded', true).html('&#9662;');
-                el_for.show();
+            spin_toggle(event);
+        }).keydown(function(event) {
+            // allow space or enter to toggle visibility
+            if (event.keyCode == 13 || event.keyCode == 32) {
+                spin_toggle(event);
             }
         });
 
+    function spin_toggle(event) {
+        event.preventDefault();
+        var type  = $(event.target).data('for');
+        var latch = $('#' + type + '-latch');
+        var name  = $('#' + type + '-name');
+        var info  = $('#' + type + '-info');
+        var label = name.attr('aria-label');
+
+        if (latch.data('expanded')) {
+            label = label.replace(/^hide/, 'show');
+            latch.data('expanded', false).html('&#9656;');
+            name.attr('aria-expanded', false);
+            info.hide();
+        }
+        else {
+            label = label.replace(/^show/, 'hide');
+            latch.data('expanded', true).html('&#9662;');
+            name.attr('aria-expanded', true);
+            info.show();
+        }
+        name.attr('aria-label', label);
+        name.attr('title', label);
+    }
+
     // cc list
 
     function ccListLoading() {
@@ -230,24 +248,37 @@ $(function() {
         $('#cc-summary').addClass('cc-loadable');
         $('#cc-latch, #cc-summary')
             .click(function(event) {
-                event.preventDefault();
-                var latch = $('#cc-latch');
-
-                if (latch.data('expanded')) {
-                    latch.data('expanded', false).html('&#9656;');
-                    $('#cc-list').hide();
-                }
-                else {
-                    latch.data('expanded', true).html('&#9662;');
-                    $('#cc-list').show();
-                    if (!latch.data('fetched')) {
-                        ccListLoading();
-                        ccListUpdate();
-                    }
+                cc_toggle(event);
+            }).keydown(function(event) {
+                // allow space or enter to toggle visibility
+                if (event.keyCode == 13 || event.keyCode == 32) {
+                    cc_toggle(event);
                 }
             });
     }
 
+    function cc_toggle(event) {
+        event.preventDefault();
+        var latch = $('#cc-latch');
+        var label = latch.attr('aria-label');
+        if (latch.data('expanded')) {
+            label = label.replace(/^hide/, 'show');
+            latch.data('expanded', false).html('&#9656;');
+            $('#cc-list').hide();
+        }
+        else {
+            latch.data('expanded', true).html('&#9662;');
+            label = label.replace(/^show/, 'hide');
+            $('#cc-list').show();
+            if (!latch.data('fetched')) {
+                ccListLoading();
+                ccListUpdate();
+            }
+        }
+        latch.attr('aria-label', label);
+        $('#cc-summary').attr('aria-label', label);
+    }
+
     // copy summary to clipboard
 
     function clipboardSummary() {