mirror of
https://github.com/portainer/portainer.git
synced 2025-08-05 22:05:23 +02:00
feat(docker/images): show used tag correctly [EE-5396] (#10305)
This commit is contained in:
parent
b895e88075
commit
9bf2957ea7
29 changed files with 383 additions and 287 deletions
|
@ -14,12 +14,17 @@ function ImageHelperFactory() {
|
|||
return tag.match(/^(?![\.\-])([a-zA-Z0-9\_\.\-])+$/g);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {import('@/react/docker/images/queries/useImages').ImagesListResponse[]} images
|
||||
* @returns {{names: string[]}}}
|
||||
*/
|
||||
function getImagesNamesForDownload(images) {
|
||||
var names = images.map(function (image) {
|
||||
return image.RepoTags[0] !== '<none>:<none>' ? image.RepoTags[0] : image.Id;
|
||||
return image.tags[0] !== '<none>:<none>' ? image.tags[0] : image.id;
|
||||
});
|
||||
return {
|
||||
names: names,
|
||||
names,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -74,13 +74,10 @@ const ngModule = angular
|
|||
.component(
|
||||
'dockerImagesDatatable',
|
||||
r2a(withUIRouter(withCurrentUser(ImagesDatatable)), [
|
||||
'dataset',
|
||||
'environment',
|
||||
'onRemove',
|
||||
'isExportInProgress',
|
||||
'isHostColumnVisible',
|
||||
'onDownload',
|
||||
'onRefresh',
|
||||
'onRemove',
|
||||
])
|
||||
)
|
||||
|
|
|
@ -46,15 +46,9 @@
|
|||
</div>
|
||||
|
||||
<docker-images-datatable
|
||||
ng-if="images"
|
||||
dataset="images"
|
||||
is-host-column-visible="applicationState.endpoint.mode.agentProxy && applicationState.endpoint.mode.provider === 'DOCKER_SWARM_MODE'"
|
||||
on-download="(downloadAction)"
|
||||
on-remove="(confirmRemovalAction)"
|
||||
on-refresh="(getImages)"
|
||||
is-export-in-progress="state.exportInProgress"
|
||||
storage-key="images"
|
||||
environment="endpoint"
|
||||
settings-store="settingsStore"
|
||||
containers="containers"
|
||||
></docker-images-datatable>
|
||||
|
|
|
@ -71,6 +71,11 @@ angular.module('portainer.docker').controller('ImagesController', [
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {Array<import('@/react/docker/images/queries/useImages').ImagesListResponse>} selectedItems
|
||||
* @param {boolean} force
|
||||
*/
|
||||
$scope.confirmRemovalAction = async function (selectedItems, force) {
|
||||
const confirmed = await (force ? confirmImageForceRemoval() : confirmRegularRemove());
|
||||
|
||||
|
@ -81,11 +86,15 @@ angular.module('portainer.docker').controller('ImagesController', [
|
|||
$scope.removeAction(selectedItems, force);
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {Array<import('@/react/docker/images/queries/useImages').ImagesListResponse>} selectedItems
|
||||
*/
|
||||
function isAuthorizedToDownload(selectedItems) {
|
||||
for (var i = 0; i < selectedItems.length; i++) {
|
||||
var image = selectedItems[i];
|
||||
|
||||
var untagged = _.find(image.RepoTags, function (item) {
|
||||
var untagged = _.find(image.tags, function (item) {
|
||||
return item.indexOf('<none>') > -1;
|
||||
});
|
||||
|
||||
|
@ -103,8 +112,12 @@ angular.module('portainer.docker').controller('ImagesController', [
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {Array<import('@/react/docker/images/queries/useImages').ImagesListResponse>} images
|
||||
*/
|
||||
function exportImages(images) {
|
||||
HttpRequestHelper.setPortainerAgentTargetHeader(images[0].NodeName);
|
||||
HttpRequestHelper.setPortainerAgentTargetHeader(images[0].nodeName);
|
||||
$scope.state.exportInProgress = true;
|
||||
ImageService.downloadImages(images)
|
||||
.then(function success(data) {
|
||||
|
@ -120,6 +133,10 @@ angular.module('portainer.docker').controller('ImagesController', [
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {Array<import('@/react/docker/images/queries/useImages').ImagesListResponse>} selectedItems
|
||||
*/
|
||||
$scope.downloadAction = function (selectedItems) {
|
||||
if (!isAuthorizedToDownload(selectedItems)) {
|
||||
return;
|
||||
|
@ -133,15 +150,20 @@ angular.module('portainer.docker').controller('ImagesController', [
|
|||
});
|
||||
};
|
||||
|
||||
$scope.removeAction = function (selectedItems, force) {
|
||||
$scope.removeAction = removeAction;
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {Array<import('@/react/docker/images/queries/useImages').ImagesListResponse>} selectedItems
|
||||
* @param {boolean} force
|
||||
*/
|
||||
function removeAction(selectedItems, force) {
|
||||
var actionCount = selectedItems.length;
|
||||
angular.forEach(selectedItems, function (image) {
|
||||
HttpRequestHelper.setPortainerAgentTargetHeader(image.NodeName);
|
||||
ImageService.deleteImage(image.Id, force)
|
||||
HttpRequestHelper.setPortainerAgentTargetHeader(image.nodeName);
|
||||
ImageService.deleteImage(image.id, force)
|
||||
.then(function success() {
|
||||
Notifications.success('Image successfully removed', image.Id);
|
||||
var index = $scope.images.indexOf(image);
|
||||
$scope.images.splice(index, 1);
|
||||
Notifications.success('Image successfully removed', image.id);
|
||||
})
|
||||
.catch(function error(err) {
|
||||
Notifications.error('Failure', err, 'Unable to remove image');
|
||||
|
@ -153,29 +175,11 @@ angular.module('portainer.docker').controller('ImagesController', [
|
|||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
$scope.getImages = getImages;
|
||||
function getImages() {
|
||||
ImageService.images(true)
|
||||
.then(function success(data) {
|
||||
$scope.images = data;
|
||||
})
|
||||
.catch(function error(err) {
|
||||
Notifications.error('Failure', err, 'Unable to retrieve images');
|
||||
$scope.images = [];
|
||||
});
|
||||
}
|
||||
|
||||
$scope.setPullImageValidity = setPullImageValidity;
|
||||
function setPullImageValidity(validity) {
|
||||
$scope.state.pullRateValid = validity;
|
||||
}
|
||||
|
||||
function initView() {
|
||||
getImages();
|
||||
}
|
||||
|
||||
initView();
|
||||
},
|
||||
]);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue