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-05-13 10:00:45 +02:00
|
|
|
<clr-modal
|
|
|
|
class="hidden-tag"
|
|
|
|
[(clrModalOpen)]="showTagManifestOpened"
|
|
|
|
[clrModalStaticBackdrop]="staticBackdrop"
|
2020-02-13 08:39:29 +01:00
|
|
|
[clrModalClosable]="closable">
|
|
|
|
<h3 class="modal-title">{{ manifestInfoTitle | translate }}</h3>
|
|
|
|
<div class="modal-body">
|
|
|
|
<div class="row col-md-12">
|
2022-05-13 10:00:45 +02:00
|
|
|
<textarea class="clr-textarea w-100" rows="2" #digestTarget>{{
|
|
|
|
digestId
|
|
|
|
}}</textarea>
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
2022-05-13 10:00:45 +02:00
|
|
|
<span class="copy-failed" [hidden]="!copyFailed">{{
|
|
|
|
'TAG.COPY_ERROR' | translate
|
|
|
|
}}</span>
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
class="btn btn-primary"
|
|
|
|
[ngxClipboard]="digestTarget"
|
|
|
|
(cbOnSuccess)="onSuccess($event)"
|
|
|
|
(cbOnError)="onError($event)">
|
|
|
|
{{ 'BUTTON.COPY' | translate }}
|
|
|
|
</button>
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
|
|
|
</clr-modal>
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-modal
|
|
|
|
class="hidden-tag"
|
|
|
|
[(clrModalOpen)]="retagDialogOpened"
|
|
|
|
[clrModalStaticBackdrop]="staticBackdrop">
|
2020-02-13 08:39:29 +01:00
|
|
|
<h3 class="modal-title">{{ 'REPOSITORY.RETAG' | translate }}</h3>
|
|
|
|
<div class="modal-body retag-modal-body">
|
|
|
|
<div class="row col-md-12">
|
|
|
|
<hbr-image-name-input #imageNameInput></hbr-image-name-input>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="modal-footer">
|
2022-05-13 10:00:45 +02:00
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
[disabled]="
|
|
|
|
imageNameInput.projectName.invalid ||
|
|
|
|
imageNameInput.repoName.invalid ||
|
|
|
|
imageNameInput.noProjectInfo !== ''
|
|
|
|
"
|
|
|
|
class="btn btn-primary"
|
|
|
|
(click)="onRetag()">
|
|
|
|
{{ 'BUTTON.CONFIRM' | translate }}
|
|
|
|
</button>
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
|
|
|
</clr-modal>
|
|
|
|
<div class="row tag-row">
|
|
|
|
<div>
|
|
|
|
<div class="row flex-items-xs-right rightPos">
|
2020-02-25 09:07:21 +01:00
|
|
|
<div id="filterArea" *ngIf="!depth">
|
2022-05-13 10:00:45 +02:00
|
|
|
<div
|
|
|
|
class="filterLabelPiece"
|
|
|
|
*ngIf="openLabelFilterPiece && filterByType === 'labels'"
|
|
|
|
[style.left.px]="110">
|
|
|
|
<hbr-label-piece
|
|
|
|
*ngIf="showlabel"
|
|
|
|
[hidden]="!filterOneLabel"
|
|
|
|
[label]="filterOneLabel"
|
2020-02-13 08:39:29 +01:00
|
|
|
[labelWidth]="130"></hbr-label-piece>
|
|
|
|
</div>
|
|
|
|
<div class="flex-xs-middle">
|
2020-02-25 09:07:21 +01:00
|
|
|
<div class="execution-select">
|
2022-05-13 10:00:45 +02:00
|
|
|
<div
|
|
|
|
class="select filter-tag"
|
|
|
|
[hidden]="!openSelectFilterPiece">
|
2020-02-25 09:07:21 +01:00
|
|
|
<clr-select-container>
|
2022-05-13 10:00:45 +02:00
|
|
|
<select
|
|
|
|
clrSelect
|
|
|
|
[(ngModel)]="filterByType"
|
|
|
|
(change)="selectFilterType()">
|
|
|
|
<option
|
|
|
|
*ngFor="let filter of mutipleFilter"
|
|
|
|
value="{{ filter.filterBy }}">
|
|
|
|
{{
|
|
|
|
filter.filterByShowText | translate
|
|
|
|
}}
|
|
|
|
</option>
|
2020-02-25 09:07:21 +01:00
|
|
|
</select>
|
|
|
|
</clr-select-container>
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
2020-02-25 09:07:21 +01:00
|
|
|
<div class="flex-xs-middle">
|
2022-05-13 10:00:45 +02:00
|
|
|
<hbr-filter
|
|
|
|
[withDivider]="true"
|
|
|
|
[readonly]="isFilterReadonly"
|
|
|
|
filterPlaceholder="{{
|
|
|
|
getFilterPlaceholder() | translate
|
|
|
|
}}"
|
|
|
|
(filterEvt)="doSearchArtifactByFilter($event)"
|
|
|
|
(openFlag)="openFlagEvent($event)"
|
|
|
|
[currentValue]="lastFilteredTagName">
|
|
|
|
</hbr-filter>
|
|
|
|
<div
|
|
|
|
[hidden]="!openSelectFilterPiece"
|
|
|
|
class="label-filter-panel list-filter">
|
|
|
|
<div *ngFor="let filter of mutipleFilter">
|
|
|
|
<ul
|
|
|
|
class="list-unstyled"
|
|
|
|
*ngIf="
|
|
|
|
filterByType === filter.filterBy
|
|
|
|
">
|
|
|
|
<li
|
|
|
|
class="cursor-pointer"
|
|
|
|
(click)="
|
|
|
|
selectFilter(
|
|
|
|
item.showItem,
|
|
|
|
item.filterText
|
|
|
|
)
|
|
|
|
"
|
|
|
|
*ngFor="
|
|
|
|
let item of filter.listItem
|
|
|
|
">
|
|
|
|
{{ item.showItem | translate }}
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
2020-02-25 09:07:21 +01:00
|
|
|
</div>
|
2022-05-13 10:00:45 +02:00
|
|
|
<div
|
|
|
|
class="label-filter-panel"
|
|
|
|
[hidden]="
|
|
|
|
!(
|
|
|
|
openLabelFilterPanel &&
|
|
|
|
filterByType === 'labels'
|
|
|
|
)
|
|
|
|
">
|
|
|
|
<a class="filterClose" (click)="closeFilter()"
|
|
|
|
>×</a
|
|
|
|
>
|
|
|
|
<label class="filterLabelHeader filter-dark">{{
|
|
|
|
'REPOSITORY.FILTER_ARTIFACT_BY_LABEL'
|
|
|
|
| translate
|
|
|
|
}}</label>
|
|
|
|
<div class="form-group mb-05">
|
|
|
|
<input
|
|
|
|
clrInput
|
|
|
|
type="text"
|
|
|
|
placeholder="Filter labels"
|
|
|
|
[(ngModel)]="filterName"
|
|
|
|
(keyup)="handleInputFilter()" />
|
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
[hidden]="
|
|
|
|
artifactListPageService
|
|
|
|
?.imageFilterLabels.length
|
|
|
|
"
|
|
|
|
class="no-labels">
|
|
|
|
{{ 'LABEL.NO_LABELS' | translate }}
|
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
[hidden]="
|
|
|
|
!artifactListPageService
|
|
|
|
?.imageFilterLabels.length
|
|
|
|
"
|
|
|
|
class="has-label">
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
class="labelBtn"
|
|
|
|
*ngFor="
|
|
|
|
let label of artifactListPageService?.imageFilterLabels
|
|
|
|
"
|
|
|
|
[hidden]="!label.show"
|
|
|
|
(click)="rightFilterLabel(label)">
|
|
|
|
<clr-icon
|
|
|
|
shape="check"
|
|
|
|
class="pull-left"
|
|
|
|
[hidden]="
|
|
|
|
!label.iconsShow
|
|
|
|
"></clr-icon>
|
|
|
|
<div class="labelDiv top-3-px">
|
|
|
|
<hbr-label-piece
|
|
|
|
[label]="label.label"
|
|
|
|
[labelWidth]="
|
|
|
|
160
|
|
|
|
"></hbr-label-piece>
|
|
|
|
</div>
|
|
|
|
</button>
|
|
|
|
</div>
|
2020-02-25 09:07:21 +01:00
|
|
|
</div>
|
2020-02-13 08:39:29 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<span class="refresh-btn" (click)="refresh()">
|
|
|
|
<clr-icon shape="refresh"></clr-icon>
|
|
|
|
</span>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-datagrid
|
|
|
|
[clrDgLoading]="loading"
|
|
|
|
(clrDgRefresh)="clrDgRefresh($event)"
|
|
|
|
class="datagrid-top"
|
2020-02-13 08:39:29 +01:00
|
|
|
[(clrDgSelected)]="selectedRow">
|
|
|
|
<clr-dg-action-bar>
|
2022-05-13 10:00:45 +02:00
|
|
|
<button
|
|
|
|
id="scan-btn"
|
|
|
|
[clrLoading]="scanBtnState"
|
|
|
|
type="button"
|
|
|
|
class="btn btn-secondary scan-btn"
|
|
|
|
[disabled]="
|
|
|
|
!(
|
|
|
|
canScanNow() &&
|
|
|
|
selectedRowHasVul() &&
|
|
|
|
hasEnabledScanner &&
|
|
|
|
hasScanImagePermission
|
|
|
|
)
|
|
|
|
"
|
|
|
|
(click)="scanNow()">
|
2021-01-07 10:16:52 +01:00
|
|
|
<clr-icon shape="shield-check" size="16"></clr-icon>
|
2022-05-13 10:00:45 +02:00
|
|
|
<span>{{ 'VULNERABILITY.SCAN_NOW' | translate }}</span>
|
2020-02-13 08:39:29 +01:00
|
|
|
</button>
|
|
|
|
|
2022-05-13 10:00:45 +02:00
|
|
|
<button
|
|
|
|
id="stop-scan"
|
|
|
|
[clrLoading]="stopBtnState"
|
|
|
|
type="button"
|
|
|
|
class="btn btn-secondary scan-btn"
|
|
|
|
[disabled]="!(canStopScan() && hasScanImagePermission)"
|
|
|
|
(click)="stopNow()">
|
2021-09-15 11:00:08 +02:00
|
|
|
<clr-icon shape="stop" size="16"></clr-icon>
|
2022-05-13 10:00:45 +02:00
|
|
|
<span>{{ 'VULNERABILITY.STOP_NOW' | translate }}</span>
|
2021-09-15 11:00:08 +02:00
|
|
|
</button>
|
|
|
|
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-dropdown class="btn btn-link" *ngIf="!depth">
|
|
|
|
<span
|
|
|
|
clrDropdownTrigger
|
|
|
|
id="artifact-list-action"
|
|
|
|
class="btn pl-0">
|
|
|
|
{{ 'BUTTON.ACTIONS' | translate }}
|
2020-02-13 08:39:29 +01:00
|
|
|
<clr-icon shape="caret down"></clr-icon>
|
|
|
|
</span>
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-dropdown-menu
|
|
|
|
class="action-dropdown"
|
|
|
|
clrPosition="bottom-left"
|
|
|
|
*clrIfOpen>
|
|
|
|
<div
|
|
|
|
class="action-dropdown-item no-border"
|
|
|
|
aria-label="copy digest"
|
|
|
|
clrDropdownItem
|
|
|
|
[clrDisabled]="
|
|
|
|
!(selectedRow.length === 1 && !depth)
|
|
|
|
"
|
|
|
|
(click)="showDigestId()">
|
|
|
|
{{ 'REPOSITORY.COPY_DIGEST_ID' | translate }}
|
|
|
|
</div>
|
2022-01-05 06:41:51 +01:00
|
|
|
<clr-dropdown>
|
2022-05-13 10:00:45 +02:00
|
|
|
<button
|
|
|
|
class="action-dropdown-item"
|
|
|
|
clrDropdownTrigger
|
|
|
|
[disabled]="
|
|
|
|
!canAddLabel() ||
|
|
|
|
!hasAddLabelImagePermission ||
|
|
|
|
depth ||
|
|
|
|
inprogress
|
|
|
|
"
|
2020-02-13 08:39:29 +01:00
|
|
|
(click)="addLabels()">
|
2022-05-13 10:00:45 +02:00
|
|
|
{{ 'REPOSITORY.ADD_LABELS' | translate }}
|
2020-02-13 08:39:29 +01:00
|
|
|
</button>
|
2020-03-24 03:56:18 +01:00
|
|
|
<clr-dropdown-menu [hidden]="!selectedRow.length">
|
2020-02-13 08:39:29 +01:00
|
|
|
<div class="filter-grid">
|
2022-05-13 10:00:45 +02:00
|
|
|
<label class="dropdown-header">{{
|
|
|
|
'REPOSITORY.ADD_LABEL_TO_IMAGE'
|
|
|
|
| translate
|
|
|
|
}}</label>
|
|
|
|
<div class="form-group filter-label-input">
|
|
|
|
<input
|
|
|
|
clrInput
|
|
|
|
type="text"
|
|
|
|
placeholder="Filter labels"
|
|
|
|
[(ngModel)]="stickName"
|
|
|
|
(keyup)="
|
|
|
|
handleStickInputFilter()
|
|
|
|
" />
|
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
[hidden]="
|
|
|
|
artifactListPageService
|
|
|
|
?.imageStickLabels.length
|
|
|
|
"
|
|
|
|
class="no-labels">
|
|
|
|
{{ 'LABEL.NO_LABELS' | translate }}
|
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
[hidden]="
|
|
|
|
!artifactListPageService
|
|
|
|
?.imageStickLabels.length
|
|
|
|
"
|
|
|
|
class="has-label">
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
class="dropdown-item"
|
|
|
|
clrDropdownItem
|
|
|
|
*ngFor="
|
|
|
|
let label of artifactListPageService?.imageStickLabels
|
|
|
|
"
|
|
|
|
[hidden]="!label.show"
|
2020-02-13 08:39:29 +01:00
|
|
|
(click)="stickLabel(label)">
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-icon
|
|
|
|
shape="check"
|
|
|
|
class="pull-left"
|
|
|
|
[hidden]="!label.iconsShow">
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-icon>
|
2022-05-13 10:00:45 +02:00
|
|
|
<div class="labelDiv">
|
|
|
|
<hbr-label-piece
|
|
|
|
[label]="label.label"
|
|
|
|
[labelWidth]="130">
|
2020-02-13 08:39:29 +01:00
|
|
|
</hbr-label-piece>
|
|
|
|
</div>
|
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</clr-dropdown-menu>
|
|
|
|
</clr-dropdown>
|
2022-05-13 10:00:45 +02:00
|
|
|
<div
|
|
|
|
class="action-dropdown-item"
|
|
|
|
aria-label="retag"
|
|
|
|
[clrDisabled]="
|
|
|
|
!(selectedRow.length === 1) ||
|
|
|
|
!hasRetagImagePermission ||
|
|
|
|
depth
|
|
|
|
"
|
|
|
|
(click)="retag()"
|
|
|
|
clrDropdownItem>
|
|
|
|
{{ 'REPOSITORY.RETAG' | translate }}
|
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
class="action-dropdown-item"
|
|
|
|
clrDropdownItem
|
|
|
|
*ngIf="hasDeleteImagePermission"
|
|
|
|
(click)="deleteArtifact()"
|
|
|
|
id="artifact-list-delete"
|
|
|
|
[clrDisabled]="
|
|
|
|
!hasDeleteImagePermission ||
|
|
|
|
!selectedRow.length ||
|
|
|
|
depth
|
|
|
|
">
|
|
|
|
{{ 'REPOSITORY.DELETE' | translate }}
|
|
|
|
</div>
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-dropdown-menu>
|
|
|
|
</clr-dropdown>
|
|
|
|
</clr-dg-action-bar>
|
|
|
|
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-dg-column class="flex-max-width" [clrDgSortBy]="'digest'"
|
|
|
|
>{{ 'REPOSITORY.ARTIFACTS_COUNT' | translate }}
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-dg-column>
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-dg-column class="pull-command-column">{{
|
|
|
|
'REPOSITORY.PULL_COMMAND' | translate
|
|
|
|
}}</clr-dg-column>
|
|
|
|
<clr-dg-column *ngIf="depth">{{
|
|
|
|
'REPOSITORY.PLATFORM' | translate
|
|
|
|
}}</clr-dg-column>
|
|
|
|
<clr-dg-column class="tag-column">{{
|
|
|
|
'REPOSITORY.TAGS' | translate
|
|
|
|
}}</clr-dg-column>
|
|
|
|
<clr-dg-column class="co-signed-column">{{
|
|
|
|
'ACCESSORY.CO_SIGNED' | translate
|
|
|
|
}}</clr-dg-column>
|
|
|
|
<clr-dg-column [clrDgSortBy]="'size'">{{
|
|
|
|
'REPOSITORY.SIZE' | translate
|
|
|
|
}}</clr-dg-column>
|
|
|
|
<clr-dg-column class="vul-column">{{
|
|
|
|
'REPOSITORY.VULNERABILITY' | translate
|
|
|
|
}}</clr-dg-column>
|
|
|
|
<clr-dg-column class="annotations-column">{{
|
|
|
|
'ARTIFACT.ANNOTATION' | translate
|
|
|
|
}}</clr-dg-column>
|
|
|
|
<clr-dg-column>{{ 'REPOSITORY.LABELS' | translate }}</clr-dg-column>
|
|
|
|
<clr-dg-column [clrDgSortBy]="pushComparator">{{
|
|
|
|
'REPOSITORY.PUSH_TIME' | translate
|
|
|
|
}}</clr-dg-column>
|
|
|
|
<clr-dg-column [clrDgSortBy]="pullComparator">{{
|
|
|
|
'REPOSITORY.PULL_TIME' | translate
|
|
|
|
}}</clr-dg-column>
|
|
|
|
<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 }}">
|
|
|
|
{{ artifact.digest | slice: 0:15 }}</a
|
|
|
|
>
|
|
|
|
<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>
|
|
|
|
<th
|
|
|
|
*ngIf="withNotary"
|
|
|
|
class="left tag-header-color">
|
|
|
|
{{
|
|
|
|
'ACCESSORY.NOTARY_SIGNED'
|
|
|
|
| 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
|
|
|
|
*ngIf="withNotary"
|
|
|
|
class="left tag-body-color"
|
|
|
|
[ngSwitch]="tag.signed">
|
2020-03-27 09:31:04 +01:00
|
|
|
<div class="cell">
|
2022-05-13 10:00:45 +02:00
|
|
|
<clr-icon
|
|
|
|
shape="check-circle"
|
|
|
|
*ngSwitchCase="true"
|
|
|
|
size="20"
|
|
|
|
class="color-green"></clr-icon>
|
|
|
|
<clr-icon
|
|
|
|
shape="times-circle"
|
|
|
|
*ngSwitchCase="false"
|
|
|
|
size="16"
|
|
|
|
class="color-red"></clr-icon>
|
|
|
|
<a
|
|
|
|
href="javascript:void(0)"
|
|
|
|
*ngSwitchDefault
|
|
|
|
role="tooltip"
|
|
|
|
aria-haspopup="true"
|
|
|
|
class="tooltip tooltip-top-right">
|
|
|
|
<clr-icon
|
|
|
|
shape="help"
|
|
|
|
class="color-gray"
|
|
|
|
size="16"></clr-icon>
|
|
|
|
<span
|
|
|
|
class="tooltip-content"
|
|
|
|
>{{
|
|
|
|
'REPOSITORY.NOTARY_IS_UNDETERMINED'
|
|
|
|
| translate
|
|
|
|
}}</span
|
|
|
|
>
|
2020-03-27 09:31:04 +01:00
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</td>
|
2022-05-13 10:00:45 +02:00
|
|
|
<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">
|
2020-02-13 08:39:29 +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]="'top-middle'"
|
|
|
|
*clrIfOpen>
|
2020-02-13 08:39:29 +01:00
|
|
|
<div>
|
2022-05-13 10:00:45 +02:00
|
|
|
<hbr-label-piece
|
|
|
|
*ngFor="
|
|
|
|
let label of artifact.labels
|
|
|
|
"
|
|
|
|
[label]="label">
|
2020-02-13 08:39:29 +01:00
|
|
|
</hbr-label-piece>
|
|
|
|
</div>
|
|
|
|
</clr-signpost-content>
|
|
|
|
</clr-signpost>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</clr-dg-cell>
|
|
|
|
<clr-dg-cell>
|
2022-05-13 10:00:45 +02:00
|
|
|
<div class="cell">
|
|
|
|
{{ artifact.push_time | harborDatetime: 'short' }}
|
|
|
|
</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
|
|
|
|
? ''
|
|
|
|
: (artifact.pull_time | harborDatetime: 'short')
|
|
|
|
}}
|
|
|
|
</div>
|
2020-02-13 08:39:29 +01:00
|
|
|
</clr-dg-cell>
|
2022-05-13 10:00:45 +02:00
|
|
|
<sub-accessories
|
|
|
|
(deleteAccessory)="deleteAccessory($event)"
|
|
|
|
[projectName]="projectName"
|
|
|
|
[repositoryName]="repoName"
|
|
|
|
*ngIf="artifact?.accessories?.length"
|
|
|
|
[total]="artifact?.accessoryNumber"
|
|
|
|
[accessories]="artifact?.accessories"
|
|
|
|
[clrIfExpanded]="false"
|
|
|
|
ngProjectAs="clr-dg-row-detail"></sub-accessories>
|
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>
|