From db47430f71b319ae62897639f0d44b11cd35fee8 Mon Sep 17 00:00:00 2001
From: Sandro Lutz <sandro.lutz@temparus.ch>
Date: Sun, 31 Dec 2017 13:38:48 +0100
Subject: [PATCH] Change onchange to oninput (more intuitive behavior)

---
 src/views/formFields.js     | 23 ++++++++++++++++++++++-
 src/views/jsonSchemaForm.js |  2 +-
 2 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/views/formFields.js b/src/views/formFields.js
index b411a78e..5db38ae9 100644
--- a/src/views/formFields.js
+++ b/src/views/formFields.js
@@ -25,6 +25,7 @@ export class inputGroup {
     }
     args.value = vnode.attrs.value;
     args.onchange = vnode.attrs.onchange;
+    args.oninput = vnode.attrs.oninput;
 
     if (['radio', 'checkbox'].includes(args.type)) {
       return m('div', { class: groupClasses }, [
@@ -65,6 +66,14 @@ export class selectGroup {
                   }
                   vnode.attrs.onchange({ target: { name: e.target.name, value: this.value } });
                 },
+                oninput: (e) => {
+                  if (e.target.checked) {
+                    this.value.push(e.target.value);
+                  } else {
+                    this.value = this.value.filter(item => item !== e.target.value);
+                  }
+                  vnode.attrs.oninput({ target: { name: e.target.name, value: this.value } });
+                },
                 args: { type: 'checkbox' },
               }))),
           ]);
@@ -97,7 +106,18 @@ export class selectGroup {
                       value.push(opt);
                     }
                   }
-                  vnode.attrs.onchange(e);
+                  vnode.attrs.onchange({ target: { name: e.target.name, value } });
+                },
+                oninput: (e) => {
+                  const value = [];
+                  let opt;
+                  for (let i = 0; i < e.target.options.length; i += 1) {
+                    opt = e.target.options[i];
+                    if (opt.selected) {
+                      value.push(opt);
+                    }
+                  }
+                  vnode.attrs.oninput({ target: { name: e.target.name, value } });
                 },
                 multiple: true,
               },
@@ -112,6 +132,7 @@ export class selectGroup {
             {
               value: vnode.attrs.value,
               onchange: vnode.attrs.onchange,
+              oninput: vnode.attrs.oninput,
               multiple: false,
             },
             vnode.attrs.args.options.map(option => m('option', option)),
diff --git a/src/views/jsonSchemaForm.js b/src/views/jsonSchemaForm.js
index aa07e8f3..98887168 100644
--- a/src/views/jsonSchemaForm.js
+++ b/src/views/jsonSchemaForm.js
@@ -32,7 +32,7 @@ export default class JSONSchemaForm {
     if (!this.errors[attrs.name]) this.errors[attrs.name] = [];
 
     const boundFormelement = {
-      onchange: (e) => {
+      oninput: (e) => {
         // bind changed data
         this.data[e.target.name] = e.target.value;
 
-- 
GitLab