debian-mirror-gitlab/app/assets/javascripts/packages/details/components/app.vue

293 lines
8.7 KiB
Vue
Raw Normal View History

2020-10-24 23:57:45 +05:30
<script>
import {
GlBadge,
GlButton,
GlModal,
GlModalDirective,
GlTooltipDirective,
GlEmptyState,
GlTab,
GlTabs,
GlSprintf,
} from '@gitlab/ui';
import { mapActions, mapState } from 'vuex';
2021-02-22 17:27:13 +05:30
import { objectToQueryString } from '~/lib/utils/common_utils';
import { numberToHumanSize } from '~/lib/utils/number_utils';
2021-09-04 01:27:46 +05:30
import { s__, __ } from '~/locale';
2021-03-11 19:13:27 +05:30
import Tracking from '~/tracking';
2020-10-24 23:57:45 +05:30
import PackageListRow from '../../shared/components/package_list_row.vue';
2021-03-11 19:13:27 +05:30
import PackagesListLoader from '../../shared/components/packages_list_loader.vue';
2021-02-22 17:27:13 +05:30
import { PackageType, TrackingActions, SHOW_DELETE_SUCCESS_ALERT } from '../../shared/constants';
2021-03-11 19:13:27 +05:30
import { packageTypeToTrackCategory } from '../../shared/utils';
2020-10-24 23:57:45 +05:30
import AdditionalMetadata from './additional_metadata.vue';
2021-03-11 19:13:27 +05:30
import DependencyRow from './dependency_row.vue';
2020-10-24 23:57:45 +05:30
import InstallationCommands from './installation_commands.vue';
2021-02-22 17:27:13 +05:30
import PackageFiles from './package_files.vue';
2021-03-11 19:13:27 +05:30
import PackageHistory from './package_history.vue';
2020-10-24 23:57:45 +05:30
export default {
name: 'PackagesApp',
components: {
GlBadge,
GlButton,
GlEmptyState,
GlModal,
GlTab,
GlTabs,
GlSprintf,
2021-09-04 01:27:46 +05:30
PackageTitle: () => import('./package_title.vue'),
TerraformTitle: () =>
import('~/packages_and_registries/infrastructure_registry/components/details_title.vue'),
2020-10-24 23:57:45 +05:30
PackagesListLoader,
PackageListRow,
DependencyRow,
PackageHistory,
AdditionalMetadata,
InstallationCommands,
2021-02-22 17:27:13 +05:30
PackageFiles,
2020-10-24 23:57:45 +05:30
},
directives: {
GlTooltip: GlTooltipDirective,
GlModal: GlModalDirective,
},
2021-02-22 17:27:13 +05:30
mixins: [Tracking.mixin()],
2021-09-04 01:27:46 +05:30
inject: {
titleComponent: {
default: 'PackageTitle',
from: 'titleComponent',
},
},
2020-10-24 23:57:45 +05:30
trackingActions: { ...TrackingActions },
2021-09-04 01:27:46 +05:30
data() {
return {
fileToDelete: null,
};
},
2020-10-24 23:57:45 +05:30
computed: {
...mapState([
'projectName',
'packageEntity',
'packageFiles',
'isLoading',
'canDelete',
'svgPath',
'npmPath',
'npmHelpPath',
2020-11-24 15:15:51 +05:30
'projectListUrl',
'groupListUrl',
2020-10-24 23:57:45 +05:30
]),
isValidPackage() {
return Boolean(this.packageEntity.name);
},
tracking() {
return {
category: packageTypeToTrackCategory(this.packageEntity.package_type),
};
},
hasVersions() {
return this.packageEntity.versions?.length > 0;
},
packageDependencies() {
return this.packageEntity.dependency_links || [];
},
showDependencies() {
return this.packageEntity.package_type === PackageType.NUGET;
},
showFiles() {
return this.packageEntity?.package_type !== PackageType.COMPOSER;
},
},
methods: {
2021-09-04 01:27:46 +05:30
...mapActions(['deletePackage', 'fetchPackageVersions', 'deletePackageFile']),
2020-10-24 23:57:45 +05:30
formatSize(size) {
return numberToHumanSize(size);
},
getPackageVersions() {
if (!this.packageEntity.versions) {
this.fetchPackageVersions();
}
},
2020-11-24 15:15:51 +05:30
async confirmPackageDeletion() {
this.track(TrackingActions.DELETE_PACKAGE);
await this.deletePackage();
const returnTo =
!this.groupListUrl || document.referrer.includes(this.projectName)
? this.projectListUrl
: this.groupListUrl; // to avoid security issue url are supplied from backend
const modalQuery = objectToQueryString({ [SHOW_DELETE_SUCCESS_ALERT]: true });
window.location.replace(`${returnTo}?${modalQuery}`);
},
2021-09-04 01:27:46 +05:30
handleFileDelete(file) {
this.track(TrackingActions.REQUEST_DELETE_PACKAGE_FILE);
this.fileToDelete = { ...file };
this.$refs.deleteFileModal.show();
},
confirmFileDelete() {
this.track(TrackingActions.DELETE_PACKAGE_FILE);
this.deletePackageFile(this.fileToDelete.id);
this.fileToDelete = null;
},
2020-10-24 23:57:45 +05:30
},
i18n: {
deleteModalTitle: s__(`PackageRegistry|Delete Package Version`),
deleteModalContent: s__(
`PackageRegistry|You are about to delete version %{version} of %{name}. Are you sure?`,
),
2021-09-04 01:27:46 +05:30
deleteFileModalTitle: s__(`PackageRegistry|Delete Package File`),
deleteFileModalContent: s__(
`PackageRegistry|You are about to delete %{filename}. This is a destructive action that may render your package unusable. Are you sure?`,
),
},
modal: {
packageDeletePrimaryAction: {
text: __('Delete'),
attributes: [
{ variant: 'danger' },
{ category: 'primary' },
{ 'data-qa-selector': 'delete_modal_button' },
],
},
fileDeletePrimaryAction: {
text: __('Delete'),
attributes: [{ variant: 'danger' }, { category: 'primary' }],
},
cancelAction: {
text: __('Cancel'),
},
2020-10-24 23:57:45 +05:30
},
};
</script>
<template>
<gl-empty-state
v-if="!isValidPackage"
:title="s__('PackageRegistry|Unable to load package')"
:description="s__('PackageRegistry|There was a problem fetching the details for this package.')"
:svg-path="svgPath"
/>
<div v-else class="packages-app">
2021-09-04 01:27:46 +05:30
<component :is="titleComponent">
2020-11-24 15:15:51 +05:30
<template #delete-button>
2020-10-24 23:57:45 +05:30
<gl-button
2020-11-24 15:15:51 +05:30
v-if="canDelete"
2020-10-24 23:57:45 +05:30
v-gl-modal="'delete-modal'"
class="js-delete-button"
variant="danger"
category="primary"
data-qa-selector="delete_button"
>
{{ __('Delete') }}
</gl-button>
2020-11-24 15:15:51 +05:30
</template>
2021-09-04 01:27:46 +05:30
</component>
2020-10-24 23:57:45 +05:30
<gl-tabs>
<gl-tab :title="__('Detail')">
<div data-qa-selector="package_information_content">
<package-history :package-entity="packageEntity" :project-name="projectName" />
<installation-commands
:package-entity="packageEntity"
:npm-path="npmPath"
:npm-help-path="npmHelpPath"
/>
<additional-metadata :package-entity="packageEntity" />
</div>
2021-02-22 17:27:13 +05:30
<package-files
v-if="showFiles"
:package-files="packageFiles"
2021-09-04 01:27:46 +05:30
:can-delete="canDelete"
2021-02-22 17:27:13 +05:30
@download-file="track($options.trackingActions.PULL_PACKAGE)"
2021-09-04 01:27:46 +05:30
@delete-file="handleFileDelete"
2021-02-22 17:27:13 +05:30
/>
2020-10-24 23:57:45 +05:30
</gl-tab>
<gl-tab v-if="showDependencies" title-item-class="js-dependencies-tab">
<template #title>
<span>{{ __('Dependencies') }}</span>
<gl-badge size="sm" data-testid="dependencies-badge">{{
packageDependencies.length
}}</gl-badge>
</template>
<template v-if="packageDependencies.length > 0">
<dependency-row
v-for="(dep, index) in packageDependencies"
:key="index"
:dependency="dep"
/>
</template>
<p v-else class="gl-mt-3" data-testid="no-dependencies-message">
{{ s__('PackageRegistry|This NuGet package has no dependencies.') }}
</p>
</gl-tab>
<gl-tab
:title="__('Other versions')"
title-item-class="js-versions-tab"
@click="getPackageVersions"
>
<template v-if="isLoading && !hasVersions">
<packages-list-loader />
</template>
<template v-else-if="hasVersions">
<package-list-row
v-for="v in packageEntity.versions"
:key="v.id"
:package-entity="{ name: packageEntity.name, ...v }"
:package-link="v.id.toString()"
:disable-delete="true"
:show-package-type="false"
/>
</template>
<p v-else class="gl-mt-3" data-testid="no-versions-message">
{{ s__('PackageRegistry|There are no other versions of this package.') }}
</p>
</gl-tab>
</gl-tabs>
2021-09-04 01:27:46 +05:30
<gl-modal
ref="deleteModal"
class="js-delete-modal"
modal-id="delete-modal"
:action-primary="$options.modal.packageDeletePrimaryAction"
:action-cancel="$options.modal.cancelAction"
@primary="confirmPackageDeletion"
@canceled="track($options.trackingActions.CANCEL_DELETE_PACKAGE)"
>
2020-10-24 23:57:45 +05:30
<template #modal-title>{{ $options.i18n.deleteModalTitle }}</template>
<gl-sprintf :message="$options.i18n.deleteModalContent">
<template #version>
<strong>{{ packageEntity.version }}</strong>
</template>
<template #name>
<strong>{{ packageEntity.name }}</strong>
</template>
</gl-sprintf>
2021-09-04 01:27:46 +05:30
</gl-modal>
2020-10-24 23:57:45 +05:30
2021-09-04 01:27:46 +05:30
<gl-modal
ref="deleteFileModal"
modal-id="delete-file-modal"
:action-primary="$options.modal.fileDeletePrimaryAction"
:action-cancel="$options.modal.cancelAction"
@primary="confirmFileDelete"
@canceled="track($options.trackingActions.CANCEL_DELETE_PACKAGE_FILE)"
>
<template #modal-title>{{ $options.i18n.deleteFileModalTitle }}</template>
<gl-sprintf v-if="fileToDelete" :message="$options.i18n.deleteFileModalContent">
<template #filename>
<strong>{{ fileToDelete.file_name }}</strong>
</template>
</gl-sprintf>
2020-10-24 23:57:45 +05:30
</gl-modal>
</div>
</template>