From 328f1d6cd7cfbc7d6cb687dd6b93114947f7bd63 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Wed, 17 Jun 2026 12:45:33 +0300 Subject: [PATCH 1/2] test(iot-hub): use WIDGET in install-plan dedupe tests so root-entry isAlreadyInstalled check applies --- .../server/service/iot_hub/DefaultIotHubServiceTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/application/src/test/java/org/thingsboard/server/service/iot_hub/DefaultIotHubServiceTest.java b/application/src/test/java/org/thingsboard/server/service/iot_hub/DefaultIotHubServiceTest.java index d505509e4a..c252b58103 100644 --- a/application/src/test/java/org/thingsboard/server/service/iot_hub/DefaultIotHubServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/iot_hub/DefaultIotHubServiceTest.java @@ -180,7 +180,7 @@ class DefaultIotHubServiceTest { String versionId = UUID.randomUUID().toString(); UUID rootItemId = UUID.randomUUID(); when(iotHubRestClient.getVersionInfo(versionId)) - .thenReturn(version(versionId, rootItemId.toString(), "DASHBOARD", "Root", "1.0")); + .thenReturn(version(versionId, rootItemId.toString(), "WIDGET", "Root", "1.0")); when(iotHubInstalledItemService.findInstalledItemIdsByTenantIdAndItemIdIn(eq(tenantId), any())).thenReturn(List.of(rootItemId)); InstallPlan plan = service.resolveInstallPlan(user, versionId); @@ -231,6 +231,7 @@ class DefaultIotHubServiceTest { InstallPlanEntry entry = new InstallPlanEntry(); entry.setItemId(itemId.toString()); entry.setVersionId(UUID.randomUUID().toString()); + entry.setType("WIDGET"); entry.setStatus(InstallPlanEntry.Status.WILL_INSTALL); entry.setRoot(true); // The item is reported as already installed at install time, even though the plan says WILL_INSTALL. From dcbafcf4233a19c3d0dfe5c40e85cc5078eccc9f Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Wed, 17 Jun 2026 17:40:32 +0300 Subject: [PATCH 2/2] style(iot-hub): scroll long creator description + links inside their own container Wrap the creator description and social-link block in a flex column that takes the remaining height with overflow-y:auto, so long bios scroll inside the left rail instead of pushing the avatar off-screen. Lock the avatar's min-height to keep its circle from collapsing. --- .../iot-hub-creator-profile.component.html | 76 ++++++++++--------- .../iot-hub-creator-profile.component.scss | 13 ++++ 2 files changed, 52 insertions(+), 37 deletions(-) diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.html b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.html index f599fcc743..9e181dff63 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.html +++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.html @@ -41,7 +41,7 @@ chevron_left {{ 'iot-hub.back-to-iot-hub' | translate }} -
+
@if (getAvatarUrl(); as avatarUrl) { @@ -57,46 +57,48 @@ matTooltipPosition="above">verified }
- @if (creator.description) { -

{{ creator.description }}

- } -
- @if (creator.website) { - - language - {{ getWebsiteLabel() }} - +
+ @if (creator.description) { +

{{ creator.description }}

} - @if (creator.contactEmail) { - +
+ @if (creator.website) { + + language + {{ getWebsiteLabel() }} + + } + @if (creator.contactEmail) { + mdi:email-outline {{ creator.contactEmail }} - } - @if (creator.githubUrl) { - - mdi:github - GitHub - - } - @if (creator.linkedinUrl) { - - mdi:linkedin - LinkedIn - - } - @if (creator.twitterUrl) { - - mdi:twitter - X - - } - @if (creator.youtubeUrl) { - - mdi:youtube - YouTube - - } + } + @if (creator.githubUrl) { + + mdi:github + GitHub + + } + @if (creator.linkedinUrl) { + + mdi:linkedin + LinkedIn + + } + @if (creator.twitterUrl) { + + mdi:twitter + X + + } + @if (creator.youtubeUrl) { + + mdi:youtube + YouTube + + } +
diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.scss b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.scss index 885ef74812..3163c89674 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.scss +++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-creator-profile.component.scss @@ -68,6 +68,7 @@ width: 140px; height: 140px; min-width: 140px; + min-height: 140px; border-radius: 50%; overflow: hidden; display: flex; @@ -107,6 +108,18 @@ cursor: default; } +.tb-creator-desc-container { + display: flex; + flex-direction: column; + gap: 1rem; + flex: 1; + min-height: 0; + overflow-y: auto; + @media #{$mat-gt-md} { + padding-bottom: 1rem; + } +} + // Description .tb-creator-desc { font-size: 16px;