From 3906448d713da7106a9130077e57a7d7e47dff39 Mon Sep 17 00:00:00 2001
From: KDSBrowne <kert.browne85@gmail.com>
Date: Thu, 8 Jun 2017 08:33:25 -0700
Subject: [PATCH] fix keydown event bugs

---
 .../ui/components/dropdown/list/component.jsx | 105 +++++++++++++++---
 .../ui/components/user-list/component.jsx     |   4 +-
 .../user-list/user-list-item/component.jsx    |   3 +-
 3 files changed, 91 insertions(+), 21 deletions(-)

diff --git a/bigbluebutton-html5/imports/ui/components/dropdown/list/component.jsx b/bigbluebutton-html5/imports/ui/components/dropdown/list/component.jsx
index 78bb001414..a56e18ba4e 100755
--- a/bigbluebutton-html5/imports/ui/components/dropdown/list/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/dropdown/list/component.jsx
@@ -26,9 +26,14 @@ export default class DropdownList extends Component {
     this.childrenRefs = [];
     this.handleItemKeyDown = this.handleItemKeyDown.bind(this);
     this.handleItemClick = this.handleItemClick.bind(this);
+    this.handleItemKeyDownWithparent = this.handleItemKeyDownWithparent.bind(this);
     this.focusedItemIndex = 0;
   }
 
+  componentDidMount() {
+    this._menu.addEventListener('keydown', event=>this.handleItemKeyDownWithparent(event));
+  }
+  
   componentWillMount() {
     this.setState({
       activeItemIndex: 0,
@@ -49,7 +54,85 @@ export default class DropdownList extends Component {
     }
   }
 
+  handleItemKeyDownWithparent(event) {
+    const { onActionsHide, getDropdownMenuParent, } = this.props;
+
+      if (!getDropdownMenuParent) {
+
+        let selectableItems = [];
+        for (let i = 0; i < (this._menu.children.length); i++) {
+          if (this._menu.children[i].getAttribute("role") === 'menuitem'){
+            selectableItems.push(this._menu.children[i]);
+          }
+        }
+
+        const focusMenuItem = () => {
+          selectableItems[this.focusedItemIndex].focus();
+        }
+
+        if (KEY_CODES.ARROW_UP === event.which) {
+          event.stopPropagation();
+
+          this.focusedItemIndex -= 1;
+
+          if (this.focusedItemIndex < 0) {
+            this.focusedItemIndex = selectableItems.length - 1;
+          }else if (this.focusedItemIndex > selectableItems.length - 1) {
+            this.focusedItemIndex = 0;
+          }
+          
+          focusMenuItem();
+          return;
+        }
+
+        if ([KEY_CODES.ARROW_DOWN].includes(event.keyCode)) {
+          event.stopPropagation();
+
+          this.focusedItemIndex += 1;
+
+          if(this.focusedItemIndex > selectableItems.length - 1){
+            this.focusedItemIndex = 0;
+          }
+
+          focusMenuItem();
+          return;
+        }
+
+        if ([KEY_CODES.ENTER, KEY_CODES.ARROW_RIGHT].includes(event.keyCode)) {
+          event.stopPropagation();
+          document.activeElement.firstChild.click();
+          return;
+        }
+
+        if ([KEY_CODES.ESCAPE, KEY_CODES.TAB, KEY_CODES.ARROW_LEFT].includes(event.keyCode)) {
+          const { dropdownHide } = this.props;
+          event.stopPropagation();
+          dropdownHide();
+          return;
+        }
+
+    }else{
+
+        if ([KEY_CODES.ESCAPE, KEY_CODES.TAB, KEY_CODES.ARROW_LEFT].includes(event.keyCode)) {
+          const { getDropdownMenuParent, dropdownHide, } = this.props;
+
+          event.stopPropagation();
+        
+          if (getDropdownMenuParent) {
+            getDropdownMenuParent().focus();
+          }
+
+          dropdownHide();
+          return;
+        }
+
+        document.activeElement.firstChild.click();
+        onActionsHide();
+    }
+  }
+
   handleItemKeyDown(event, callback) {
+
     const { dropdownHide } = this.props;
     const { activeItemIndex } = this.state;
 
@@ -61,32 +144,21 @@ export default class DropdownList extends Component {
     }
 
     const focusMenuItem = () => {
-      event.preventDefault();
-      event.stopPropagation();
-
       selectableItems[this.focusedItemIndex].focus();
     }
 
     if ([KEY_CODES.ENTER, KEY_CODES.SPACE].includes(event.keyCode)) {
-      const { getDropdownMenuParent } = this.props;
-      
-      if (getDropdownMenuParent) {
-        return;
-      }
-
-      event.preventDefault();
       event.stopPropagation();
-
+      
       document.activeElement.firstChild.click();
     }
 
     if ([KEY_CODES.ARROW_DOWN].includes(event.keyCode)) {
-      event.preventDefault();
       event.stopPropagation();
 
       this.focusedItemIndex += 1;
 
-      if(this.focusedItemIndex > selectableItems.length - 1){
+      if (this.focusedItemIndex > selectableItems.length - 1) {
         this.focusedItemIndex = 0;
       }
 
@@ -94,24 +166,22 @@ export default class DropdownList extends Component {
     }
 
     if (KEY_CODES.ARROW_UP === event.which) {
-      event.preventDefault();
       event.stopPropagation();
 
       this.focusedItemIndex -= 1;
 
       if (this.focusedItemIndex < 0) {
         this.focusedItemIndex = selectableItems.length - 1;
-      }else if (this.focusedItemIndex > selectableItems.length - 1){
+      }else if (this.focusedItemIndex > selectableItems.length - 1) {
         this.focusedItemIndex = 0;
       }
       
       focusMenuItem();
     }
 
-    if ([KEY_CODES.ESCAPE, KEY_CODES.TAB, KEY_CODES.ARROW_LEFT].includes(event.keyCode)){
+    if ([KEY_CODES.ESCAPE, KEY_CODES.TAB, KEY_CODES.ARROW_LEFT].includes(event.keyCode)) {
       const { getDropdownMenuParent } = this.props;
 
-      event.preventDefault();
       event.stopPropagation();
       
       if (getDropdownMenuParent) {
@@ -156,7 +226,6 @@ export default class DropdownList extends Component {
           onClick: (event) => {
             let { onClick } = item.props;
             onClick = onClick ? onClick.bind(item) : null;
-
             this.handleItemClick(event, onClick);
           },
 
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/component.jsx
index a60b6a794d..6dc577205e 100755
--- a/bigbluebutton-html5/imports/ui/components/user-list/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/component.jsx
@@ -77,8 +77,8 @@ class UserList extends Component {
         this.focusList(list);
     }
 
-    if ([KEY_CODES.ARROW_RIGHT, KEY_CODES.ENTER].includes(event.keyCode)) {
-        active.firstChild.click();
+    if ([KEY_CODES.ARROW_RIGHT, KEY_CODES.ARROW_SPACE].includes(event.keyCode)) {
+      active.firstChild.click();
     }
 
     if (event.keyCode === KEY_CODES.ARROW_DOWN) {
diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/component.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/component.jsx
index 9c2d60fd40..42f77a869e 100755
--- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/component.jsx
+++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-item/component.jsx
@@ -300,7 +300,8 @@ class UserListItem extends Component {
 
           <DropdownList 
             ref={(ref) => { this.list = ref; }} 
-            getDropdownMenuParent={this.getDropdownMenuParent}>
+            getDropdownMenuParent={this.getDropdownMenuParent}
+            onActionsHide={this.onActionsHide}>
             {
               [
                 (<DropdownListTitle
-- 
GitLab