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

JHoelli pushed a commit to branch 4716-add-loading-banner-for-asset-links
in repository https://gitbox.apache.org/repos/asf/streampipes.git


The following commit(s) were added to 
refs/heads/4716-add-loading-banner-for-asset-links by this push:
     new 192e0b8fc6 alert banner
192e0b8fc6 is described below

commit 192e0b8fc675278bb0bac43eeb1854a18f2e9ecc
Author: Jacqueline Höllig <[email protected]>
AuthorDate: Mon Jul 13 06:00:55 2026 +0000

    alert banner
---
 .../asset-link-table.component.html                | 204 ++++++-----
 .../asset-link-table/asset-link-table.component.ts |   5 +
 .../view-asset-links.component.html                |  13 +
 .../view-asset-links/view-asset-links.component.ts |   2 +
 .../asset-link-table.component.html                | 390 +++++++++++----------
 .../asset-link-table/asset-link-table.component.ts |   5 +
 .../manage-asset-links-dialog.component.html       |   1 +
 .../manage-asset-links-dialog.component.ts         |   2 +
 8 files changed, 338 insertions(+), 284 deletions(-)

diff --git 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.html
 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.html
index da7295734b..2d855fb596 100644
--- 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.html
+++ 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.html
@@ -17,101 +17,115 @@
   -->
 
 <div fxFlex="100" fxLayout="row" fxLayoutAlign="center start">
