2022-05-13 10:00:45 +02:00
|
|
|
<confirmation-dialog
|
|
|
|
class="hidden-tag"
|
|
|
|
#confirmationDialog
|
|
|
|
(confirmAction)="confirmDeletion($event)">
|
2020-02-13 08:39:29 +01:00
|
|
|
</confirmation-dialog>
|
2022-09-15 05:37:36 +02:00
|
|
|
<app-copy-artifact></app-copy-artifact>
|
|
|
|
<app-copy-digest></app-copy-digest>
|
2020-02-13 08:39:29 +01:00
|
|
|
<div class="row tag-row">
|
2022-07-29 13:04:01 +02:00
|
|
|
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
|
|
|
|
<clr-datagrid
|
2023-03-17 11:52:23 +01:00
|
|
|
#datagrid
|
2022-07-29 13:04:01 +02:00
|
|
|
[clrDgLoading]="loading"
|
|
|
|
(clrDgRefresh)="clrDgRefresh($event)"
|
|
|
|
[(clrDgSelected)]="selectedRow">
|
|
|
|
<clr-dg-action-bar class="action-bar">
|
|
|
|
<div>
|
|
|
|
<button
|
|
|
|
id="scan-btn"
|
|
|
|
[clrLoading]="scanBtnState"
|
|
|
|
type="button"
|
|
|
|
class="btn btn-secondary scan-btn"
|
|
|
|
[disabled]="
|
|
|
|
!(
|
|
|
|
canScanNow() &&
|
|
|
|
selectedRowHasVul() &&
|
|
|
|
hasEnabledScanner &&
|
|
|
|
hasScanImagePermission
|
|
|
|
)
|
|
|
|
"
|
|
|
|
(click)="scanNow()">
|
|
|
|
<clr-icon shape="shield-check" size="16"></clr-icon
|
|
|
|
>
|
|
|
|
<span>{{ 'VULNERABILITY.SCAN_NOW' | translate }}</span>
|
|
|
|
</button>
|
|
|
|
<button
|
|
|
|
id="stop-scan"
|
|
|
|
[clrLoading]="stopBtnState"
|
|
|
|
type="button"
|
|
|
|
class="btn btn-secondary scan-btn"
|
|
|
|
[disabled]="!(canStopScan() && hasScanImagePermission)"
|
|
|
|
(click)="stopNow()">
|
|
|
|
<clr-icon shape="stop" size="16"></clr-icon>
|
|
|
|
<span>{{ 'VULNERABILITY.STOP_NOW' | translate }}</span>
|
|
|
|
</button>
|
|
|
|
<clr-dropdown class="btn btn-link" *ngIf="!depth">
|
|
|
|
<span
|
|
|
|
clrDropdownTrigger
|
|
|
|
id="artifact-list-action"
|
|
|
|
class="btn pl-0">
|
|
|
|
{{ 'BUTTON.ACTIONS' | translate }}
|
|
|
|
<clr-icon shape="caret down"></clr-icon>
|
|
|
|
</span>
|
|
|
|
<clr-dropdown-menu
|
|
|
|
class="action-dropdown"
|
|
|
|
clrPosition="bottom-left"
|
|
|
|
*clrIfOpen>
|
2022-05-13 10:00:45 +02:00
|
|
|
<div
|
2022-09-20 11:16:16 +02:00
|
|
|
id="artifact-list-copy-digest"
|
2022-07-29 13:04:01 +02:00
|
|
|
class="action-dropdown-item no-border"
|
|
|
|
aria-label="copy digest"
|
|
|
|
clrDropdownItem
|
|
|
|
[clrDisabled]="
|
|
|
|
!(selectedRow.length === 1 && !depth)
|
|
|
|
"
|
|
|
|
(click)="showDigestId()">
|
|
|
|
{{ 'REPOSITORY.COPY_DIGEST_ID' | translate }}
|
2020-02-25 09:07:21 +01:00
|
|
|
</div>
|
2022-07-29 13:04:01 +02:00
|
|
|
<clr-dropdown>
|
|
|
|
<button
|
2022-09-20 11:16:16 +02:00
|
|
|
id="artifact-list-add-labels"
|
2022-07-29 13:04:01 +02:00
|
|
|
class="action-dropdown-item"
|
|
|
|
clrDropdownTrigger
|
|
|
|
[disabled]="
|
|
|
|
!canAddLabel() ||
|
|
|
|
!hasAddLabelImagePermission ||
|
|
|
|
depth ||
|
|
|
|
inprogress
|
2022-09-20 11:16:16 +02:00
|
|
|
">
|
2022-07-29 13:04:01 +02:00
|
|
|
{{ 'REPOSITORY.ADD_LABELS' | translate }}
|
|
|
|
</button>
|
|
|
|
<clr-dropdown-menu
|
|
|
|
[hidden]="!selectedRow.length">
|
2022-09-20 11:16:16 +02:00
|
|
|
<div class="filter-grid" clrDropdownItem>
|
2022-07-29 13:04:01 +02:00
|
|
|
<label class="dropdown-header">{{
|
|
|
|
'REPOSITORY.ADD_LABEL_TO_IMAGE'
|
|
|
|
| translate
|
|
|
|
}}</label>
|
2022-09-20 11:16:16 +02:00
|
|
|
<app-label-selector
|
|
|
|
[width]="200"
|
|
|
|
[ownedLabels]="
|
|
|
|
selectedRow[0]?.labels
|
2022-07-29 13:04:01 +02:00
|
|
|
"
|
2022-09-20 11:16:16 +02:00
|
|
|
(clickLabel)="stickLabel($event)"
|
|
|
|
[projectId]="projectId"
|
|
|
|
[scope]="'p'"></app-label-selector>
|
2022-07-29 13:04:01 +02:00
|
|
|
</div>
|
|
|
|
</clr-dropdown-menu>
|
|
|
|
</clr-dropdown>
|
|
|
|
<div
|
2022-09-20 11:16:16 +02:00
|
|
|
id="artifact-list-copy"
|
2022-07-29 13:04:01 +02:00
|
|
|
class="action-dropdown-item"
|
|
|
|
aria-label="retag"
|
|
|
|
[clrDisabled]="
|
|
|
|
!(selectedRow.length === 1) ||
|
|
|
|
!hasRetagImagePermission ||
|
|
|
|
depth
|
|
|
|
"
|
|
|
|
(click)="retag()"
|
|
|
|
clrDropdownItem>
|
|
|
|
{{ 'REPOSITORY.RETAG' | translate }}
|
2020-02-25 09:07:21 +01:00
|
|
|
</div>
|
2022-07-29 13:04:01 +02:00
|
|
|
<div
|
|
|
|
class="action-dropdown-item"
|
|
|
|
clrDropdownItem
|
|
|
|
*ngIf="hasDeleteImagePermission"
|
|
|
|
(click)="deleteArtifact()"
|
|
|
|
id="artifact-list-delete"
|
|
|
|
[clrDisabled]="
|
|
|
|
!hasDeleteImagePermission ||
|
|
|
|
!selectedRow.length ||
|
|
|
|
depth
|
|
|
|
">
|
|
|
|
{{ 'REPOSITORY.DELETE' | translate }}
|
|
|
|
</div>
|
|
|
|
</clr-dropdown-menu>
|
|
|
|
</clr-dropdown>
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
2022-09-20 11:16:16 +02:00
|
|
|
<div class="right-pos">
|
|
|
|
<app-artifact-filter
|
|
|
|
[withDivider]="true"
|
|
|
|
(filterEvent)="filterEvent($event)"
|
|
|
|
[projectId]="projectId"></app-artifact-filter>
|
2022-07-29 13:04:01 +02:00
|
|
|
<span class="refresh-btn" (click)="refresh()">
|
|
|
|
<clr-icon shape="refresh"></clr-icon>
|
|
|
|
</span>
|
|
|
|
</div>
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-dg-action-bar>
|
|
|
|
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-dg-column class="flex-max-width" [clrDgSortBy]="'digest'"
|
2023-03-14 07:41:16 +01:00
|
|
|
><ng-template
|
2023-03-17 11:52:23 +01:00
|
|
|
[clrDgHideableColumn]="{ hidden: hiddenArray[0] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'REPOSITORY.ARTIFACTS_COUNT' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column class="pull-command-column">
|
2023-03-17 11:52:23 +01:00
|
|
|
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[1] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'REPOSITORY.PULL_COMMAND' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column *ngIf="depth">
|
2023-03-17 11:52:23 +01:00
|
|
|
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[2] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'REPOSITORY.PLATFORM' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column>
|
2023-03-17 11:52:23 +01:00
|
|
|
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[3] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'REPOSITORY.TAGS' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column class="co-signed-column">
|
2023-03-17 11:52:23 +01:00
|
|
|
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[4] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'ACCESSORY.CO_SIGNED' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column [clrDgSortBy]="'size'">
|
2023-03-17 11:52:23 +01:00
|
|
|
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[5] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'REPOSITORY.SIZE' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column class="vul-column">
|
2023-03-17 11:52:23 +01:00
|
|
|
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[6] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'REPOSITORY.VULNERABILITY' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column class="annotations-column">
|
2023-03-17 11:52:23 +01:00
|
|
|
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[7] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'ARTIFACT.ANNOTATION' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column>
|
2023-03-17 11:52:23 +01:00
|
|
|
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[8] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'REPOSITORY.LABELS' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column [clrDgSortBy]="pushComparator">
|
2023-03-17 11:52:23 +01:00
|
|
|
<ng-template [clrDgHideableColumn]="{ hidden: hiddenArray[9] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'REPOSITORY.PUSH_TIME' | translate }}
|
|
|
|
</ng-template>
|
|
|
|
</clr-dg-column>
|
|
|
|
<clr-dg-column [clrDgSortBy]="pullComparator">
|
|
|
|
<ng-template
|
2023-03-17 11:52:23 +01:00
|
|
|
[clrDgHideableColumn]="{ hidden: hiddenArray[10] }">
|
2023-03-14 07:41:16 +01:00
|
|
|
{{ 'REPOSITORY.PULL_TIME' | translate }}
|
|
|
|
</ng-template>
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-dg-column>
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-dg-placeholder>{{
|
|
|
|
'ARTIFACT.PLACEHOLDER' | translate
|
|
|
|
}}</clr-dg-placeholder>
|
|
|
|
<clr-dg-row
|
|
|
|
*ngFor="let artifact of artifactList; let i = index"
|
|
|
|
[clrDgItem]="artifact">
|
2022-01-05 06:41:51 +01:00
|
|
|
<clr-dg-cell class="flex-max-width truncated">
|
2020-02-13 08:39:29 +01:00
|
|
|
<div class="cell white-normal">
|
2022-05-13 10:00:45 +02:00
|
|
|
<div
|
|
|
|
class="artifact-icon clr-display-inline-block"
|
|
|
|
*ngIf="artifact.icon">
|
|
|
|
<img
|
|
|
|
*ngIf="getIcon(artifact.icon)"
|
|
|
|
class="artifact-icon"
|
|
|
|
[title]="artifact.type"
|
|
|
|
[src]="getIcon(artifact.icon)"
|
|
|
|
(error)="showDefaultIcon($event)" />
|
2020-08-11 04:22:02 +02:00
|
|
|
</div>
|
2022-05-13 10:00:45 +02:00
|
|
|
<a
|
|
|
|
href="javascript:void(0)"
|
|
|
|
class="digest margin-left-5"
|
|
|
|
(click)="goIntoArtifactSummaryPage(artifact)"
|
|
|
|
title="{{ artifact.digest }}">
|
2023-03-17 05:14:16 +01:00
|
|
|
{{ artifact.digest | slice : 0 : 15 }}</a
|
2022-05-13 10:00:45 +02:00
|
|
|
>
|
|
|
|
<clr-tooltip
|
|
|
|
*ngIf="
|
|
|
|
artifact?.references &&
|
|
|
|
artifact?.references?.length
|
|
|
|
">
|
2020-02-13 08:39:29 +01:00
|
|
|
<div clrTooltipTrigger class="level-border">
|
2020-08-11 04:22:02 +02:00
|
|
|
<div class="inner truncated">
|
2022-05-13 10:00:45 +02:00
|
|
|
<a
|
|
|
|
href="javascript:void(0)"
|
|
|
|
(click)="goIntoIndexArtifact(artifact)">
|
|
|
|
<clr-icon
|
|
|
|
size="24"
|
|
|
|
class="icon-folder"
|
|
|
|
shape="folder"></clr-icon>
|
2020-02-13 08:39:29 +01:00
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-tooltip-content
|
|
|
|
[clrPosition]="'top-right'"
|
|
|
|
[clrSize]="'lg'"
|
|
|
|
*clrIfOpen>
|
|
|
|
{{ 'REPOSITORY.ARTIFACT_TOOTIP' | translate }}
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-tooltip-content>
|
|
|
|
</clr-tooltip>
|
|
|
|
</div>
|
|
|
|
</clr-dg-cell>
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-dg-cell>
|
|
|
|
<hbr-copy-input
|
|
|
|
[title]="getPullCommand(artifact)"
|
|
|
|
*ngIf="getPullCommand(artifact)"
|
|
|
|
[iconMode]="true"
|
|
|
|
[defaultValue]="
|
|
|
|
getPullCommand(artifact)
|
|
|
|
"></hbr-copy-input>
|
2020-04-12 19:41:39 +02:00
|
|
|
</clr-dg-cell>
|
2020-02-25 03:36:24 +01:00
|
|
|
<clr-dg-cell *ngIf="depth">
|
2020-02-13 08:39:29 +01:00
|
|
|
<div class="cell">
|
2022-05-13 10:00:45 +02:00
|
|
|
{{ artifact.platform?.os }}
|
|
|
|
/{{ artifact.platform?.architecture
|
|
|
|
}}{{
|
|
|
|
artifact.platform?.variant
|
|
|
|
? '/' + artifact.platform?.variant
|
|
|
|
: ''
|
|
|
|
}}
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
|
|
|
</clr-dg-cell>
|
2022-01-05 06:41:51 +01:00
|
|
|
<clr-dg-cell class="center">
|
2020-02-13 08:39:29 +01:00
|
|
|
<div *ngIf="artifact.tags" class="truncated width-p-100">
|
|
|
|
<clr-tooltip class="width-p-100">
|
2022-01-05 06:41:51 +01:00
|
|
|
<div clrTooltipTrigger class="center">
|
2022-05-10 11:47:09 +02:00
|
|
|
<div class="center width-p-100">
|
2022-05-13 10:00:45 +02:00
|
|
|
<span
|
|
|
|
#tagsSpan
|
|
|
|
class="truncated width-p-75"
|
|
|
|
>{{ tagsString(artifact?.tags) }}</span
|
|
|
|
>
|
|
|
|
<span
|
|
|
|
*ngIf="
|
|
|
|
artifact?.tags?.length > 1 &&
|
|
|
|
isEllipsisActive(tagsSpan)
|
|
|
|
"
|
|
|
|
>({{ artifact?.tagNumber }} )</span
|
|
|
|
>
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-tooltip-content
|
|
|
|
[clrPosition]="'top-right'"
|
|
|
|
class="lg"
|
|
|
|
[clrSize]="'lg'"
|
|
|
|
*clrIfOpen>
|
|
|
|
<table
|
|
|
|
class="table table-noborder mt-0 table-tag">
|
2020-02-13 08:39:29 +01:00
|
|
|
<thead class="tag-thead">
|
|
|
|
<tr>
|
|
|
|
<th class="left tag-header-color">
|
2022-05-13 10:00:45 +02:00
|
|
|
{{
|
|
|
|
'REPOSITORY.TAGS'
|
|
|
|
| translate
|
|
|
|
| uppercase
|
|
|
|
}}
|
|
|
|
</th>
|
2020-02-13 08:39:29 +01:00
|
|
|
<th class="left tag-header-color">
|
2022-05-13 10:00:45 +02:00
|
|
|
{{
|
|
|
|
'REPOSITORY.PULL_TIME'
|
|
|
|
| translate
|
|
|
|
| uppercase
|
|
|
|
}}
|
|
|
|
</th>
|
2020-03-24 03:56:18 +01:00
|
|
|
<th class="left tag-header-color">
|
2022-05-13 10:00:45 +02:00
|
|
|
{{
|
|
|
|
'REPOSITORY.PUSH_TIME'
|
|
|
|
| translate
|
|
|
|
| uppercase
|
|
|
|
}}
|
|
|
|
</th>
|
2020-02-13 08:39:29 +01:00
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody class="tag-tbody">
|
2020-11-26 07:39:33 +01:00
|
|
|
<!--display less than 9 tags(too many tags will make UI stuck)-->
|
2022-05-13 10:00:45 +02:00
|
|
|
<tr
|
|
|
|
class="tag-tr"
|
|
|
|
*ngFor="let tag of artifact.tags">
|
|
|
|
<td class="left tag-body-color">
|
|
|
|
{{ tag.name }}
|
|
|
|
</td>
|
|
|
|
<td class="left tag-body-color">
|
|
|
|
{{
|
|
|
|
tag.pull_time ===
|
|
|
|
availableTime
|
|
|
|
? ''
|
|
|
|
: (tag.pull_time
|
|
|
|
| harborDatetime
|
|
|
|
: 'short')
|
|
|
|
}}
|
|
|
|
</td>
|
|
|
|
<td class="left tag-body-color">
|
|
|
|
{{
|
|
|
|
tag.push_time
|
|
|
|
| harborDatetime
|
|
|
|
: 'short'
|
|
|
|
}}
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
<tr *ngIf="artifact?.tagNumber > 8">
|
|
|
|
...
|
2020-02-13 08:39:29 +01:00
|
|
|
</tr>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
</clr-tooltip-content>
|
|
|
|
</clr-tooltip>
|
|
|
|
</div>
|
|
|
|
</clr-dg-cell>
|
2022-01-05 06:41:51 +01:00
|
|
|
<clr-dg-cell>
|
2022-05-13 10:00:45 +02:00
|
|
|
<span
|
|
|
|
*ngIf="artifact.coSigned === 'checking'"
|
|
|
|
class="spinner spinner-inline ml-2"></span>
|
|
|
|
<clr-icon
|
|
|
|
shape="check-circle"
|
|
|
|
*ngIf="artifact.coSigned === 'true'"
|
|
|
|
size="20"
|
|
|
|
class="signed"></clr-icon>
|
|
|
|
<clr-icon
|
|
|
|
shape="times-circle"
|
|
|
|
*ngIf="artifact.coSigned === 'false'"
|
|
|
|
size="16"
|
|
|
|
class="color-red"></clr-icon>
|
2022-01-05 06:41:51 +01:00
|
|
|
</clr-dg-cell>
|
2020-02-13 08:39:29 +01:00
|
|
|
<clr-dg-cell>
|
|
|
|
<div class="cell">
|
2022-05-13 10:00:45 +02:00
|
|
|
{{
|
|
|
|
artifact.size
|
|
|
|
? sizeTransform(artifact.size + '')
|
|
|
|
: ''
|
|
|
|
}}
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
|
|
|
</clr-dg-cell>
|
|
|
|
<clr-dg-cell>
|
|
|
|
<div class="cell">
|
2020-03-05 08:33:28 +01:00
|
|
|
<span *ngIf="!hasVul(artifact)">
|
2022-05-13 10:00:45 +02:00
|
|
|
{{ 'ARTIFACT.SCAN_UNSUPPORTED' | translate }}
|
2020-03-05 08:33:28 +01:00
|
|
|
</span>
|
2022-05-13 10:00:45 +02:00
|
|
|
<hbr-vulnerability-bar
|
|
|
|
(submitStopFinish)="submitStopFinish($event)"
|
|
|
|
(scanFinished)="scanFinished($event)"
|
|
|
|
*ngIf="hasVul(artifact)"
|
|
|
|
[inputScanner]="
|
|
|
|
handleScanOverview(artifact.scan_overview)
|
|
|
|
?.scanner
|
|
|
|
"
|
|
|
|
(submitFinish)="submitFinish($event)"
|
|
|
|
[projectName]="projectName"
|
|
|
|
[repoName]="repoName"
|
|
|
|
[artifactDigest]="artifact.digest"
|
|
|
|
[summary]="
|
|
|
|
handleScanOverview(artifact.scan_overview)
|
|
|
|
">
|
2020-02-13 08:39:29 +01:00
|
|
|
</hbr-vulnerability-bar>
|
|
|
|
</div>
|
|
|
|
</clr-dg-cell>
|
2020-02-25 03:36:24 +01:00
|
|
|
<clr-dg-cell>
|
|
|
|
<div class="cell" *ngIf="artifact.annotationsArray?.length">
|
2022-05-13 10:00:45 +02:00
|
|
|
<div class="bar-state">
|
|
|
|
<span class="label not-scan">{{
|
|
|
|
artifact.annotationsArray[0]
|
|
|
|
}}</span>
|
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
class="signpost-item"
|
|
|
|
[hidden]="artifact.annotationsArray?.length <= 1">
|
2020-02-25 03:36:24 +01:00
|
|
|
<div class="trigger-item">
|
|
|
|
<clr-signpost>
|
2022-05-13 10:00:45 +02:00
|
|
|
<button
|
|
|
|
class="btn btn-link"
|
|
|
|
clrSignpostTrigger>
|
|
|
|
...
|
|
|
|
</button>
|
|
|
|
<clr-signpost-content
|
|
|
|
[clrPosition]="'left-top'"
|
|
|
|
*clrIfOpen>
|
2020-02-25 03:36:24 +01:00
|
|
|
<div>
|
2022-05-13 10:00:45 +02:00
|
|
|
<div
|
|
|
|
*ngFor="
|
|
|
|
let attr of artifact.annotationsArray
|
|
|
|
"
|
|
|
|
class="bar-state">
|
|
|
|
<span class="label not-scan">{{
|
|
|
|
attr
|
|
|
|
}}</span>
|
|
|
|
</div>
|
2020-02-25 03:36:24 +01:00
|
|
|
</div>
|
|
|
|
</clr-signpost-content>
|
|
|
|
</clr-signpost>
|
|
|
|
</div>
|
|
|
|
</div>
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
2020-02-25 03:36:24 +01:00
|
|
|
</clr-dg-cell>
|
2022-01-05 06:41:51 +01:00
|
|
|
<clr-dg-cell>
|
2020-02-13 08:39:29 +01:00
|
|
|
<div class="cell">
|
2022-05-13 10:00:45 +02:00
|
|
|
<hbr-label-piece
|
|
|
|
*ngIf="artifact.labels?.length"
|
|
|
|
[label]="artifact.labels[0]"
|
|
|
|
[labelWidth]="90">
|
2020-02-13 08:39:29 +01:00
|
|
|
</hbr-label-piece>
|
2022-05-13 10:00:45 +02:00
|
|
|
<div
|
|
|
|
class="signpost-item"
|
|
|
|
[hidden]="artifact.labels?.length <= 1">
|
2022-09-20 11:16:16 +02:00
|
|
|
<clr-signpost>
|
|
|
|
<button class="btn btn-link" clrSignpostTrigger>
|
|
|
|
...
|
|
|
|
</button>
|
|
|
|
<clr-signpost-content
|
|
|
|
[clrPosition]="'top-middle'"
|
|
|
|
*clrIfOpen>
|
|
|
|
<div
|
|
|
|
*ngFor="let label of artifact.labels"
|
|
|
|
class="margin-5px">
|
|
|
|
<hbr-label-piece
|
|
|
|
[labelWidth]="130"
|
|
|
|
[label]="label">
|
|
|
|
</hbr-label-piece>
|
|
|
|
</div>
|
|
|
|
</clr-signpost-content>
|
|
|
|
</clr-signpost>
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</clr-dg-cell>
|
|
|
|
<clr-dg-cell>
|
2022-05-13 10:00:45 +02:00
|
|
|
<div class="cell">
|
2023-03-17 05:14:16 +01:00
|
|
|
{{ artifact.push_time | harborDatetime : 'short' }}
|
2022-05-13 10:00:45 +02:00
|
|
|
</div>
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-dg-cell>
|
|
|
|
<clr-dg-cell>
|
|
|
|
<div class="cell">
|
2022-05-13 10:00:45 +02:00
|
|
|
{{
|
|
|
|
artifact.pull_time === availableTime
|
|
|
|
? ''
|
2023-03-17 05:14:16 +01:00
|
|
|
: (artifact.pull_time
|
|
|
|
| harborDatetime : 'short')
|
2022-05-13 10:00:45 +02:00
|
|
|
}}
|
|
|
|
</div>
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-dg-cell>
|
2022-05-18 08:58:50 +02:00
|
|
|
<ng-container
|
|
|
|
ngProjectAs="clr-dg-row-detail"
|
|
|
|
*ngIf="artifact?.accessories?.length">
|
|
|
|
<sub-accessories
|
|
|
|
[projectName]="projectName"
|
|
|
|
[repositoryName]="repoName"
|
|
|
|
[artifactDigest]="artifact?.digest"
|
|
|
|
[total]="artifact?.accessoryNumber"
|
|
|
|
[accessories]="artifact?.accessories"
|
|
|
|
*clrIfExpanded></sub-accessories>
|
|
|
|
</ng-container>
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-dg-row>
|
|
|
|
<clr-dg-footer>
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-dg-pagination
|
|
|
|
#pagination
|
|
|
|
[clrDgTotalItems]="totalCount"
|
|
|
|
[(clrDgPage)]="currentPage"
|
|
|
|
[clrDgPageSize]="pageSize">
|
|
|
|
<clr-dg-page-size [clrPageSizeOptions]="[15, 25, 50]">{{
|
|
|
|
'PAGINATION.PAGE_SIZE' | translate
|
|
|
|
}}</clr-dg-page-size>
|
|
|
|
<span *ngIf="totalCount"
|
|
|
|
>{{ pagination.firstItem + 1 }} -
|
|
|
|
{{ pagination.lastItem + 1 }}
|
|
|
|
{{ 'REPOSITORY.OF' | translate }}</span
|
|
|
|
>
|
|
|
|
{{ totalCount }}
|
|
|
|
{{ 'REPOSITORY.ITEMS' | translate }}
|
2020-10-16 11:17:33 +02:00
|
|
|
</clr-dg-pagination>
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-dg-footer>
|
|
|
|
</clr-datagrid>
|
|
|
|
</div>
|
2020-05-08 09:42:25 +02:00
|
|
|
</div>
|