mirror of https://github.com/portainer/portainer
142 lines
7.5 KiB
HTML
142 lines
7.5 KiB
HTML
<rd-header>
|
|
<rd-header-title title="Application templates list">
|
|
<a data-toggle="tooltip" title="Refresh" ui-sref="templates" ui-sref-opts="{reload: true}">
|
|
<i class="fa fa-refresh" aria-hidden="true"></i>
|
|
</a>
|
|
</rd-header-title>
|
|
<rd-header-content>Templates</rd-header-content>
|
|
</rd-header>
|
|
<div id="selectedTemplate" class="row" ng-if="state.selectedTemplate">
|
|
<div class="col-lg-12 col-md-12 col-xs-12">
|
|
<rd-widget>
|
|
<rd-widget-custom-header icon="state.selectedTemplate.logo" title="state.selectedTemplate.image">
|
|
</rd-widget-custom-header>
|
|
<rd-widget-body classes="padding">
|
|
<form class="form-horizontal">
|
|
<div class="form-group" ng-if="globalNetworkCount === 0 && endpointMode.provider === 'DOCKER_SWARM'">
|
|
<div class="col-sm-12">
|
|
<span class="small text-muted">When using Swarm, we recommend deploying containers in a shared network. Looks like you don't have any shared network, head over the <a ui-sref="networks">networks view</a> to create one.</span>
|
|
</div>
|
|
</div>
|
|
<div class="form-group" ng-if="endpointMode.provider === 'DOCKER_SWARM_MODE'">
|
|
<div class="col-sm-12">
|
|
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
|
|
<span class="small text-muted">App templates cannot be used with swarm-mode at the moment. You can still use them to quickly deploy containers to the Docker host.</span>
|
|
</div>
|
|
</div>
|
|
<!-- name-and-network-inputs -->
|
|
<div class="form-group">
|
|
<label for="image_registry" class="col-sm-2 control-label text-left">Name</label>
|
|
<div class="col-sm-4">
|
|
<input type="text" class="form-control" ng-model="formValues.name" placeholder="e.g. web (optional)">
|
|
</div>
|
|
<label for="container_network" class="col-sm-2 control-label text-right">Network</label>
|
|
<div class="col-sm-4">
|
|
<select class="selectpicker form-control" ng-options="net.Name for net in availableNetworks" ng-model="formValues.network">
|
|
<option disabled hidden value="">Select a network</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<!-- !name-and-network-inputs -->
|
|
<div ng-repeat="var in state.selectedTemplate.env" ng-if="!var.set" class="form-group">
|
|
<label for="field_{{ $index }}" class="col-sm-2 control-label text-left">{{ var.label }}</label>
|
|
<div class="col-sm-10">
|
|
<select ng-if="endpointMode.provider !== 'DOCKER_SWARM' && var.type === 'container'" ng-options="container|containername for container in runningContainers" class="selectpicker form-control" ng-model="var.value">
|
|
<option selected disabled hidden value="">Select a container</option>
|
|
</select>
|
|
<select ng-if="endpointMode.provider === 'DOCKER_SWARM' && var.type === 'container'" ng-options="container|swarmcontainername for container in runningContainers" class="selectpicker form-control" ng-model="var.value">
|
|
<option selected disabled hidden value="">Select a container</option>
|
|
</select>
|
|
<input ng-if="!var.type || !var.type === 'container'" type="text" class="form-control" ng-model="var.value" id="field_{{ $index }}">
|
|
</div>
|
|
</div>
|
|
<div class="form-group">
|
|
<div class="col-sm-12">
|
|
<a class="small interactive" ng-if="!state.showAdvancedOptions" ng-click="state.showAdvancedOptions = true;">
|
|
<i class="fa fa-plus space-right" aria-hidden="true"></i> Show advanced options
|
|
</a>
|
|
<a class="small interactive" ng-if="state.showAdvancedOptions" ng-click="state.showAdvancedOptions = false;">
|
|
<i class="fa fa-minus space-right" aria-hidden="true"></i> Hide advanced options
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="form-group" ng-if="state.showAdvancedOptions">
|
|
<label for="container_ports" class="col-sm-1 control-label text-left">Port mapping</label>
|
|
<div class="col-sm-11" style="margin-top: 5px;">
|
|
<span class="label label-default interactive" ng-click="addPortBinding()">
|
|
<i class="fa fa-plus-circle" aria-hidden="true"></i> map additional port
|
|
</span>
|
|
</div>
|
|
<!-- port-mapping-input-list -->
|
|
<div class="col-sm-offset-1 col-sm-11 form-inline" style="margin-top: 10px;">
|
|
<div ng-repeat="portBinding in formValues.ports" style="margin-top: 2px;">
|
|
<div class="input-group col-sm-5 input-group-sm">
|
|
<span class="input-group-addon">host</span>
|
|
<input type="text" class="form-control" ng-model="portBinding.hostPort" placeholder="e.g. 80 or 1.2.3.4:80 (optional)">
|
|
</div>
|
|
<div class="input-group col-sm-5 input-group-sm">
|
|
<span class="input-group-addon">container</span>
|
|
<input type="text" class="form-control" ng-model="portBinding.containerPort" placeholder="e.g. 80">
|
|
</div>
|
|
<div class="input-group col-sm-1 input-group-sm">
|
|
<select class="selectpicker form-control" ng-model="portBinding.protocol">
|
|
<option value="tcp">tcp</option>
|
|
<option value="udp">udp</option>
|
|
</select>
|
|
<span class="input-group-btn">
|
|
<button class="btn btn-default" type="button" ng-click="removePortBinding($index)">
|
|
<i class="fa fa-minus" aria-hidden="true"></i>
|
|
</button>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- !port-mapping-input-list -->
|
|
</div>
|
|
<!-- !port-mapping -->
|
|
<div class="form-group">
|
|
<div class="col-sm-12">
|
|
<button type="button" class="btn btn-default btn-sm" ng-disabled="!formValues.network" ng-click="createTemplate()">Create</button>
|
|
<i id="createContainerSpinner" class="fa fa-cog fa-spin" style="margin-left: 5px; display: none;"></i>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
</rd-widget-body>
|
|
</rd-widget>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row" ng-if="state.selectedTemplate">
|
|
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-lg-12 col-md-12 col-xs-12">
|
|
<rd-widget>
|
|
<rd-widget-header icon="fa-rocket" title="Available templates">
|
|
<div class="pull-right">
|
|
<i id="loadTemplatesSpinner" class="fa fa-cog fa-2x fa-spin" style="margin-top: 5px;"></i>
|
|
</div>
|
|
</rd-widget-header>
|
|
<rd-widget-body classes="padding">
|
|
<div class="template-list">
|
|
<div dir-paginate="tpl in templates | itemsPerPage: pagination_count" class="container-template hvr-underline-from-center" id="template_{{ tpl.index }}" ng-click="selectTemplate(tpl.index)">
|
|
<img class="logo" ng-src="{{ tpl.logo }}" />
|
|
<div class="title">{{ tpl.title }}</div>
|
|
<div class="description">{{ tpl.description }}</div>
|
|
</div>
|
|
<div ng-if="!templates" class="text-center text-muted">
|
|
Loading...
|
|
</div>
|
|
<div ng-if="templates.length == 0" class="text-center text-muted">
|
|
No templates available.
|
|
</div>
|
|
</div>
|
|
<div ng-if="templates">
|
|
<dir-pagination-controls></dir-pagination-controls>
|
|
</div>
|
|
</rd-widget-body>
|
|
</rd-widget>
|
|
</div>
|
|
</div>
|