diff --git a/.gitea/workflows/sonarqube.yml b/.gitea/workflows/sonarqube.yml
index 8bf969a4..dfdb6621 100644
--- a/.gitea/workflows/sonarqube.yml
+++ b/.gitea/workflows/sonarqube.yml
@@ -42,16 +42,43 @@ jobs:
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-maven-
- - name: Build and Test with coverage
+ - name: Build and Test Java
run: mvn clean verify -DskipITs -U --batch-mode
+ - name: Install UI dependencies
+ working-directory: ui
+ run: |
+ echo '//gitea.siegeln.net/api/packages/cameleer/npm/:_authToken=${REGISTRY_TOKEN}' >> .npmrc
+ npm ci
+ env:
+ REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
+
+ - name: Lint UI
+ working-directory: ui
+ run: npm run lint -- --format json --output-file eslint-report.json || true
+
+ - name: Install sonar-scanner
+ run: |
+ SONAR_SCANNER_VERSION=6.2.1.4610
+ curl -sSLo sonar-scanner.zip "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux-x64.zip"
+ unzip -q sonar-scanner.zip
+ ln -s "$(pwd)/sonar-scanner-${SONAR_SCANNER_VERSION}-linux-x64/bin/sonar-scanner" /usr/local/bin/sonar-scanner
+
- name: SonarQube Analysis
run: |
- mvn sonar:sonar --batch-mode \
+ sonar-scanner \
-Dsonar.host.url="$SONAR_HOST_URL" \
-Dsonar.token="$SONAR_TOKEN" \
-Dsonar.projectKey=cameleer3-server \
- -Dsonar.projectName="Cameleer3 Server"
+ -Dsonar.projectName="Cameleer3 Server" \
+ -Dsonar.sources=cameleer3-server-core/src/main/java,cameleer3-server-app/src/main/java,ui/src \
+ -Dsonar.tests=cameleer3-server-core/src/test/java,cameleer3-server-app/src/test/java \
+ -Dsonar.java.binaries=cameleer3-server-core/target/classes,cameleer3-server-app/target/classes \
+ -Dsonar.java.test.binaries=cameleer3-server-core/target/test-classes,cameleer3-server-app/target/test-classes \
+ -Dsonar.java.libraries="$HOME/.m2/repository/**/*.jar" \
+ -Dsonar.typescript.eslint.reportPaths=ui/eslint-report.json \
+ -Dsonar.eslint.reportPaths=ui/eslint-report.json \
+ -Dsonar.exclusions="ui/node_modules/**,ui/dist/**,**/target/**"
env:
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
diff --git a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java
index dd2bb484..56d38c4e 100644
--- a/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java
+++ b/cameleer3-server-app/src/main/java/com/cameleer3/server/app/diagram/ElkDiagramRenderer.java
@@ -53,12 +53,12 @@ public class ElkDiagramRenderer implements DiagramRenderer {
}
private static final int PADDING = 20;
- private static final int NODE_HEIGHT = 40;
- private static final int NODE_WIDTH = 160;
+ private static final int NODE_HEIGHT = 50;
+ private static final int NODE_WIDTH = 220;
private static final int COMPOUND_TOP_PADDING = 30;
private static final int COMPOUND_SIDE_PADDING = 10;
private static final int CORNER_RADIUS = 8;
- private static final double NODE_SPACING = 90.0;
+ private static final double NODE_SPACING = 120.0;
private static final double EDGE_SPACING = 20.0;
// Blue: endpoints
diff --git a/ui/src/components/ProcessDiagram/DiagramNode.tsx b/ui/src/components/ProcessDiagram/DiagramNode.tsx
index a1244fe2..23186932 100644
--- a/ui/src/components/ProcessDiagram/DiagramNode.tsx
+++ b/ui/src/components/ProcessDiagram/DiagramNode.tsx
@@ -5,6 +5,8 @@ import { colorForType, iconForType } from './node-colors';
import { ConfigBadge } from './ConfigBadge';
const TOP_BAR_HEIGHT = 6;
+const TEXT_LEFT = 32;
+const TEXT_RIGHT_PAD = 24;
const CORNER_RADIUS = 4;
interface DiagramNodeProps {
@@ -109,22 +111,27 @@ export function DiagramNode({
+ {/* Clip path for text area */}
+
+
+
+
{/* Icon */}
-
+
{icon}
- {/* Type name */}
-
- {typeName}
-
-
- {/* Detail label (truncated) */}
- {detail && detail !== typeName && (
-
- {detail.length > 22 ? detail.slice(0, 20) + '...' : detail}
+ {/* Type name + detail (clipped to available width) */}
+
+
+ {typeName}
- )}
+ {detail && detail !== typeName && (
+
+ {detail}
+
+ )}
+
{/* Config badges */}
{config && }