summaryrefslogtreecommitdiff
path: root/app/assets
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-01-07 09:07:59 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-01-07 09:07:59 +0000
commite440c86979e9c02a09fb6558f59a1fbe29433b51 (patch)
tree3f29052345686bbf7590ed794eff0ca93c37fb97 /app/assets
parent7d81614e3f13d6ab2dbbf42c7f30d3a6702943e2 (diff)
downloadgitlab-ce-e440c86979e9c02a09fb6558f59a1fbe29433b51.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets')
-rw-r--r--app/assets/javascripts/releases/list/components/release_block.vue183
-rw-r--r--app/assets/javascripts/releases/list/components/release_block_assets.vue65
-rw-r--r--app/assets/javascripts/releases/list/components/release_block_author.vue42
-rw-r--r--app/assets/javascripts/releases/list/components/release_block_header.vue47
-rw-r--r--app/assets/javascripts/releases/list/components/release_block_metadata.vue84
-rw-r--r--app/assets/javascripts/releases/list/components/release_block_milestones.vue51
6 files changed, 308 insertions, 164 deletions
diff --git a/app/assets/javascripts/releases/list/components/release_block.vue b/app/assets/javascripts/releases/list/components/release_block.vue
index d5621808ed7..d924b5795f0 100644
--- a/app/assets/javascripts/releases/list/components/release_block.vue
+++ b/app/assets/javascripts/releases/list/components/release_block.vue
@@ -1,34 +1,27 @@
<script>
-/* eslint-disable @gitlab/vue-i18n/no-bare-strings */
import _ from 'underscore';
-import { GlTooltipDirective, GlLink, GlBadge } from '@gitlab/ui';
-import Icon from '~/vue_shared/components/icon.vue';
-import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
-import timeagoMixin from '~/vue_shared/mixins/timeago';
-import { __, n__, sprintf } from '~/locale';
import { slugify } from '~/lib/utils/text_utility';
import { getLocationHash } from '~/lib/utils/url_utility';
import { scrollToElement } from '~/lib/utils/common_utils';
import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
-import ReleaseBlockFooter from './release_block_footer.vue';
import EvidenceBlock from './evidence_block.vue';
+import ReleaseBlockAssets from './release_block_assets.vue';
+import ReleaseBlockFooter from './release_block_footer.vue';
+import ReleaseBlockHeader from './release_block_header.vue';
+import ReleaseBlockMetadata from './release_block_metadata.vue';
import ReleaseBlockMilestoneInfo from './release_block_milestone_info.vue';
export default {
name: 'ReleaseBlock',
components: {
EvidenceBlock,
- GlLink,
- GlBadge,
- Icon,
- UserAvatarLink,
+ ReleaseBlockAssets,
ReleaseBlockFooter,
+ ReleaseBlockHeader,
+ ReleaseBlockMetadata,
ReleaseBlockMilestoneInfo,
},
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- mixins: [timeagoMixin, glFeatureFlagsMixin()],
+ mixins: [glFeatureFlagsMixin()],
props: {
release: {
type: Object,
@@ -45,45 +38,14 @@ export default {
id() {
return slugify(this.release.tag_name);
},
- releasedTimeAgo() {
- return sprintf(__('released %{time}'), {
- time: this.timeFormatted(this.release.released_at),
- });
- },
- userImageAltDescription() {
- return this.author && this.author.username
- ? sprintf(__("%{username}'s avatar"), { username: this.author.username })
- : null;
- },
- commit() {
- return this.release.commit || {};
- },
- commitUrl() {
- return this.release.commit_path;
- },
- tagUrl() {
- return this.release.tag_path;
- },
assets() {
return this.release.assets || {};
},
- author() {
- return this.release.author || {};
- },
- hasAuthor() {
- return !_.isEmpty(this.author);
- },
hasEvidence() {
return Boolean(this.release.evidence_sha);
},
- shouldRenderMilestones() {
- return !_.isEmpty(this.release.milestones);
- },
- labelText() {
- return n__('Milestone', 'Milestones', this.release.milestones.length);
- },
- shouldShowEditButton() {
- return Boolean(this.release._links && this.release._links.edit_url);
+ milestones() {
+ return this.release.milestones || [];
},
shouldShowEvidence() {
return this.glFeatures.releaseEvidenceCollection;
@@ -91,6 +53,11 @@ export default {
shouldShowFooter() {
return this.glFeatures.releaseIssueSummary;
},
+ shouldRenderAssets() {
+ return Boolean(
+ this.assets.links.length || (this.assets.sources && this.assets.sources.length),
+ );
+ },
shouldRenderReleaseMetaData() {
return !this.glFeatures.releaseIssueSummary;
},
@@ -113,127 +80,15 @@ export default {
</script>
<template>
<div :id="id" :class="{ 'bg-line-target-blue': isHighlighted }" class="card release-block">
- <div class="card-header d-flex align-items-center bg-white pr-0">
- <h2 class="card-title my-2 mr-auto gl-font-size-20">
- {{ release.name }}
- <gl-badge v-if="release.upcoming_release" variant="warning" class="align-middle">{{
- __('Upcoming Release')
- }}</gl-badge>
- </h2>
- <gl-link
- v-if="shouldShowEditButton"
- v-gl-tooltip
- class="btn btn-default append-right-10 js-edit-button ml-2"
- :title="__('Edit this release')"
- :href="release._links.edit_url"
- >
- <icon name="pencil" />
- </gl-link>
- </div>
+ <release-block-header :release="release" />
<div class="card-body">
<div v-if="shouldRenderMilestoneInfo">
- <release-block-milestone-info :milestones="release.milestones" />
+ <release-block-milestone-info :milestones="milestones" />
<hr class="mb-3 mt-0" />
</div>
- <div v-if="shouldRenderReleaseMetaData" class="card-subtitle d-flex flex-wrap text-secondary">
- <div class="append-right-8">
- <icon name="commit" class="align-middle" />
- <gl-link v-if="commitUrl" v-gl-tooltip.bottom :title="commit.title" :href="commitUrl">
- {{ commit.short_id }}
- </gl-link>
- <span v-else v-gl-tooltip.bottom :title="commit.title">{{ commit.short_id }}</span>
- </div>
-
- <div class="append-right-8">
- <icon name="tag" class="align-middle" />
- <gl-link v-if="tagUrl" v-gl-tooltip.bottom :title="__('Tag')" :href="tagUrl">
- {{ release.tag_name }}
- </gl-link>
- <span v-else v-gl-tooltip.bottom :title="__('Tag')">{{ release.tag_name }}</span>
- </div>
-
- <template v-if="shouldRenderMilestones">
- <div class="js-milestone-list-label">
- <icon name="flag" class="align-middle" />
- <span class="js-label-text">{{ labelText }}</span>
- </div>
-
- <template v-for="(milestone, index) in release.milestones">
- <gl-link
- :key="milestone.id"
- v-gl-tooltip
- :title="milestone.description"
- :href="milestone.web_url"
- class="append-right-4 prepend-left-4 js-milestone-link"
- >
- {{ milestone.title }}
- </gl-link>
- <template v-if="index !== release.milestones.length - 1">
- &bull;
- </template>
- </template>
- </template>
-
- <div class="append-right-4">
- &bull;
- <span v-gl-tooltip.bottom :title="tooltipTitle(release.released_at)">
- {{ releasedTimeAgo }}
- </span>
- </div>
-
- <div v-if="hasAuthor" class="d-flex">
- by
- <user-avatar-link
- class="prepend-left-4"
- :link-href="author.web_url"
- :img-src="author.avatar_url"
- :img-alt="userImageAltDescription"
- :tooltip-text="author.username"
- />
- </div>
- </div>
-
- <div
- v-if="assets.links.length || (assets.sources && assets.sources.length)"
- class="card-text prepend-top-default"
- >
- <b>
- {{ __('Assets') }}
- <span class="js-assets-count badge badge-pill">{{ assets.count }}</span>
- </b>
-
- <ul v-if="assets.links.length" class="pl-0 mb-0 prepend-top-8 list-unstyled js-assets-list">
- <li v-for="link in assets.links" :key="link.name" class="append-bottom-8">
- <gl-link v-gl-tooltip.bottom :title="__('Download asset')" :href="link.url">
- <icon name="package" class="align-middle append-right-4 align-text-bottom" />
- {{ link.name }}
- <span v-if="link.external">{{ __('(external source)') }}</span>
- </gl-link>
- </li>
- </ul>
-
- <div v-if="assets.sources && assets.sources.length" class="dropdown">
- <button
- type="button"
- class="btn btn-link"
- data-toggle="dropdown"
- aria-haspopup="true"
- aria-expanded="false"
- >
- <icon name="doc-code" class="align-top append-right-4" />
- {{ __('Source code') }}
- <icon name="arrow-down" />
- </button>
-
- <div class="js-sources-dropdown dropdown-menu">
- <li v-for="asset in assets.sources" :key="asset.url">
- <gl-link :href="asset.url">{{ __('Download') }} {{ asset.format }}</gl-link>
- </li>
- </div>
- </div>
- </div>
-
+ <release-block-metadata v-if="shouldRenderReleaseMetaData" :release="release" />
+ <release-block-assets v-if="shouldRenderAssets" :assets="assets" />
<evidence-block v-if="hasEvidence && shouldShowEvidence" :release="release" />
<div class="card-text prepend-top-default">
diff --git a/app/assets/javascripts/releases/list/components/release_block_assets.vue b/app/assets/javascripts/releases/list/components/release_block_assets.vue
new file mode 100644
index 00000000000..e840bc90d68
--- /dev/null
+++ b/app/assets/javascripts/releases/list/components/release_block_assets.vue
@@ -0,0 +1,65 @@
+<script>
+import { GlTooltipDirective, GlLink } from '@gitlab/ui';
+import Icon from '~/vue_shared/components/icon.vue';
+
+export default {
+ name: 'ReleaseBlockAssets',
+ components: {
+ GlLink,
+ Icon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ assets: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ hasAssets() {
+ return Boolean(this.assets.count);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="card-text prepend-top-default">
+ <b>
+ {{ __('Assets') }}
+ <span class="js-assets-count badge badge-pill">{{ assets.count }}</span>
+ </b>
+
+ <ul v-if="assets.links.length" class="pl-0 mb-0 prepend-top-8 list-unstyled js-assets-list">
+ <li v-for="link in assets.links" :key="link.name" class="append-bottom-8">
+ <gl-link v-gl-tooltip.bottom :title="__('Download asset')" :href="link.url">
+ <icon name="package" class="align-middle append-right-4 align-text-bottom" />
+ {{ link.name }}
+ <span v-if="link.external">{{ __('(external source)') }}</span>
+ </gl-link>
+ </li>
+ </ul>
+
+ <div v-if="hasAssets" class="dropdown">
+ <button
+ type="button"
+ class="btn btn-link"
+ data-toggle="dropdown"
+ aria-haspopup="true"
+ aria-expanded="false"
+ >
+ <icon name="doc-code" class="align-top append-right-4" />
+ {{ __('Source code') }}
+ <icon name="arrow-down" />
+ </button>
+
+ <div class="js-sources-dropdown dropdown-menu">
+ <li v-for="asset in assets.sources" :key="asset.url">
+ <gl-link :href="asset.url">{{ __('Download') }} {{ asset.format }}</gl-link>
+ </li>
+ </div>
+ </div>
+ </div>
+</template>
diff --git a/app/assets/javascripts/releases/list/components/release_block_author.vue b/app/assets/javascripts/releases/list/components/release_block_author.vue
new file mode 100644
index 00000000000..ff6b00d8221
--- /dev/null
+++ b/app/assets/javascripts/releases/list/components/release_block_author.vue
@@ -0,0 +1,42 @@
+<script>
+import { __, sprintf } from '~/locale';
+import { GlSprintf } from '@gitlab/ui';
+import UserAvatarLink from '~/vue_shared/components/user_avatar/user_avatar_link.vue';
+
+export default {
+ name: 'ReleaseBlockAuthor',
+ components: {
+ GlSprintf,
+ UserAvatarLink,
+ },
+ props: {
+ author: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ userImageAltDescription() {
+ return this.author && this.author.username
+ ? sprintf(__("%{username}'s avatar"), { username: this.author.username })
+ : null;
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="d-flex">
+ <gl-sprintf message="by %{user}">
+ <template #user>
+ <user-avatar-link
+ class="prepend-left-4"
+ :link-href="author.web_url"
+ :img-src="author.avatar_url"
+ :img-alt="userImageAltDescription"
+ :tooltip-text="author.username"
+ />
+ </template>
+ </gl-sprintf>
+ </div>
+</template>
diff --git a/app/assets/javascripts/releases/list/components/release_block_header.vue b/app/assets/javascripts/releases/list/components/release_block_header.vue
new file mode 100644
index 00000000000..9c5dcf2a709
--- /dev/null
+++ b/app/assets/javascripts/releases/list/components/release_block_header.vue
@@ -0,0 +1,47 @@
+<script>
+import { GlTooltipDirective, GlLink, GlBadge } from '@gitlab/ui';
+import Icon from '~/vue_shared/components/icon.vue';
+
+export default {
+ name: 'ReleaseBlockHeader',
+ components: {
+ GlLink,
+ GlBadge,
+ Icon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ release: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ shouldShowEditButton() {
+ return Boolean(this.release._links && this.release._links.edit_url);
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="card-header d-flex align-items-center bg-white pr-0">
+ <h2 class="card-title my-2 mr-auto gl-font-size-20">
+ {{ release.name }}
+ <gl-badge v-if="release.upcoming_release" variant="warning" class="align-middle">{{
+ __('Upcoming Release')
+ }}</gl-badge>
+ </h2>
+ <gl-link
+ v-if="shouldShowEditButton"
+ v-gl-tooltip
+ class="btn btn-default append-right-10 js-edit-button ml-2"
+ :title="__('Edit this release')"
+ :href="release._links.edit_url"
+ >
+ <icon name="pencil" />
+ </gl-link>
+ </div>
+</template>
diff --git a/app/assets/javascripts/releases/list/components/release_block_metadata.vue b/app/assets/javascripts/releases/list/components/release_block_metadata.vue
new file mode 100644
index 00000000000..f0aad594062
--- /dev/null
+++ b/app/assets/javascripts/releases/list/components/release_block_metadata.vue
@@ -0,0 +1,84 @@
+<script>
+import { GlTooltipDirective, GlLink } from '@gitlab/ui';
+import { __, sprintf } from '~/locale';
+import Icon from '~/vue_shared/components/icon.vue';
+import timeagoMixin from '~/vue_shared/mixins/timeago';
+import ReleaseBlockAuthor from './release_block_author.vue';
+import ReleaseBlockMilestones from './release_block_milestones.vue';
+
+export default {
+ name: 'ReleaseBlockMetadata',
+ components: {
+ Icon,
+ GlLink,
+ ReleaseBlockAuthor,
+ ReleaseBlockMilestones,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ mixins: [timeagoMixin],
+ props: {
+ release: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ author() {
+ return this.release.author;
+ },
+ commit() {
+ return this.release.commit || {};
+ },
+ commitUrl() {
+ return this.release.commit_path;
+ },
+ hasAuthor() {
+ return Boolean(this.author);
+ },
+ releasedTimeAgo() {
+ return sprintf(__('released %{time}'), {
+ time: this.timeFormatted(this.release.released_at),
+ });
+ },
+ shouldRenderMilestones() {
+ return Boolean(this.release.milestones?.length);
+ },
+ tagUrl() {
+ return this.release.tag_path;
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="card-subtitle d-flex flex-wrap text-secondary">
+ <div class="append-right-8">
+ <icon name="commit" class="align-middle" />
+ <gl-link v-if="commitUrl" v-gl-tooltip.bottom :title="commit.title" :href="commitUrl">
+ {{ commit.short_id }}
+ </gl-link>
+ <span v-else v-gl-tooltip.bottom :title="commit.title">{{ commit.short_id }}</span>
+ </div>
+
+ <div class="append-right-8">
+ <icon name="tag" class="align-middle" />
+ <gl-link v-if="tagUrl" v-gl-tooltip.bottom :title="__('Tag')" :href="tagUrl">
+ {{ release.tag_name }}
+ </gl-link>
+ <span v-else v-gl-tooltip.bottom :title="__('Tag')">{{ release.tag_name }}</span>
+ </div>
+
+ <release-block-milestones v-if="shouldRenderMilestones" :milestones="release.milestones" />
+
+ <div class="append-right-4">
+ &bull;
+ <span v-gl-tooltip.bottom :title="tooltipTitle(release.released_at)">
+ {{ releasedTimeAgo }}
+ </span>
+ </div>
+
+ <release-block-author v-if="hasAuthor" :author="author" />
+ </div>
+</template>
diff --git a/app/assets/javascripts/releases/list/components/release_block_milestones.vue b/app/assets/javascripts/releases/list/components/release_block_milestones.vue
new file mode 100644
index 00000000000..a3dff75b828
--- /dev/null
+++ b/app/assets/javascripts/releases/list/components/release_block_milestones.vue
@@ -0,0 +1,51 @@
+<script>
+import { GlTooltipDirective, GlLink } from '@gitlab/ui';
+import { n__ } from '~/locale';
+import Icon from '~/vue_shared/components/icon.vue';
+
+export default {
+ name: 'ReleaseBlockMilestones',
+ components: {
+ GlLink,
+ Icon,
+ },
+ directives: {
+ GlTooltip: GlTooltipDirective,
+ },
+ props: {
+ milestones: {
+ type: Array,
+ required: true,
+ },
+ },
+ computed: {
+ labelText() {
+ return n__('Milestone', 'Milestones', this.milestones.length);
+ },
+ },
+};
+</script>
+
+<template>
+ <div>
+ <div class="js-milestone-list-label">
+ <icon name="flag" class="align-middle" />
+ <span class="js-label-text">{{ labelText }}</span>
+ </div>
+
+ <template v-for="(milestone, index) in milestones">
+ <gl-link
+ :key="milestone.id"
+ v-gl-tooltip
+ :title="milestone.description"
+ :href="milestone.web_url"
+ class="mx-1 js-milestone-link"
+ >
+ {{ milestone.title }}
+ </gl-link>
+ <template v-if="index !== milestones.length - 1">
+ &bull;
+ </template>
+ </template>
+ </div>
+</template>