-    <sp-table
-        fxFlex="100"
-        [columns]="displayedColumns"
-        [dataSource]="dataSource"
-        [showActionsMenu]="true"
-        [rowsClickable]="true"
-        (rowClicked)="openDetails($event)"
-        data-cy="all-adapters-table"
-        matSort
-    >
-        <ng-container matColumnDef="type">
-            <th mat-header-cell mat-sort-header *matHeaderCellDef>
-                {{ 'Type' | translate }}
-            </th>
-            <td mat-cell *matCellDef="let assetLink">
-                <div
-                    fxLayout="column"
-                    fxLayoutAlign="start start"
-                    class="truncate"
-                >
-                    <sp-asset-link-table-type
-                        [assetLink]="assetLink"
-                        [assetLinkTypes]="assetLinkTypes"
-                        class="mt-sm mb-sm"
-                    >
-                    </sp-asset-link-table-type>
-                </div>
-            </td>
-        </ng-container>
-        <ng-container matColumnDef="linkLabel">
-            <th mat-header-cell mat-sort-header *matHeaderCellDef>
-                {{ 'Name' | translate }}
-            </th>
-            <td
-                mat-cell
-                *matCellDef="let assetLink"
-                data-cy="asset-links-table"
+    <div fxFlex="100" fxLayout="column" fxLayoutGap="8px">
+        @if (loading) {
+            <sp-alert-banner
+                type="info"
+                icon="hourglass_empty"
+                [title]="'Loading linked resources' | translate"
+                [description]="
+                    'This can take a moment while Streampipes gathers the 
available assets.'
+                        | translate
+                "
+            ></sp-alert-banner>
+        } @else {
+            <sp-table
+                fxFlex="100"
+                [columns]="displayedColumns"
+                [dataSource]="dataSource"
+                [showActionsMenu]="true"
+                [rowsClickable]="true"
+                (rowClicked)="openDetails($event)"
+                data-cy="all-adapters-table"
+                matSort
             >
-                <div
-                    fxLayout="column"
-                    fxLayoutAlign="start start"
-                    class="truncate"
-                >
-                    <span>{{ assetLink.linkLabel }}</span>
-                </div>
-            </td>
-        </ng-container>
-        <ng-container matColumnDef="additionalInfo">
-            <th mat-header-cell *matHeaderCellDef>Info</th>
-            <td mat-cell *matCellDef="let assetLink">
-                <sp-asset-link-table-additional-data
-                    [isAdminUser]="isAdminUser"
-                    [assetLink]="assetLink"
-                    [certificates]="certificates"
-                >
-                </sp-asset-link-table-additional-data>
-            </td>
-        </ng-container>
+                <ng-container matColumnDef="type">
+                    <th mat-header-cell mat-sort-header *matHeaderCellDef>
+                        {{ 'Type' | translate }}
+                    </th>
+                    <td mat-cell *matCellDef="let assetLink">
+                        <div
+                            fxLayout="column"
+                            fxLayoutAlign="start start"
+                            class="truncate"
+                        >
+                            <sp-asset-link-table-type
+                                [assetLink]="assetLink"
+                                [assetLinkTypes]="assetLinkTypes"
+                                class="mt-sm mb-sm"
+                            >
+                            </sp-asset-link-table-type>
+                        </div>
+                    </td>
+                </ng-container>
+                <ng-container matColumnDef="linkLabel">
+                    <th mat-header-cell mat-sort-header *matHeaderCellDef>
+                        {{ 'Name' | translate }}
+                    </th>
+                    <td
+                        mat-cell
+                        *matCellDef="let assetLink"
+                        data-cy="asset-links-table"
+                    >
+                        <div
+                            fxLayout="column"
+                            fxLayoutAlign="start start"
+                            class="truncate"
+                        >
+                            <span>{{ assetLink.linkLabel }}</span>
+                        </div>
+                    </td>
+                </ng-container>
+                <ng-container matColumnDef="additionalInfo">
+                    <th mat-header-cell *matHeaderCellDef>Info</th>
+                    <td mat-cell *matCellDef="let assetLink">
+                        <sp-asset-link-table-additional-data
+                            [isAdminUser]="isAdminUser"
+                            [assetLink]="assetLink"
+                            [certificates]="certificates"
+                        >
+                        </sp-asset-link-table-additional-data>
+                    </td>
+                </ng-container>
 
-        <ng-template spTableActions let-element>
-            <button
-                mat-menu-item
-                data-cy="details-asset-link"
-                [disabled]="!hasFeatureCard(element.linkType)"
-                (click)="openDetails(element)"
-            >
-                <mat-icon>visibility</mat-icon>
-                <span>{{ 'Details' | translate }}</span>
-            </button>
-            <button
-                mat-menu-item
-                data-cy="navigate-asset-link"
-                (click)="navigate(element)"
-            >
-                <mat-icon>open_in_new</mat-icon>
-                <span>{{ 'Navigate' | translate }}</span>
-            </button>
-            @if (editMode) {
-                <button
-                    mat-menu-item
-                    data-cy="edit-asset-link"
-                    (click)="openEditAssetLinkDialog(element)"
-                >
-                    <mat-icon>edit</mat-icon>
-                    <span>{{ 'Edit' | translate }}</span>
-                </button>
-                <button
-                    mat-menu-item
-                    data-cy="delete-asset-link"
-                    (click)="deleteAssetLink(element)"
-                >
-                    <mat-icon>delete</mat-icon>
-                    <span>{{ 'Delete' | translate }}</span>
-                </button>
-            }
-        </ng-template>
-    </sp-table>
+                <ng-template spTableActions let-element>
+                    <button
+                        mat-menu-item
+                        data-cy="details-asset-link"
+                        [disabled]="!hasFeatureCard(element.linkType)"
+                        (click)="openDetails(element)"
+                    >
+                        <mat-icon>visibility</mat-icon>
+                        <span>{{ 'Details' | translate }}</span>
+                    </button>
+                    <button
+                        mat-menu-item
+                        data-cy="navigate-asset-link"
+                        (click)="navigate(element)"
+                    >
+                        <mat-icon>open_in_new</mat-icon>
+                        <span>{{ 'Navigate' | translate }}</span>
+                    </button>
+                    @if (editMode) {
+                        <button
+                            mat-menu-item
+                            data-cy="edit-asset-link"
+                            (click)="openEditAssetLinkDialog(element)"
+                        >
+                            <mat-icon>edit</mat-icon>
+                            <span>{{ 'Edit' | translate }}</span>
+                        </button>
+                        <button
+                            mat-menu-item
+                            data-cy="delete-asset-link"
+                            (click)="deleteAssetLink(element)"
+                        >
+                            <mat-icon>delete</mat-icon>
+                            <span>{{ 'Delete' | translate }}</span>
+                        </button>
+                    }
+                </ng-template>
+            </sp-table>
+        }
+    </div>
 </div>
diff --git 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.ts
 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.ts
index 8507749a56..5b6bb1d4e3 100644
--- 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.ts
+++ 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/asset-link-table/asset-link-table.component.ts
@@ -52,6 +52,7 @@ import {
     PanelType,
     SpTableActionsDirective,
     SpTableComponent,
+    SpAlertBannerComponent,
 } from '@streampipes/shared-ui';
 import { TranslatePipe, TranslateService } from '@ngx-translate/core';
 import { Router } from '@angular/router';
