You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by hn...@apache.org on 2019/11/11 15:21:21 UTC

[myfaces-tobago] branch master updated: tobago-select-one-listbox: custom elements

This is an automated email from the ASF dual-hosted git repository.

hnoeth pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/myfaces-tobago.git


The following commit(s) were added to refs/heads/master by this push:
     new 708155d  tobago-select-one-listbox: custom elements
708155d is described below

commit 708155da52f57dd3807e16571222d26b27a43bdf
Author: Henning Noeth <hn...@apache.org>
AuthorDate: Thu Nov 7 16:07:44 2019 +0100

    tobago-select-one-listbox: custom elements
    
    Using custom elements for tobago-select-one-listbox.ts
    
    issue: TOBAGO-1633: TS refactoring
---
 .../renderer/SelectOneListboxRenderer.java         |  4 ++
 .../tobago/renderkit/html/HtmlElements.java        |  1 +
 .../src/main/npm/ts/tobago-select-one-listbox.ts   | 79 ++++++++++++++++------
 3 files changed, 63 insertions(+), 21 deletions(-)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListboxRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListboxRenderer.java
index 0773f02..d30b732 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListboxRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/SelectOneListboxRenderer.java
@@ -38,6 +38,10 @@ import java.util.List;
 
 public class SelectOneListboxRenderer extends SelectOneRendererBase {
 
+  public HtmlElements getComponentTag() {
+    return HtmlElements.TOBAGO_SELECT_ONE_LISTBOX;
+  }
+
   @Override
   public boolean getRendersChildren() {
     return true;
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/HtmlElements.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/HtmlElements.java
index abd1dac..2b586d0 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/HtmlElements.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/renderkit/html/HtmlElements.java
@@ -146,6 +146,7 @@ public enum HtmlElements {
   TOBAGO_SELECT_BOOLEAN_TOGGLE("tobago-select-boolean-toggle"),
   TOBAGO_SELECT_MANY_CHECKBOX("tobago-select-many-checkbox"),
   TOBAGO_SELECT_MANY_SHUTTLE("tobago-select-many-shuttle"),
+  TOBAGO_SELECT_ONE_LISTBOX("tobago-select-one-listbox"),
   TOBAGO_SHEET("tobago-sheet"),
   TOBAGO_STARS("tobago-stars"),
   TOBAGO_SUGGEST("tobago-suggest"),
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-listbox.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-listbox.ts
index 8387958..a3232b6 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-listbox.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-select-one-listbox.ts
@@ -15,29 +15,66 @@
  * limitations under the License.
  */
 
-import {Listener, Phase} from "./tobago-listener";
 import {DomUtils} from "./tobago-utils";
 
-class SelectOneListbox {
-
-  static init = function (element: HTMLElement): void {
-    for (const listbox of DomUtils.selfOrQuerySelectorAll(element, ".tobago-selectOneListbox:not(:required)")) {
-      listbox.addEventListener("change", (event: Event) => {
-        const target = event.currentTarget as HTMLSelectElement;
-        if (!target.dataset.tobagoOldValue) {
-          target.dataset.tobagoOldValue = "-1";
-        }
-      });
-      listbox.addEventListener("click", (event: Event) => {
-        const target = event.currentTarget as HTMLSelectElement;
-        if (!target.dataset.tobagoOldValue || parseInt(target.dataset.tobagoOldValue) === target.selectedIndex) {
-          target.selectedIndex = -1;
-        }
-        target.dataset.tobagoOldValue = String(target.selectedIndex);
-      });
+class SelectOneListbox extends HTMLElement {
+
+  private oldSelectedIndex: number = -1;
+
+  constructor() {
+    super();
+  }
+
+  connectedCallback(): void {
+    if (!this.select.required) {
+      this.select.addEventListener("click", this.clickSelection.bind(this));
+      this.select.addEventListener("keyup", this.keySelection.bind(this));
     }
-  };
+  }
+
+  private clickSelection(event: MouseEvent): void {
+    const select = event.currentTarget as HTMLSelectElement;
+    if (select.selectedIndex >= 0 && select.selectedIndex === this.oldSelectedIndex) {
+      this.revertSelection(select);
+    } else {
+      this.saveSelection(select);
+    }
+  }
+
+  private keySelection(event: KeyboardEvent): void {
+    const select = event.currentTarget as HTMLSelectElement;
+    if (event.code === "Space") {
+      if (select.selectedIndex >= 0) {
+        this.oldSelectedIndex = select.selectedIndex;
+        select.selectedIndex = -1;
+      } else {
+        select.selectedIndex = this.oldSelectedIndex;
+      }
+    } else {
+      this.saveSelection(select);
+    }
+  }
+
+  private revertSelection(select: HTMLSelectElement): void {
+    if (select.selectedIndex > -1) {
+      this.oldSelectedIndex = select.selectedIndex;
+      select.selectedIndex = -1;
+    } else {
+      select.selectedIndex = this.oldSelectedIndex;
+      this.oldSelectedIndex = -1;
+    }
+  }
+
+  private saveSelection(select: HTMLSelectElement): void {
+    this.oldSelectedIndex = select.selectedIndex;
+  }
+
+  get select(): HTMLSelectElement {
+    const rootNode = this.getRootNode() as ShadowRoot | Document;
+    return rootNode.getElementById(this.id + DomUtils.SUB_COMPONENT_SEP + "field") as HTMLSelectElement;
+  }
 }
 
-Listener.register(SelectOneListbox.init, Phase.DOCUMENT_READY);
-Listener.register(SelectOneListbox.init, Phase.AFTER_UPDATE);
+document.addEventListener("DOMContentLoaded", function (event: Event): void {
+  window.customElements.define("tobago-select-one-listbox", SelectOneListbox);
+});