Compare commits

...

1 Commits

Author SHA1 Message Date
sunportainer
b56531e67d feat/ee-1977/rollup-duplicated-volumes 2021-12-07 23:29:48 +08:00
3 changed files with 64 additions and 7 deletions

View File

@@ -13,6 +13,10 @@
</div>
<div class="menuContent">
<div>
<div class="md-checkbox">
<input id="setting_anonymous_volumes" type="checkbox" ng-model="$ctrl.settings.showAnonymousVolumes" ng-change="$ctrl.onSettingsAnonymousVolumesChange()" />
<label for="setting_anonymous_volumes">Show anonymous volumes</label>
</div>
<div class="md-checkbox">
<input id="setting_auto_refresh" type="checkbox" ng-model="$ctrl.settings.repeater.autoRefresh" ng-change="$ctrl.onSettingsRepeaterChange()" />
<label for="setting_auto_refresh">Auto refresh</label>
@@ -136,10 +140,10 @@
</a>
</th>
<th ng-if="$ctrl.showHostColumn">
<a ng-click="$ctrl.changeOrderBy('NodeName')">
<a ng-click="$ctrl.changeOrderBy('DisplayName')">
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>
<i class="fa fa-sort-alpha-down" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'DisplayName' && !$ctrl.state.reverseOrder"></i>
<i class="fa fa-sort-alpha-up" aria-hidden="true" ng-if="$ctrl.state.orderBy === 'DisplayName' && $ctrl.state.reverseOrder"></i>
</a>
</th>
<th>
@@ -153,7 +157,7 @@
</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))"
dir-paginate="item in ($ctrl.state.filteredDataSet = ($ctrl.dataset | filter:$ctrl.applyFilters | filter:$ctrl.anonymousVolumesFilters | filter:$ctrl.state.textFilter | orderBy:$ctrl.state.orderBy:$ctrl.state.reverseOrder | itemsPerPage: $ctrl.state.paginatedItemLimit))"
ng-class="{ active: item.Checked }"
>
<td>
@@ -176,7 +180,7 @@
<td>{{ item.Driver }}</td>
<td>{{ item.Mountpoint | truncatelr }}</td>
<td>{{ item.CreatedAt | getisodate }}</td>
<td ng-if="$ctrl.showHostColumn">{{ item.NodeName ? item.NodeName : '-' }}</td>
<td ng-if="$ctrl.showHostColumn">{{ item.DisplayName ? item.DisplayName : '-' }}</td>
<td>
<span>
<i ng-class="item.ResourceControl.Ownership | ownershipicon" aria-hidden="true"></i>

View File

@@ -25,6 +25,16 @@ angular.module('portainer.docker').controller('VolumesDatatableController', [
return false;
};
this.applyFilters = anonymousVolumesFilters.bind(this);
function anonymousVolumesFilters(value) {
var volume = value;
var isAnonymous = volume.Id.match('[A-z0-9]{32}') != null;
if (isAnonymous && !this.settings.showAnonymousVolumes) {
return false;
}
return true;
}
this.onstateFilterChange = function () {
var filters = this.filters.state;
var filtered = false;
@@ -35,6 +45,10 @@ angular.module('portainer.docker').controller('VolumesDatatableController', [
DatatableService.setDataTableFilters(this.tableKey, this.filters);
};
this.onSettingsAnonymousVolumesChange = function () {
DatatableService.setDataTableSettings(this.tableKey, this.settings);
};
this.$onInit = function () {
this.setDefaults();
this.prepareTableFromDataset();
@@ -64,6 +78,13 @@ angular.module('portainer.docker').controller('VolumesDatatableController', [
if (storedSettings !== null) {
this.settings = storedSettings;
this.settings.open = false;
if (typeof this.settings.showAnonymousVolumes == 'undefined') {
// Anonymous volumes will be shown by default.
this.settings.showAnonymousVolumes = true;
}
} else {
// Anonymous volumes will be shown by default.
this.settings.showAnonymousVolumes = true;
}
this.onSettingsRepeaterChange();
};

View File

@@ -53,13 +53,45 @@ angular.module('portainer.docker').controller('VolumesController', [
.then(function success(data) {
var services = data.services;
$scope.offlineMode = EndpointProvider.offlineMode();
$scope.volumes = data.attached
// Aggregate volume
var attachedVolumes = new Array();
var merged = false;
for (let volume of data.attached) {
volume.DisplayName = volume.NodeName;
merged = false;
for (let attvlm of attachedVolumes) {
if (attvlm.Id === volume.Id && attvlm.ResourceId === volume.ResourceId) {
attvlm.DisplayName = attvlm.DisplayName + ', ' + volume.DisplayName;
merged = true;
break;
}
}
if (!merged) {
attachedVolumes.push(volume);
}
}
var danglingVolumes = new Array();
for (let volume of data.dangling) {
volume.DisplayName = volume.NodeName;
merged = false;
for (let attvlm of danglingVolumes) {
if (attvlm.Id === volume.Id && attvlm.ResourceId === volume.ResourceId) {
attvlm.DisplayName = attvlm.DisplayName + ', ' + volume.DisplayName;
merged = true;
break;
}
}
if (!merged) {
danglingVolumes.push(volume);
}
}
$scope.volumes = attachedVolumes
.map(function (volume) {
volume.dangling = false;
return volume;
})
.concat(
data.dangling.map(function (volume) {
danglingVolumes.map(function (volume) {
volume.dangling = true;
if (VolumeHelper.isVolumeUsedByAService(volume, services)) {
volume.dangling = false;