@@ -88,6 +89,7 @@ import { MatIcon } from '@angular/material/icon';
         SpTableActionsDirective,
         MatMenuItem,
         MatIcon,
+        SpAlertBannerComponent,
         TranslatePipe,
     ],
 })
@@ -106,6 +108,9 @@ export class AssetLinkTableComponent
     @Input()
     editMode = false;
 
+    @Input()
+    loading = false;
+
     @ViewChild(MatSort)
     sort: MatSort;
 
diff --git 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.html
 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.html
index 48eceaf516..e804977bf5 100644
--- 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.html
+++ 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.html
@@ -34,14 +34,27 @@
                 }
             </div>
             @if (
+                !assetLinkTypesLoading &&
                 assetLinkTypes.length > 0 &&
                 selectedAsset.assetLinks?.length > 0
             ) {
                 <sp-asset-link-table
                     [asset]="selectedAsset"
                     [assetLinkTypes]="assetLinkTypes"
+                    [loading]="assetLinkTypesLoading"
                 >
                 </sp-asset-link-table>
+            } @else if (assetLinkTypesLoading) {
+                <sp-alert-banner
+                    type="info"
+                    icon="hourglass_empty"
+                    [title]="'Loading linked resources' | translate"
+                    [description]="
+                        'This can take a moment while Streampipes gathers the 
available assets.'
+                            | translate
+                    "
+                >
+                </sp-alert-banner>
             } @else {
                 <sp-alert-banner
                     type="info"
diff --git 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.ts
 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.ts
index 71766b1de2..a8bd62dab9 100644
--- 
a/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.ts
+++ 
b/ui/src/app/assets/components/asset-details/view-asset/view-asset-links/view-asset-links.component.ts
@@ -52,6 +52,7 @@ export class ViewAssetLinksComponent implements OnInit {
     selectedAsset: SpAsset;
 
     assetLinkTypes: AssetLinkType[] = [];
+    assetLinkTypesLoading = true;
 
     private genericStorageService = inject(GenericStorageService);
 
@@ -60,6 +61,7 @@ export class ViewAssetLinksComponent implements OnInit {
             .getAllDocuments(AssetConstants.ASSET_LINK_TYPES_DOC_NAME)
             .subscribe(res => {
                 this.assetLinkTypes = res;
+                this.assetLinkTypesLoading = false;
             });
     }
 }
diff --git 
a/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.html
 
b/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.html
index 5b92b8924c..ab52829ff1 100644
--- 
a/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.html
+++ 
b/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.html
@@ -17,210 +17,222 @@
 -->
 
 <div fxLayout="column" fxLayoutGap="8px">
-    <div
-        fxLayout="row wrap"
-        fxLayoutAlign="end center"
-        fxLayoutGap="8px"
-        class="asset-link-table-toolbar"
-    >
-        <button
-            mat-flat-button
-            class="mat-basic"
-            data-cy="asset-link-table-select-all"
-            [disabled]="!hasUnselectedFilteredResources()"
-            (click)="selectAll()"
-        >
-            <mat-icon>queue</mat-icon>
-            {{ 'Select all' | translate }}
-        </button>
-        <button
-            mat-flat-button
-            class="mat-basic"
-            data-cy="asset-link-table-deselect-all"
-            [disabled]="!hasSelectedFilteredResources()"
-            (click)="deselectAll()"
+    @if (resourcesLoading) {
+        <sp-alert-banner
+            type="info"
+            icon="hourglass_empty"
+            [title]="'Loading linked resources' | translate"
+            [description]="
+                'This can take a moment while Streampipes gathers the 
available assets.'
+                    | translate
+            "
+        ></sp-alert-banner>
+    } @else {
+        <div
+            fxLayout="row wrap"
+            fxLayoutAlign="end center"
+            fxLayoutGap="8px"
+            class="asset-link-table-toolbar"
         >
-            <mat-icon>filter_none</mat-icon>
-            {{ 'Deselect all' | translate }}
-        </button>
+            <button
+                mat-flat-button
+                class="mat-basic"
+                data-cy="asset-link-table-select-all"
+                [disabled]="!hasUnselectedFilteredResources()"
+                (click)="selectAll()"
+            >
+                <mat-icon>queue</mat-icon>
+                {{ 'Select all' | translate }}
+            </button>
+            <button
+                mat-flat-button
+                class="mat-basic"
+                data-cy="asset-link-table-deselect-all"
+                [disabled]="!hasSelectedFilteredResources()"
+                (click)="deselectAll()"
+            >
+                <mat-icon>filter_none</mat-icon>
+                {{ 'Deselect all' | translate }}
+            </button>
 
-        <mat-form-field class="form-field-small asset-link-table-search">
-            <mat-icon matPrefix>search</mat-icon>
-            <input
-                #searchInput
-                matInput
-                [placeholder]="'Search' | translate"
-                [value]="searchTerm"
-                (input)="updateSearch($any($event.target).value)"
-            />
-            @if (searchTerm) {
-                <button
-                    mat-icon-button
-                    matSuffix
-                    type="button"
-                    [attr.aria-label]="'Clear search' | translate"
-                    (click)="clearSearch()"
-                >
-                    <mat-icon>close</mat-icon>
-                </button>
-            }
-        </mat-form-field>
+            <mat-form-field class="form-field-small asset-link-table-search">
+                <mat-icon matPrefix>search</mat-icon>
+                <input
+                    #searchInput
+                    matInput
+                    [placeholder]="'Search' | translate"
+                    [value]="searchTerm"
+                    (input)="updateSearch($any($event.target).value)"
+                />
+                @if (searchTerm) {
+                    <button
+                        mat-icon-button
+                        matSuffix
+                        type="button"
+                        [attr.aria-label]="'Clear search' | translate"
+                        (click)="clearSearch()"
+                    >
+                        <mat-icon>close</mat-icon>
+                    </button>
+                }
+            </mat-form-field>
 
-        <mat-button-toggle-group
-            [value]="viewMode"
-            (change)="updateViewMode($event.value)"
-        >
-            <mat-button-toggle value="grouped">
-                {{ 'Grouped' | translate }}
-            </mat-button-toggle>
-            <mat-button-toggle value="list">
-                {{ 'List' | translate }}
-            </mat-button-toggle>
-        </mat-button-toggle-group>
-    </div>
+            <mat-button-toggle-group
+                [value]="viewMode"
+                (change)="updateViewMode($event.value)"
+            >
+                <mat-button-toggle value="grouped">
+                    {{ 'Grouped' | translate }}
+                </mat-button-toggle>
+                <mat-button-toggle value="list">
+                    {{ 'List' | translate }}
+                </mat-button-toggle>
+            </mat-button-toggle-group>
+        </div>
 
-    <table
-        mat-table
-        matSort
-        [matSortActive]="sort.active"
-        [matSortDirection]="sort.direction"
-        class="sp-table"
-        [dataSource]="renderedRows"
-        [multiTemplateDataRows]="viewMode === 'grouped'"
-        (matSortChange)="updateSort($event)"
-    >
-        <ng-container matColumnDef="selected">
-            <th mat-header-cell *matHeaderCellDef></th>
-            <td mat-cell *matCellDef="let resource">
-                <mat-checkbox
-                    color="accent"
-                    [checked]="isResourceSelected(resource.resourceId)"
-                    [attr.data-cy]="
-                        'select-' +
-                        resource.resourceType
-                            .toLowerCase()
-                            .replace(/\s+/g, '-') +
-                        '-checkbox-' +
-                        resource.resourceName
-                    "
-                    (change)="updateSelection($event.checked, resource)"
-                    (click)="$event.stopPropagation()"
-                >
-                </mat-checkbox>
-            </td>
-        </ng-container>
+        <table
+            mat-table
+            matSort
+            [matSortActive]="sort.active"
+            [matSortDirection]="sort.direction"
+            class="sp-table"
+            [dataSource]="renderedRows"
+            [multiTemplateDataRows]="viewMode === 'grouped'"
+            (matSortChange)="updateSort($event)"
+        >
+            <ng-container matColumnDef="selected">
+                <th mat-header-cell *matHeaderCellDef></th>
+                <td mat-cell *matCellDef="let resource">
+                    <mat-checkbox
+                        color="accent"
+                        [checked]="isResourceSelected(resource.resourceId)"
+                        [attr.data-cy]="
+                            'select-' +
+                            resource.resourceType
+                                .toLowerCase()
+                                .replace(/\s+/g, '-') +
+                            '-checkbox-' +
+                            resource.resourceName
+                        "
+                        (change)="updateSelection($event.checked, resource)"
+                        (click)="$event.stopPropagation()"
+                    >
+                    </mat-checkbox>
+                </td>
+            </ng-container>
 
-        <ng-container matColumnDef="type">
-            <th mat-header-cell mat-sort-header *matHeaderCellDef>
-                {{ 'Type' | translate }}
-            </th>
-            <td mat-cell *matCellDef="let resource">
-                <div
-                    fxLayout="column"
-                    fxLayoutAlign="start start"
-                    class="truncate"
-                >
+            <ng-container matColumnDef="type">
+                <th mat-header-cell mat-sort-header *matHeaderCellDef>
+                    {{ 'Type' | translate }}
+                </th>
+                <td mat-cell *matCellDef="let resource">
                     <div
-                        class="chip mt-sm mb-sm"
-                        [ngStyle]="{ color: getLinkTypeColor(resource) }"
+                        fxLayout="column"
+                        fxLayoutAlign="start start"
+                        class="truncate"
                     >
-                        <mat-icon class="link-type-icon">
-                            {{ getLinkType(resource)?.linkIcon || 'link' }}
-                        </mat-icon>
-                        <span class="text-sm">
-                            {{
-                                getLinkType(resource)?.linkLabel ||
-                                    resource.resourceType
-                            }}
-                        </span>
+                        <div
+                            class="chip mt-sm mb-sm"
+                            [ngStyle]="{ color: getLinkTypeColor(resource) }"
+                        >
+                            <mat-icon class="link-type-icon">
+                                {{ getLinkType(resource)?.linkIcon || 'link' }}
+                            </mat-icon>
+                            <span class="text-sm">
+                                {{
+                                    getLinkType(resource)?.linkLabel ||
+                                        resource.resourceType
+                                }}
+                            </span>
+                        </div>
                     </div>
-                </div>
-            </td>
-        </ng-container>
+                </td>
+            </ng-container>
 
-        <ng-container matColumnDef="linkLabel">
-            <th mat-header-cell mat-sort-header *matHeaderCellDef>
-                {{ 'Name' | translate }}
-            </th>
-            <td mat-cell *matCellDef="let resource">
-                <div
-                    fxLayout="column"
-                    fxLayoutAlign="start start"
-                    class="truncate"
-                >
-                    <span>{{ resource.resourceName }}</span>
-                </div>
-            </td>
-        </ng-container>
+            <ng-container matColumnDef="linkLabel">
+                <th mat-header-cell mat-sort-header *matHeaderCellDef>
+                    {{ 'Name' | translate }}
+                </th>
+                <td mat-cell *matCellDef="let resource">
+                    <div
+                        fxLayout="column"
+                        fxLayoutAlign="start start"
+                        class="truncate"
+                    >
+                        <span>{{ resource.resourceName }}</span>
+                    </div>
+                </td>
+            </ng-container>
 
-        <ng-container matColumnDef="groupHeader">
-            <td
-                mat-cell
-                *matCellDef="let group"
-                class="asset-link-table-group-header-cell"
-                [attr.colspan]="displayedColumns.length"
-            >
-                <div
-                    fxLayout="row"
-                    fxLayoutAlign="start center"
-                    fxLayoutGap="8px"
-                    class="asset-link-table-group-header"
+            <ng-container matColumnDef="groupHeader">
+                <td
+                    mat-cell
+                    *matCellDef="let group"
+                    class="asset-link-table-group-header-cell"
+                    [attr.colspan]="displayedColumns.length"
                 >
-                    <button
-                        mat-icon-button
-                        type="button"
-                        class="asset-link-table-group-toggle"
-                        (click)="toggleGroup(group.id)"
-                    >
-                        <mat-icon>
-                            {{
-                                group.collapsed
-                                    ? 'chevron_right'
-                                    : 'expand_more'
-                            }}
-                        </mat-icon>
-                    </button>
                     <div
-                        class="chip asset-link-table-group-chip"
-                        [ngStyle]="{ color: group.color }"
+                        fxLayout="row"
+                        fxLayoutAlign="start center"
+                        fxLayoutGap="8px"
+                        class="asset-link-table-group-header"
                     >
-                        <mat-icon class="link-type-icon">
-                            {{ group.icon }}
-                        </mat-icon>
-                        <span class="text-sm">
-                            {{ group.title | translate }}
+                        <button
+                            mat-icon-button
+                            type="button"
+                            class="asset-link-table-group-toggle"
+                            (click)="toggleGroup(group.id)"
+                        >
+                            <mat-icon>
+                                {{
+                                    group.collapsed
+                                        ? 'chevron_right'
+                                        : 'expand_more'
+                                }}
+                            </mat-icon>
+                        </button>
+                        <div
+                            class="chip asset-link-table-group-chip"
+                            [ngStyle]="{ color: group.color }"
+                        >
+                            <mat-icon class="link-type-icon">
+                                {{ group.icon }}
+                            </mat-icon>
+                            <span class="text-sm">
+                                {{ group.title | translate }}
+                            </span>
+                        </div>
+                        <span class="asset-link-table-group-count text-sm">
+                            {{ group.count }}
                         </span>
                     </div>
-                    <span class="asset-link-table-group-count text-sm">
-                        {{ group.count }}
-                    </span>
-                </div>
-            </td>
-        </ng-container>
+                </td>
+            </ng-container>
 
-        <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
-        <tr
-            mat-row
-            *matRowDef="
-                let row;
-                columns: groupHeaderColumns;
-                when: isGroupHeaderRow
-            "
-            class="asset-link-table-group-row"
-        ></tr>
-        <tr
-            mat-row
-            *matRowDef="let row; columns: displayedColumns; when: isDataRow"
-        ></tr>
+            <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
+            <tr
+                mat-row
+                *matRowDef="
+                    let row;
+                    columns: groupHeaderColumns;
+                    when: isGroupHeaderRow
+                "
+                class="asset-link-table-group-row"
+            ></tr>
+            <tr
+                mat-row
+                *matRowDef="let row; columns: displayedColumns; when: 
isDataRow"
+            ></tr>
 
-        <tr class="mat-row" *matNoDataRow>
-            <td
-                class="mat-cell"
-                data-cy="no-table-entries"
-                [colSpan]="displayedColumns.length"
-            >
-                {{ 'No entries available.' | translate }}
-            </td>
-        </tr>
-    </table>
+            <tr class="mat-row" *matNoDataRow>
+                <td
+                    class="mat-cell"
+                    data-cy="no-table-entries"
+                    [colSpan]="displayedColumns.length"
+                >
+                    {{ 'No entries available.' | translate }}
+                </td>
+            </tr>
+        </table>
+    }
 </div>
diff --git 
a/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.ts
 
b/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.ts
index 16a15e71f0..6f28abd3a9 100644
--- 
a/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.ts
+++ 
b/ui/src/app/assets/dialog/manage-asset-links/asset-link-table/asset-link-table.component.ts
@@ -65,6 +65,7 @@ import {
     LayoutDirective,
 } from '@ngbracket/ngx-layout/flex';
 import { LayoutGapDirective } from '@ngbracket/ngx-layout';
+import { SpAlertBannerComponent } from '@streampipes/shared-ui';
 
 interface AssetLinkGroupHeaderRow {
     groupHeader: true;
@@ -112,6 +113,7 @@ type AssetLinkViewMode = 'grouped' | 'list';
         MatSuffix,
         MatTable,
         NgStyle,
+        SpAlertBannerComponent,
         TranslatePipe,
     ],
 })
