<div> <rd-widget> <rd-widget-header icon="fa-tasks" title-text="Published ports"> <div class="nopadding" authorization="DockerServiceUpdate"> <a class="btn btn-default btn-sm pull-right" ng-click="isUpdating ||addPublishedPort(service)" ng-disabled="isUpdating"> <i class="fa fa-plus-circle" aria-hidden="true"></i> port mapping </a> </div> </rd-widget-header> <rd-widget-body ng-if="!service.Ports || service.Ports.length === 0"> <p>This service has no ports published.</p> </rd-widget-body> <rd-widget-body ng-if="service.Ports && service.Ports.length > 0" classes="no-padding"> <table class="table"> <thead> <tr> <th>Host port</th> <th>Container port</th> <th>Protocol</th> <th>Publish mode</th> <th authorization="DockerServiceUpdate">Actions</th> </tr> </thead> <tbody> <tr ng-repeat="portBinding in service.Ports"> <td> <div class="input-group input-group-sm"> <span class="input-group-addon">host</span> <input type="number" class="form-control" ng-model="portBinding.PublishedPort" placeholder="e.g. 8080" ng-change="updatePublishedPort(service, mapping)" ng-disabled="isUpdating" disable-authorization="DockerServiceUpdate" /> </div> </td> <td> <div class="input-group input-group-sm"> <span class="input-group-addon">container</span> <input type="number" class="form-control" ng-model="portBinding.TargetPort" placeholder="e.g. 80" ng-change="updatePublishedPort(service, mapping)" ng-disabled="isUpdating" disable-authorization="DockerServiceUpdate" /> </div> </td> <td> <div class="input-group input-group-sm"> <select class="selectpicker form-control" ng-model="portBinding.Protocol" ng-change="updatePublishedPort(service, mapping)" ng-disabled="isUpdating" disable-authorization="DockerServiceUpdate" > <option value="tcp">tcp</option> <option value="udp">udp</option> </select> </div> </td> <td> <div class="input-group input-group-sm"> <select class="selectpicker form-control" ng-model="portBinding.PublishMode" ng-change="updatePublishedPort(service, mapping)" ng-disabled="isUpdating" disable-authorization="DockerServiceUpdate" > <option value="ingress">ingress</option> <option value="host">host</option> </select> </div> </td> <td authorization="DockerServiceUpdate"> <span class="input-group-btn"> <button class="btn btn-sm btn-danger" type="button" ng-click="removePortPublishedBinding(service, $index)" ng-disabled="isUpdating"> <i class="fa fa-trash" aria-hidden="true"></i> </button> </span> </td> </tr> </tbody> </table> </rd-widget-body> <rd-widget-footer authorization="DockerServiceUpdate"> <div class="btn-toolbar" role="toolbar"> <div class="btn-group" role="group"> <button type="button" class="btn btn-primary btn-sm" ng-disabled="!hasChanges(service, ['Ports'])" ng-click="updateService(service)">Apply changes</button> <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span class="caret"></span> </button> <ul class="dropdown-menu"> <li><a ng-click="cancelChanges(service, ['Ports'])">Reset changes</a></li> <li><a ng-click="cancelChanges(service)">Reset all changes</a></li> </ul> </div> </div> </rd-widget-footer> </rd-widget> </div>