This repository has been archived on 2020-03-24. You can view files and clone it, but cannot push or open issues or pull requests.
quay/static/js/directives/ui/manage-trigger/manage-trigger.component.html

434 lines
23 KiB
HTML
Raw Normal View History

<div class="manage-trigger-githost-element manage-trigger-control">
<linear-workflow done-title="Create Trigger"
(on-workflow-complete)="$ctrl.createTrigger($event)">
<!-- Section: Namespace -->
<linear-workflow-section class="row"
section-id="namespace"
section-title="::{{ 'Select ' + $ctrl.namespaceTitle }}"
section-valid="$ctrl.local.selectedNamespace"
skip-section="::$ctrl.githost == 'custom-git'">
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
ng-if="$ctrl.local.namespaces">
<h3>Select {{ ::$ctrl.namespaceTitle }}</h3>
<strong>Please select the {{ ::$ctrl.namespaceTitle }} under which the repository lives</strong>
<cor-table table-data="$ctrl.local.namespaces"
table-item-title="namespaces"
max-display-count="$ctrl.namespacesPerPage"
filter-fields="::['title', 'id']">
<cor-table-col datafield="title"
style="width: 20px;"
sortfield="title"
bind-model="$ctrl.local.selectedNamespace"
templateurl="/static/js/directives/ui/manage-trigger-githost/namespace-radio-input.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/namespace-radio-input.html">
<input type="radio"
ng-model="col.bindModel" ng-value="item"
ng-dblclick="col.bindModel = null">
</script>
</cor-table-col>
<cor-table-col title="{{ ::$ctrl.namespaceTitle }}"
datafield="id"
sortfield="id"
templateurl="/static/js/directives/ui/manage-trigger-githost/namespace-name.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/namespace-name.html">
<img class="namespace-avatar" ng-src="{{ ::item.avatar_url }}" ng-if="::item.avatar_url">
<span class="anchor"
href="{{ ::item.url }}"
is-text-only="::!item.url">{{ ::item.id }}</span>
</script>
</cor-table-col>
<cor-table-col title="Importance"
datafield="score"
bind-model="$ctrl.local.maxScore"
style="display: flex; justify-content: flex-end"
templateurl="/static/js/directives/ui/manage-trigger-githost/namespace-score.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/namespace-score.html">
<div style="padding-right: 40px;">
<span class="strength-indicator"
value="::item.score" maximum="::col.bindModel" log-base="10"></span>
</div>
</script>
</cor-table-col>
</cor-table>
</div>
<div class="col-lg-8 col-md-8 col-sm-12 main-col"
ng-if="!$ctrl.local.namespaces">
<span class="cor-loader-inline"></span> Retrieving {{ $ctrl.namespaceTitle }}s
</div>
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col" ng-if="$ctrl.local.namespaces">
<p>
<span class="registry-name"></span> has been granted access to read and view these {{ $ctrl.namespaceTitle }}s.
</p>
<p>
Don't see an expected {{ $ctrl.namespaceTitle }} here? Please make sure third-party access is enabled for <span class="registry-name"></span> under that {{ $ctrl.namespaceTitle }}.
</p>
</div>
</linear-workflow-section><!-- /Section: Namespace -->
<!-- Section: Githost Repository -->
<linear-workflow-section class="row"
section-id="repo"
section-title="Select Repository"
section-valid="$ctrl.local.selectedRepository.full_name"
skip-section="::$ctrl.githost == 'custom-git'">
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
ng-if="$ctrl.local.repositories">
<h3>Select Repository</h3>
<strong>
Select a repository in
<img class="namespace-avatar"
ng-src="{{ $ctrl.local.selectedNamespace.avatar_url }}"
ng-if="$ctrl.local.selectedNamespace.avatar_url">
{{ $ctrl.local.selectedNamespace.id }}
</strong>
<div style="display: flex; justify-content: flex-end;">
<div class="filter-options">
<label>
<input type="checkbox"
ng-model="$ctrl.local.repositoryOptions.hideStale"
ng-change="$ctrl.buildOrderedRepositories()">
Hide stale repositories
</label>
</div>
</div>
<cor-table table-data="$ctrl.local.orderedRepositories.entries"
table-item-title="repositories"
max-display-count="$ctrl.repositoriesPerPage"
filter-fields="['name', 'description']">
<cor-table-col bind-model="$ctrl.local.selectedRepository"
templateurl="/static/js/directives/ui/manage-trigger-githost/repository-radio-input.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/repository-radio-input.html">
<span ng-if="!item.has_admin_permissions">
<i class="fa fa-exclamation-triangle"
data-title="Admin access is required to add the webhook trigger to this repository" bs-tooltip></i>
</span>
<div ng-if="item.has_admin_permissions">
<input type="radio"
ng-model="col.bindModel" ng-value="item"
ng-dblclick="col.bindModel = null">
</div>
</script>
</cor-table-col>
<cor-table-col title="Repository Name"
datafield="name"
sortfield="name"
bind-model="$ctrl.getTriggerIcon()"
templateurl="/static/js/directives/ui/manage-trigger-githost/repository-name.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/repository-name.html">
<i class="service-icon fa {{ ::col.bindModel }}"></i>
<span class="anchor"
href="{{ item.url }}"
is-text-only="!item.url">{{ item.name }}</span>
</script>
</cor-table-col>
<cor-table-col title="Updated"
datafield="last_updated_datetime"
templateurl="/static/js/directives/ui/manage-trigger-githost/repository-last-updated.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/repository-last-updated.html">
<span am-time-ago="item.last_updated_datetime"></span>
</script>
</cor-table-col>
<cor-table-col title="Description"
datafield="description"
sortfield="description"
templateurl="/static/js/directives/ui/manage-trigger-githost/repository-description.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-githost/repository-description.html">
<span ng-if="item.description">{{ item.description }}</span>
<span class="empty-description" ng-if="!item.description">(None)</span>
</script>
</cor-table-col>
</cor-table>
</div>
<div class="col-lg-8 col-md-8 col-sm-12 main-col"
ng-if="!$ctrl.local.repositories">
<span class="cor-loader-inline"></span> Retrieving repositories
</div>
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col"
ng-if="$ctrl.local.repositories">
<p>
A webhook will be added to the selected repository in order to detect when new commits are made.
</p>
<p>
Don't see an expected repository here? Please make sure you have admin access on that repository.
</p>
</div>
</linear-workflow-section><!-- /Section: Githost Repository -->
<!-- Section: Custom Git Repository -->
<linear-workflow-section class="row"
section-id="repo"
section-title="Git Repository"
section-valid="$ctrl.local.selectedRepository.full_name"
skip-section="::$ctrl.githost != 'custom-git'">
<div class="col-lg-7 col-md-7 col-sm-12 main-col">
<h3>Enter repository</h3>
<strong>Please enter the HTTP or SSH style URL used to clone your git repository</strong>
<input class="form-control" type="text" placeholder="git@example.com:namespace/repository.git"
ng-model="$ctrl.buildSource"
ng-change="$ctrl.checkBuildSource($ctrl.buildSource)"
ng-pattern="/(((http|https):\/\/)(.+)|\w+@(.+):(.+))/">
</div>
<div class="col-lg-5 col-md-5 hidden-sm hidden-xs help-col">
<p>Custom git triggers support any externally accessible git repository, via either the normal git protocol or HTTP.</p>
<p><b>It is the responsibility of the git repository to invoke a webhook to tell <span class="registry-name" short="true"></span> that a commit has been added.</b></p>
</div>
</linear-workflow-section><!-- /Section: Repository -->
<!-- Section: Trigger Options -->
<linear-workflow-section class="row"
section-id="triggeroptions"
section-title="Configure Trigger"
section-valid="$ctrl.local.triggerOptions"
skip-section="$ctrl.githost == 'custom-git'">
<div class="col-lg-7 col-md-7 col-sm-12 main-col" ng-if="$ctrl.local.repositoryRefs">
<h3>Configure Trigger</h3>
<strong>
Configure trigger options for
<img class="namespace-avatar"
ng-src="{{ $ctrl.local.selectedNamespace.avatar_url }}"
ng-if="$ctrl.local.selectedNamespace.avatar_url">
{{ $ctrl.local.selectedNamespace.id }}/{{ $ctrl.local.selectedRepository.name }}
</strong>
<div class="radio" style="margin-top: 20px;">
<label>
<input type="radio" name="optionRadio"
ng-model="$ctrl.local.triggerOptions.hasBranchTagFilter"
ng-value="false">
<div class="title">Trigger for all branches and tags <span class="weak">(default)</span></div>
<div class="description">Build a container image for each commit across all branches and tags</div>
</label>
</div>
<div class="radio">
<label>
<input type="radio"
name="optionRadio"
ng-model="$ctrl.local.triggerOptions.hasBranchTagFilter"
ng-value="true">
<div class="title">Trigger only on branches and tags matching a regular expression</div>
<div class="description">Only build container images for a subset of branches and/or tags.</div>
<div class="extended"
ng-if="$ctrl.local.triggerOptions.hasBranchTagFilter">
<table>
<tr>
<td style="white-space: nowrap;">Regular Expression:</td>
<td>
<input type="text" class="form-control"
ng-model="$ctrl.local.triggerOptions.branchTagFilter"
required>
<div class="description">Examples: heads/master, tags/tagname, heads/.+</div>
<regex-match-view items="$ctrl.local.repositoryFullRefs"
regex="$ctrl.local.triggerOptions.branchTagFilter"
ng-if="$ctrl.local.triggerOptions.branchTagFilter"></regex-match-view>
</td>
</tr>
</table>
</div>
</label>
</div>
</div>
<div class="col-lg-8 col-md-8 col-sm-12 main-col"
ng-if="!$ctrl.local.repositoryRefs">
<span class="cor-loader-inline"></span> Retrieving repository refs
</div>
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col">
<p>Do you want to build a new container image for commits across all branches and tags, or limit to a subset?</p>
<p>For example, if you use release branches instead of <code>master</code> for building versions of your software, you can configure the trigger to only build images for these branches.</p>
<p>All images built will be tagged with the name of the branch or tag whose change invoked the trigger</p>
</div>
</linear-workflow-section><!-- /Section: Trigger Options -->
<!-- Section: Dockerfile Location -->
<linear-workflow-section class="row"
section-id="dockerfilelocation"
section-title="Select Dockerfile"
section-valid="$ctrl.local.hasValidDockerfilePath">
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
ng-if="$ctrl.local.dockerfileLocations.status == 'error'">
<div class="co-alert co-alert-warning">
{{ $ctrl.local.dockerfileLocations.message }}
</div>
</div>
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
ng-if="$ctrl.githost == 'custom-git' || $ctrl.local.dockerfileLocations.status == 'success'">
<h3>Select Dockerfile</h3>
<strong>Please select the location of the Dockerfile to build when this trigger is invoked</strong>
<dockerfile-path-select current-path="$ctrl.local.dockerfilePath"
paths="$ctrl.local.dockerfileLocations.dockerfile_paths"
supports-full-listing="true"
(path-changed)="$ctrl.checkDockerfilePath($event)"></dockerfile-path-select>
<span ng-if="$ctrl.local.dockerfilePath.split('/').splice(-1)[0] == ''"
style="color: #D64456;">
Dockerfile path must end with a file, probably named <code>Dockerfile</code>
</span>
</div>
<div class="col-lg-8 col-md-8 col-sm-12 main-col"
ng-if="$ctrl.githost != 'custom-git' && !$ctrl.local.dockerfileLocations">
<span class="cor-loader-inline"></span> Retrieving Dockerfile locations
</div>
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col">
<p>Please select the location containing the Dockerfile to be built.</p>
<p>The Dockerfile path starts with the context and ends with the path to the Dockefile that you would like to build</p>
<p>If the Dockerfile is located at the root of the git repository and named Dockerfile, enter <code>/Dockerfile</code> as the Dockerfile path.</p>
</div>
</linear-workflow-section><!-- /Section: Dockerfile Location -->
<!-- Section: Context Location -->
<linear-workflow-section class="row"
section-id="contextlocation"
section-title="Select Docker Context"
section-valid="$ctrl.local.hasValidContextLocation">
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
ng-if="$ctrl.local.dockerfileLocations.status == 'error'">
<div class="co-alert co-alert-warning">
{{ $ctrl.local.dockerfileLocations.message }}
</div>
</div>
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
ng-if="$ctrl.githost == 'custom-git' || $ctrl.local.dockerfileLocations.status == 'success'">
<h3>Select Context</h3>
<strong>Please select the context for the Docker build</strong>
<context-path-select current-context="$ctrl.local.dockerContext"
contexts="$ctrl.local.contexts"
(context-changed)="$ctrl.checkBuildContext($event)"></context-path-select>
</div>
<div class="col-lg-8 col-md-8 col-sm-12 main-col"
ng-if="$ctrl.githost != 'custom-git' && !$ctrl.local.dockerfileLocations">
<span class="cor-loader-inline"></span> Retrieving Dockerfile locations
</div>
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col">
<p>Please select a Docker context.</p>
<p>The build context directory is the path of the directory containing the Dockerfile and any other files to be made available when the build is triggered.</p>
<p>If the Dockerfile is located at the root of the git repository, enter <code>/</code> as the build context directory.</p>
</div>
</linear-workflow-section><!-- /Section: Context Location -->
<!-- Section: Robot Account -->
<linear-workflow-section class="row"
section-id="robot"
section-title="Robot Account"
section-valid="$ctrl.local.triggerAnalysis.status != 'error' &&
($ctrl.local.triggerAnalysis.status != 'requiresrobot' || $ctrl.local.robotAccount)">
<!-- Error -->
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
ng-if="$ctrl.local.triggerAnalysis.status == 'error'">
<h3 class="error"><i class="fa fa-exclamation-circle"></i> Verification Error</h3>
<strong>
There was an error when verifying the state of <img class="namespace-avatar"
ng-src="{{ $ctrl.local.selectedNamespace.avatar_url }}"
ng-if="$ctrl.local.selectedNamespace.avatar_url">
{{ $ctrl.local.selectedNamespace.id }}/{{ $ctrl.local.selectedRepository.name }}
</strong>
{{ $ctrl.local.triggerAnalysis.message }}
</div>
<!-- Robot display for non-error cases -->
<div class="col-lg-7 col-md-7 col-sm-12 main-col"
ng-if="$ctrl.local.triggerAnalysis.status != 'error'">
<!-- Warning -->
<div ng-if="$ctrl.local.triggerAnalysis.status == 'warning'">
<h3 class="warning"><i class="fa fa-exclamation-triangle"></i> Verification Warning</h3>
{{ $ctrl.local.triggerAnalysis.message }}
</div>
<!-- Public base -->
<div ng-if="$ctrl.local.triggerAnalysis.status == 'publicbase'">
<h3>Optional Robot Account</h3>
<strong>
<span ng-if="$ctrl.local.triggerAnalysis.is_admin">Choose an optional robot account below or click "Continue" to complete setup of this build trigger.</span>
</strong>
</div>
<!-- Requires robot and is not admin -->
<div ng-if="$ctrl.local.triggerAnalysis.status == 'requiresrobot' && !$ctrl.local.triggerAnalysis.is_admin">
<h3>Robot Account Required</h3>
<p>The selected Dockerfile in the selected repository depends upon a private base image.</p>
<p>A robot account with access to the base image is required to setup this trigger, but you are not the administrator of this namespace.</p>
<p>Administrative access is required to continue to ensure security of the robot credentials.</p>
</div>
<!-- Requires robot and is admin -->
<div ng-if="$ctrl.local.triggerAnalysis.status == 'requiresrobot' && $ctrl.local.triggerAnalysis.is_admin">
<h3>Robot Account Required</h3>
<p>The selected Dockerfile in the selected repository depends upon a private base image.</p>
<p>A robot account with access to the base image is required to setup this trigger.</p>
</div>
<!-- Robots view -->
<div ng-if="$ctrl.local.triggerAnalysis.is_admin">
<cor-table table-data="$ctrl.local.triggerAnalysis.robots"
table-item-title="robot accounts"
filter-fields="['name']"
max-display-count="$ctrl.robotsPerPage">
<cor-table-col datafield="name"
bind-model="$ctrl.local.robotAccount"
style="width: 20px;"
templateurl="/static/js/directives/ui/manage-trigger-custom-git/robot-radio-input.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-custom-git/robot-radio-input.html">
<input type="radio"
ng-model="col.bindModel" ng-value="item"
ng-dblclick="col.bindModel = null">
</script>
</cor-table-col>
<cor-table-col title="Robot Account"
sortfield="name"
templateurl="/static/js/directives/ui/manage-trigger-custom-git/robot-name.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-custom-git/robot-name.html">
<span class="entity-reference" entity="item"></span>
</script>
</cor-table-col>
<cor-table-col ng-if="$ctrl.local.triggerAnalysis.status == 'requiresrobot' || true"
datafield="can_read"
templateurl="/static/js/directives/ui/manage-trigger-custom-git/can-read.html">
<script type="text/ng-template" id="/static/js/directives/ui/manage-trigger-custom-git/can-read.html">
<span ng-if="item.can_read" class="success">Can Read</span>
<span ng-if="!item.can_read">Read access will be added if selected</span>
</script>
</cor-table-col>
</cor-table>
</div> <!-- /Robots view -->
</div>
<div class="col-lg-4 col-md-4 hidden-sm hidden-xs help-col"
ng-if="$ctrl.local.triggerAnalysis.is_admin">
<p>
In order for the <span class="registry-name"></span> to pull a <b>private base image</b> during the build
process, a robot account with access must be selected.
</p>
<p ng-if="$ctrl.local.triggerAnalysis.status != 'requiresrobot'">
If you know that a private base image is not used, you can skip this step.
</p>
<p ng-if="$ctrl.local.triggerAnalysis.status == 'requiresrobot'">
Robot accounts that already have access to this base image are listed first. If you select a robot account
that does not currently have access, read permission will be granted to that robot account on trigger creation.
</p>
</div>
</linear-workflow-section><!-- /Section: Verification and Robot Account -->
<!-- Verification -->
<linear-workflow-section class="row"
section-id="verification"
section-title="Verification"
section-valid="true">
<span>
<h3 class="success"><i class="fa fa-check-circle"></i> Ready to go!</h3>
Click "Continue" to complete setup of this build trigger.
</span>
</linear-workflow-section><!-- /Section: Verification -->
</linear-workflow>
</div>