@@ -128,6 +130,9 @@ export class AssetLinkTableComponent {
     @Input()
     assetLinkTypes: AssetLinkType[] = [];
 
+    @Input()
+    resourcesLoading = false;
+
     @Output()
     selectionChange = new EventEmitter<AssetLinkSelectionChange>();
 
diff --git 
a/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.html
 
b/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.html
index 7bcd39cc0c..56fcb013cf 100644
--- 
a/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.html
+++ 
b/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.html
@@ -24,6 +24,7 @@
                 [resources]="resourceRows"
                 [selectedResourceIds]="selectedResourceIds"
                 [assetLinkTypes]="assetLinkTypes"
+                [resourcesLoading]="resourcesLoading"
                 (selectionChange)="selectLink($event)"
                 data-cy="manage-asset-links-table"
             >
diff --git 
a/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.ts
 
b/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.ts
index ddf8d37c14..b4d3d26d52 100644
--- 
a/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.ts
+++ 
b/ui/src/app/assets/dialog/manage-asset-links/manage-asset-links-dialog.component.ts
@@ -63,6 +63,7 @@ export class SpManageAssetLinksDialogComponent
     clonedAssetLinks: AssetLink[] = [];
 
     resourceRows: AssetLinkResourceRow[] = [];
+    resourcesLoading = true;
 
     ngOnInit(): void {
         super.onInit();
@@ -161,6 +162,7 @@ export class SpManageAssetLinksDialogComponent
                 ),
             ),
         ];
+        this.resourcesLoading = false;
     }
 
     linkSelected(resourceId: string): boolean {

Reply via email to