diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-07 09:07:59 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-01-07 09:07:59 +0000 |
commit | e440c86979e9c02a09fb6558f59a1fbe29433b51 (patch) | |
tree | 3f29052345686bbf7590ed794eff0ca93c37fb97 /app/assets/javascripts/releases | |
parent | 7d81614e3f13d6ab2dbbf42c7f30d3a6702943e2 (diff) | |
download | gitlab-ce-e440c86979e9c02a09fb6558f59a1fbe29433b51.tar.gz |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/assets/javascripts/releases')
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"> - • - </template> - </template> - </template> - - <div class="append-right-4"> - • - <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"> + • + <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"> + • + </template> + </template> + </div> +</template> |