Pārlūkot izejas kodu

[popup] Add option to close on escape

Clément Espeute 6 dienas atpakaļ
vecāks
revīzija
2775019350
1 mainītis faili ar 28 papildinājumiem un 4 dzēšanām
  1. 28 4
      hide/comp/Popup.hx

+ 28 - 4
hide/comp/Popup.hx

@@ -9,6 +9,7 @@ class Popup extends Component {
 	var timer : haxe.Timer;
 	var isSearchable:Bool;
 	public var anchor : Element;
+	var globalKeyListener : Dynamic = null;
 
 	function onMouseDown(e : js.html.MouseEvent) {
 		originalTarget = e.target;
@@ -25,7 +26,7 @@ class Popup extends Component {
 	var originalTarget : js.html.EventTarget;
 
 	public function new(?parent:Element, isSearchable = false) {
-        super(parent,new Element("<div>"));
+      super(parent,new Element("<div>"));
 
 		element.attr("popover", "").addClass("popup");
 
@@ -43,9 +44,6 @@ class Popup extends Component {
 		var body = parent.closest(".lm_content");
 		if (body.length == 0) body = new Element("body");
 
-		// Browser.document.addEventListener("mousedown",onMouseDown);
-		// Browser.document.addEventListener("mouseup", onMouseUp);
-
 		timer = new haxe.Timer(500);
 		timer.run = function() {
 			if( parent.closest("body").length == 0 ) {
@@ -58,6 +56,24 @@ class Popup extends Component {
         reflow();
 	}
 
+	public function bindCloseOnEscape() {
+		globalKeyListener = (e: js.html.KeyboardEvent) -> {
+			// in case somehow our event wasn't properly cleaned up
+			if (element.closest("body") == null) {
+				cleanupGlobalKeyListener();
+				return;
+			}
+
+			if (e.key == "Escape") {
+				close();
+				e.preventDefault();
+				e.stopPropagation();
+			}
+		};
+
+		Browser.document.addEventListener("keydown", globalKeyListener, true);
+	}
+
 	public function open() {
 		untyped element.get(0).showPopover();
 		element.show();
@@ -79,9 +95,17 @@ class Popup extends Component {
 			}
 			element.hide();
 			onClose();
+			if (globalKeyListener != null) {
+				cleanupGlobalKeyListener();
+			}
 		}
 	}
 
+	function cleanupGlobalKeyListener() {
+		Browser.document.removeEventListener("keydown", globalKeyListener, true);
+		globalKeyListener = null;
+	}
+
 	function fixInputSelect() {
 		var e = new Element("input");
 		e.each(function (id : Int, elem : js.html.Element) {