Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
63324f9cfd
commit
965e1d8b5a
|
|
@ -28,6 +28,7 @@ Personas are described at https://about.gitlab.com/handbook/marketing/product-ma
|
||||||
* [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops)
|
* [Allison (Application Ops)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#allison-application-ops)
|
||||||
* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer)
|
* [Priyanka (Platform Engineer)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#priyanka-platform-engineer)
|
||||||
* [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst)
|
* [Dana (Data Analyst)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#dana-data-analyst)
|
||||||
|
* [Eddie (Content Editor)](https://about.gitlab.com/handbook/marketing/product-marketing/roles-personas/#eddie-content-editor)
|
||||||
-->
|
-->
|
||||||
|
|
||||||
### User experience goal
|
### User experience goal
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,12 @@
|
||||||
/* global DocumentTouch */
|
/* global DocumentTouch */
|
||||||
|
|
||||||
import $ from 'jquery';
|
|
||||||
import sortableConfig from 'ee_else_ce/sortable/sortable_config';
|
import sortableConfig from 'ee_else_ce/sortable/sortable_config';
|
||||||
|
|
||||||
export function sortableStart() {
|
export function sortableStart() {
|
||||||
$('.has-tooltip')
|
|
||||||
.tooltip('hide')
|
|
||||||
.tooltip('disable');
|
|
||||||
document.body.classList.add('is-dragging');
|
document.body.classList.add('is-dragging');
|
||||||
}
|
}
|
||||||
|
|
||||||
export function sortableEnd() {
|
export function sortableEnd() {
|
||||||
$('.has-tooltip').tooltip('enable');
|
|
||||||
document.body.classList.remove('is-dragging');
|
document.body.classList.remove('is-dragging');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
<script>
|
<script>
|
||||||
import { mapState, mapGetters, mapActions } from 'vuex';
|
import { mapState, mapGetters, mapActions } from 'vuex';
|
||||||
import { GlSprintf, GlLink } from '@gitlab/ui';
|
import { GlSprintf, GlLink, GlIcon } from '@gitlab/ui';
|
||||||
import { s__ } from '~/locale';
|
import { s__ } from '~/locale';
|
||||||
|
|
||||||
import gkeDropdownMixin from './gke_dropdown_mixin';
|
import gkeDropdownMixin from './gke_dropdown_mixin';
|
||||||
|
|
@ -10,6 +10,7 @@ export default {
|
||||||
components: {
|
components: {
|
||||||
GlSprintf,
|
GlSprintf,
|
||||||
GlLink,
|
GlLink,
|
||||||
|
GlIcon,
|
||||||
},
|
},
|
||||||
mixins: [gkeDropdownMixin],
|
mixins: [gkeDropdownMixin],
|
||||||
props: {
|
props: {
|
||||||
|
|
@ -178,14 +179,14 @@ export default {
|
||||||
'https://console.cloud.google.com/freetrial?utm_campaign=2018_cpanel&utm_source=gitlab&utm_medium=referral'
|
'https://console.cloud.google.com/freetrial?utm_campaign=2018_cpanel&utm_source=gitlab&utm_medium=referral'
|
||||||
"
|
"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>{{ content }} <i class="fa fa-external-link" aria-hidden="true"></i
|
>{{ content }} <gl-icon name="external-link" aria-hidden="true"
|
||||||
></gl-link>
|
/></gl-link>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #docsLink="{ content }">
|
<template #docsLink="{ content }">
|
||||||
<gl-link :href="docsUrl" target="_blank"
|
<gl-link :href="docsUrl" target="_blank"
|
||||||
>{{ content }} <i class="fa fa-external-link" aria-hidden="true"></i
|
>{{ content }} <gl-icon name="external-link" aria-hidden="true"
|
||||||
></gl-link>
|
/></gl-link>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #error>
|
<template #error>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
<script>
|
<script>
|
||||||
import { mapState, mapActions, mapGetters } from 'vuex';
|
import { mapState, mapActions, mapGetters } from 'vuex';
|
||||||
import tooltip from '~/vue_shared/directives/tooltip';
|
|
||||||
import CommitFilesList from './commit_sidebar/list.vue';
|
import CommitFilesList from './commit_sidebar/list.vue';
|
||||||
import EmptyState from './commit_sidebar/empty_state.vue';
|
import EmptyState from './commit_sidebar/empty_state.vue';
|
||||||
import { stageKeys } from '../constants';
|
import { stageKeys } from '../constants';
|
||||||
|
|
@ -10,9 +9,6 @@ export default {
|
||||||
CommitFilesList,
|
CommitFilesList,
|
||||||
EmptyState,
|
EmptyState,
|
||||||
},
|
},
|
||||||
directives: {
|
|
||||||
tooltip,
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(['changedFiles', 'stagedFiles', 'lastCommitMsg']),
|
...mapState(['changedFiles', 'stagedFiles', 'lastCommitMsg']),
|
||||||
...mapState('commit', ['commitMessage', 'submitCommitLoading']),
|
...mapState('commit', ['commitMessage', 'submitCommitLoading']),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
<script>
|
||||||
|
import { GlModal } from '@gitlab/ui';
|
||||||
|
import { __ } from '~/locale';
|
||||||
|
import CodeBlock from '~/vue_shared/components/code_block.vue';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'TestCaseDetails',
|
||||||
|
components: {
|
||||||
|
CodeBlock,
|
||||||
|
GlModal,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
modalId: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
testCase: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
validator: ({ classname, formattedTime, name }) =>
|
||||||
|
Boolean(classname) && Boolean(formattedTime) && Boolean(name),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
text: {
|
||||||
|
name: __('Name'),
|
||||||
|
duration: __('Execution time'),
|
||||||
|
trace: __('System output'),
|
||||||
|
},
|
||||||
|
modalCloseButton: {
|
||||||
|
text: __('Close'),
|
||||||
|
attributes: [{ variant: 'info' }],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<gl-modal
|
||||||
|
:modal-id="modalId"
|
||||||
|
:title="testCase.classname"
|
||||||
|
:action-primary="$options.modalCloseButton"
|
||||||
|
>
|
||||||
|
<div class="gl-display-flex gl-flex-wrap gl-mx-n4 gl-my-3">
|
||||||
|
<strong class="gl-text-right col-sm-3">{{ $options.text.name }}</strong>
|
||||||
|
<div class="col-sm-9" data-testid="test-case-name">
|
||||||
|
{{ testCase.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="gl-display-flex gl-flex-wrap gl-mx-n4 gl-my-3">
|
||||||
|
<strong class="gl-text-right col-sm-3">{{ $options.text.duration }}</strong>
|
||||||
|
<div class="col-sm-9" data-testid="test-case-duration">
|
||||||
|
{{ testCase.formattedTime }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
v-if="testCase.system_output"
|
||||||
|
class="gl-display-flex gl-flex-wrap gl-mx-n4 gl-my-3"
|
||||||
|
data-testid="test-case-trace"
|
||||||
|
>
|
||||||
|
<strong class="gl-text-right col-sm-3">{{ $options.text.trace }}</strong>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<code-block :code="testCase.system_output" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</gl-modal>
|
||||||
|
</template>
|
||||||
|
|
@ -61,7 +61,7 @@ export default {
|
||||||
<div
|
<div
|
||||||
v-else-if="!isLoading && showTests"
|
v-else-if="!isLoading && showTests"
|
||||||
ref="container"
|
ref="container"
|
||||||
class="tests-detail position-relative"
|
class="position-relative"
|
||||||
data-testid="tests-detail"
|
data-testid="tests-detail"
|
||||||
>
|
>
|
||||||
<transition
|
<transition
|
||||||
|
|
@ -69,13 +69,13 @@ export default {
|
||||||
@before-enter="beforeEnterTransition"
|
@before-enter="beforeEnterTransition"
|
||||||
@after-leave="afterLeaveTransition"
|
@after-leave="afterLeaveTransition"
|
||||||
>
|
>
|
||||||
<div v-if="showSuite" key="detail" class="w-100 position-absolute slide-enter-to-element">
|
<div v-if="showSuite" key="detail" class="w-100 slide-enter-to-element">
|
||||||
<test-summary :report="getSelectedSuite" show-back @on-back-click="summaryBackClick" />
|
<test-summary :report="getSelectedSuite" show-back @on-back-click="summaryBackClick" />
|
||||||
|
|
||||||
<test-suite-table />
|
<test-suite-table />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-else key="summary" class="w-100 position-absolute slide-enter-from-element">
|
<div v-else key="summary" class="w-100 slide-enter-from-element">
|
||||||
<test-summary :report="testReports" />
|
<test-summary :report="testReports" />
|
||||||
|
|
||||||
<test-summary-table @row-click="summaryTableRowClick" />
|
<test-summary-table @row-click="summaryTableRowClick" />
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from 'vuex';
|
import { mapGetters } from 'vuex';
|
||||||
import { GlTooltipDirective, GlFriendlyWrap, GlIcon, GlButton } from '@gitlab/ui';
|
import { GlModalDirective, GlTooltipDirective, GlFriendlyWrap, GlIcon, GlButton } from '@gitlab/ui';
|
||||||
import { __ } from '~/locale';
|
import { __ } from '~/locale';
|
||||||
|
import TestCaseDetails from './test_case_details.vue';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TestsSuiteTable',
|
name: 'TestsSuiteTable',
|
||||||
|
|
@ -9,9 +10,11 @@ export default {
|
||||||
GlIcon,
|
GlIcon,
|
||||||
GlFriendlyWrap,
|
GlFriendlyWrap,
|
||||||
GlButton,
|
GlButton,
|
||||||
|
TestCaseDetails,
|
||||||
},
|
},
|
||||||
directives: {
|
directives: {
|
||||||
GlTooltip: GlTooltipDirective,
|
GlTooltip: GlTooltipDirective,
|
||||||
|
GlModalDirective,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
heading: {
|
heading: {
|
||||||
|
|
@ -43,7 +46,7 @@ export default {
|
||||||
<div role="rowheader" class="table-section section-20">
|
<div role="rowheader" class="table-section section-20">
|
||||||
{{ __('Suite') }}
|
{{ __('Suite') }}
|
||||||
</div>
|
</div>
|
||||||
<div role="rowheader" class="table-section section-20">
|
<div role="rowheader" class="table-section section-40">
|
||||||
{{ __('Name') }}
|
{{ __('Name') }}
|
||||||
</div>
|
</div>
|
||||||
<div role="rowheader" class="table-section section-10">
|
<div role="rowheader" class="table-section section-10">
|
||||||
|
|
@ -52,12 +55,12 @@ export default {
|
||||||
<div role="rowheader" class="table-section section-10 text-center">
|
<div role="rowheader" class="table-section section-10 text-center">
|
||||||
{{ __('Status') }}
|
{{ __('Status') }}
|
||||||
</div>
|
</div>
|
||||||
<div role="rowheader" class="table-section flex-grow-1">
|
<div role="rowheader" class="table-section section-10">
|
||||||
{{ __('Trace'), }}
|
|
||||||
</div>
|
|
||||||
<div role="rowheader" class="table-section section-10 text-right">
|
|
||||||
{{ __('Duration') }}
|
{{ __('Duration') }}
|
||||||
</div>
|
</div>
|
||||||
|
<div role="rowheader" class="table-section section-10">
|
||||||
|
{{ __('Details'), }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
|
@ -72,7 +75,7 @@ export default {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="table-section section-20 section-wrap">
|
<div class="table-section section-40 section-wrap">
|
||||||
<div role="rowheader" class="table-mobile-header">{{ __('Name') }}</div>
|
<div role="rowheader" class="table-mobile-header">{{ __('Name') }}</div>
|
||||||
<div class="table-mobile-content gl-md-pr-2 gl-overflow-wrap-break">
|
<div class="table-mobile-content gl-md-pr-2 gl-overflow-wrap-break">
|
||||||
<gl-friendly-wrap :symbols="$options.wrapSymbols" :text="testCase.name" />
|
<gl-friendly-wrap :symbols="$options.wrapSymbols" :text="testCase.name" />
|
||||||
|
|
@ -107,24 +110,24 @@ export default {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="table-section flex-grow-1">
|
|
||||||
<div role="rowheader" class="table-mobile-header">{{ __('Trace'), }}</div>
|
|
||||||
<div class="table-mobile-content">
|
|
||||||
<pre
|
|
||||||
v-if="testCase.system_output"
|
|
||||||
class="build-trace build-trace-rounded text-left"
|
|
||||||
><code class="bash p-0">{{testCase.system_output}}</code></pre>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="table-section section-10 section-wrap">
|
<div class="table-section section-10 section-wrap">
|
||||||
<div role="rowheader" class="table-mobile-header">
|
<div role="rowheader" class="table-mobile-header">
|
||||||
{{ __('Duration') }}
|
{{ __('Duration') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="table-mobile-content text-right pr-sm-1">
|
<div class="table-mobile-content pr-sm-1">
|
||||||
{{ testCase.formattedTime }}
|
{{ testCase.formattedTime }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="table-section section-10 section-wrap">
|
||||||
|
<div role="rowheader" class="table-mobile-header">{{ __('Details'), }}</div>
|
||||||
|
<div class="table-mobile-content">
|
||||||
|
<gl-button v-gl-modal-directive="`test-case-details-${index}`">{{
|
||||||
|
__('View details')
|
||||||
|
}}</gl-button>
|
||||||
|
<test-case-details :modal-id="`test-case-details-${index}`" :test-case="testCase" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import { LOADING, ERROR, SUCCESS } from '../../constants';
|
import { LOADING, ERROR, SUCCESS } from '../../constants';
|
||||||
import { sprintf, __, s__, n__ } from '~/locale';
|
import { sprintf, __, s__, n__ } from '~/locale';
|
||||||
|
import { spriteIcon } from '~/lib/utils/common_utils';
|
||||||
|
|
||||||
export const hasCodequalityIssues = state =>
|
export const hasCodequalityIssues = state =>
|
||||||
Boolean(state.newIssues?.length || state.resolvedIssues?.length);
|
Boolean(state.newIssues?.length || state.resolvedIssues?.length);
|
||||||
|
|
@ -48,7 +49,7 @@ export const codequalityPopover = state => {
|
||||||
s__('ciReport|%{linkStartTag}Learn more about codequality reports %{linkEndTag}'),
|
s__('ciReport|%{linkStartTag}Learn more about codequality reports %{linkEndTag}'),
|
||||||
{
|
{
|
||||||
linkStartTag: `<a href="${state.helpPath}" target="_blank" rel="noopener noreferrer">`,
|
linkStartTag: `<a href="${state.helpPath}" target="_blank" rel="noopener noreferrer">`,
|
||||||
linkEndTag: '<i class="fa fa-external-link" aria-hidden="true"></i></a>',
|
linkEndTag: `${spriteIcon('external-link', 's16')}</a>`,
|
||||||
},
|
},
|
||||||
false,
|
false,
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,6 @@ export default {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
rootPath: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
tooltipPlacement: {
|
tooltipPlacement: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'bottom',
|
default: 'bottom',
|
||||||
|
|
@ -76,7 +72,7 @@ export default {
|
||||||
<!-- use d-flex so that slot can be appropriately styled -->
|
<!-- use d-flex so that slot can be appropriately styled -->
|
||||||
<span class="d-flex">
|
<span class="d-flex">
|
||||||
<assignee-avatar :user="user" :img-size="32" :issuable-type="issuableType" />
|
<assignee-avatar :user="user" :img-size="32" :issuable-type="issuableType" />
|
||||||
<slot :user="user"></slot>
|
<slot></slot>
|
||||||
</span>
|
</span>
|
||||||
</gl-link>
|
</gl-link>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
||||||
|
|
@ -13,10 +13,6 @@ export default {
|
||||||
type: Array,
|
type: Array,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
rootPath: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
issuableType: {
|
issuableType: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false,
|
required: false,
|
||||||
|
|
@ -66,22 +62,20 @@ export default {
|
||||||
<template>
|
<template>
|
||||||
<assignee-avatar-link
|
<assignee-avatar-link
|
||||||
v-if="hasOneUser"
|
v-if="hasOneUser"
|
||||||
#default="{ user }"
|
|
||||||
tooltip-placement="left"
|
tooltip-placement="left"
|
||||||
:tooltip-has-name="false"
|
:tooltip-has-name="false"
|
||||||
:user="firstUser"
|
:user="firstUser"
|
||||||
:root-path="rootPath"
|
|
||||||
:issuable-type="issuableType"
|
:issuable-type="issuableType"
|
||||||
>
|
>
|
||||||
<div class="ml-2 gl-line-height-normal">
|
<div class="ml-2 gl-line-height-normal">
|
||||||
<div>{{ user.name }}</div>
|
<div>{{ firstUser.name }}</div>
|
||||||
<div>{{ username }}</div>
|
<div>{{ username }}</div>
|
||||||
</div>
|
</div>
|
||||||
</assignee-avatar-link>
|
</assignee-avatar-link>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<div class="user-list">
|
<div class="user-list">
|
||||||
<div v-for="user in uncollapsedUsers" :key="user.id" class="user-item">
|
<div v-for="user in uncollapsedUsers" :key="user.id" class="user-item">
|
||||||
<assignee-avatar-link :user="user" :root-path="rootPath" :issuable-type="issuableType" />
|
<assignee-avatar-link :user="user" :issuable-type="issuableType" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="renderShowMoreSection" class="user-list-more">
|
<div v-if="renderShowMoreSection" class="user-list-more">
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,10 @@ export default {
|
||||||
RoleDropdown,
|
RoleDropdown,
|
||||||
RemoveGroupLinkModal,
|
RemoveGroupLinkModal,
|
||||||
ExpirationDatepicker,
|
ExpirationDatepicker,
|
||||||
|
LdapOverrideConfirmationModal: () =>
|
||||||
|
import(
|
||||||
|
'ee_component/vue_shared/components/members/ldap/ldap_override_confirmation_modal.vue'
|
||||||
|
),
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(['members', 'tableFields']),
|
...mapState(['members', 'tableFields']),
|
||||||
|
|
@ -114,5 +118,6 @@ export default {
|
||||||
</template>
|
</template>
|
||||||
</gl-table>
|
</gl-table>
|
||||||
<remove-group-link-modal />
|
<remove-group-link-modal />
|
||||||
|
<ldap-override-confirmation-modal />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import createState from 'ee_else_ce/vuex_shared/modules/members/state';
|
import createState from 'ee_else_ce/vuex_shared/modules/members/state';
|
||||||
import * as actions from './actions';
|
import mutations from 'ee_else_ce/vuex_shared/modules/members/mutations';
|
||||||
import mutations from './mutations';
|
import * as actions from 'ee_else_ce/vuex_shared/modules/members/actions';
|
||||||
|
|
||||||
export default initialState => ({
|
export default initialState => ({
|
||||||
namespaced: true,
|
namespaced: true,
|
||||||
|
|
|
||||||
|
|
@ -101,10 +101,6 @@
|
||||||
content: '\f071';
|
content: '\f071';
|
||||||
}
|
}
|
||||||
|
|
||||||
.fa-external-link::before {
|
|
||||||
content: '\f08e';
|
|
||||||
}
|
|
||||||
|
|
||||||
.fa-spinner::before {
|
.fa-spinner::before {
|
||||||
content: '\f110';
|
content: '\f110';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -453,11 +453,9 @@
|
||||||
h4,
|
h4,
|
||||||
h5,
|
h5,
|
||||||
h6 {
|
h6 {
|
||||||
position: relative;
|
|
||||||
|
|
||||||
a.anchor {
|
a.anchor {
|
||||||
left: -16px;
|
float: left;
|
||||||
position: absolute;
|
margin-left: -16px;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
outline: none;
|
outline: none;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -463,8 +463,7 @@ $mr-widget-min-height: 69px;
|
||||||
|
|
||||||
.mr-list {
|
.mr-list {
|
||||||
.merge-request {
|
.merge-request {
|
||||||
padding: 10px 0 10px 15px;
|
padding: 10px $gl-padding;
|
||||||
position: relative;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
.issuable-info-container {
|
.issuable-info-container {
|
||||||
|
|
|
||||||
|
|
@ -196,7 +196,7 @@ module CommitsHelper
|
||||||
return unless external_url
|
return unless external_url
|
||||||
|
|
||||||
link_to(external_url, class: 'btn btn-file-option has-tooltip', target: '_blank', rel: 'noopener noreferrer', title: "View on #{environment.formatted_external_url}", data: { container: 'body' }) do
|
link_to(external_url, class: 'btn btn-file-option has-tooltip', target: '_blank', rel: 'noopener noreferrer', title: "View on #{environment.formatted_external_url}", data: { container: 'body' }) do
|
||||||
icon('external-link')
|
sprite_icon('external-link')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,4 +14,4 @@
|
||||||
'kubernetes-integration-help-path' => help_page_path('user/project/clusters/index'),
|
'kubernetes-integration-help-path' => help_page_path('user/project/clusters/index'),
|
||||||
'account-and-external-ids-help-path' => help_page_path('user/project/clusters/add_remove_clusters.md', anchor: 'new-eks-cluster'),
|
'account-and-external-ids-help-path' => help_page_path('user/project/clusters/add_remove_clusters.md', anchor: 'new-eks-cluster'),
|
||||||
'create-role-arn-help-path' => help_page_path('user/project/clusters/add_remove_clusters.md', anchor: 'new-eks-cluster'),
|
'create-role-arn-help-path' => help_page_path('user/project/clusters/add_remove_clusters.md', anchor: 'new-eks-cluster'),
|
||||||
'external-link-icon' => icon('external-link') } }
|
'external-link-icon' => sprite_icon('external-link') } }
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
= javascript_include_tag 'https://apis.google.com/js/api.js'
|
= javascript_include_tag 'https://apis.google.com/js/api.js'
|
||||||
- external_link_icon = icon('external-link')
|
- external_link_icon = sprite_icon('external-link')
|
||||||
- zones_link_url = 'https://cloud.google.com/compute/docs/regions-zones/regions-zones'
|
- zones_link_url = 'https://cloud.google.com/compute/docs/regions-zones/regions-zones'
|
||||||
- machine_type_link_url = 'https://cloud.google.com/compute/docs/machine-types'
|
- machine_type_link_url = 'https://cloud.google.com/compute/docs/machine-types'
|
||||||
- pricing_link_url = 'https://cloud.google.com/compute/pricing#machinetype'
|
- pricing_link_url = 'https://cloud.google.com/compute/pricing#machinetype'
|
||||||
|
|
|
||||||
|
|
@ -272,7 +272,6 @@
|
||||||
.feature-highlight.js-feature-highlight{ disabled: true,
|
.feature-highlight.js-feature-highlight{ disabled: true,
|
||||||
data: { trigger: 'manual',
|
data: { trigger: 'manual',
|
||||||
container: 'body',
|
container: 'body',
|
||||||
toggle: 'popover',
|
|
||||||
placement: 'right',
|
placement: 'right',
|
||||||
highlight: UserCalloutsHelper::GKE_CLUSTER_INTEGRATION,
|
highlight: UserCalloutsHelper::GKE_CLUSTER_INTEGRATION,
|
||||||
highlight_priority: UserCallout.feature_names[:GKE_CLUSTER_INTEGRATION],
|
highlight_priority: UserCallout.feature_names[:GKE_CLUSTER_INTEGRATION],
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
To install this service,
|
To install this service,
|
||||||
= link_to "#{Gitlab.config.mattermost.host}/select_team", target: '__blank' do
|
= link_to "#{Gitlab.config.mattermost.host}/select_team", target: '__blank' do
|
||||||
join a team
|
join a team
|
||||||
= icon('external-link')
|
= sprite_icon('external-link')
|
||||||
and try again.
|
and try again.
|
||||||
%hr
|
%hr
|
||||||
.clearfix
|
.clearfix
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
To create a team,
|
To create a team,
|
||||||
= link_to "#{Gitlab.config.mattermost.host}/create_team" do
|
= link_to "#{Gitlab.config.mattermost.host}/create_team" do
|
||||||
use Mattermost's interface
|
use Mattermost's interface
|
||||||
= icon('external-link')
|
= sprite_icon('external-link')
|
||||||
or ask your Mattermost system administrator.
|
or ask your Mattermost system administrator.
|
||||||
%hr
|
%hr
|
||||||
%h4 Command trigger word
|
%h4 Command trigger word
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
Reserved:
|
Reserved:
|
||||||
= link_to 'https://docs.mattermost.com/help/messaging/executing-commands.html#built-in-commands', target: '__blank' do
|
= link_to 'https://docs.mattermost.com/help/messaging/executing-commands.html#built-in-commands', target: '__blank' do
|
||||||
see list of built-in slash commands
|
see list of built-in slash commands
|
||||||
= icon('external-link')
|
= sprite_icon('external-link')
|
||||||
%hr
|
%hr
|
||||||
.clearfix
|
.clearfix
|
||||||
.float-right
|
.float-right
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Replace external-link icons with GitLab SVG
|
||||||
|
merge_request: 45685
|
||||||
|
author:
|
||||||
|
type: changed
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Move test report system output to modal
|
||||||
|
merge_request: 45575
|
||||||
|
author:
|
||||||
|
type: changed
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Fix rendering of markdown headings and floated images
|
||||||
|
merge_request: 25442
|
||||||
|
author: Gwen_
|
||||||
|
type: fixed
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Simplify CSS for Merge Requests (list)
|
||||||
|
merge_request: 45785
|
||||||
|
author: Takuya Noguchi
|
||||||
|
type: other
|
||||||
|
|
@ -281,3 +281,11 @@ When running your project pipeline at this point:
|
||||||
- Your built application is pushed to your S3 bucket then and deployed to your EC2 instance, based
|
- Your built application is pushed to your S3 bucket then and deployed to your EC2 instance, based
|
||||||
on the related JSON object's content. The deployment job finishes whenever the deployment to EC2
|
on the related JSON object's content. The deployment job finishes whenever the deployment to EC2
|
||||||
is done or has failed.
|
is done or has failed.
|
||||||
|
|
||||||
|
#### Deploy Amazon EKS
|
||||||
|
|
||||||
|
- [How to deploy your application to a GitLab-managed Amazon EKS cluster with Auto DevOps](https://about.gitlab.com/blog/2020/05/05/deploying-application-eks/)
|
||||||
|
|
||||||
|
#### Deploy to Google Cloud
|
||||||
|
|
||||||
|
- [Deploying with GitLab on Google Cloud](https://about.gitlab.com/solutions/google-cloud-platform/)
|
||||||
|
|
|
||||||
|
|
@ -933,11 +933,10 @@ the [Kubernetes integration](../../user/project/clusters/index.md)), GitLab can
|
||||||
a terminal session to your environment.
|
a terminal session to your environment.
|
||||||
|
|
||||||
This is a powerful feature that allows you to debug issues without leaving the comfort
|
This is a powerful feature that allows you to debug issues without leaving the comfort
|
||||||
of your web browser. To enable it, just follow the instructions given in the service integration
|
of your web browser. To enable it, follow the instructions given in the service integration
|
||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
NOTE: **Note:**
|
Note that container-based deployments often lack basic tools (like an editor), and may
|
||||||
Container-based deployments often lack basic tools (like an editor), and may
|
|
||||||
be stopped or restarted at any time. If this happens, you will lose all your
|
be stopped or restarted at any time. If this happens, you will lose all your
|
||||||
changes. Treat this as a debugging tool, not a comprehensive online IDE.
|
changes. Treat this as a debugging tool, not a comprehensive online IDE.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -72,8 +72,7 @@ they have the following privileges:
|
||||||
Users granted access to a protected environment, but not push or merge access
|
Users granted access to a protected environment, but not push or merge access
|
||||||
to the branch deployed to it, are only granted access to deploy the environment.
|
to the branch deployed to it, are only granted access to deploy the environment.
|
||||||
|
|
||||||
NOTE: **Note:**
|
Note that deployment-only access is the only possible access level for users with
|
||||||
Deployment-only access is the only possible access level for users with
|
|
||||||
[Reporter permissions](../../user/permissions.md).
|
[Reporter permissions](../../user/permissions.md).
|
||||||
|
|
||||||
## Modifying and unprotecting environments
|
## Modifying and unprotecting environments
|
||||||
|
|
@ -84,7 +83,6 @@ Maintainers can:
|
||||||
**Allowed to Deploy** dropdown menu.
|
**Allowed to Deploy** dropdown menu.
|
||||||
- Unprotect a protected environment by clicking the **Unprotect** button for that environment.
|
- Unprotect a protected environment by clicking the **Unprotect** button for that environment.
|
||||||
|
|
||||||
NOTE: **Note:**
|
|
||||||
After an environment is unprotected, all access entries are deleted and must
|
After an environment is unprotected, all access entries are deleted and must
|
||||||
be re-entered if the environment is re-protected.
|
be re-entered if the environment is re-protected.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,8 @@ This tutorial assumes you are familiar with GitLab CI/CD and Vault.
|
||||||
To follow along, you will need:
|
To follow along, you will need:
|
||||||
|
|
||||||
- An account on GitLab.
|
- An account on GitLab.
|
||||||
- A running Vault server and the access required to configure authentication and create roles and policies.
|
- A running Vault server and access to it is required to configure authentication and create roles
|
||||||
|
and policies. For HashiCorp Vaults, this can be the Open Source or Enterprise version.
|
||||||
|
|
||||||
NOTE: **Note:**
|
NOTE: **Note:**
|
||||||
You will need to replace the `vault.example.com` URL below with the URL of your Vault server and `gitlab.example.com` with the URL of your GitLab instance.
|
You will need to replace the `vault.example.com` URL below with the URL of your Vault server and `gitlab.example.com` with the URL of your GitLab instance.
|
||||||
|
|
|
||||||
|
|
@ -392,7 +392,10 @@ you must have Owner [permissions](../../user/permissions.md#project-members-perm
|
||||||
|
|
||||||
You must set up a runner to be able to run all the different types of jobs
|
You must set up a runner to be able to run all the different types of jobs
|
||||||
that it may encounter on the projects it's shared over. This would be
|
that it may encounter on the projects it's shared over. This would be
|
||||||
problematic for large amounts of projects, if it weren't for tags.
|
problematic for large amounts of projects, if it weren't for tags.
|
||||||
|
|
||||||
|
GitLab CI tags are not the same as Git tags. GitLab CI tags are associated with runners.
|
||||||
|
Git tags are associated with commits.
|
||||||
|
|
||||||
By tagging a runner for the types of jobs it can handle, you can make sure
|
By tagging a runner for the types of jobs it can handle, you can make sure
|
||||||
shared runners will [only run the jobs they are equipped to run](../yaml/README.md#tags).
|
shared runners will [only run the jobs they are equipped to run](../yaml/README.md#tags).
|
||||||
|
|
|
||||||
|
|
@ -92,9 +92,7 @@ Guidelines:
|
||||||
|
|
||||||
1. If the feature meets the requirements for creating a [Change Management](https://about.gitlab.com/handbook/engineering/infrastructure/change-management/#feature-flags-and-the-change-management-process) issue, create a Change Management issue per [criticality guidelines](https://about.gitlab.com/handbook/engineering/infrastructure/change-management/#change-request-workflows).
|
1. If the feature meets the requirements for creating a [Change Management](https://about.gitlab.com/handbook/engineering/infrastructure/change-management/#feature-flags-and-the-change-management-process) issue, create a Change Management issue per [criticality guidelines](https://about.gitlab.com/handbook/engineering/infrastructure/change-management/#change-request-workflows).
|
||||||
1. For simple, low-risk, easily reverted features, proceed and [enable the feature in `#production`](#process).
|
1. For simple, low-risk, easily reverted features, proceed and [enable the feature in `#production`](#process).
|
||||||
1. For features that impact the user experience, consider notifying
|
1. For features that impact the user experience, consider notifying `#support_gitlab-com` beforehand.
|
||||||
`#support_gitlab-com` first.
|
|
||||||
`#support_gitlab-com` beforehand.
|
|
||||||
|
|
||||||
#### Process
|
#### Process
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,8 @@ The DevOps Report gives you an overview of your entire instance's adoption of
|
||||||
[Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/)
|
[Concurrent DevOps](https://about.gitlab.com/topics/concurrent-devops/)
|
||||||
from planning to monitoring.
|
from planning to monitoring.
|
||||||
|
|
||||||
|
To see DevOps Report, go to **Admin Area > Analytics > DevOps Report**.
|
||||||
|
|
||||||
## DevOps Score
|
## DevOps Score
|
||||||
|
|
||||||
DevOps Score displays the usage of GitLab's major features on your instance over
|
DevOps Score displays the usage of GitLab's major features on your instance over
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 105 KiB |
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
Instance Statistics gives you an overview of how much data your instance contains, and how quickly this volume is changing over time.
|
Instance Statistics gives you an overview of how much data your instance contains, and how quickly this volume is changing over time.
|
||||||
|
|
||||||
|
To see Instance Statistics, go to **Admin Area > Analytics > Instance Statistics**.
|
||||||
|
|
||||||
## Total counts
|
## Total counts
|
||||||
|
|
||||||
At the top of the page, Instance Statistics shows total counts for:
|
At the top of the page, Instance Statistics shows total counts for:
|
||||||
|
|
@ -16,3 +18,12 @@ At the top of the page, Instance Statistics shows total counts for:
|
||||||
- Pipelines
|
- Pipelines
|
||||||
|
|
||||||
These figures can be useful for understanding how much data your instance contains in total.
|
These figures can be useful for understanding how much data your instance contains in total.
|
||||||
|
|
||||||
|
## Past year trend charts
|
||||||
|
|
||||||
|
Instance Statistics also displays line charts that show total counts per month, over the past 12 months,
|
||||||
|
in the categories shown in [Total counts](#total-counts).
|
||||||
|
|
||||||
|
These charts help you visualize how rapidly these records are being created on your instance.
|
||||||
|
|
||||||
|

|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,8 @@
|
||||||
As a benefit of having the [usage ping active](../settings/usage_statistics.md),
|
As a benefit of having the [usage ping active](../settings/usage_statistics.md),
|
||||||
GitLab lets you analyze the users' activities over time of your GitLab installation.
|
GitLab lets you analyze the users' activities over time of your GitLab installation.
|
||||||
|
|
||||||
|
To see User Cohorts, go to **Admin Area > Analytics > Cohorts**.
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
How do we read the user cohorts table? Let's take an example with the following
|
How do we read the user cohorts table? Let's take an example with the following
|
||||||
|
|
|
||||||
|
|
@ -8618,6 +8618,9 @@ msgstr ""
|
||||||
msgid "Delete source branch"
|
msgid "Delete source branch"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Delete subscription"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Delete this attachment"
|
msgid "Delete this attachment"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -10762,6 +10765,9 @@ msgstr ""
|
||||||
msgid "Excluding merge commits. Limited to 6,000 commits."
|
msgid "Excluding merge commits. Limited to 6,000 commits."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Execution time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Existing branch name, tag, or commit SHA"
|
msgid "Existing branch name, tag, or commit SHA"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -16256,6 +16262,15 @@ msgstr ""
|
||||||
msgid "Members|%{time} by %{user}"
|
msgid "Members|%{time} by %{user}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Members|%{userName} is currently a LDAP user. Editing their permissions will override the settings from the LDAP group sync."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Members|An error occurred while trying to enable LDAP override, please try again."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Members|An error occurred while trying to revert to LDAP group sync settings, please try again."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Members|An error occurred while updating the member's expiration date, please try again."
|
msgid "Members|An error occurred while updating the member's expiration date, please try again."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -16283,6 +16298,9 @@ msgstr ""
|
||||||
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
|
msgid "Members|Are you sure you want to withdraw your access request for \"%{source}\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Members|Edit permissions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Members|Expiration date removed successfully."
|
msgid "Members|Expiration date removed successfully."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -16292,6 +16310,9 @@ msgstr ""
|
||||||
msgid "Members|Expired"
|
msgid "Members|Expired"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Members|LDAP override enabled."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Members|Leave \"%{source}\""
|
msgid "Members|Leave \"%{source}\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -25702,6 +25723,9 @@ msgstr ""
|
||||||
msgid "System metrics (Kubernetes)"
|
msgid "System metrics (Kubernetes)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "System output"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Table of Contents"
|
msgid "Table of Contents"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
@ -27828,9 +27852,6 @@ msgstr ""
|
||||||
msgid "TotalRefCountIndicator|1000+"
|
msgid "TotalRefCountIndicator|1000+"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Trace"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Tracing"
|
msgid "Tracing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -48,8 +48,8 @@
|
||||||
"@rails/actioncable": "^6.0.3-3",
|
"@rails/actioncable": "^6.0.3-3",
|
||||||
"@rails/ujs": "^6.0.3-2",
|
"@rails/ujs": "^6.0.3-2",
|
||||||
"@sourcegraph/code-host-integration": "0.0.50",
|
"@sourcegraph/code-host-integration": "0.0.50",
|
||||||
"@toast-ui/editor": "^2.4.0",
|
"@toast-ui/editor": "^2.5.0",
|
||||||
"@toast-ui/vue-editor": "^2.4.0",
|
"@toast-ui/vue-editor": "^2.5.0",
|
||||||
"apollo-cache-inmemory": "^1.6.6",
|
"apollo-cache-inmemory": "^1.6.6",
|
||||||
"apollo-client": "^2.6.10",
|
"apollo-client": "^2.6.10",
|
||||||
"apollo-link": "^1.2.14",
|
"apollo-link": "^1.2.14",
|
||||||
|
|
@ -80,7 +80,7 @@
|
||||||
"deckar01-task_list": "^2.3.1",
|
"deckar01-task_list": "^2.3.1",
|
||||||
"diff": "^3.4.0",
|
"diff": "^3.4.0",
|
||||||
"document-register-element": "1.14.3",
|
"document-register-element": "1.14.3",
|
||||||
"dompurify": "^2.1.1",
|
"dompurify": "^2.2.0",
|
||||||
"dropzone": "^4.2.0",
|
"dropzone": "^4.2.0",
|
||||||
"editorconfig": "^0.15.3",
|
"editorconfig": "^0.15.3",
|
||||||
"emoji-regex": "^7.0.3",
|
"emoji-regex": "^7.0.3",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
import { shallowMount, createLocalVue } from '@vue/test-utils';
|
||||||
|
import { GlModal } from '@gitlab/ui';
|
||||||
|
import TestCaseDetails from '~/pipelines/components/test_reports/test_case_details.vue';
|
||||||
|
import CodeBlock from '~/vue_shared/components/code_block.vue';
|
||||||
|
|
||||||
|
const localVue = createLocalVue();
|
||||||
|
|
||||||
|
describe('Test case details', () => {
|
||||||
|
let wrapper;
|
||||||
|
const defaultTestCase = {
|
||||||
|
classname: 'spec.test_spec',
|
||||||
|
name: 'Test#something cool',
|
||||||
|
formattedTime: '10.04ms',
|
||||||
|
system_output: 'Line 42 is broken',
|
||||||
|
};
|
||||||
|
|
||||||
|
const findModal = () => wrapper.find(GlModal);
|
||||||
|
const findName = () => wrapper.find('[data-testid="test-case-name"]');
|
||||||
|
const findDuration = () => wrapper.find('[data-testid="test-case-duration"]');
|
||||||
|
const findSystemOutput = () => wrapper.find('[data-testid="test-case-trace"]');
|
||||||
|
|
||||||
|
const createComponent = (testCase = {}) => {
|
||||||
|
wrapper = shallowMount(TestCaseDetails, {
|
||||||
|
localVue,
|
||||||
|
propsData: {
|
||||||
|
modalId: 'my-modal',
|
||||||
|
testCase: {
|
||||||
|
...defaultTestCase,
|
||||||
|
...testCase,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
stubs: { CodeBlock, GlModal },
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
wrapper.destroy();
|
||||||
|
wrapper = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('required details', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
createComponent();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders the test case classname as modal title', () => {
|
||||||
|
expect(findModal().attributes('title')).toBe(defaultTestCase.classname);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders the test case name', () => {
|
||||||
|
expect(findName().text()).toBe(defaultTestCase.name);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders the test case duration', () => {
|
||||||
|
expect(findDuration().text()).toBe(defaultTestCase.formattedTime);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when test case has system output', () => {
|
||||||
|
it('renders the test case system output', () => {
|
||||||
|
createComponent();
|
||||||
|
|
||||||
|
expect(findSystemOutput().text()).toContain(defaultTestCase.system_output);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when test case does not have system output', () => {
|
||||||
|
it('does not render the test case system output', () => {
|
||||||
|
createComponent({ system_output: null });
|
||||||
|
|
||||||
|
expect(findSystemOutput().exists()).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import Vuex from 'vuex';
|
import Vuex from 'vuex';
|
||||||
import { shallowMount, createLocalVue } from '@vue/test-utils';
|
import { shallowMount, createLocalVue } from '@vue/test-utils';
|
||||||
import { getJSONFixture } from 'helpers/fixtures';
|
import { getJSONFixture } from 'helpers/fixtures';
|
||||||
import { GlButton } from '@gitlab/ui';
|
import { GlButton, GlFriendlyWrap } from '@gitlab/ui';
|
||||||
import SuiteTable from '~/pipelines/components/test_reports/test_suite_table.vue';
|
import SuiteTable from '~/pipelines/components/test_reports/test_suite_table.vue';
|
||||||
import * as getters from '~/pipelines/stores/test_reports/getters';
|
import * as getters from '~/pipelines/stores/test_reports/getters';
|
||||||
import { TestStatus } from '~/pipelines/constants';
|
import { TestStatus } from '~/pipelines/constants';
|
||||||
|
|
@ -40,6 +40,7 @@ describe('Test reports suite table', () => {
|
||||||
wrapper = shallowMount(SuiteTable, {
|
wrapper = shallowMount(SuiteTable, {
|
||||||
store,
|
store,
|
||||||
localVue,
|
localVue,
|
||||||
|
stubs: { GlFriendlyWrap },
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ export const member = {
|
||||||
canUpdate: false,
|
canUpdate: false,
|
||||||
canRemove: false,
|
canRemove: false,
|
||||||
canOverride: false,
|
canOverride: false,
|
||||||
|
isOverridden: false,
|
||||||
accessLevel: { integerValue: 50, stringValue: 'Owner' },
|
accessLevel: { integerValue: 50, stringValue: 'Owner' },
|
||||||
source: {
|
source: {
|
||||||
id: 178,
|
id: 178,
|
||||||
|
|
|
||||||
26
yarn.lock
26
yarn.lock
|
|
@ -1173,20 +1173,20 @@
|
||||||
dom-accessibility-api "^0.5.1"
|
dom-accessibility-api "^0.5.1"
|
||||||
pretty-format "^26.4.2"
|
pretty-format "^26.4.2"
|
||||||
|
|
||||||
"@toast-ui/editor@^2.4.0":
|
"@toast-ui/editor@^2.5.0":
|
||||||
version "2.4.0"
|
version "2.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/@toast-ui/editor/-/editor-2.4.0.tgz#0ed082da7e0160162dbc8f69d00ad3ab2adf81bc"
|
resolved "https://registry.yarnpkg.com/@toast-ui/editor/-/editor-2.5.0.tgz#02779b119eaa6dd7601249d75ca031e0b98400f1"
|
||||||
integrity sha512-49YCYcDnCjv4mC9VVNlytJ23SA5t6ox540GnmysluJHJ8aGRdWcVoH8hiyCZi9ZVIXi90B/TU+2HUQ7mOCHHRQ==
|
integrity sha512-h4LgcGz+oedTqNAaSCp0VpR+k4C6Ag01hdDb1kPvO4aMQ/aTtT8uA34plpmYQgJvM0CWD1mXqWUSPkyJtRzDyA==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/codemirror" "0.0.71"
|
"@types/codemirror" "0.0.71"
|
||||||
codemirror "^5.48.4"
|
codemirror "^5.48.4"
|
||||||
|
|
||||||
"@toast-ui/vue-editor@^2.4.0":
|
"@toast-ui/vue-editor@^2.5.0":
|
||||||
version "2.4.0"
|
version "2.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/@toast-ui/vue-editor/-/vue-editor-2.4.0.tgz#18b6629006f2dac5bfef4a26388499931d5fa869"
|
resolved "https://registry.yarnpkg.com/@toast-ui/vue-editor/-/vue-editor-2.5.0.tgz#8094136588b0f726241b5f89d0754a7169f2ffee"
|
||||||
integrity sha512-fj4H4jM+usW43mD0VEIfBeUpANY9/pQLB8GlXLQH2iAmpmJFX+xMZl6r7d/vw6TDJaHLfFxP/iXcYIfyJobepQ==
|
integrity sha512-GREAaVOe5esQaQFmFCZLjo6iOtIvqvYhANulvsKpbh4QNnsPLaFRIQoUDSImNPVGkDDQn60wxXBnZVKOl9sMmg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@toast-ui/editor" "^2.4.0"
|
"@toast-ui/editor" "^2.5.0"
|
||||||
|
|
||||||
"@types/aria-query@^4.2.0":
|
"@types/aria-query@^4.2.0":
|
||||||
version "4.2.0"
|
version "4.2.0"
|
||||||
|
|
@ -4174,10 +4174,10 @@ domhandler@^2.3.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
domelementtype "1"
|
domelementtype "1"
|
||||||
|
|
||||||
dompurify@^2.1.1:
|
dompurify@^2.1.1, dompurify@^2.2.0:
|
||||||
version "2.1.1"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.1.1.tgz#b5aa988676b093a9c836d8b855680a8598af25fe"
|
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.2.0.tgz#51d34e76faa38b5d6b4e83a0678530f27fe3965c"
|
||||||
integrity sha512-NijiNVkS/OL8mdQL1hUbCD6uty/cgFpmNiuFxrmJ5YPH2cXrPKIewoixoji56rbZ6XBPmtM8GA8/sf9unlSuwg==
|
integrity sha512-bqFOQ7XRmmozp0VsKdIEe8UwZYxj0yttz7l80GBtBqdVRY48cOpXH2J/CVO7AEkV51qY0EBVXfilec18mdmQ/w==
|
||||||
|
|
||||||
domutils@^1.5.1:
|
domutils@^1.5.1:
|
||||||
version "1.6.2"
|
version "1.6.2"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue