mirror of
https://github.com/portainer/portainer.git
synced 2025-07-24 15:59:41 +02:00
Raise cutoff level and provide tooltips for links in images and volumes datatables to avoid having to open the detail view to see the full name.
150 lines
8.3 KiB
HTML
150 lines
8.3 KiB
HTML
<div class="datatable">
|
|
<rd-widget>
|
|
<rd-widget-body classes="no-padding">
|
|
<div class="toolBar">
|
|
<div class="toolBarTitle">
|
|
<i class="fa" ng-class="$ctrl.titleIcon" aria-hidden="true" style="margin-right: 2px;"></i> {{ $ctrl.titleText }}
|
|
</div>
|
|
</div>
|
|
<div class="actionBar">
|
|
<div class="btn-group">
|
|
<button type="button" class="btn btn-sm btn-danger"
|
|
ng-disabled="$ctrl.state.selectedItemCount === 0" ng-click="$ctrl.removeAction($ctrl.state.selectedItems, false)">
|
|
<i class="fa fa-trash-alt space-right" aria-hidden="true"></i>Remove
|
|
</button>
|
|
<button type="button" class="btn btn-sm btn-danger dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" ng-disabled="$ctrl.state.selectedItemCount === 0">
|
|
<span class="caret"></span>
|
|
<span class="sr-only">Toggle Dropdown</span>
|
|
</button>
|
|
<ul class="dropdown-menu">
|
|
<li><a ng-click="$ctrl.forceRemoveAction($ctrl.state.selectedItems, true)" ng-disabled="$ctrl.state.selectedItemCount === 0">Force Remove</a></li>
|
|
</ul>
|
|
</div>
|
|
<button type="button" class="btn btn-sm btn-primary" ui-sref="docker.images.build">
|
|
<i class="fa fa-plus space-right" aria-hidden="true"></i>Build a new image
|
|
</button>
|
|
</div>
|
|
<div class="searchBar">
|
|
<i class="fa fa-search searchIcon" aria-hidden="true"></i>
|
|
<input type="text" class="searchInput" ng-model="$ctrl.state.textFilter" placeholder="Search..." auto-focus>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table table-hover table-filters">
|
|
<thead>
|
|
<tr>
|
|
<th uib-dropdown dropdown-append-to-body auto-close="disabled" popover-placement="bottom-left" is-open="$ctrl.filters.usage.open">
|
|
<span class="md-checkbox">
|
|
<input id="select_all" type="checkbox" ng-model="$ctrl.state.selectAll" ng-change="$ctrl.selectAll()" />
|
|
<label for="select_all"></label>
|
|
</span>
|
|
<a ng-click="$ctrl.changeOrderBy('Id')">
|
|
Id
|
|
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Id' && !$ctrl.state.reverseOrder"></i>
|
|
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Id' && $ctrl.state.reverseOrder"></i>
|
|
</a>
|
|
<div>
|
|
<span uib-dropdown-toggle class="table-filter" ng-if="!$ctrl.filters.usage.enabled">Filter <i class="fa fa-filter" aria-hidden="true"></i></span>
|
|
<span uib-dropdown-toggle class="table-filter filter-active" ng-if="$ctrl.filters.usage.enabled">Filter <i class="fa fa-check" aria-hidden="true"></i></span>
|
|
</div>
|
|
<div class="dropdown-menu" uib-dropdown-menu>
|
|
<div class="tableMenu">
|
|
<div class="menuHeader">
|
|
Filter by usage
|
|
</div>
|
|
<div class="menuContent">
|
|
<div class="md-checkbox">
|
|
<input id="filter_usage_usedImages" type="checkbox" ng-model="$ctrl.filters.usage.showUsedImages" ng-change="$ctrl.onUsageFilterChange()"/>
|
|
<label for="filter_usage_usedImages">Used images</label>
|
|
</div>
|
|
<div class="md-checkbox">
|
|
<input id="filter_usage_unusedImages" type="checkbox" ng-model="$ctrl.filters.usage.showUnusedImages" ng-change="$ctrl.onUsageFilterChange()"/>
|
|
<label for="filter_usage_unusedImages">Unused images</label>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<a type="button" class="btn btn-default btn-sm" ng-click="$ctrl.filters.usage.open = false;">Close</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</th>
|
|
<th>
|
|
<a ng-click="$ctrl.changeOrderBy('RepoTags')">
|
|
Tags
|
|
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'RepoTags' && !$ctrl.state.reverseOrder"></i>
|
|
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'RepoTags' && $ctrl.state.reverseOrder"></i>
|
|
</a>
|
|
</th>
|
|
<th>
|
|
<a ng-click="$ctrl.changeOrderBy('VirtualSize')">
|
|
Size
|
|
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'VirtualSize' && !$ctrl.state.reverseOrder"></i>
|
|
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'VirtualSize' && $ctrl.state.reverseOrder"></i>
|
|
</a>
|
|
</th>
|
|
<th>
|
|
<a ng-click="$ctrl.changeOrderBy('Created')">
|
|
Created
|
|
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Created' && !$ctrl.state.reverseOrder"></i>
|
|
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'Created' && $ctrl.state.reverseOrder"></i>
|
|
</a>
|
|
</th>
|
|
<th ng-if="$ctrl.showHostColumn">
|
|
<a ng-click="$ctrl.changeOrderBy('NodeName')">
|
|
Host
|
|
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'NodeName' && !$ctrl.state.reverseOrder"></i>
|
|
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'NodeName' && $ctrl.state.reverseOrder"></i>
|
|
</a>
|
|
</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr dir-paginate="item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter: $ctrl.applyFilters | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))" ng-class="{active: item.Checked}">
|
|
<td>
|
|
<span class="md-checkbox">
|
|
<input id="select_{{ $index }}" type="checkbox" ng-model="item.Checked" ng-change="$ctrl.selectItem(item)"/>
|
|
<label for="select_{{ $index }}"></label>
|
|
</span>
|
|
<a ui-sref="docker.images.image({ id: item.Id, nodeName: item.NodeName })" class="monospaced" title="{{ item.Id }}">{{ item.Id | truncate:40 }}</a>
|
|
<span style="margin-left: 10px;" class="label label-warning image-tag" ng-if="::item.ContainerCount === 0">Unused</span>
|
|
</td>
|
|
<td>
|
|
<span class="label label-primary image-tag" ng-repeat="tag in (item | repotags)">{{ tag }}</span>
|
|
</td>
|
|
<td>{{ item.VirtualSize | humansize }}</td>
|
|
<td>{{ item.Created | getisodatefromtimestamp }}</td>
|
|
<td ng-if="$ctrl.showHostColumn">{{ item.NodeName ? item.NodeName : '-' }}</td>
|
|
</tr>
|
|
<tr ng-if="!$ctrl.dataset">
|
|
<td colspan="5" class="text-center text-muted">Loading...</td>
|
|
</tr>
|
|
<tr ng-if="$ctrl.state.filteredDataSet.length === 0">
|
|
<td colspan="5" class="text-center text-muted">No image available.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="footer" ng-if="$ctrl.dataset">
|
|
<div class="infoBar" ng-if="$ctrl.state.selectedItemCount !== 0">
|
|
{{ $ctrl.state.selectedItemCount }} item(s) selected
|
|
</div>
|
|
<div class="paginationControls">
|
|
<form class="form-inline">
|
|
<span class="limitSelector">
|
|
<span style="margin-right: 5px;">
|
|
Items per page
|
|
</span>
|
|
<select class="form-control" ng-model="$ctrl.state.paginatedItemLimit" ng-change="$ctrl.changePaginationLimit()">
|
|
<option value="0">All</option>
|
|
<option value="10">10</option>
|
|
<option value="25">25</option>
|
|
<option value="50">50</option>
|
|
<option value="100">100</option>
|
|
</select>
|
|
</span>
|
|
<dir-pagination-controls max-size="5"></dir-pagination-controls>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</rd-widget-body>
|
|
</rd-widget>
|
|
</div>
|