This is an automated email from the ASF dual-hosted git repository.
riemer pushed a commit to branch
2862-opcua-adapter-add-all-direct-children-+-button-not-working
in repository https://gitbox.apache.org/repos/asf/streampipes.git
The following commit(s) were added to
refs/heads/2862-opcua-adapter-add-all-direct-children-+-button-not-working by
this push:
new 4526d7948f fix(#2862): Support children selection in tree view
4526d7948f is described below
commit 4526d7948fc7f9f25f71ec909f862c59bd676db9
Author: Dominik Riemer <[email protected]>
AuthorDate: Tue May 21 11:49:37 2024 +0200
fix(#2862): Support children selection in tree view
---
.../sdk/extractor/AbstractParameterExtractor.java | 12 ++++++------
.../static-tree-input.component.html | 21 +++++++++++++++++++--
.../static-tree-input.component.scss | 13 +++++++++++++
.../static-tree-input.component.ts | 22 ++++++++++++++++++++++
4 files changed, 60 insertions(+), 8 deletions(-)
diff --git
a/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/extractor/AbstractParameterExtractor.java
b/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/extractor/AbstractParameterExtractor.java
index ad29407fe6..bfefe341ba 100644
---
a/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/extractor/AbstractParameterExtractor.java
+++
b/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/extractor/AbstractParameterExtractor.java
@@ -248,22 +248,22 @@ public abstract class AbstractParameterExtractor<T
extends InvocableStreamPipesE
List<TreeInputNode> allNodes = new ArrayList<>();
RuntimeResolvableTreeInputStaticProperty sp =
getStaticPropertyByName(internalName,
RuntimeResolvableTreeInputStaticProperty.class);
- if (sp.getNodes().size() > 0) {
+ if (!sp.getNodes().isEmpty()) {
sp.getNodes().forEach(node -> buildFlatTree(node, allNodes));
}
- if (allNodes.size() > 0) {
- return allNodes
+ if (!allNodes.isEmpty()) {
+ return sp.getSelectedNodesInternalNames()
.stream()
.filter(node -> {
if (!onlyDataNodes) {
return true;
} else {
- return node.isDataNode();
+ var existingNode = allNodes.stream().filter(n ->
n.getInternalNodeName().equals(node)).findFirst();
+ return existingNode.map(TreeInputNode::isDataNode).orElse(false);
}
})
- .filter(TreeInputNode::isSelected)
- .map(node -> typeParser.parse(node.getInternalNodeName(),
targetClass))
+ .map(node -> typeParser.parse(node, targetClass))
.collect(Collectors.toList());
} else {
return new ArrayList<>();
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.html
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.html
index beabe6de63..b3bc952595 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.html
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.html
@@ -54,14 +54,30 @@
<div fxLayout="row" fxLayoutGap="15px">
<div fxFlex="30" class="tree-input-section" fxLayout="column">
<div class="tree-input-header" fxLayoutAlign="start center">
- <b>Browse</b>
+ <div fxLayout="row" fxFlex="100">
+ <div fxFlex fxLayoutAlign="start
center"><b>Browse</b></div>
+ <div fxLayoutAlign="end center">
+ <button
+ mat-icon-button
+ color="accent"
+ (click)="largeView = !largeView"
+ >
+ <mat-icon
*ngIf="!largeView">open_in_full</mat-icon>
+ <mat-icon *ngIf="largeView"
+ >close_fullscreen</mat-icon
+ >
+ </button>
+ </div>
+ </div>
</div>
<mat-tree
[dataSource]="dataSource"
[treeControl]="treeControl"
#tree
class="sp-tree"
- style="max-height: 300px; overflow-y: auto"
+ [ngClass]="
+ largeView ? 'tree-large-height' : 'tree-normal-height'
+ "
>
<mat-tree-node *matTreeNodeDef="let node" matTreeNodeToggle>
<div
@@ -156,6 +172,7 @@
hasDataChildren(node)
"
matTooltip="Add all direct children"
+ (click)="addAllDirectChildren(node)"
>add_circle</i
>
<i
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.scss
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.scss
index d8aa86627e..4cb8975c33 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.scss
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.scss
@@ -16,6 +16,19 @@
*
*/
+.sp-tree {
+ overflow-y: auto;
+}
+
+.tree-normal-height {
+ min-height: 300px;
+ max-height: 300px;
+}
+
+.tree-large-height {
+ min-height: 800px;
+}
+
.sp-tree-invisible {
display: none;
}
diff --git
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.ts
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.ts
index f736e4a139..1f7dbf2010 100644
---
a/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.ts
+++
b/ui/src/app/core-ui/static-properties/static-runtime-resolvable-tree-input/static-tree-input.component.ts
@@ -27,6 +27,7 @@ import { RuntimeResolvableService } from
'../static-runtime-resolvable-input/run
import { NestedTreeControl } from '@angular/cdk/tree';
import { MatTree, MatTreeNestedDataSource } from '@angular/material/tree';
import { UntypedFormControl } from '@angular/forms';
+import Tree from 'echarts/types/src/data/Tree';
@Component({
selector: 'sp-runtime-resolvable-tree-input',
@@ -43,6 +44,8 @@ export class StaticRuntimeResolvableTreeInputComponent
selectedNodeMetadata: Record<string, string>;
selectedNodeId: string;
+ largeView = false;
+
@ViewChild('tree') tree: MatTree<TreeInputNode>;
constructor(runtimeResolvableService: RuntimeResolvableService) {
@@ -159,6 +162,25 @@ export class StaticRuntimeResolvableTreeInputComponent
this.performValidation();
}
+ addAllDirectChildren(node: TreeInputNode) {
+ node.children.forEach(child => {
+ if (child.dataNode && !this.existsSelectedNode(child)) {
+ this.staticProperty.selectedNodesInternalNames.push(
+ child.internalNodeName,
+ );
+ }
+ });
+ this.performValidation();
+ }
+
+ existsSelectedNode(node: TreeInputNode) {
+ return (
+ this.staticProperty.selectedNodesInternalNames.find(
+ nodeName => nodeName === node.internalNodeName,
+ ) !== undefined
+ );
+ }
+
removeNode(node: TreeInputNode) {
node.selected = false;
const index = this.getSelectedNodeIndex(node.internalNodeName);