[beast/ebeast] EBEAST: add closeonescape to ModalDialog



commit fabc88769e323139d997c5e9c23050c66d7c9e2a
Author: Tim Janik <timj gnu org>
Date:   Tue Mar 7 00:46:15 2017 +0100

    EBEAST: add closeonescape to ModalDialog
    
    Signed-off-by: Tim Janik <timj gnu org>

 ebeast/assets/dialogs.js |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)
---
diff --git a/ebeast/assets/dialogs.js b/ebeast/assets/dialogs.js
index 4cbf8e9..36c7480 100644
--- a/ebeast/assets/dialogs.js
+++ b/ebeast/assets/dialogs.js
@@ -1,4 +1,5 @@
 'use strict';
+const Widgets = require ('./widgets.js');
 const m = Mithril;
 
 // == ModalDialog ==
@@ -8,13 +9,35 @@ const m = Mithril;
  * - title: dialog title vnode
  * - buttons: list of vnodes
  * - onclose: callback for dialog closing
+ * - closeonescape: boolean
  */
 const ModalDialog = {
+  oncreate: function (vnode) {
+    function document_keydown (event) {
+      if (vnode.attrs.closeonescape === false ||
+         !vnode.attrs.onclose ||
+         !event || event.defaultPrevented ||
+         event.keyCode != Widgets.KeyCode.ESCAPE)
+       return;
+      event.preventDefault();
+      vnode.attrs.onclose.call (vnode.dom, event);
+      m.redraw();
+    }
+    vnode.state.document_keydown = document_keydown;
+    $(document.body).on ('keydown', vnode.state.document_keydown);
+  },
+  onremove: function (vnode) {
+    if (vnode.state.document_keydown) {
+      $(document.body).off ('keydown', vnode.state.document_keydown);
+      vnode.state.document_keydown = undefined;
+    }
+  },
   view: function (vnode) {
     const child_attrs = {
       title: undefined,
       buttons: undefined,
       onclose: undefined,
+      closeonescape: undefined,
       __proto__: vnode.attrs
     };
     let divs = [


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]