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/29 15:40:28 UTC

[myfaces-tobago] branch master updated: tobago-tree: 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 af60bca  tobago-tree: custom elements
af60bca is described below

commit af60bca8ab24d332af25a3309736a84e27e442a2
Author: Henning Noeth <hn...@apache.org>
AuthorDate: Fri Nov 29 16:24:11 2019 +0100

    tobago-tree: custom elements
    
    fix: multiple tobago-page-overlays after collapsing/expanding tree.
    
    issue: TOBAGO-1633: TS refactoring
---
 .../renderkit/renderer/TreeSelectRenderer.java     |  1 +
 .../src/main/npm/ts/tobago-tree.ts                 | 64 +++++++++++++++++-----
 2 files changed, 51 insertions(+), 14 deletions(-)

diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TreeSelectRenderer.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TreeSelectRenderer.java
index ad60083..69152ec 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TreeSelectRenderer.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/renderkit/renderer/TreeSelectRenderer.java
@@ -138,6 +138,7 @@ public class TreeSelectRenderer extends RendererBase {
       final CommandMap behaviorCommands = getBehaviorCommands(facesContext, treeSelect);
       Command change = behaviorCommands.getOther().get(ClientBehaviors.change);
       change.setExecute(change.getExecute() + " " + tree.getClientId(facesContext));
+      change.setRender(change.getRender() + " " + tree.getClientId(facesContext));
       encodeBehavior(writer, behaviorCommands);
     }
 
diff --git a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree.ts b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree.ts
index 64b1c2f..d3b8aa4 100644
--- a/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree.ts
+++ b/tobago-theme/tobago-theme-standard/src/main/npm/ts/tobago-tree.ts
@@ -42,6 +42,22 @@ export class Tree extends HTMLElement {
     this.hiddenInputSelected.value = JSON.stringify(Array.from(selectedNodes));
   }
 
+  getSelectedNodes(): NodeListOf<TreeNode> {
+    let queryString: string = "";
+    for (const selectedNodeIndex of JSON.parse(this.hiddenInputSelected.value)) {
+      if (queryString.length > 0) {
+        queryString += ", ";
+      }
+      queryString += "tobago-tree-node[index='" + selectedNodeIndex + "']";
+    }
+
+    if(queryString.length > 0) {
+      return this.querySelectorAll(queryString) as NodeListOf<TreeNode>;
+    } else {
+      return null;
+    }
+  }
+
   deleteSelectedNode(selectedNode: number): void {
     const selectedNodes = new Set(JSON.parse(this.hiddenInputSelected.value));
     selectedNodes.delete(selectedNode);
@@ -181,7 +197,6 @@ export class TreeNode extends HTMLElement {
             this.id,
             event,
             {
-              //"javax.faces.behavior.event": "click",
               execute: this.tree.id,
               render: this.tree.id
             });
@@ -226,10 +241,6 @@ export class TreeSelect extends HTMLElement {
 
   connectedCallback(): void {
     this.input.addEventListener("change", this.select.bind(this));
-
-    if (this.tree.selectable === Selectable.multiCascade) {
-      this.input.addEventListener("change", this.selectChildren.bind(this));
-    }
   }
 
   get tree(): Tree {
@@ -240,6 +251,18 @@ export class TreeSelect extends HTMLElement {
     return this.closest("tobago-tree-node") as TreeNode;
   }
 
+  get treeSelectChildren(): NodeListOf<TreeSelect> {
+    let treeNodeId: string = this.treeNode.id;
+    if (this.tree.isSheet) {
+      return this.closest("tbody")
+          .querySelectorAll("tobago-tree-node[parent='" + treeNodeId + "'] tobago-tree-select");
+    } else {
+      let treeNode = this.closest("tobago-tree-node");
+      return treeNode.parentElement
+          .querySelectorAll("tobago-tree-node[parent='" + treeNode.id + "'] tobago-tree-select");
+    }
+  }
+
   get input(): HTMLInputElement {
     return this.querySelector("input");
   }
@@ -256,22 +279,35 @@ export class TreeSelect extends HTMLElement {
         } else {
           this.tree.deleteSelectedNode(this.treeNode.index);
         }
+
+        if (this.tree.selectable === Selectable.multiCascade) {
+          let treeNodeIds = [];
+          this.selectChildren(this.treeSelectChildren, this.input.checked, treeNodeIds);
+
+          /*if (treeNodeIds.length > 0) {
+            for (const id of treeNodeIds) {
+              let ts: TreeSelect = document.getElementById(id).querySelector("tobago-tree-select") as TreeSelect;
+              ts.input.dispatchEvent(new Event("change", {bubbles: false}));
+            }
+          }*/
+        }
         break;
     }
   }
 
-  selectChildren(event: Event): void {
-    for (const treeChildNode of this.treeNode.treeChildNodes) {
-      const child: TreeSelect = treeChildNode.querySelector(":scope > tobago-tree-select");
-      child.input.checked = this.input.checked;
-
-      if (this.input.checked) {
-        this.tree.addSelectedNode(child.treeNode.index);
+  selectChildren(treeSelectChildren: NodeListOf<TreeSelect>, checked: boolean, treeNodeIds: Array<string>): void {
+    for (const treeSelect of treeSelectChildren) {
+      if (treeSelect.input.checked !== checked) {
+        treeSelect.input.checked = checked;
+        treeNodeIds.push(treeSelect.treeNode.id);
+      }
+      if (checked) {
+        this.tree.addSelectedNode(treeSelect.treeNode.index);
       } else {
-        this.tree.deleteSelectedNode(child.treeNode.index);
+        this.tree.deleteSelectedNode(treeSelect.treeNode.index);
       }
 
-      child.input.dispatchEvent(new Event("change", {bubbles: true}));
+      this.selectChildren(treeSelect.treeSelectChildren, checked, treeNodeIds);
     }
   }
 }