diff options
Diffstat (limited to 'app/assets/javascripts')
13 files changed, 128 insertions, 49 deletions
diff --git a/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue b/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue index 2cbc7c7077b..42d14b65b3a 100644 --- a/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue +++ b/app/assets/javascripts/frequent_items/components/frequent_items_list_item.vue @@ -82,8 +82,14 @@ export default { <li class="frequent-items-list-item-container"> <a :href="webUrl" class="clearfix"> <div class="frequent-items-item-avatar-container"> - <img v-if="hasAvatar" :src="avatarUrl" class="avatar s32" /> - <identicon v-else :entity-id="itemId" :entity-name="itemName" size-class="s32" /> + <img v-if="hasAvatar" :src="avatarUrl" class="avatar rect-avatar s32" /> + <identicon + v-else + :entity-id="itemId" + :entity-name="itemName" + size-class="s32" + class="rect-avatar" + /> </div> <div class="frequent-items-item-metadata-container"> <div :title="itemName" class="frequent-items-item-title" v-html="highlightedItemName"></div> diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js index 570d3b712e0..c81e754df4c 100644 --- a/app/assets/javascripts/gfm_auto_complete.js +++ b/app/assets/javascripts/gfm_auto_complete.js @@ -195,11 +195,15 @@ class GfmAutoComplete { title += ` (${m.count})`; } + const GROUP_TYPE = 'Group'; + const autoCompleteAvatar = m.avatar_url || m.username.charAt(0).toUpperCase(); + + const rectAvatarClass = m.type === GROUP_TYPE ? 'rect-avatar' : ''; const imgAvatar = `<img src="${m.avatar_url}" alt="${ m.username - }" class="avatar avatar-inline center s26"/>`; - const txtAvatar = `<div class="avatar center avatar-inline s26">${autoCompleteAvatar}</div>`; + }" class="avatar ${rectAvatarClass} avatar-inline center s26"/>`; + const txtAvatar = `<div class="avatar ${rectAvatarClass} center avatar-inline s26">${autoCompleteAvatar}</div>`; return { username: m.username, diff --git a/app/assets/javascripts/groups/components/group_item.vue b/app/assets/javascripts/groups/components/group_item.vue index 688bd37cc56..d5130cd331d 100644 --- a/app/assets/javascripts/groups/components/group_item.vue +++ b/app/assets/javascripts/groups/components/group_item.vue @@ -88,7 +88,7 @@ export default { </div> <div :class="{ 'content-loading': group.isChildrenLoading }" - class="avatar-container s24 d-none d-sm-flex" + class="avatar-container rect-avatar s24 d-none d-sm-flex" > <a :href="group.relativePath" class="no-expand"> <img v-if="hasAvatar" :src="group.avatarUrl" class="avatar s24" /> diff --git a/app/assets/javascripts/issuable_suggestions/index.js b/app/assets/javascripts/issuable_suggestions/index.js index 2c80cf1797a..40916c9d27f 100644 --- a/app/assets/javascripts/issuable_suggestions/index.js +++ b/app/assets/javascripts/issuable_suggestions/index.js @@ -1,6 +1,6 @@ import Vue from 'vue'; import VueApollo from 'vue-apollo'; -import defaultClient from '~/lib/graphql'; +import createDefaultClient from '~/lib/graphql'; import App from './components/app.vue'; Vue.use(VueApollo); @@ -10,7 +10,7 @@ export default function() { const issueTitle = document.getElementById('issue_title'); const { projectPath } = el.dataset; const apolloProvider = new VueApollo({ - defaultClient, + defaultClient: createDefaultClient(), }); return new Vue({ diff --git a/app/assets/javascripts/lib/graphql.js b/app/assets/javascripts/lib/graphql.js index 20a0f142d9e..64e4e899f44 100644 --- a/app/assets/javascripts/lib/graphql.js +++ b/app/assets/javascripts/lib/graphql.js @@ -1,9 +1,11 @@ import ApolloClient from 'apollo-boost'; import csrf from '~/lib/utils/csrf'; -export default new ApolloClient({ - uri: `${gon.relative_url_root}/api/graphql`, - headers: { - [csrf.headerKey]: csrf.token, - }, -}); +export default (clientState = {}) => + new ApolloClient({ + uri: `${gon.relative_url_root}/api/graphql`, + headers: { + [csrf.headerKey]: csrf.token, + }, + clientState, + }); diff --git a/app/assets/javascripts/lib/utils/common_utils.js b/app/assets/javascripts/lib/utils/common_utils.js index 29fe460017e..a73cdb73690 100644 --- a/app/assets/javascripts/lib/utils/common_utils.js +++ b/app/assets/javascripts/lib/utils/common_utils.js @@ -456,21 +456,6 @@ export const historyPushState = newUrl => { export const parseBoolean = value => (value && value.toString()) === 'true'; /** - * Converts permission provided as strings to booleans. - * - * @param {String} string - * @returns {Boolean} - */ -export const convertPermissionToBoolean = permission => { - if (process.env.NODE_ENV !== 'production') { - // eslint-disable-next-line no-console - console.warn('convertPermissionToBoolean is deprecated! Please use parseBoolean instead.'); - } - - return parseBoolean(permission); -}; - -/** * @callback backOffCallback * @param {Function} next * @param {Function} stop diff --git a/app/assets/javascripts/lib/utils/poll.js b/app/assets/javascripts/lib/utils/poll.js index 198711cf427..a900ff34bf5 100644 --- a/app/assets/javascripts/lib/utils/poll.js +++ b/app/assets/javascripts/lib/utils/poll.js @@ -63,6 +63,10 @@ export default class Poll { const headers = normalizeHeaders(response.headers); const pollInterval = parseInt(headers[this.intervalHeader], 10); if (pollInterval > 0 && successCodes.indexOf(response.status) !== -1 && this.canPoll) { + if (this.timeoutID) { + clearTimeout(this.timeoutID); + } + this.timeoutID = setTimeout(() => { this.makeRequest(); }, pollInterval); @@ -101,15 +105,25 @@ export default class Poll { } /** - * Restarts polling after it has been stoped + * Enables polling after it has been stopped */ - restart(options) { - // update data + enable(options) { if (options && options.data) { this.options.data = options.data; } this.canPoll = true; + + if (options && options.response) { + this.checkConditions(options.response); + } + } + + /** + * Restarts polling after it has been stopped and makes a request + */ + restart(options) { + this.enable(options); this.makeRequest(); } } diff --git a/app/assets/javascripts/notes/components/discussion_resolve_with_issue_button.vue b/app/assets/javascripts/notes/components/discussion_resolve_with_issue_button.vue new file mode 100644 index 00000000000..e413398696a --- /dev/null +++ b/app/assets/javascripts/notes/components/discussion_resolve_with_issue_button.vue @@ -0,0 +1,34 @@ +<script> +import Icon from '~/vue_shared/components/icon.vue'; +import { GlTooltipDirective, GlButton } from '@gitlab/ui'; + +export default { + name: 'ResolveWithIssueButton', + components: { + Icon, + GlButton, + }, + directives: { + GlTooltip: GlTooltipDirective, + }, + props: { + url: { + type: String, + required: true, + }, + }, +}; +</script> + +<template> + <div class="btn-group" role="group"> + <gl-button + v-gl-tooltip + :href="url" + :title="s__('MergeRequests|Resolve this discussion in a new issue')" + class="new-issue-for-discussion discussion-create-issue-btn" + > + <icon name="issue-new" /> + </gl-button> + </div> +</template> diff --git a/app/assets/javascripts/notes/components/noteable_discussion.vue b/app/assets/javascripts/notes/components/noteable_discussion.vue index 2d6fd8b116f..3894dc8c677 100644 --- a/app/assets/javascripts/notes/components/noteable_discussion.vue +++ b/app/assets/javascripts/notes/components/noteable_discussion.vue @@ -25,6 +25,7 @@ import noteable from '../mixins/noteable'; import resolvable from '../mixins/resolvable'; import discussionNavigation from '../mixins/discussion_navigation'; import ReplyPlaceholder from './discussion_reply_placeholder.vue'; +import ResolveWithIssueButton from './discussion_resolve_with_issue_button.vue'; import jumpToNextDiscussionButton from './discussion_jump_to_next_button.vue'; import eventHub from '../event_hub'; @@ -44,6 +45,7 @@ export default { ReplyPlaceholder, placeholderNote, placeholderSystemNote, + ResolveWithIssueButton, systemNote, TimelineEntryItem, }, @@ -234,6 +236,9 @@ export default { url: this.discussion.discussion_path, }; }, + resolveWithIssuePath() { + return !this.discussionResolved && this.discussion.resolve_with_issue_path; + }, }, watch: { isReplying() { @@ -487,16 +492,10 @@ Please check your network connection and try again.`; class="btn-group discussion-actions ml-sm-2" role="group" > - <div v-if="!discussionResolved" class="btn-group" role="group"> - <a - v-gl-tooltip - :href="discussion.resolve_with_issue_path" - :title="s__('MergeRequests|Resolve this discussion in a new issue')" - class="new-issue-for-discussion btn btn-default discussion-create-issue-btn" - > - <icon name="issue-new" /> - </a> - </div> + <resolve-with-issue-button + v-if="resolveWithIssuePath" + :url="resolveWithIssuePath" + /> <jump-to-next-discussion-button v-if="shouldShowJumpToNextDiscussion" @onClick="jumpToNextDiscussion" diff --git a/app/assets/javascripts/pipelines/mixins/pipelines.js b/app/assets/javascripts/pipelines/mixins/pipelines.js index 32bfa47e5f2..74ca3071364 100644 --- a/app/assets/javascripts/pipelines/mixins/pipelines.js +++ b/app/assets/javascripts/pipelines/mixins/pipelines.js @@ -94,8 +94,7 @@ export default { this.isLoading = false; this.successCallback(response); - // restart polling - this.poll.restart({ data: this.requestData }); + this.poll.enable({ data: this.requestData, response }); }) .catch(() => { this.isLoading = false; diff --git a/app/assets/javascripts/projects/project_new.js b/app/assets/javascripts/projects/project_new.js index d65e73a3f9c..6fb25622a05 100644 --- a/app/assets/javascripts/projects/project_new.js +++ b/app/assets/javascripts/projects/project_new.js @@ -125,6 +125,10 @@ const bindEvents = () => { text: 'Spring', icon: '.template-option .icon-spring', }, + dotnetcore: { + text: '.NET Core', + icon: '.template-option .icon-dotnet', + }, hugo: { text: 'Pages/Hugo', icon: '.template-option .icon-hugo', @@ -145,6 +149,26 @@ const bindEvents = () => { text: 'Pages/Hexo', icon: '.template-option .icon-hexo', }, + nfhugo: { + text: 'Netlify/Hugo', + icon: '.template-option .icon-netlify', + }, + nfjekyll: { + text: 'Netlify/Jekyll', + icon: '.template-option .icon-netlify', + }, + nfplainhtml: { + text: 'Netlify/Plain HTML', + icon: '.template-option .icon-netlify', + }, + nfgitbook: { + text: 'Netlify/GitBook', + icon: '.template-option .icon-netlify', + }, + nfhexo: { + text: 'Netlify/Hexo', + icon: '.template-option .icon-netlify', + }, }; const selectedTemplate = templates[value]; diff --git a/app/assets/javascripts/vue_merge_request_widget/components/deployment.vue b/app/assets/javascripts/vue_merge_request_widget/components/deployment.vue index 2f2a37347af..da0a9483f8e 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/deployment.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/deployment.vue @@ -54,6 +54,12 @@ export default { deployTimeago() { return this.timeFormated(this.deployment.deployed_at); }, + deploymentExternalUrl() { + if (this.deployment.changes && this.deployment.changes.length === 1) { + return this.deployment.changes[0].external_url; + } + return this.deployment.external_url; + }, hasExternalUrls() { return !!(this.deployment.external_url && this.deployment.external_url_formatted); }, @@ -78,7 +84,7 @@ export default { : ''; }, shouldRenderDropdown() { - return this.deployment.changes && this.deployment.changes.length > 0; + return this.deployment.changes && this.deployment.changes.length > 1; }, showMemoryUsage() { return this.hasMetrics && this.showMetrics; @@ -154,12 +160,12 @@ export default { v-if="shouldRenderDropdown" class="js-mr-wigdet-deployment-dropdown inline" :items="deployment.changes" - :main-action-link="deployment.external_url" + :main-action-link="deploymentExternalUrl" filter-key="path" > <template slot="mainAction" slot-scope="slotProps"> <review-app-link - :link="deployment.external_url" + :link="deploymentExternalUrl" :css-class="`deploy-link js-deploy-url inline ${slotProps.className}`" /> </template> @@ -183,7 +189,7 @@ export default { </filtered-search-dropdown> <review-app-link v-else - :link="deployment.external_url" + :link="deploymentExternalUrl" css-class="js-deploy-url js-deploy-url-feature-flag deploy-link btn btn-default btn-sm inlin" /> </template> diff --git a/app/assets/javascripts/vue_shared/components/project_avatar/default.vue b/app/assets/javascripts/vue_shared/components/project_avatar/default.vue index b399c232937..881b5059d2a 100644 --- a/app/assets/javascripts/vue_shared/components/project_avatar/default.vue +++ b/app/assets/javascripts/vue_shared/components/project_avatar/default.vue @@ -26,7 +26,7 @@ export default { </script> <template> - <span :class="sizeClass" class="avatar-container project-avatar"> + <span :class="sizeClass" class="avatar-container rect-avatar project-avatar"> <project-avatar-image v-if="project.avatar_url" :link-href="project.path" @@ -34,6 +34,12 @@ export default { :img-alt="project.name" :img-size="size" /> - <identicon v-else :entity-id="project.id" :entity-name="project.name" :size-class="sizeClass" /> + <identicon + v-else + :entity-id="project.id" + :entity-name="project.name" + :size-class="sizeClass" + class="rect-avatar" + /> </span> </template> |