Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
a07606b8d8
commit
dcf94a820d
|
|
@ -1 +1 @@
|
|||
27b3a74b0ac39329e049167a7a1d7109c344f441
|
||||
1a16fa05c2645a0abba4e2f028e1fdbe5d85be2f
|
||||
|
|
|
|||
|
|
@ -256,7 +256,7 @@
|
|||
},
|
||||
"reports": {
|
||||
"type": "object",
|
||||
"markdownDescription": "Reports will be uploaded as artifacts, and often displayed in the Gitlab UI, such as in Merge Requests. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#artifactsreports).",
|
||||
"markdownDescription": "Reports will be uploaded as artifacts, and often displayed in the Gitlab UI, such as in merge requests. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#artifactsreports).",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"junit": {
|
||||
|
|
@ -290,7 +290,8 @@
|
|||
"coverage_format": {
|
||||
"description": "Code coverage format used by the test framework.",
|
||||
"enum": [
|
||||
"cobertura", "jacoco"
|
||||
"cobertura",
|
||||
"jacoco"
|
||||
]
|
||||
},
|
||||
"path": {
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import {
|
|||
getOAuthConfig,
|
||||
setupRootElement,
|
||||
handleTracking,
|
||||
handleUpdateUrl,
|
||||
} from './lib/gitlab_web_ide';
|
||||
import { GITLAB_WEB_IDE_FEEDBACK_ISSUE } from './constants';
|
||||
import { renderWebIdeError } from './render_web_ide_error';
|
||||
|
|
@ -84,6 +85,7 @@ export const initGitlabWebIDE = async (el) => {
|
|||
editorFont,
|
||||
extensionsGallerySettings,
|
||||
codeSuggestionsEnabled,
|
||||
handleContextUpdate: handleUpdateUrl,
|
||||
handleTracking,
|
||||
// See https://gitlab.com/gitlab-org/gitlab-web-ide/-/blob/main/packages/web-ide-types/src/config.ts#L86
|
||||
telemetryEnabled: Tracking.enabled(),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
import { joinPaths, webIDEUrl } from '~/lib/utils/url_utility';
|
||||
|
||||
function withPrevious(fn) {
|
||||
let prev;
|
||||
|
||||
return (arg) => {
|
||||
fn(arg, prev);
|
||||
prev = arg;
|
||||
};
|
||||
}
|
||||
|
||||
function getWebIdeUrl(projectPath, branchName) {
|
||||
return webIDEUrl(joinPaths('/', projectPath, 'edit', branchName, '-/'));
|
||||
}
|
||||
|
||||
export const handleUpdateUrl = withPrevious(({ projectPath, ref }, previous) => {
|
||||
if (!previous) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (previous.ref === ref) {
|
||||
return;
|
||||
}
|
||||
|
||||
const newUrl = getWebIdeUrl(projectPath, ref);
|
||||
|
||||
window.history.replaceState(null, '', newUrl);
|
||||
});
|
||||
|
|
@ -2,3 +2,4 @@ export * from './get_base_config';
|
|||
export * from './get_oauth_config';
|
||||
export * from './handle_tracking_event';
|
||||
export * from './setup_root_element';
|
||||
export * from './handle_update_url';
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ export default {
|
|||
<template>
|
||||
<div>
|
||||
<div class="page-title-holder gl-flex">
|
||||
<h1 class="page-title gl-font-size-h-display">{{ __('Merge Requests') }}</h1>
|
||||
<h1 class="page-title gl-font-size-h-display">{{ __('Merge requests') }}</h1>
|
||||
</div>
|
||||
<merge-requests-query
|
||||
v-for="(list, i) in lists"
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ export default {
|
|||
ISSUES_GROUP_TITLE,
|
||||
PAGES_GROUP_TITLE,
|
||||
GROUPS_GROUP_TITLE,
|
||||
MERGE_REQUESTS_GROUP_TITLE: s__('GlobalSearch|Merge Requests'),
|
||||
MERGE_REQUESTS_GROUP_TITLE: s__('GlobalSearch|Merge requests'),
|
||||
RECENT_ISSUES_GROUP_TITLE: s__('GlobalSearch|Recent issues'),
|
||||
RECENT_EPICS_GROUP_TITLE: s__('GlobalSearch|Recent epics'),
|
||||
RECENT_MERGE_REQUESTS_GROUP_TITLE: s__('GlobalSearch|Recent merge requests'),
|
||||
|
|
|
|||
|
|
@ -507,7 +507,7 @@ export default {
|
|||
>
|
||||
<template v-if="workItemAssignees">
|
||||
<work-item-assignees
|
||||
class="gl-mb-5 js-assignee"
|
||||
class="js-assignee gl-mb-5"
|
||||
:can-update="canUpdate"
|
||||
:full-path="fullPath"
|
||||
:work-item-id="workItemId"
|
||||
|
|
@ -532,7 +532,7 @@ export default {
|
|||
</template>
|
||||
<template v-if="workItemLabels">
|
||||
<work-item-labels
|
||||
class="gl-mb-5 js-labels"
|
||||
class="js-labels gl-mb-5"
|
||||
:can-update="canUpdate"
|
||||
:full-path="fullPath"
|
||||
:work-item-id="workItemId"
|
||||
|
|
@ -576,7 +576,7 @@ export default {
|
|||
/>
|
||||
</template>
|
||||
</aside>
|
||||
<div class="gl-py-3 gl-flex gl-gap-3 gl-col-start-1">
|
||||
<div class="gl-col-start-1 gl-flex gl-gap-3 gl-py-3">
|
||||
<gl-button
|
||||
variant="confirm"
|
||||
:loading="loading"
|
||||
|
|
|
|||
|
|
@ -133,15 +133,15 @@ export default {
|
|||
params: { iid: workItemIid, id: filename },
|
||||
query: $route.query,
|
||||
}"
|
||||
class="card gl-cursor-pointer gl-text-default hover:gl-text-default js-design-list-item design-list-item gl-mb-0"
|
||||
class="card js-design-list-item design-list-item gl-mb-0 gl-cursor-pointer gl-text-default hover:gl-text-default"
|
||||
>
|
||||
<div
|
||||
class="card-body gl-p-0 gl-flex gl-items-center gl-justify-content-center gl-overflow-hidden gl-relative gl-rounded-top-base"
|
||||
class="card-body gl-relative gl-flex gl-items-center gl-justify-center gl-overflow-hidden gl-rounded-t-base gl-p-0"
|
||||
>
|
||||
<div
|
||||
v-if="icon.name"
|
||||
data-testid="design-event"
|
||||
class="gl-absolute gl-top-3 gl-right-3 gl-mr-1"
|
||||
class="gl-absolute gl-right-3 gl-top-3 gl-mr-1"
|
||||
>
|
||||
<span :title="icon.tooltip" :aria-label="icon.tooltip">
|
||||
<gl-icon
|
||||
|
|
@ -170,18 +170,18 @@ export default {
|
|||
v-show="showImage"
|
||||
:src="imageLink"
|
||||
:alt="filename"
|
||||
class="gl-block gl-mx-auto gl-max-w-full gl-max-h-full gl-w-auto design-img"
|
||||
class="design-img gl-mx-auto gl-block gl-max-h-full gl-w-auto gl-max-w-full"
|
||||
:data-testid="`design-img-${id}`"
|
||||
@load="onImageLoad"
|
||||
@error="onImageError"
|
||||
/>
|
||||
</gl-intersection-observer>
|
||||
</div>
|
||||
<div class="card-footer gl-flex gl-w-full gl-bg-white gl-py-3 gl-px-4">
|
||||
<div class="gl-flex gl-flex-col str-truncated-100">
|
||||
<div class="card-footer gl-flex gl-w-full gl-bg-white gl-px-4 gl-py-3">
|
||||
<div class="str-truncated-100 gl-flex gl-flex-col">
|
||||
<span
|
||||
v-gl-tooltip
|
||||
class="gl-font-sm str-truncated-100"
|
||||
class="str-truncated-100 gl-text-sm"
|
||||
:data-testid="`design-img-filename-${id}`"
|
||||
:title="filename"
|
||||
>{{ filename }}</span
|
||||
|
|
@ -192,7 +192,7 @@ export default {
|
|||
</div>
|
||||
<div v-if="notesCount" class="gl-ml-auto gl-flex gl-items-center gl-text-gray-500">
|
||||
<gl-icon name="comments" class="gl-ml-2" />
|
||||
<span :aria-label="notesLabel" class="gl-font-sm gl-ml-2">
|
||||
<span :aria-label="notesLabel" class="gl-ml-2 gl-text-sm">
|
||||
{{ notesCount }}
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@ export default {
|
|||
<template>
|
||||
<widget-wrapper v-if="hasDesigns" data-testid="designs-root" :error="error">
|
||||
<template #header>
|
||||
<span class="gl-font-bold gl-mr-3">{{ s__('DesignManagement|Designs') }}</span>
|
||||
<span class="gl-mr-3 gl-font-bold">{{ s__('DesignManagement|Designs') }}</span>
|
||||
</template>
|
||||
<template #header-suffix>
|
||||
<design-version-dropdown :all-versions="allVersions" />
|
||||
|
|
@ -107,7 +107,7 @@ export default {
|
|||
<li
|
||||
v-for="design in designs"
|
||||
:key="design.id"
|
||||
class="col-md-6 col-lg-3 gl-mt-5 gl-px-3 gl-bg-transparent gl-shadow-none js-design-tile"
|
||||
class="col-md-6 col-lg-3 js-design-tile gl-mt-5 gl-bg-transparent gl-px-3 gl-shadow-none"
|
||||
>
|
||||
<design
|
||||
v-bind="design"
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ export default {
|
|||
<template>
|
||||
<div class="design-discussion-wrapper" @click="$emit('update-active-discussion')">
|
||||
<design-note-pin :is-resolved="discussion.resolved" :label="discussion.index" />
|
||||
<ul class="design-discussion bordered-box gl-relative gl-p-0 gl-list-none">
|
||||
<ul class="design-discussion bordered-box gl-relative gl-list-none gl-p-0">
|
||||
<design-note :note="firstNote">
|
||||
<template v-if="isLoggedIn && discussion.resolvable" #resolve-discussion>
|
||||
<gl-button
|
||||
|
|
@ -73,10 +73,10 @@ export default {
|
|||
/>
|
||||
</template>
|
||||
<template v-if="discussion.resolved" #resolved-status>
|
||||
<p class="gl-text-gray-500 gl-text-sm gl-m-0 gl-mt-5" data-testid="resolved-message">
|
||||
<p class="gl-m-0 gl-mt-5 gl-text-sm gl-text-gray-500" data-testid="resolved-message">
|
||||
{{ __('Resolved by') }}
|
||||
<gl-link
|
||||
class="gl-text-gray-500 gl-no-underline gl-text-sm link-inherit-color"
|
||||
class="link-inherit-color gl-text-sm gl-text-gray-500 gl-no-underline"
|
||||
:href="discussion.resolvedBy.webUrl"
|
||||
target="_blank"
|
||||
>{{ discussion.resolvedBy.name }}</gl-link
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ export default {
|
|||
:href="author.webUrl"
|
||||
:data-user-id="authorId"
|
||||
:data-username="author.username"
|
||||
class="gl-float-left gl-mr-3 link-inherit-color js-user-link"
|
||||
class="link-inherit-color js-user-link gl-float-left gl-mr-3"
|
||||
>
|
||||
<gl-avatar
|
||||
:size="32"
|
||||
|
|
@ -96,7 +96,7 @@ export default {
|
|||
<span class="note-headline-light note-headline-meta">
|
||||
<span class="system-note-message"> <slot></slot> </span>
|
||||
<gl-link
|
||||
class="note-timestamp system-note-separator gl-inline-block gl-mb-2 gl-text-sm link-inherit-color"
|
||||
class="note-timestamp system-note-separator link-inherit-color gl-mb-2 gl-inline-block gl-text-sm"
|
||||
:href="`#note_${noteAnchorId}`"
|
||||
>
|
||||
<time-ago-tooltip :time="note.createdAt" tooltip-placement="bottom" />
|
||||
|
|
@ -104,7 +104,7 @@ export default {
|
|||
<imported-badge v-if="isImported" :importable-type="$options.TYPE_COMMENT" size="sm" />
|
||||
</span>
|
||||
</div>
|
||||
<div class="gl-flex gl-items-start -gl-mt-2 -gl-mr-2">
|
||||
<div class="-gl-mr-2 -gl-mt-2 gl-flex gl-items-start">
|
||||
<slot name="resolve-discussion"></slot>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ export default {
|
|||
|
||||
<template>
|
||||
<li
|
||||
class="toggle-comments gl-bg-gray-10 gl-flex gl-items-center gl-p-3 gl-min-h-8 gl-rounded-bl-base gl-rounded-br-base"
|
||||
class="toggle-comments gl-flex gl-min-h-8 gl-items-center gl-rounded-bl-base gl-rounded-br-base gl-bg-gray-10 gl-p-3"
|
||||
:class="{ expanded: !collapsed }"
|
||||
data-testid="toggle-comments-wrapper"
|
||||
>
|
||||
|
|
@ -71,7 +71,7 @@ export default {
|
|||
:avatar-size="24"
|
||||
badge-tooltip-prop="name"
|
||||
:badge-sr-only-text="authorCollapsedTooltip"
|
||||
class="gl-whitespace-nowrap gl-mr-3"
|
||||
class="gl-mr-3 gl-whitespace-nowrap"
|
||||
>
|
||||
<template #avatar="{ avatar }">
|
||||
<gl-avatar-link v-gl-tooltip :href="avatar.webUrl" :title="avatar.name">
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ export default {
|
|||
query: $route.query,
|
||||
}"
|
||||
:aria-label="s__('DesignManagement|Go back to designs')"
|
||||
class="btn btn-icon gl-px-3 gl-mx-3 gl-border-0"
|
||||
class="btn btn-icon gl-mx-3 gl-border-0 gl-px-3"
|
||||
>
|
||||
<gl-icon name="close" />
|
||||
</router-link>
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@ export default {
|
|||
<template>
|
||||
<div class="design-description-container">
|
||||
<div class="design-description-view">
|
||||
<div class="design-description-header gl-flex gl-justify-between gl-mb-2">
|
||||
<h3 class="!gl-leading-20 gl-font-lg gl-m-0">
|
||||
<div class="design-description-header gl-mb-2 gl-flex gl-justify-between">
|
||||
<h3 class="gl-m-0 gl-text-lg !gl-leading-20">
|
||||
{{ $options.i18n.descriptionLabel }}
|
||||
</h3>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -161,9 +161,9 @@ export default {
|
|||
|
||||
<template>
|
||||
<div
|
||||
class="design-detail js-design-detail fixed-top gl-w-full gl-flex gl-justify-content-center gl-flex-col gl-lg-flex-direction-row gl-bg-gray-10"
|
||||
class="design-detail js-design-detail fixed-top gl-flex gl-w-full gl-flex-col gl-justify-center gl-bg-gray-10 lg:gl-flex-row"
|
||||
>
|
||||
<div class="gl-flex gl-overflow-hidden gl-grow gl-flex-col gl-relative">
|
||||
<div class="gl-relative gl-flex gl-grow gl-flex-col gl-overflow-hidden">
|
||||
<design-toolbar
|
||||
:work-item-title="workItemTitle"
|
||||
:design="design"
|
||||
|
|
@ -173,10 +173,8 @@ export default {
|
|||
:all-designs="allDesigns"
|
||||
@toggle-sidebar="toggleSidebar"
|
||||
/>
|
||||
<div
|
||||
class="gl-flex gl-overflow-hidden gl-flex-col gl-lg-flex-direction-row gl-grow gl-relative"
|
||||
>
|
||||
<div class="gl-flex gl-overflow-hidden gl-flex-grow-2 gl-flex-col gl-relative">
|
||||
<div class="gl-relative gl-flex gl-grow gl-flex-col gl-overflow-hidden lg:gl-flex-row">
|
||||
<div class="gl-relative gl-flex gl-flex-grow-2 gl-flex-col gl-overflow-hidden">
|
||||
<div v-if="errorMessage" class="gl-p-5">
|
||||
<gl-alert variant="danger" @dismiss="errorMessage = null">
|
||||
{{ errorMessage }}
|
||||
|
|
|
|||
|
|
@ -80,8 +80,8 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="designsCount" class="gl-display-flex gl-align-items-center gl-flex-shrink-0">
|
||||
<div class="gl-w-5 gl-mr-2 gl-text-right">{{ currentIndex + 1 }}</div>
|
||||
<div v-if="designsCount" class="gl-flex gl-shrink-0 gl-items-center">
|
||||
<div class="gl-mr-2 gl-w-5 gl-text-right">{{ currentIndex + 1 }}</div>
|
||||
<div>{{ paginationText }}</div>
|
||||
<gl-button-group class="gl-ml-3">
|
||||
<gl-button
|
||||
|
|
|
|||
|
|
@ -296,7 +296,7 @@ export default {
|
|||
<template>
|
||||
<div
|
||||
ref="presentationViewport"
|
||||
class="gl-h-full gl-w-full gl-p-5 overflow-auto gl-relative"
|
||||
class="overflow-auto gl-relative gl-h-full gl-w-full gl-p-5"
|
||||
:style="presentationStyle"
|
||||
@mousedown="onPresentationMousedown"
|
||||
@mousemove="onPresentationMousemove"
|
||||
|
|
@ -308,7 +308,7 @@ export default {
|
|||
@touchcancel="onPresentationMouseup"
|
||||
>
|
||||
<gl-loading-icon v-if="isLoading" size="xl" class="gl-flex gl-h-full gl-items-center" />
|
||||
<div v-else class="gl-h-full gl-w-full gl-flex gl-items-center gl-relative">
|
||||
<div v-else class="gl-relative gl-flex gl-h-full gl-w-full gl-items-center">
|
||||
<design-image
|
||||
v-if="image"
|
||||
:image="image"
|
||||
|
|
|
|||
|
|
@ -72,12 +72,12 @@ export default {
|
|||
<design-disclosure :open="isOpen">
|
||||
<template #default>
|
||||
<div class="image-notes gl-h-full gl-pt-0">
|
||||
<design-description v-if="showDescription" :design="design" class="gl-my-5 gl-border-b" />
|
||||
<design-description v-if="showDescription" :design="design" class="gl-border-b gl-my-5" />
|
||||
<div v-if="isLoading" class="gl-my-5">
|
||||
<gl-skeleton-loader />
|
||||
</div>
|
||||
<template v-else>
|
||||
<h3 data-testid="unresolved-discussion-count" class="!gl-leading-20 gl-text-lg gl-my-5">
|
||||
<h3 data-testid="unresolved-discussion-count" class="gl-my-5 gl-text-lg !gl-leading-20">
|
||||
{{ unresolvedDiscussionsCount }}
|
||||
</h3>
|
||||
<gl-empty-state
|
||||
|
|
|
|||
|
|
@ -63,17 +63,17 @@ export default {
|
|||
|
||||
<template>
|
||||
<header
|
||||
class="gl-flex gl-flex-col md:gl-flex-row md:gl-items-center gl-justify-between gl-max-w-full gl-bg-white gl-py-4 gl-pl-5 gl-border-b js-design-header"
|
||||
class="js-design-header gl-border-b gl-flex gl-max-w-full gl-flex-col gl-justify-between gl-bg-white gl-py-4 gl-pl-5 md:gl-flex-row md:gl-items-center"
|
||||
>
|
||||
<div class="gl-flex gl-flex-row gl-items-center gl-mb-3 md:gl-mb-0 gl-overflow-hidden">
|
||||
<div class="gl-overflow-hidden gl-flex gl-mr-3">
|
||||
<div class="gl-mb-3 gl-flex gl-flex-row gl-items-center gl-overflow-hidden md:gl-mb-0">
|
||||
<div class="gl-mr-3 gl-flex gl-overflow-hidden">
|
||||
<gl-skeleton-loader v-if="isLoading" :lines="1" />
|
||||
<h2 v-else class="gl-flex gl-items-center gl-overflow-hidden gl-m-0 gl-text-base">
|
||||
<span class="gl-text-truncate gl-text-gray-900 gl-no-underline">
|
||||
<h2 v-else class="gl-m-0 gl-flex gl-items-center gl-overflow-hidden gl-text-base">
|
||||
<span class="gl-truncate gl-text-gray-900 gl-no-underline">
|
||||
{{ workItemTitle }}
|
||||
</span>
|
||||
<gl-icon name="chevron-right" class="gl-text-gray-200 gl-flex-shrink-0" />
|
||||
<span class="gl-text-truncate gl-font-normal">{{ design.filename }}</span>
|
||||
<gl-icon name="chevron-right" class="gl-shrink-0 gl-text-gray-200" />
|
||||
<span class="gl-truncate gl-font-normal">{{ design.filename }}</span>
|
||||
<imported-badge
|
||||
v-if="design.imported"
|
||||
:importable-type="$options.TYPE_DESIGN"
|
||||
|
|
@ -81,9 +81,9 @@ export default {
|
|||
/>
|
||||
</h2>
|
||||
</div>
|
||||
<close-button class="md:gl-hidden gl-ml-auto" />
|
||||
<close-button class="gl-ml-auto md:gl-hidden" />
|
||||
</div>
|
||||
<div class="gl-flex md:gl-flex-row gl-flex-shrink-0 gl-md-ml-auto gl-mr-5">
|
||||
<div class="gl-mr-5 gl-flex gl-shrink-0 md:gl-ml-auto md:gl-flex-row">
|
||||
<gl-button
|
||||
v-gl-tooltip.bottom
|
||||
category="tertiary"
|
||||
|
|
|
|||
|
|
@ -140,12 +140,12 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div class="gl-mx-auto gl-my-auto js-design-image">
|
||||
<div class="js-design-image gl-mx-auto gl-my-auto">
|
||||
<gl-icon v-if="imageError" class="gl-text-gray-200" name="media-broken" :size="48" />
|
||||
<img
|
||||
v-show="!imageError"
|
||||
ref="contentImg"
|
||||
class="gl-max-h-full gl-border"
|
||||
class="gl-border gl-max-h-full"
|
||||
:src="image"
|
||||
:alt="name"
|
||||
:style="imageStyle"
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ export default {
|
|||
<gl-avatar :alt="getAuthorName(item.author)" :size="32" :src="getAvatarUrl(item)" />
|
||||
<span class="gl-flex gl-flex-col">
|
||||
<span class="gl-font-bold">{{ versionText(item) }}</span>
|
||||
<span v-if="item.author" class="gl-text-gray-600 gl-mt-1">
|
||||
<span v-if="item.author" class="gl-mt-1 gl-text-gray-600">
|
||||
<span class="gl-block">{{ getAuthorName(item.author) }}</span>
|
||||
<time-ago
|
||||
v-if="item.createdAt"
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ export default {
|
|||
computed: {
|
||||
headerClasses() {
|
||||
return this.useH1
|
||||
? 'gl-w-full gl-font-size-h-display gl-m-0!'
|
||||
? 'gl-w-full gl-text-size-h-display !gl-m-0'
|
||||
: 'gl-font-normal sm:gl-font-bold gl-mb-1 gl-mt-0 gl-w-full';
|
||||
},
|
||||
},
|
||||
|
|
@ -65,8 +65,8 @@ export default {
|
|||
:aria-label="__('Title')"
|
||||
:data-placeholder="placeholder"
|
||||
:contenteditable="!disabled"
|
||||
class="hide-unfocused-input-decoration gl-px-4 gl-py-3 -gl-ml-4 gl-border gl-rounded-base gl-block"
|
||||
:class="{ 'gl-hover-border-gray-200 gl-pseudo-placeholder': !disabled }"
|
||||
class="hide-unfocused-input-decoration gl-border -gl-ml-4 gl-block gl-rounded-base gl-px-4 gl-py-3"
|
||||
:class="{ 'gl-pseudo-placeholder hover:gl-border-gray-200': !disabled }"
|
||||
@paste="handlePaste"
|
||||
@blur="handleBlur"
|
||||
@keyup="handleInput"
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ import TimelineEntryItem from '~/vue_shared/components/notes/timeline_entry_item
|
|||
|
||||
const ALLOWED_ICONS = ['issue-close'];
|
||||
const ICON_COLORS = {
|
||||
'issue-close': 'gl-bg-blue-100! gl-text-blue-700',
|
||||
'issue-close': '!gl-bg-blue-100 gl-text-blue-700',
|
||||
};
|
||||
|
||||
export default {
|
||||
|
|
@ -116,11 +116,11 @@ export default {
|
|||
:class="[
|
||||
getIconColor,
|
||||
{
|
||||
'gl-bg-gray-50 gl-text-gray-600 system-note-icon': isAllowedIcon,
|
||||
'system-note-tiny-dot gl-bg-gray-900!': !isAllowedIcon,
|
||||
'system-note-icon gl-bg-gray-50 gl-text-gray-600': isAllowedIcon,
|
||||
'system-note-tiny-dot !gl-bg-gray-900': !isAllowedIcon,
|
||||
},
|
||||
]"
|
||||
class="gl-float-left gl-flex gl-justify-center gl-items-center gl-rounded-full gl-relative"
|
||||
class="gl-relative gl-float-left gl-flex gl-items-center gl-justify-center gl-rounded-full"
|
||||
>
|
||||
<gl-icon v-if="isAllowedIcon" :size="12" :name="note.systemNoteIconName" />
|
||||
</div>
|
||||
|
|
@ -140,7 +140,7 @@ export default {
|
|||
variant="link"
|
||||
:icon="descriptionVersionToggleIcon"
|
||||
data-testid="compare-btn"
|
||||
class="gl-vertical-align-text-bottom gl-font-sm!"
|
||||
class="gl-align-text-bottom !gl-text-sm"
|
||||
@click="toggleDescriptionVersion"
|
||||
>{{ __('Compare with previous version') }}</gl-button
|
||||
>
|
||||
|
|
@ -148,7 +148,7 @@ export default {
|
|||
</note-header>
|
||||
</div>
|
||||
<div class="note-body">
|
||||
<div v-if="shouldShowDescriptionVersion" class="description-version gl-pt-3! gl-pl-4">
|
||||
<div v-if="shouldShowDescriptionVersion" class="description-version !gl-pt-3 gl-pl-4">
|
||||
<pre v-if="isLoadingDescriptionVersion" class="loading-state">
|
||||
<gl-skeleton-loader />
|
||||
</pre>
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div class="gl-display-inline-block gl-align-bottom">
|
||||
<div class="gl-inline-block gl-align-bottom">
|
||||
<local-storage-sync
|
||||
:value="sortFilterProp"
|
||||
:storage-key="storageKey"
|
||||
|
|
|
|||
|
|
@ -166,12 +166,12 @@ export default {
|
|||
timelineContentClass() {
|
||||
return {
|
||||
'timeline-content': true,
|
||||
'gl-border-0! gl-pl-0!': !this.addPadding,
|
||||
'!gl-border-0 !gl-pl-0': !this.addPadding,
|
||||
};
|
||||
},
|
||||
parentClass() {
|
||||
return {
|
||||
'gl-relative gl-display-flex gl-align-items-flex-start gl-flex-nowrap': !this.isEditing,
|
||||
'gl-relative gl-flex gl-items-start gl-flex-nowrap': !this.isEditing,
|
||||
};
|
||||
},
|
||||
isProjectArchived() {
|
||||
|
|
@ -190,9 +190,9 @@ export default {
|
|||
return {
|
||||
'timeline-entry note-form': this.isNewDiscussion,
|
||||
// eslint-disable-next-line @gitlab/require-i18n-strings
|
||||
'note note-wrapper note-comment discussion-reply-holder gl-border-t-0! clearfix':
|
||||
'note note-wrapper note-comment discussion-reply-holder !gl-border-t-0 clearfix':
|
||||
!this.isNewDiscussion,
|
||||
'gl-pt-0! is-replying': this.isEditing,
|
||||
'!gl-pt-0 is-replying': this.isEditing,
|
||||
'internal-note': this.isInternalThread,
|
||||
};
|
||||
},
|
||||
|
|
|
|||
|
|
@ -230,9 +230,9 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div class="timeline-discussion-body gl-overflow-visible!">
|
||||
<div class="note-body gl-p-0! gl-overflow-visible!">
|
||||
<form class="common-note-form gfm-form js-main-target-form gl-flex-grow-1 new-note">
|
||||
<div class="timeline-discussion-body !gl-overflow-visible">
|
||||
<div class="note-body !gl-overflow-visible !gl-p-0">
|
||||
<form class="common-note-form gfm-form js-main-target-form new-note gl-grow">
|
||||
<comment-field-layout
|
||||
:with-alert-container="isWorkItemConfidential"
|
||||
:noteable-data="getWorkItemData"
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div class="issuable-note-warning gl-relative gl-py-4 gl-rounded-base">
|
||||
<div class="issuable-note-warning gl-relative gl-rounded-base gl-py-4">
|
||||
<gl-icon name="lock" class="gl-mr-2" />
|
||||
<template v-if="isProjectArchived">
|
||||
{{ $options.constantOptions.projectArchivedWarning }}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ export default {
|
|||
<template>
|
||||
<li class="timeline-entry note note-wrapper discussion-filter-note">
|
||||
<div
|
||||
class="gl-float-left gl-flex gl-justify-center gl-items-center gl-rounded-full -gl-mt-1 gl-ml-2 gl-w-6 gl-h-6 gl-bg-gray-50 gl-text-gray-600"
|
||||
class="gl-float-left -gl-mt-1 gl-ml-2 gl-flex gl-h-6 gl-w-6 gl-items-center gl-justify-center gl-rounded-full gl-bg-gray-50 gl-text-gray-600"
|
||||
>
|
||||
<gl-icon name="comment" />
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -351,7 +351,7 @@ export default {
|
|||
:is-discussion-resolvable="isDiscussionResolvable"
|
||||
:has-replies="hasReplies"
|
||||
:full-path="fullPath"
|
||||
class="gl-pl-3 gl-mt-3"
|
||||
class="gl-mt-3 gl-pl-3"
|
||||
@cancelEditing="isEditing = false"
|
||||
@toggleResolveDiscussion="$emit('resolve')"
|
||||
@submitForm="updateNote"
|
||||
|
|
|
|||
|
|
@ -29,6 +29,6 @@ export default {
|
|||
<template>
|
||||
<div
|
||||
v-safe-html="signedOutText"
|
||||
class="disabled-comment gl-text-center gl-text-secondary gl-relative"
|
||||
class="disabled-comment gl-relative gl-text-center gl-text-secondary"
|
||||
></div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
headerClasses() {
|
||||
return this.useH2 ? 'gl-font-size-h1 gl-m-0' : 'gl-font-base gl-m-0';
|
||||
return this.useH2 ? 'gl-text-size-h1 gl-m-0' : 'gl-text-base gl-m-0';
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
|
|
@ -65,13 +65,11 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="gl-display-flex gl-justify-content-space-between gl-flex-wrap gl-pb-3 gl-align-items-center"
|
||||
>
|
||||
<div class="gl-flex gl-flex-wrap gl-items-center gl-justify-between gl-pb-3">
|
||||
<component :is="useH2 ? 'h2' : 'h3'" :class="headerClasses">{{
|
||||
$options.i18n.activityLabel
|
||||
}}</component>
|
||||
<div class="gl-display-flex gl-gap-3">
|
||||
<div class="gl-flex gl-gap-3">
|
||||
<work-item-activity-sort-filter
|
||||
:work-item-type="workItemType"
|
||||
:loading="disableActivityFilterSort"
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ export default {
|
|||
|
||||
<template>
|
||||
<div
|
||||
class="item-body work-item-link-child gl-relative gl-display-flex gl-flex-grow-1 gl-break-words gl-hyphens-auto gl-min-w-0 gl-rounded-base gl-p-3 gl-gap-3"
|
||||
class="item-body work-item-link-child gl-relative gl-flex gl-min-w-0 gl-grow gl-gap-3 gl-hyphens-auto gl-break-words gl-rounded-base gl-p-3"
|
||||
data-testid="links-child"
|
||||
>
|
||||
<div ref="stateIcon" class="gl-cursor-help">
|
||||
|
|
@ -157,8 +157,8 @@ export default {
|
|||
{{ childItemType }}
|
||||
</gl-tooltip>
|
||||
</div>
|
||||
<div class="gl-display-flex gl-flex-direction-column gl-flex-grow-1 gl-flex-wrap gl-min-w-0">
|
||||
<div class="gl-flex gl-justify-between gl-gap-3 gl-min-w-0 gl-mb-2">
|
||||
<div class="gl-flex gl-min-w-0 gl-grow gl-flex-col gl-flex-wrap">
|
||||
<div class="gl-mb-2 gl-flex gl-min-w-0 gl-justify-between gl-gap-3">
|
||||
<div class="item-title gl-min-w-0">
|
||||
<span v-if="childItem.confidential">
|
||||
<gl-icon
|
||||
|
|
@ -172,7 +172,7 @@ export default {
|
|||
</span>
|
||||
<gl-link
|
||||
:href="childItem.webUrl"
|
||||
class="gl-break-words gl-hyphens-auto gl-font-semibold"
|
||||
class="gl-hyphens-auto gl-break-words gl-font-semibold"
|
||||
@click.exact="$emit('click', $event)"
|
||||
@mouseover="$emit('mouseover')"
|
||||
@mouseout="$emit('mouseout')"
|
||||
|
|
@ -180,7 +180,7 @@ export default {
|
|||
{{ childItem.title }}
|
||||
</gl-link>
|
||||
</div>
|
||||
<div class="gl-display-flex gl-justify-content-end">
|
||||
<div class="gl-flex gl-justify-end">
|
||||
<gl-avatars-inline
|
||||
v-if="assignees.length"
|
||||
:avatars="assignees"
|
||||
|
|
@ -189,7 +189,7 @@ export default {
|
|||
:avatar-size="16"
|
||||
badge-tooltip-prop="name"
|
||||
:badge-sr-only-text="assigneesCollapsedTooltip"
|
||||
class="gl-whitespace-nowrap gl-mr-3"
|
||||
class="gl-mr-3 gl-whitespace-nowrap"
|
||||
>
|
||||
<template #avatar="{ avatar }">
|
||||
<gl-avatar-link v-gl-tooltip :href="avatar.webUrl" :title="avatar.name">
|
||||
|
|
@ -221,7 +221,7 @@ export default {
|
|||
:metadata-widgets="metadataWidgets"
|
||||
class="ml-xl-0"
|
||||
/>
|
||||
<div v-if="displayLabels" class="gl-display-flex gl-flex-wrap">
|
||||
<div v-if="displayLabels" class="gl-flex gl-flex-wrap">
|
||||
<gl-label
|
||||
v-for="label in labels"
|
||||
:key="label.id"
|
||||
|
|
@ -229,7 +229,7 @@ export default {
|
|||
:background-color="label.color"
|
||||
:description="label.description"
|
||||
:scoped="showScopedLabel(label)"
|
||||
class="gl-mt-2 gl-mr-2 gl-mb-auto"
|
||||
class="gl-mb-auto gl-mr-2 gl-mt-2"
|
||||
tooltip-placement="top"
|
||||
/>
|
||||
</div>
|
||||
|
|
@ -237,7 +237,7 @@ export default {
|
|||
<div v-if="canUpdate">
|
||||
<gl-button
|
||||
v-gl-tooltip
|
||||
class="-gl-mt-2 -gl-mr-2"
|
||||
class="-gl-mr-2 -gl-mt-2"
|
||||
category="tertiary"
|
||||
size="small"
|
||||
icon="close"
|
||||
|
|
|
|||
|
|
@ -36,13 +36,13 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div class="gl-display-flex gl-justify-content-space-between">
|
||||
<div class="gl-display-flex gl-flex-wrap gl-gap-2 gl-align-items-center">
|
||||
<span class="gl-text-secondary gl-font-sm">{{ reference }}</span>
|
||||
<div class="gl-flex gl-justify-between">
|
||||
<div class="gl-flex gl-flex-wrap gl-items-center gl-gap-2">
|
||||
<span class="gl-text-sm gl-text-secondary">{{ reference }}</span>
|
||||
<item-milestone
|
||||
v-if="milestone"
|
||||
:milestone="milestone"
|
||||
class="gl-display-flex gl-align-items-center gl-max-w-15 gl-font-sm gl-leading-normal gl-text-gray-900! gl-cursor-help! gl-text-decoration-none!"
|
||||
class="gl-flex gl-max-w-15 !gl-cursor-help gl-items-center gl-text-sm gl-leading-normal !gl-text-gray-900 !gl-no-underline"
|
||||
/>
|
||||
<slot name="left-metadata"></slot>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -104,7 +104,12 @@ export default {
|
|||
@action="$emit('toggle-show-labels')"
|
||||
>
|
||||
<template #list-item>
|
||||
<gl-toggle :value="showLabels" :label="$options.i18n.showLabels" label-position="left" />
|
||||
<gl-toggle
|
||||
:value="showLabels"
|
||||
:label="$options.i18n.showLabels"
|
||||
class="gl-justify-between"
|
||||
label-position="left"
|
||||
/>
|
||||
</template>
|
||||
</gl-disclosure-dropdown-item>
|
||||
|
||||
|
|
|
|||
|
|
@ -185,9 +185,9 @@ export default {
|
|||
|
||||
<template>
|
||||
<div>
|
||||
<div class="gl-display-flex gl-align-items-center gl-gap-3">
|
||||
<div class="gl-flex gl-items-center gl-gap-3">
|
||||
<!-- hide header when editing, since we then have a form label. Keep it reachable for screenreader nav -->
|
||||
<h3 :class="{ 'gl-sr-only': isEditing }" class="gl-mb-0! gl-heading-5">
|
||||
<h3 :class="{ 'gl-sr-only': isEditing }" class="gl-heading-5 !gl-mb-0">
|
||||
{{ dropdownLabel }}
|
||||
</h3>
|
||||
<gl-loading-icon v-if="updateInProgress" />
|
||||
|
|
@ -196,15 +196,15 @@ export default {
|
|||
data-testid="edit-button"
|
||||
category="tertiary"
|
||||
size="small"
|
||||
class="gl-ml-auto shortcut-sidebar-dropdown-toggle"
|
||||
class="shortcut-sidebar-dropdown-toggle gl-ml-auto"
|
||||
:disabled="updateInProgress"
|
||||
@click="isEditing = true"
|
||||
>{{ $options.i18n.editButtonLabel }}</gl-button
|
||||
>
|
||||
</div>
|
||||
<gl-form v-if="isEditing">
|
||||
<div class="gl-display-flex gl-justify-content-space-between gl-align-items-center">
|
||||
<label :for="inputId" class="gl-mb-0! gl-heading-5">{{ dropdownLabel }}</label>
|
||||
<div class="gl-flex gl-items-center gl-justify-between">
|
||||
<label :for="inputId" class="gl-heading-5 !gl-mb-0">{{ dropdownLabel }}</label>
|
||||
<gl-button
|
||||
data-testid="apply-button"
|
||||
category="tertiary"
|
||||
|
|
@ -245,7 +245,7 @@ export default {
|
|||
<slot name="list-item" :item="item">{{ item.text }}</slot>
|
||||
</template>
|
||||
<template v-if="showFooter" #footer>
|
||||
<div class="gl-border-t-solid gl-border-t-1 gl-border-t-gray-200 gl-p-2!">
|
||||
<div class="gl-border-t-1 gl-border-t-gray-200 !gl-p-2 gl-border-t-solid">
|
||||
<slot name="footer"></slot>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ export default {
|
|||
searchStarted: false,
|
||||
error: '',
|
||||
textInputAttrs: {
|
||||
class: 'gl-min-w-fit-content!',
|
||||
class: '!gl-min-w-fit',
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
@ -190,7 +190,7 @@ export default {
|
|||
return input;
|
||||
}
|
||||
|
||||
return highlighter(`<span class="gl-text-black-normal">${input}</span>`, this.searchTerm);
|
||||
return highlighter(`<span class="gl-text-default">${input}</span>`, this.searchTerm);
|
||||
},
|
||||
unsetError() {
|
||||
this.error = '';
|
||||
|
|
@ -220,7 +220,7 @@ export default {
|
|||
:dropdown-items="availableWorkItems"
|
||||
:loading="isLoading"
|
||||
:placeholder="$options.i18n.addInputPlaceholder"
|
||||
menu-class="gl-dropdown-menu-wide dropdown-reduced-height gl-min-h-7!"
|
||||
menu-class="gl-dropdown-menu-wide dropdown-reduced-height !gl-min-h-7"
|
||||
:container-class="tokenSelectorContainerClass"
|
||||
data-testid="work-item-token-select-input"
|
||||
:text-input-attrs="textInputAttrs"
|
||||
|
|
@ -234,12 +234,12 @@ export default {
|
|||
>
|
||||
<template #token-content="{ token }"> {{ token.iid }} {{ token.title }} </template>
|
||||
<template #dropdown-item-content="{ dropdownItem }">
|
||||
<div class="gl-display-flex">
|
||||
<div class="gl-flex">
|
||||
<div
|
||||
v-safe-html="formatResults(dropdownItem.iid)"
|
||||
class="gl-text-secondary gl-font-sm gl-mr-4"
|
||||
class="gl-mr-4 gl-text-sm gl-text-secondary"
|
||||
></div>
|
||||
<div v-safe-html="formatResults(dropdownItem.title)" class="gl-text-truncate"></div>
|
||||
<div v-safe-html="formatResults(dropdownItem.title)" class="gl-truncate"></div>
|
||||
</div>
|
||||
</template>
|
||||
<template #no-results-content>
|
||||
|
|
|
|||
|
|
@ -67,11 +67,7 @@ export default {
|
|||
<div class="gl-new-card-title-wrapper">
|
||||
<h2 class="gl-new-card-title">
|
||||
<div aria-hidden="true">
|
||||
<gl-link
|
||||
:id="anchorLinkId"
|
||||
class="gl-text-decoration-none gl-hidden"
|
||||
:href="anchorLink"
|
||||
/>
|
||||
<gl-link :id="anchorLinkId" class="gl-hidden gl-no-underline" :href="anchorLink" />
|
||||
</div>
|
||||
<slot name="header"></slot>
|
||||
</h2>
|
||||
|
|
|
|||
|
|
@ -393,15 +393,15 @@ export default {
|
|||
>
|
||||
<template v-if="$options.isLoggedIn && !hideSubscribe">
|
||||
<gl-disclosure-dropdown-item
|
||||
class="gl-display-flex gl-justify-content-end gl-w-full"
|
||||
class="gl-flex gl-w-full gl-justify-end"
|
||||
:data-testid="$options.notificationsToggleFormTestId"
|
||||
>
|
||||
<template #list-item>
|
||||
<gl-toggle
|
||||
:value="subscribedToNotifications"
|
||||
:label="$options.i18n.notifications"
|
||||
class="work-item-dropdown-toggle"
|
||||
label-position="left"
|
||||
class="work-item-dropdown-toggle gl-justify-between"
|
||||
@change="toggleNotifications($event)"
|
||||
/>
|
||||
</template>
|
||||
|
|
@ -483,7 +483,7 @@ export default {
|
|||
@action="handleDelete"
|
||||
>
|
||||
<template #list-item>
|
||||
<span class="gl-text-danger gl-font-bold">{{ i18n.deleteWorkItem }}</span>
|
||||
<span class="gl-font-bold gl-text-danger">{{ i18n.deleteWorkItem }}</span>
|
||||
</template>
|
||||
</gl-disclosure-dropdown-item>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -86,11 +86,9 @@ export default {
|
|||
<template>
|
||||
<div
|
||||
v-gl-resize-observer="handleResize"
|
||||
class="disclosure-hierarchy gl-relative gl-display-flex gl-flex-grow-2 gl-min-w-0"
|
||||
class="disclosure-hierarchy gl-relative gl-flex gl-min-w-0 gl-flex-grow-2"
|
||||
>
|
||||
<ul
|
||||
class="gl-p-0 gl-m-0 gl-relative gl-list-none gl-inline-flex gl-flex-direction-row gl-max-w-full"
|
||||
>
|
||||
<ul class="gl-relative gl-m-0 gl-inline-flex gl-max-w-full gl-list-none gl-flex-row gl-p-0">
|
||||
<template v-if="withEllipsis || isMobile">
|
||||
<disclosure-hierarchy-item v-if="!isMobile" :item="firstItem" :item-id="itemId(0)">
|
||||
<slot :item="firstItem" :item-id="itemId(0)"></slot>
|
||||
|
|
@ -103,15 +101,15 @@ export default {
|
|||
class="disclosure-hierarchy-button"
|
||||
:aria-label="ellipsisTooltipLabel"
|
||||
>
|
||||
<gl-icon name="ellipsis_h" class="gl-ml-3 gl-text-gray-600 gl-z-200" />
|
||||
<gl-icon name="ellipsis_h" class="gl-z-200 gl-ml-3 gl-text-gray-600" />
|
||||
</button>
|
||||
</template>
|
||||
<template #list-item="{ item }">
|
||||
<span class="gl-display-flex">
|
||||
<span class="gl-flex">
|
||||
<gl-icon
|
||||
v-if="item.icon"
|
||||
:name="item.icon"
|
||||
class="gl-mr-3 gl-align-middle gl-text-gray-600 gl-flex-shrink-0"
|
||||
class="gl-mr-3 gl-shrink-0 gl-align-middle gl-text-gray-600"
|
||||
/>
|
||||
{{ item.title }}
|
||||
</span>
|
||||
|
|
|
|||
|
|
@ -41,19 +41,19 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<li class="disclosure-hierarchy-item gl-display-flex gl-min-w-0">
|
||||
<li class="disclosure-hierarchy-item gl-flex gl-min-w-0">
|
||||
<gl-link
|
||||
:id="itemId"
|
||||
:href="item.webUrl"
|
||||
class="disclosure-hierarchy-button gl-text-gray-900 gl-hover-text-decoration-none gl-active-text-decoration-none!"
|
||||
class="disclosure-hierarchy-button gl-text-gray-900 hover:gl-no-underline active:!gl-no-underline"
|
||||
:class="{ 'gl-cursor-help': item.ancestorNotAvailable }"
|
||||
>
|
||||
<gl-icon
|
||||
v-if="shouldDisplayIcon(item.icon)"
|
||||
:name="item.icon"
|
||||
class="gl-mx-2 gl-text-gray-600 gl-flex-shrink-0"
|
||||
class="gl-mx-2 gl-shrink-0 gl-text-gray-600"
|
||||
/>
|
||||
<span class="gl-z-200 gl-text-truncate">{{ item.title }}</span>
|
||||
<span class="gl-z-200 gl-truncate">{{ item.title }}</span>
|
||||
</gl-link>
|
||||
<!--
|
||||
@slot Additional content to be displayed in an item.
|
||||
|
|
|
|||
|
|
@ -338,23 +338,23 @@ export default {
|
|||
<sidebar-participant v-if="item" :user="item" />
|
||||
</template>
|
||||
<template v-if="canInviteMembers" #footer>
|
||||
<gl-button category="tertiary" block class="gl-justify-content-start!">
|
||||
<gl-button category="tertiary" block class="!gl-justify-start">
|
||||
<invite-members-trigger
|
||||
:display-text="__('Invite members')"
|
||||
trigger-element="side-nav"
|
||||
icon="plus"
|
||||
trigger-source="work-item-assignees"
|
||||
classes="gl-hover-text-decoration-none! gl-pb-2"
|
||||
classes="hover:!gl-no-underline gl-pb-2"
|
||||
/>
|
||||
</gl-button>
|
||||
</template>
|
||||
<template #none>
|
||||
<div class="gl-display-flex gl-align-items-center gl-text-gray-500 gl-gap-2">
|
||||
<div class="gl-flex gl-items-center gl-gap-2 gl-text-gray-500">
|
||||
<span>{{ __('None') }}</span>
|
||||
<template v-if="currentUser && canUpdate">
|
||||
<span>-</span>
|
||||
<gl-button variant="link" data-testid="assign-self" @click.stop="assignToCurrentUser"
|
||||
><span class="gl-text-gray-500 gl-hover-text-blue-800">{{
|
||||
><span class="gl-text-gray-500 hover:gl-text-blue-800">{{
|
||||
__('assign yourself')
|
||||
}}</span></gl-button
|
||||
>
|
||||
|
|
@ -364,7 +364,7 @@ export default {
|
|||
<template #readonly>
|
||||
<uncollapsed-assignee-list
|
||||
:users="localAssignees"
|
||||
show-less-assignees-class="gl-hover-bg-transparent!"
|
||||
show-less-assignees-class="hover:!gl-bg-transparent"
|
||||
/>
|
||||
</template>
|
||||
</work-item-sidebar-dropdown-widget>
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ export default {
|
|||
<div class="work-item-attributes-wrapper">
|
||||
<template v-if="workItemAssignees">
|
||||
<work-item-assignees
|
||||
class="gl-mb-5 js-assignee"
|
||||
class="js-assignee gl-mb-5"
|
||||
:can-update="canUpdate"
|
||||
:full-path="fullPath"
|
||||
:work-item-id="workItem.id"
|
||||
|
|
@ -209,7 +209,7 @@ export default {
|
|||
</template>
|
||||
<template v-if="workItemLabels">
|
||||
<work-item-labels
|
||||
class="gl-mb-5 js-labels"
|
||||
class="js-labels gl-mb-5"
|
||||
:can-update="canUpdate"
|
||||
:full-path="fullPath"
|
||||
:work-item-id="workItem.id"
|
||||
|
|
@ -247,7 +247,7 @@ export default {
|
|||
</template>
|
||||
<template v-if="workItemMilestone">
|
||||
<work-item-milestone
|
||||
class="gl-mb-5 js-milestone"
|
||||
class="js-milestone gl-mb-5"
|
||||
:full-path="fullPath"
|
||||
:work-item-id="workItem.id"
|
||||
:work-item-milestone="workItemMilestone.milestone"
|
||||
|
|
@ -316,7 +316,7 @@ export default {
|
|||
</template>
|
||||
<template v-if="workItemHierarchy && showParent">
|
||||
<work-item-parent
|
||||
class="gl-mb-5 gl-pt-5 gl-border-t gl-border-gray-50"
|
||||
class="gl-border-t gl-mb-5 gl-border-gray-50 gl-pt-5"
|
||||
:can-update="canUpdate"
|
||||
:work-item-id="workItem.id"
|
||||
:work-item-type="workItemType"
|
||||
|
|
@ -334,7 +334,7 @@ export default {
|
|||
/>
|
||||
<work-item-time-tracking
|
||||
v-if="workItemTimeTracking"
|
||||
class="gl-mb-5 gl-pt-5 gl-border-t gl-border-gray-50"
|
||||
class="gl-border-t gl-mb-5 gl-border-gray-50 gl-pt-5"
|
||||
:can-update="canUpdate"
|
||||
:time-estimate="workItemTimeTracking.timeEstimate"
|
||||
:timelogs="workItemTimeTracking.timelogs.nodes"
|
||||
|
|
@ -345,7 +345,7 @@ export default {
|
|||
/>
|
||||
<participants
|
||||
v-if="workItemParticipants.length"
|
||||
class="gl-mb-5 gl-pt-5 gl-border-t gl-border-gray-50"
|
||||
class="gl-border-t gl-mb-5 gl-border-gray-50 gl-pt-5"
|
||||
:participants="workItemParticipants"
|
||||
/>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<div class="gl-mb-3 gl-text-gray-700 gl-mt-3">
|
||||
<div class="gl-mb-3 gl-mt-3 gl-text-gray-700">
|
||||
<work-item-state-badge v-if="workItemState" :work-item-state="workItemState" />
|
||||
<gl-loading-icon v-if="updateInProgress" inline />
|
||||
<confidentiality-badge
|
||||
|
|
@ -109,7 +109,7 @@ export default {
|
|||
</template>
|
||||
<template #author>
|
||||
<gl-avatar-link
|
||||
class="js-user-link gl-text-body gl-font-bold"
|
||||
class="js-user-link gl-font-bold gl-text-primary"
|
||||
:title="author.name"
|
||||
:data-user-id="authorId"
|
||||
:href="author.webUrl"
|
||||
|
|
|
|||
|
|
@ -269,13 +269,13 @@ export default {
|
|||
@updateValue="updateItems"
|
||||
>
|
||||
<template #readonly>
|
||||
<div class="gl-gap-2 gl-mt-1">
|
||||
<div class="gl-mt-1 gl-gap-2">
|
||||
<div
|
||||
v-for="[organizationName, contacts] in selectedOrganizations"
|
||||
:key="organizationName"
|
||||
data-testid="organization"
|
||||
>
|
||||
<div class="gl-text-secondary gl-mt-3">{{ organizationName }}</div>
|
||||
<div class="gl-mt-3 gl-text-secondary">{{ organizationName }}</div>
|
||||
<div
|
||||
v-for="contact in contacts"
|
||||
:id="`contact_container_${contact.id}`"
|
||||
|
|
|
|||
|
|
@ -310,7 +310,7 @@ export default {
|
|||
@keydown.meta.enter="updateWorkItem"
|
||||
@keydown.ctrl.enter="updateWorkItem"
|
||||
/>
|
||||
<div class="gl-display-flex">
|
||||
<div class="gl-flex">
|
||||
<gl-alert v-if="hasConflicts" :dismissible="false" variant="danger" class="gl-w-full">
|
||||
<p>
|
||||
{{
|
||||
|
|
|
|||
|
|
@ -315,7 +315,7 @@ export default {
|
|||
<div
|
||||
v-else
|
||||
ref="description"
|
||||
class="work-item-description description md gl-clearfix gl-relative"
|
||||
class="work-item-description description md gl-relative gl-clearfix"
|
||||
>
|
||||
<div
|
||||
ref="gfm-content"
|
||||
|
|
@ -329,7 +329,7 @@ export default {
|
|||
class="description-more gl-block gl-w-full"
|
||||
data-test-id="description-read-more"
|
||||
>
|
||||
<div class="show-all-btn gl-w-full gl-flex gl-justify-center gl-items-center">
|
||||
<div class="show-all-btn gl-flex gl-w-full gl-items-center gl-justify-center">
|
||||
<gl-button
|
||||
variant="confirm"
|
||||
category="tertiary"
|
||||
|
|
|
|||
|
|
@ -568,7 +568,7 @@ export default {
|
|||
:svg-path="$options.noAccessSvg"
|
||||
/>
|
||||
<div v-else data-testid="detail-wrapper">
|
||||
<div class="gl-block sm:!gl-flex gl-items-start gl-flex-row gl-gap-3">
|
||||
<div class="gl-block gl-flex-row gl-items-start gl-gap-3 sm:!gl-flex">
|
||||
<work-item-ancestors v-if="shouldShowAncestors" :work-item="workItem" class="gl-mb-1" />
|
||||
<div v-if="!error" :class="titleClassHeader" data-testid="work-item-type">
|
||||
<work-item-title
|
||||
|
|
@ -581,7 +581,7 @@ export default {
|
|||
@error="updateError = $event"
|
||||
/>
|
||||
</div>
|
||||
<div class="gl-flex gl-self-start gl-ml-auto gl-gap-3 gl-mt-1">
|
||||
<div class="gl-ml-auto gl-mt-1 gl-flex gl-gap-3 gl-self-start">
|
||||
<gl-button
|
||||
v-if="shouldShowEditButton"
|
||||
category="secondary"
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ export default {
|
|||
hide-footer
|
||||
size="lg"
|
||||
:modal-id="$options.WORK_ITEM_DETAIL_MODAL_ID"
|
||||
header-class="gl-p-0 gl-pb-2!"
|
||||
header-class="gl-p-0 !gl-pb-2"
|
||||
scrollable
|
||||
:title="$options.i18n.modalTitle"
|
||||
:data-testid="$options.WORK_ITEM_DETAIL_MODAL_ID"
|
||||
|
|
@ -139,7 +139,7 @@ export default {
|
|||
:work-item-id="workItemId"
|
||||
:work-item-iid="displayedWorkItemIid"
|
||||
:modal-work-item-full-path="workItemFullPath"
|
||||
class="gl-p-5 -gl-mt-3 gl-bg-inherit gl-isolate"
|
||||
class="gl-isolate -gl-mt-3 gl-bg-inherit gl-p-5"
|
||||
@close="hide"
|
||||
@deleteWorkItem="deleteWorkItem"
|
||||
@update-modal="updateModal"
|
||||
|
|
|
|||
|
|
@ -140,17 +140,17 @@ export default {
|
|||
<template>
|
||||
<div>
|
||||
<gl-loading-icon v-if="isLoading" class="gl-my-2" />
|
||||
<div v-if="shouldShowDevWidget" class="gl-border-t gl-border-gray-50 gl-mb-5 gl-pt-5">
|
||||
<div class="gl-flex gl-items-center gl-gap-3 gl-justify-between">
|
||||
<div v-if="shouldShowDevWidget" class="gl-border-t gl-mb-5 gl-border-gray-50 gl-pt-5">
|
||||
<div class="gl-flex gl-items-center gl-justify-between gl-gap-3">
|
||||
<h3
|
||||
class="!gl-mb-0 gl-heading-5 gl-flex gl-items-center gl-gap-2"
|
||||
class="gl-heading-5 !gl-mb-0 gl-flex gl-items-center gl-gap-2"
|
||||
data-testid="dev-widget-label"
|
||||
>
|
||||
{{ $options.i18n.development }}
|
||||
<gl-button
|
||||
v-if="showAutoCloseInformation"
|
||||
v-gl-tooltip
|
||||
class="hover:!gl-bg-transparent !gl-p-0"
|
||||
class="!gl-p-0 hover:!gl-bg-transparent"
|
||||
category="tertiary"
|
||||
:title="tooltipText"
|
||||
:aria-label="tooltipText"
|
||||
|
|
|
|||
|
|
@ -61,10 +61,10 @@ export default {
|
|||
};
|
||||
</script>
|
||||
<template>
|
||||
<div class="gl-flex gl-items-center gl-justify-between gl-gap-2 gl-mb-2">
|
||||
<div class="gl-mb-2 gl-flex gl-items-center gl-justify-between gl-gap-2">
|
||||
<gl-link
|
||||
:href="mergeRequest.webUrl"
|
||||
class="gfm-merge_request gl-text-gray-900 hover:gl-text-gray-900 hover:gl-underline gl-truncate"
|
||||
class="gfm-merge_request gl-truncate gl-text-gray-900 hover:gl-text-gray-900 hover:gl-underline"
|
||||
data-reference-type="merge_request"
|
||||
:data-project-path="projectPath"
|
||||
:data-iid="mergeRequest.iid"
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ export default {
|
|||
</script>
|
||||
<template>
|
||||
<div>
|
||||
<ul ref="list-body" class="gl-list-none gl-m-0 gl-p-0" data-testid="work-item-dev-items-list">
|
||||
<ul ref="list-body" class="gl-m-0 gl-list-none gl-p-0" data-testid="work-item-dev-items-list">
|
||||
<li v-for="item in uncollapsedItems" :key="itemId(item)" class="gl-mr-3">
|
||||
<component :is="itemComponent(item)" :merge-request="itemObject(item)" />
|
||||
</li>
|
||||
|
|
|
|||
|
|
@ -73,12 +73,12 @@ export default {
|
|||
:open="open"
|
||||
data-testid="work-item-drawer"
|
||||
header-height="calc(var(--top-bar-height) + var(--performance-bar-height))"
|
||||
class="gl-w-full gl-sm-w-40p gl-leading-reset"
|
||||
class="gl-w-full gl-leading-reset sm:gl-w-4/10"
|
||||
@close="$emit('close')"
|
||||
>
|
||||
<template #title>
|
||||
<gl-link
|
||||
class="gl-text-black-normal"
|
||||
class="gl-text-default"
|
||||
:href="activeItem.webUrl"
|
||||
@click.prevent="redirectToWorkItem"
|
||||
>{{ __('Open full view') }}</gl-link
|
||||
|
|
@ -90,7 +90,7 @@ export default {
|
|||
:work-item-iid="activeItem.iid"
|
||||
:modal-work-item-full-path="activeItemFullPath"
|
||||
is-drawer
|
||||
class="gl-pt-0! work-item-drawer"
|
||||
class="work-item-drawer !gl-pt-0"
|
||||
@deleteWorkItem="deleteWorkItem"
|
||||
v-on="$listeners"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -218,8 +218,8 @@ export default {
|
|||
|
||||
<template>
|
||||
<section class="gl-pb-4" data-testid="work-item-start-due-dates">
|
||||
<div class="gl-display-flex gl-align-items-center gl-gap-3">
|
||||
<h3 :class="{ 'gl-sr-only': isEditing }" class="gl-mb-0! gl-heading-5">
|
||||
<div class="gl-flex gl-items-center gl-gap-3">
|
||||
<h3 :class="{ 'gl-sr-only': isEditing }" class="gl-heading-5 !gl-mb-0">
|
||||
{{ $options.i18n.dates }}
|
||||
</h3>
|
||||
<gl-button
|
||||
|
|
@ -234,8 +234,8 @@ export default {
|
|||
>
|
||||
</div>
|
||||
<fieldset v-if="isEditing" data-testid="datepicker-wrapper">
|
||||
<div class="gl-display-flex gl-justify-content-space-between gl-align-items-center">
|
||||
<legend class="gl-mb-0 gl-border-b-0 gl-font-bold gl-font-base">
|
||||
<div class="gl-flex gl-items-center gl-justify-between">
|
||||
<legend class="gl-mb-0 gl-border-b-0 gl-text-base gl-font-bold">
|
||||
{{ $options.i18n.dates }}
|
||||
</legend>
|
||||
<gl-button
|
||||
|
|
@ -247,12 +247,15 @@ export default {
|
|||
>{{ __('Apply') }}</gl-button
|
||||
>
|
||||
</div>
|
||||
<div v-outside="collapseWidget" class="gl-display-flex gl-pt-2">
|
||||
<div
|
||||
v-outside="collapseWidget"
|
||||
class="gl-flex gl-flex-wrap gl-gap-2 gl-pt-2 md:gl-flex-nowrap"
|
||||
>
|
||||
<gl-form-group
|
||||
class="gl-m-0"
|
||||
:label="$options.i18n.startDate"
|
||||
:label-for="$options.startDateInputId"
|
||||
label-class="!gl-font-normal gl-pb-2!"
|
||||
label-class="!gl-font-normal !gl-pb-2"
|
||||
>
|
||||
<gl-datepicker
|
||||
ref="startDatePicker"
|
||||
|
|
@ -269,10 +272,10 @@ export default {
|
|||
/>
|
||||
</gl-form-group>
|
||||
<gl-form-group
|
||||
class="gl-m-0 gl-pl-3 gl-pr-2"
|
||||
class="gl-m-0"
|
||||
:label="$options.i18n.dueDate"
|
||||
:label-for="$options.dueDateInputId"
|
||||
label-class="!gl-font-normal gl-pb-2!"
|
||||
label-class="!gl-font-normal !gl-pb-2"
|
||||
>
|
||||
<gl-datepicker
|
||||
v-model="dirtyDueDate"
|
||||
|
|
@ -297,7 +300,7 @@ export default {
|
|||
{{ startDateValue }}
|
||||
</span>
|
||||
</p>
|
||||
<p class="gl-m-0 gl-pt-1 gl-pb-3">
|
||||
<p class="gl-m-0 gl-pb-3 gl-pt-1">
|
||||
{{ $options.i18n.dueDate }}:
|
||||
<span data-testid="due-date-value" :class="{ 'gl-text-secondary': !dueDate }">
|
||||
{{ dueDateValue }}
|
||||
|
|
|
|||
|
|
@ -338,12 +338,12 @@ export default {
|
|||
<span
|
||||
:style="{ background: item.color }"
|
||||
:class="{ 'gl-border gl-border-white': isSelected(item.value) }"
|
||||
class="gl-inline-block gl-rounded gl-mr-1 gl-w-5 gl-h-3 gl-align-middle -gl-mt-1"
|
||||
class="gl-rounded -gl-mt-1 gl-mr-1 gl-inline-block gl-h-3 gl-w-5 gl-align-middle"
|
||||
></span>
|
||||
{{ item.text }}
|
||||
</template>
|
||||
<template #readonly>
|
||||
<div class="gl-flex gl-gap-2 gl-flex-wrap gl-mt-1">
|
||||
<div class="gl-mt-1 gl-flex gl-flex-wrap gl-gap-2">
|
||||
<gl-label
|
||||
v-for="label in localLabels"
|
||||
:key="label.id"
|
||||
|
|
@ -369,7 +369,7 @@ export default {
|
|||
{{ createLabelText }}
|
||||
</gl-button>
|
||||
<gl-button
|
||||
class="!gl-justify-start !gl-mt-2"
|
||||
class="!gl-mt-2 !gl-justify-start"
|
||||
block
|
||||
category="tertiary"
|
||||
:href="labelsManagePath"
|
||||
|
|
@ -386,7 +386,7 @@ export default {
|
|||
:toggle-text="dropdownText"
|
||||
>
|
||||
<div
|
||||
class="gl-text-sm gl-font-bold gl-leading-24 gl-border-b gl-pt-2 gl-pb-3 gl-pl-4 gl-mb-4"
|
||||
class="gl-border-b gl-mb-4 gl-pb-3 gl-pl-4 gl-pt-2 gl-text-sm gl-font-bold gl-leading-24"
|
||||
>
|
||||
{{ __('Create label') }}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -283,7 +283,7 @@ export default {
|
|||
v-bind="treeRootOptions"
|
||||
class="content-list"
|
||||
data-testid="child-items-container"
|
||||
:class="{ 'gl-cursor-grab sortable-container': canReorder, 'disabled-content': disableList }"
|
||||
:class="{ 'sortable-container gl-cursor-grab': canReorder, 'disabled-content': disableList }"
|
||||
@end="handleDragOnEnd"
|
||||
>
|
||||
<work-item-link-child
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ export default {
|
|||
childItemClass() {
|
||||
return {
|
||||
'gl-ml-5': !this.hasChildren,
|
||||
'gl-ml-0!': this.hasChildren || (!this.hasIndirectChildren && this.isTopLevel),
|
||||
'!gl-ml-0': this.hasChildren || (!this.hasIndirectChildren && this.isTopLevel),
|
||||
};
|
||||
},
|
||||
},
|
||||
|
|
@ -269,8 +269,8 @@ export default {
|
|||
</script>
|
||||
|
||||
<template>
|
||||
<li class="tree-item gl-p-0! gl-border-bottom-0!">
|
||||
<div class="gl-display-flex gl-align-items-flex-start">
|
||||
<li class="tree-item !gl-border-b-0 !gl-p-0">
|
||||
<div class="gl-flex gl-items-start">
|
||||
<gl-button
|
||||
v-if="hasChildren"
|
||||
v-gl-tooltip.hover
|
||||
|
|
@ -280,7 +280,7 @@ export default {
|
|||
category="tertiary"
|
||||
size="small"
|
||||
:loading="isLoadingChildren && !fetchNextPageInProgress"
|
||||
class="gl-px-0! gl-py-3!"
|
||||
class="!gl-px-0 !gl-py-3"
|
||||
data-testid="expand-child"
|
||||
@click="toggleItem"
|
||||
/>
|
||||
|
|
|
|||
|
|
@ -401,7 +401,7 @@ export default {
|
|||
@submit.prevent="addOrCreateMethod"
|
||||
>
|
||||
<template v-if="isCreateForm">
|
||||
<div class="gl-display-flex gl-gap-x-3">
|
||||
<div class="gl-flex gl-gap-x-3">
|
||||
<gl-form-group
|
||||
class="gl-w-full"
|
||||
:label="$options.i18n.titleInputLabel"
|
||||
|
|
@ -439,7 +439,7 @@ export default {
|
|||
ref="confidentialityCheckbox"
|
||||
v-model="confidential"
|
||||
name="isConfidential"
|
||||
class="gl-mb-5 gl-md-mb-3!"
|
||||
class="gl-mb-5 md:!gl-mb-3"
|
||||
:disabled="parentConfidential"
|
||||
>{{ confidentialityCheckboxLabel }}</gl-form-checkbox
|
||||
>
|
||||
|
|
@ -467,7 +467,7 @@ export default {
|
|||
>
|
||||
{{ workItemsToAddInvalidMessage }}
|
||||
</div>
|
||||
<div v-if="error" class="gl-text-red-500 gl-mt-3" data-testid="work-items-error">
|
||||
<div v-if="error" class="gl-mt-3 gl-text-red-500" data-testid="work-items-error">
|
||||
{{ error }}
|
||||
</div>
|
||||
<div
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ export default {
|
|||
:project-name="item.text"
|
||||
/>
|
||||
<span>
|
||||
<span class="gl-block gl-mr-2"> {{ item.text }} </span>
|
||||
<span class="gl-mr-2 gl-block"> {{ item.text }} </span>
|
||||
<span class="gl-block gl-text-secondary"> {{ item.namespace }} </span>
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -258,10 +258,10 @@ export default {
|
|||
v-if="shouldRolledUpWeightBeVisible"
|
||||
ref="weightData"
|
||||
data-testid="rollup-weight"
|
||||
class="gl-font-normal gl-ml-3 gl-display-flex gl-align-items-center gl-cursor-help gl-gap-2 gl-text-secondary"
|
||||
class="gl-ml-3 gl-flex gl-cursor-help gl-items-center gl-gap-2 gl-font-normal gl-text-secondary"
|
||||
>
|
||||
<gl-icon name="weight" class="gl-text-secondary" />
|
||||
<span data-testid="weight-value" class="gl-font-sm">{{ rolledUpWeight }}</span>
|
||||
<span data-testid="weight-value" class="gl-text-sm">{{ rolledUpWeight }}</span>
|
||||
<gl-tooltip :target="() => $refs.weightData">
|
||||
<span class="gl-font-bold">
|
||||
{{ __('Weight') }}
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@ export default {
|
|||
<div v-if="item.title">{{ item.title }}</div>
|
||||
</template>
|
||||
<template #readonly>
|
||||
<gl-link class="gl-text-gray-900!" :href="localMilestone.webPath">
|
||||
<gl-link class="!gl-text-gray-900" :href="localMilestone.webPath">
|
||||
{{ localMilestone.title }}{{ expired }}
|
||||
</gl-link>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -355,7 +355,7 @@ export default {
|
|||
@changeFilter="filterDiscussions"
|
||||
/>
|
||||
<work-item-notes-loading v-if="initialLoading" class="gl-mt-5" />
|
||||
<div v-else class="issuable-discussion gl-mb-5 gl-clearfix!">
|
||||
<div v-else class="issuable-discussion gl-mb-5 !gl-clearfix">
|
||||
<template v-if="!initialLoading">
|
||||
<div v-if="formAtTop && !commentsDisabled" class="js-comment-form">
|
||||
<ul class="notes notes-form timeline">
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ export default {
|
|||
<gl-link
|
||||
v-if="localSelectedItem"
|
||||
data-testid="work-item-parent-link"
|
||||
class="gl-inline-block gl-align-top gl-text-gray-900 gl-max-w-full gl-whitespace-nowrap gl-text-overflow-ellipsis gl-overflow-hidden"
|
||||
class="gl-inline-block gl-max-w-full gl-overflow-hidden gl-text-ellipsis gl-whitespace-nowrap gl-align-top gl-text-gray-900"
|
||||
:href="parentWebUrl"
|
||||
>{{ listboxText }}</gl-link
|
||||
>
|
||||
|
|
|
|||
|
|
@ -202,7 +202,7 @@ export default {
|
|||
:checked="linkedItemType"
|
||||
/>
|
||||
</gl-form-group>
|
||||
<p class="gl-font-bold gl-mb-2">
|
||||
<p class="gl-mb-2 gl-font-bold">
|
||||
{{ $options.i18n.linkItemInputLabel }}
|
||||
</p>
|
||||
<div class="gl-mb-5">
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ export default {
|
|||
<h4
|
||||
v-if="heading"
|
||||
data-testid="work-items-list-heading"
|
||||
class="gl-font-sm gl-font-semibold gl-text-gray-700 gl-mt-3 gl-mb-2 gl-ml-3"
|
||||
class="gl-mb-2 gl-ml-3 gl-mt-3 gl-text-sm gl-font-semibold gl-text-gray-700"
|
||||
>
|
||||
{{ heading }}
|
||||
</h4>
|
||||
|
|
@ -45,7 +45,7 @@ export default {
|
|||
<li
|
||||
v-for="linkedItem in linkedItems"
|
||||
:key="linkedItem.workItem.id"
|
||||
class="gl-pt-0! gl-pb-0! gl-border-b-0!"
|
||||
class="!gl-border-b-0 !gl-pb-0 !gl-pt-0"
|
||||
>
|
||||
<work-item-link-child-contents
|
||||
:child-item="linkedItem.workItem"
|
||||
|
|
|
|||
|
|
@ -266,7 +266,7 @@ export default {
|
|||
<work-item-relationship-list
|
||||
v-if="linksBlocks.length"
|
||||
:class="{
|
||||
'gl-pb-3 gl-mb-5 gl-border-b-1 gl-border-b-solid gl-border-b-gray-100':
|
||||
'gl-mb-5 gl-border-b-1 gl-border-b-gray-100 gl-pb-3 gl-border-b-solid':
|
||||
linksIsBlockedBy.length,
|
||||
}"
|
||||
:linked-items="linksBlocks"
|
||||
|
|
@ -286,7 +286,7 @@ export default {
|
|||
<work-item-relationship-list
|
||||
v-if="linksIsBlockedBy.length"
|
||||
:class="{
|
||||
'gl-pb-3 gl-mb-5 gl-border-b-1 gl-border-b-solid gl-border-b-gray-100':
|
||||
'gl-mb-5 gl-border-b-1 gl-border-b-gray-100 gl-pb-3 gl-border-b-solid':
|
||||
linksRelatesTo.length,
|
||||
}"
|
||||
:linked-items="linksIsBlockedBy"
|
||||
|
|
|
|||
|
|
@ -103,11 +103,11 @@ export default {
|
|||
<transition name="issuable-header-slide">
|
||||
<div
|
||||
v-if="isStickyHeaderShowing"
|
||||
class="issue-sticky-header gl-fixed gl-bg-default gl-border-b gl-z-3 gl-py-2"
|
||||
class="issue-sticky-header gl-border-b gl-fixed gl-z-3 gl-bg-default gl-py-2"
|
||||
data-testid="work-item-sticky-header"
|
||||
>
|
||||
<div
|
||||
class="work-item-sticky-header-text gl-items-center gl-mx-auto gl-px-5 xl:gl-px-6 gl-flex gl-gap-3"
|
||||
class="work-item-sticky-header-text gl-mx-auto gl-flex gl-items-center gl-gap-3 gl-px-5 xl:gl-px-6"
|
||||
>
|
||||
<work-item-state-badge v-if="workItemState" :work-item-state="workItemState" />
|
||||
<gl-loading-icon v-if="updateInProgress" />
|
||||
|
|
@ -119,7 +119,7 @@ export default {
|
|||
/>
|
||||
<locked-badge v-if="isDiscussionLocked" :issuable-type="workItemType" />
|
||||
<gl-link
|
||||
class="gl-truncate gl-block gl-font-bold gl-pr-3 gl-mr-auto gl-text-black"
|
||||
class="gl-mr-auto gl-block gl-truncate gl-pr-3 gl-font-bold gl-text-black"
|
||||
href="#top"
|
||||
:title="workItem.title"
|
||||
>
|
||||
|
|
|
|||
|
|
@ -107,8 +107,8 @@ export default {
|
|||
|
||||
<template>
|
||||
<div data-testid="work-item-time-tracking">
|
||||
<div class="gl-display-flex gl-align-items-center gl-justify-content-space-between">
|
||||
<h3 class="gl-heading-5 gl-mb-2!">
|
||||
<div class="gl-flex gl-items-center gl-justify-between">
|
||||
<h3 class="gl-heading-5 !gl-mb-2">
|
||||
{{ __('Time tracking') }}
|
||||
</h3>
|
||||
<gl-button
|
||||
|
|
@ -123,17 +123,14 @@ export default {
|
|||
/>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="gl-display-flex gl-align-items-center gl-gap-2 gl-font-sm"
|
||||
data-testid="time-tracking-body"
|
||||
>
|
||||
<div class="gl-flex gl-items-center gl-gap-2 gl-text-sm" data-testid="time-tracking-body">
|
||||
<template v-if="totalTimeSpent || timeEstimate">
|
||||
<span class="gl-text-secondary">{{ s__('TimeTracking|Spent') }}</span>
|
||||
<gl-button
|
||||
v-if="canUpdate"
|
||||
v-gl-modal="'time-tracking-report'"
|
||||
v-gl-tooltip="s__('TimeTracking|View time tracking report')"
|
||||
class="gl-font-sm!"
|
||||
class="!gl-text-sm"
|
||||
variant="link"
|
||||
>
|
||||
{{ humanTotalTimeSpent }}
|
||||
|
|
@ -144,7 +141,7 @@ export default {
|
|||
<template v-if="timeEstimate">
|
||||
<gl-progress-bar
|
||||
v-gl-tooltip="progressBarTooltipText"
|
||||
class="gl-flex-grow-1 gl-mx-2"
|
||||
class="gl-mx-2 gl-grow"
|
||||
:value="timeRemainingPercent"
|
||||
:variant="progressBarVariant"
|
||||
/>
|
||||
|
|
@ -153,7 +150,7 @@ export default {
|
|||
v-if="canUpdate"
|
||||
v-gl-modal="$options.setTimeEstimateModalId"
|
||||
v-gl-tooltip="s__('TimeTracking|Set estimate')"
|
||||
class="gl-font-sm!"
|
||||
class="!gl-text-sm"
|
||||
variant="link"
|
||||
>
|
||||
{{ humanTimeEstimate }}
|
||||
|
|
@ -165,7 +162,7 @@ export default {
|
|||
<gl-button
|
||||
v-else-if="canUpdate"
|
||||
v-gl-modal="$options.setTimeEstimateModalId"
|
||||
class="gl-font-sm! gl-ml-auto"
|
||||
class="gl-ml-auto !gl-text-sm"
|
||||
variant="link"
|
||||
>
|
||||
{{ s__('TimeTracking|Add estimate') }}
|
||||
|
|
@ -176,7 +173,7 @@ export default {
|
|||
<template #estimate="{ content }">
|
||||
<gl-button
|
||||
v-gl-modal="$options.setTimeEstimateModalId"
|
||||
class="gl-font-sm! gl-align-baseline"
|
||||
class="gl-align-baseline !gl-text-sm"
|
||||
variant="link"
|
||||
>
|
||||
{{ content }}
|
||||
|
|
@ -185,7 +182,7 @@ export default {
|
|||
<template #timeSpent="{ content }">
|
||||
<gl-button
|
||||
v-gl-modal="$options.createTimelogModalId"
|
||||
class="gl-font-sm! gl-align-baseline"
|
||||
class="gl-align-baseline !gl-text-sm"
|
||||
variant="link"
|
||||
>
|
||||
{{ content }}
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ export default {
|
|||
@input="$emit('updateDraft', $event)"
|
||||
/>
|
||||
</gl-form-group>
|
||||
<h1 v-else data-testid="work-item-title" class="gl-w-full gl-heading-1 !gl-m-0">
|
||||
<h1 v-else data-testid="work-item-title" class="gl-heading-1 !gl-m-0 gl-w-full">
|
||||
{{ title }}
|
||||
</h1>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -6,12 +6,6 @@ $work-item-overview-right-sidebar-width: 20rem;
|
|||
$work-item-sticky-header-height: 52px;
|
||||
$work-item-overview-gap-width: 2rem;
|
||||
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-token-selector-token-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.hide-unfocused-input-decoration:not(:focus, :hover),
|
||||
.hide-unfocused-input-decoration:disabled {
|
||||
background-color: transparent;
|
||||
|
|
@ -20,84 +14,14 @@ $work-item-overview-gap-width: 2rem;
|
|||
box-shadow: none;
|
||||
}
|
||||
|
||||
.work-item-assignees {
|
||||
.assign-myself {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(sm) {
|
||||
.assignees-selector:hover .assign-myself {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.work-item-due-date {
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-datepicker-input.gl-form-input.form-control {
|
||||
width: 10rem;
|
||||
|
||||
&:not(:focus, :hover) {
|
||||
box-shadow: none;
|
||||
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
~ .gl-datepicker-actions {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&[disabled] {
|
||||
background-color: var(--white, $white);
|
||||
box-shadow: none;
|
||||
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
~ .gl-datepicker-actions {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-datepicker-actions:focus,
|
||||
.gl-datepicker-actions:hover {
|
||||
display: flex !important;
|
||||
}
|
||||
}
|
||||
|
||||
.work-item-labels {
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-token {
|
||||
padding-left: $gl-spacing-scale-1;
|
||||
}
|
||||
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-token-close {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
// sticky error placement for errors in modals , by default it is 83px for full view
|
||||
// sticky error placement for errors in modals, by default it is 83px for full view
|
||||
#work-item-detail-modal {
|
||||
.flash-container.flash-container-page.sticky {
|
||||
top: -8px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.work-item-notifications-form {
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-toggle {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-toggle-label {
|
||||
font-weight: $gl-font-weight-normal;
|
||||
}
|
||||
}
|
||||
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-modal .work-item-view,
|
||||
.work-item-view,
|
||||
.work-item-drawer .work-item-view:not(:has(.design-detail)) {
|
||||
container-name: work-item-view;
|
||||
container-type: inline-size;
|
||||
|
|
@ -170,13 +94,6 @@ $work-item-overview-gap-width: 2rem;
|
|||
}
|
||||
}
|
||||
|
||||
.work-item-field-label {
|
||||
.work-item-overview & {
|
||||
max-width: 30%;
|
||||
flex: none;
|
||||
}
|
||||
}
|
||||
|
||||
.work-item-field-value {
|
||||
.work-item-overview & {
|
||||
max-width: 65%;
|
||||
|
|
@ -191,29 +108,9 @@ $work-item-overview-gap-width: 2rem;
|
|||
}
|
||||
}
|
||||
|
||||
.work-item-parent-field-value {
|
||||
.work-item-overview & {
|
||||
max-width: 75%;
|
||||
}
|
||||
}
|
||||
|
||||
.token-selector-menu-class {
|
||||
.work-item-overview & {
|
||||
width: 100%;
|
||||
min-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
// There is no props to set label class in GlToggle
|
||||
// and the font weight is bold in the component
|
||||
// Here, we are overriding the margin and the font weight
|
||||
|
||||
// There is no props to set the font weight class in GlToggle
|
||||
// Here, we are overriding the font weight
|
||||
.work-item-dropdown-toggle {
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-toggle {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
// stylelint-disable-next-line gitlab/no-gl-class
|
||||
.gl-toggle-label {
|
||||
font-weight: normal;
|
||||
|
|
@ -374,7 +271,7 @@ $disclosure-hierarchy-chevron-dimension: 1.2rem;
|
|||
}
|
||||
}
|
||||
|
||||
.work-item-description .truncated{
|
||||
.work-item-description .truncated {
|
||||
max-height: clamp(16rem, 40vh, 32rem);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -758,7 +758,7 @@ module Types
|
|||
|
||||
{
|
||||
issues: "Issues are",
|
||||
merge_requests: "Merge Requests are",
|
||||
merge_requests: "Merge requests are",
|
||||
wiki: 'Wikis are',
|
||||
snippets: 'Snippets are',
|
||||
container_registry: 'Container Registry is'
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
:ruby
|
||||
# rubocop: disable Lint/DuplicateBranch -- The feature enabled needs to take precedence
|
||||
title = if merge_request_dashboard_enabled?(current_user)
|
||||
_('Merge Requests')
|
||||
_('Merge requests')
|
||||
elsif params[:reviewer_username] == current_user.username
|
||||
_("Review requests")
|
||||
elsif params[:assignee_username] == current_user.username
|
||||
|
|
@ -8,6 +9,7 @@
|
|||
else
|
||||
_("Merge requests")
|
||||
end
|
||||
# rubocop: enable Lint/DuplicateBranch
|
||||
page_title title
|
||||
@breadcrumb_link = merge_requests_dashboard_path(assignee_username: current_user.username)
|
||||
add_page_specific_style 'page_bundles/issuable_list'
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
migration_job_name: BackfillSecurityOrchestrationPolicyRuleSchedulesNamespaceId
|
||||
description: Backfills sharding key `security_orchestration_policy_rule_schedules.namespace_id` from `security_orchestration_policy_configurations`.
|
||||
feature_category: security_policy_management
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/163017
|
||||
milestone: '17.4'
|
||||
queued_migration_version: 20240816130544
|
||||
finalize_after: '2024-09-22'
|
||||
finalized_by: # version of the migration that finalized this BBM
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
migration_job_name: BackfillSecurityOrchestrationPolicyRuleSchedulesProjectId
|
||||
description: Backfills sharding key `security_orchestration_policy_rule_schedules.project_id` from `security_orchestration_policy_configurations`.
|
||||
feature_category: security_policy_management
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/163017
|
||||
milestone: '17.4'
|
||||
queued_migration_version: 20240816130539
|
||||
finalize_after: '2024-09-22'
|
||||
finalized_by: # version of the migration that finalized this BBM
|
||||
|
|
@ -27,3 +27,6 @@ desired_sharding_key:
|
|||
table: security_orchestration_policy_configurations
|
||||
sharding_key: namespace_id
|
||||
belongs_to: security_orchestration_policy_configuration
|
||||
desired_sharding_key_migration_job_name:
|
||||
- BackfillSecurityOrchestrationPolicyRuleSchedulesProjectId
|
||||
- BackfillSecurityOrchestrationPolicyRuleSchedulesNamespaceId
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddProjectIdToSecurityOrchestrationPolicyRuleSchedules < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
|
||||
def change
|
||||
add_column :security_orchestration_policy_rule_schedules, :project_id, :bigint
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddNamespaceIdToSecurityOrchestrationPolicyRuleSchedules < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
|
||||
def change
|
||||
add_column :security_orchestration_policy_rule_schedules, :namespace_id, :bigint
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class IndexSecurityOrchestrationPolicyRuleSchedulesOnProjectId < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
disable_ddl_transaction!
|
||||
|
||||
INDEX_NAME = 'index_security_orchestration_policy_rule_schedules_on_project_i'
|
||||
|
||||
def up
|
||||
add_concurrent_index :security_orchestration_policy_rule_schedules, :project_id, name: INDEX_NAME
|
||||
end
|
||||
|
||||
def down
|
||||
remove_concurrent_index_by_name :security_orchestration_policy_rule_schedules, INDEX_NAME
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddSecurityOrchestrationPolicyRuleSchedulesProjectIdFk < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
disable_ddl_transaction!
|
||||
|
||||
def up
|
||||
add_concurrent_foreign_key :security_orchestration_policy_rule_schedules, :projects, column: :project_id,
|
||||
on_delete: :cascade
|
||||
end
|
||||
|
||||
def down
|
||||
with_lock_retries do
|
||||
remove_foreign_key :security_orchestration_policy_rule_schedules, column: :project_id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddSecurityOrchestrationPolicyRuleSchedulesProjectIdTrigger < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
|
||||
def up
|
||||
install_sharding_key_assignment_trigger(
|
||||
table: :security_orchestration_policy_rule_schedules,
|
||||
sharding_key: :project_id,
|
||||
parent_table: :security_orchestration_policy_configurations,
|
||||
parent_sharding_key: :project_id,
|
||||
foreign_key: :security_orchestration_policy_configuration_id
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
remove_sharding_key_assignment_trigger(
|
||||
table: :security_orchestration_policy_rule_schedules,
|
||||
sharding_key: :project_id,
|
||||
parent_table: :security_orchestration_policy_configurations,
|
||||
parent_sharding_key: :project_id,
|
||||
foreign_key: :security_orchestration_policy_configuration_id
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class QueueBackfillSecurityOrchestrationPolicyRuleSchedulesProjectId < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
|
||||
|
||||
MIGRATION = "BackfillSecurityOrchestrationPolicyRuleSchedulesProjectId"
|
||||
DELAY_INTERVAL = 2.minutes
|
||||
BATCH_SIZE = 1000
|
||||
SUB_BATCH_SIZE = 100
|
||||
|
||||
def up
|
||||
queue_batched_background_migration(
|
||||
MIGRATION,
|
||||
:security_orchestration_policy_rule_schedules,
|
||||
:id,
|
||||
:project_id,
|
||||
:security_orchestration_policy_configurations,
|
||||
:project_id,
|
||||
:security_orchestration_policy_configuration_id,
|
||||
job_interval: DELAY_INTERVAL,
|
||||
batch_size: BATCH_SIZE,
|
||||
sub_batch_size: SUB_BATCH_SIZE
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
delete_batched_background_migration(
|
||||
MIGRATION,
|
||||
:security_orchestration_policy_rule_schedules,
|
||||
:id,
|
||||
[
|
||||
:project_id,
|
||||
:security_orchestration_policy_configurations,
|
||||
:project_id,
|
||||
:security_orchestration_policy_configuration_id
|
||||
]
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class IndexSecurityOrchestrationPolicyRuleSchedulesOnNamespaceId < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
disable_ddl_transaction!
|
||||
|
||||
INDEX_NAME = 'index_security_orchestration_policy_rule_schedules_on_namespace'
|
||||
|
||||
def up
|
||||
add_concurrent_index :security_orchestration_policy_rule_schedules, :namespace_id, name: INDEX_NAME
|
||||
end
|
||||
|
||||
def down
|
||||
remove_concurrent_index_by_name :security_orchestration_policy_rule_schedules, INDEX_NAME
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddSecurityOrchestrationPolicyRuleSchedulesNamespaceIdFk < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
disable_ddl_transaction!
|
||||
|
||||
def up
|
||||
add_concurrent_foreign_key :security_orchestration_policy_rule_schedules, :namespaces, column: :namespace_id,
|
||||
on_delete: :cascade
|
||||
end
|
||||
|
||||
def down
|
||||
with_lock_retries do
|
||||
remove_foreign_key :security_orchestration_policy_rule_schedules, column: :namespace_id
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AddSecurityOrchestrationPolicyRuleSchedulesNamespaceIdTrigger < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
|
||||
def up
|
||||
install_sharding_key_assignment_trigger(
|
||||
table: :security_orchestration_policy_rule_schedules,
|
||||
sharding_key: :namespace_id,
|
||||
parent_table: :security_orchestration_policy_configurations,
|
||||
parent_sharding_key: :namespace_id,
|
||||
foreign_key: :security_orchestration_policy_configuration_id
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
remove_sharding_key_assignment_trigger(
|
||||
table: :security_orchestration_policy_rule_schedules,
|
||||
sharding_key: :namespace_id,
|
||||
parent_table: :security_orchestration_policy_configurations,
|
||||
parent_sharding_key: :namespace_id,
|
||||
foreign_key: :security_orchestration_policy_configuration_id
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class QueueBackfillSecurityOrchestrationPolicyRuleSchedulesNamespaceId < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.4'
|
||||
restrict_gitlab_migration gitlab_schema: :gitlab_main_cell
|
||||
|
||||
MIGRATION = "BackfillSecurityOrchestrationPolicyRuleSchedulesNamespaceId"
|
||||
DELAY_INTERVAL = 2.minutes
|
||||
BATCH_SIZE = 1000
|
||||
SUB_BATCH_SIZE = 100
|
||||
|
||||
def up
|
||||
queue_batched_background_migration(
|
||||
MIGRATION,
|
||||
:security_orchestration_policy_rule_schedules,
|
||||
:id,
|
||||
:namespace_id,
|
||||
:security_orchestration_policy_configurations,
|
||||
:namespace_id,
|
||||
:security_orchestration_policy_configuration_id,
|
||||
job_interval: DELAY_INTERVAL,
|
||||
batch_size: BATCH_SIZE,
|
||||
sub_batch_size: SUB_BATCH_SIZE
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
delete_batched_background_migration(
|
||||
MIGRATION,
|
||||
:security_orchestration_policy_rule_schedules,
|
||||
:id,
|
||||
[
|
||||
:namespace_id,
|
||||
:security_orchestration_policy_configurations,
|
||||
:namespace_id,
|
||||
:security_orchestration_policy_configuration_id
|
||||
]
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1 @@
|
|||
698591914a287c7e1adc5d1a8e14ec9031b83a6303a9350eb717c877e2e35a25
|
||||
|
|
@ -0,0 +1 @@
|
|||
0f0d86c9f51479f1965925e44562c3c9f9fca03b9f54ae8e41a0e293c7c40bc4
|
||||
|
|
@ -0,0 +1 @@
|
|||
be42be622fea41feb5af424406863d9b1eb4589dcb0ae1e5053899ca77c3d10e
|
||||
|
|
@ -0,0 +1 @@
|
|||
ba6ac80d4fed53f434c78c9dafb1c611d4ec2066702db8bbf52ec521a6add5e9
|
||||
|
|
@ -0,0 +1 @@
|
|||
cc1e8f00f4575739f6069beb99f337eb25a102f7f8076a29b2112420f1d854db
|
||||
|
|
@ -0,0 +1 @@
|
|||
ccb1ef219032a7a5becfdd60ab6589c41f272b3df71fa34ae7492a0f442316dc
|
||||
|
|
@ -0,0 +1 @@
|
|||
fc9ea3f83a625c49721f783e99e430e0254af2c509647b5a98fe6589afa74430
|
||||
|
|
@ -0,0 +1 @@
|
|||
10cbb42b0fe55922f8c5aa833452c86361500e741f0278ae83e59dd580314039
|
||||
|
|
@ -0,0 +1 @@
|
|||
215432d95d3ecfee7afb128a01f12219b2410de12b0f30ad5f5554c66bacb442
|
||||
|
|
@ -0,0 +1 @@
|
|||
2ba6ff4456a2c2093880f0d746466763acd674eb9c61b1d30c689da9740a1434
|
||||
|
|
@ -1250,6 +1250,22 @@ RETURN NEW;
|
|||
END
|
||||
$$;
|
||||
|
||||
CREATE FUNCTION trigger_54707c384ad7() RETURNS trigger
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
BEGIN
|
||||
IF NEW."project_id" IS NULL THEN
|
||||
SELECT "project_id"
|
||||
INTO NEW."project_id"
|
||||
FROM "security_orchestration_policy_configurations"
|
||||
WHERE "security_orchestration_policy_configurations"."id" = NEW."security_orchestration_policy_configuration_id";
|
||||
END IF;
|
||||
|
||||
RETURN NEW;
|
||||
|
||||
END
|
||||
$$;
|
||||
|
||||
CREATE FUNCTION trigger_56d49f4ed623() RETURNS trigger
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
|
|
@ -1858,6 +1874,22 @@ RETURN NEW;
|
|||
END
|
||||
$$;
|
||||
|
||||
CREATE FUNCTION trigger_c59fe6f31e71() RETURNS trigger
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
BEGIN
|
||||
IF NEW."namespace_id" IS NULL THEN
|
||||
SELECT "namespace_id"
|
||||
INTO NEW."namespace_id"
|
||||
FROM "security_orchestration_policy_configurations"
|
||||
WHERE "security_orchestration_policy_configurations"."id" = NEW."security_orchestration_policy_configuration_id";
|
||||
END IF;
|
||||
|
||||
RETURN NEW;
|
||||
|
||||
END
|
||||
$$;
|
||||
|
||||
CREATE FUNCTION trigger_c5eec113ea76() RETURNS trigger
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
|
|
@ -17760,6 +17792,8 @@ CREATE TABLE security_orchestration_policy_rule_schedules (
|
|||
policy_index integer NOT NULL,
|
||||
cron text NOT NULL,
|
||||
rule_index integer DEFAULT 0 NOT NULL,
|
||||
project_id bigint,
|
||||
namespace_id bigint,
|
||||
CONSTRAINT check_915825a76e CHECK ((char_length(cron) <= 255))
|
||||
);
|
||||
|
||||
|
|
@ -29759,6 +29793,10 @@ CREATE INDEX p_ci_builds_name_id_idx ON ONLY p_ci_builds USING btree (name, id)
|
|||
|
||||
CREATE INDEX index_security_ci_builds_on_name_and_id_parser_features ON ci_builds USING btree (name, id) WHERE (((name)::text = ANY (ARRAY[('container_scanning'::character varying)::text, ('dast'::character varying)::text, ('dependency_scanning'::character varying)::text, ('license_management'::character varying)::text, ('sast'::character varying)::text, ('secret_detection'::character varying)::text, ('coverage_fuzzing'::character varying)::text, ('license_scanning'::character varying)::text, ('apifuzzer_fuzz'::character varying)::text, ('apifuzzer_fuzz_dnd'::character varying)::text])) AND ((type)::text = 'Ci::Build'::text));
|
||||
|
||||
CREATE INDEX index_security_orchestration_policy_rule_schedules_on_namespace ON security_orchestration_policy_rule_schedules USING btree (namespace_id);
|
||||
|
||||
CREATE INDEX index_security_orchestration_policy_rule_schedules_on_project_i ON security_orchestration_policy_rule_schedules USING btree (project_id);
|
||||
|
||||
CREATE INDEX index_security_policies_on_policy_management_project_id ON security_policies USING btree (security_policy_management_project_id);
|
||||
|
||||
CREATE UNIQUE INDEX index_security_policies_on_unique_config_type_policy_index ON security_policies USING btree (security_orchestration_policy_configuration_id, type, policy_index);
|
||||
|
|
@ -32437,6 +32475,8 @@ CREATE TRIGGER trigger_4ad9a52a6614 BEFORE INSERT OR UPDATE ON sbom_occurrences_
|
|||
|
||||
CREATE TRIGGER trigger_4b43790d717f BEFORE INSERT OR UPDATE ON protected_environment_approval_rules FOR EACH ROW EXECUTE FUNCTION trigger_4b43790d717f();
|
||||
|
||||
CREATE TRIGGER trigger_54707c384ad7 BEFORE INSERT OR UPDATE ON security_orchestration_policy_rule_schedules FOR EACH ROW EXECUTE FUNCTION trigger_54707c384ad7();
|
||||
|
||||
CREATE TRIGGER trigger_56d49f4ed623 BEFORE INSERT OR UPDATE ON workspace_variables FOR EACH ROW EXECUTE FUNCTION trigger_56d49f4ed623();
|
||||
|
||||
CREATE TRIGGER trigger_57ad2742ac16 BEFORE INSERT OR UPDATE ON user_achievements FOR EACH ROW EXECUTE FUNCTION trigger_57ad2742ac16();
|
||||
|
|
@ -32511,6 +32551,8 @@ CREATE TRIGGER trigger_b4520c29ea74 BEFORE INSERT OR UPDATE ON approval_merge_re
|
|||
|
||||
CREATE TRIGGER trigger_c17a166692a2 BEFORE INSERT OR UPDATE ON audit_events_streaming_headers FOR EACH ROW EXECUTE FUNCTION trigger_c17a166692a2();
|
||||
|
||||
CREATE TRIGGER trigger_c59fe6f31e71 BEFORE INSERT OR UPDATE ON security_orchestration_policy_rule_schedules FOR EACH ROW EXECUTE FUNCTION trigger_c59fe6f31e71();
|
||||
|
||||
CREATE TRIGGER trigger_c5eec113ea76 BEFORE INSERT OR UPDATE ON dast_pre_scan_verifications FOR EACH ROW EXECUTE FUNCTION trigger_c5eec113ea76();
|
||||
|
||||
CREATE TRIGGER trigger_c8bc8646bce9 BEFORE INSERT OR UPDATE ON vulnerability_state_transitions FOR EACH ROW EXECUTE FUNCTION trigger_c8bc8646bce9();
|
||||
|
|
@ -32988,6 +33030,9 @@ ALTER TABLE ONLY scan_result_policy_violations
|
|||
ALTER TABLE ONLY wiki_page_slugs
|
||||
ADD CONSTRAINT fk_3d71295ac9 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
|
||||
|
||||
ALTER TABLE ONLY security_orchestration_policy_rule_schedules
|
||||
ADD CONSTRAINT fk_3e78b9a150 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
|
||||
|
||||
ALTER TABLE ONLY compliance_checks
|
||||
ADD CONSTRAINT fk_3fbfa4295c FOREIGN KEY (requirement_id) REFERENCES compliance_requirements(id) ON DELETE CASCADE;
|
||||
|
||||
|
|
@ -33684,6 +33729,9 @@ ALTER TABLE ONLY project_compliance_standards_adherence
|
|||
ALTER TABLE p_ci_runner_machine_builds
|
||||
ADD CONSTRAINT fk_bb490f12fe_p FOREIGN KEY (partition_id, build_id) REFERENCES p_ci_builds(partition_id, id) ON UPDATE CASCADE ON DELETE CASCADE;
|
||||
|
||||
ALTER TABLE ONLY security_orchestration_policy_rule_schedules
|
||||
ADD CONSTRAINT fk_bcbb90477f FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
|
||||
|
||||
ALTER TABLE ONLY namespace_bans
|
||||
ADD CONSTRAINT fk_bcc024eef2 FOREIGN KEY (namespace_id) REFERENCES namespaces(id) ON DELETE CASCADE;
|
||||
|
||||
|
|
|
|||
|
|
@ -28781,7 +28781,7 @@ Project-level settings for product analytics provider.
|
|||
| <a id="projectmergecommittemplate"></a>`mergeCommitTemplate` | [`String`](#string) | Template used to create merge commit message in merge requests. |
|
||||
| <a id="projectmergerequestsaccesslevel"></a>`mergeRequestsAccessLevel` | [`ProjectFeatureAccess`](#projectfeatureaccess) | Access level required for merge requests access. |
|
||||
| <a id="projectmergerequestsdisablecommittersapproval"></a>`mergeRequestsDisableCommittersApproval` | [`Boolean!`](#boolean) | Indicates that committers of the given merge request cannot approve. |
|
||||
| <a id="projectmergerequestsenabled"></a>`mergeRequestsEnabled` | [`Boolean`](#boolean) | Indicates if Merge Requests are enabled for the current user. |
|
||||
| <a id="projectmergerequestsenabled"></a>`mergeRequestsEnabled` | [`Boolean`](#boolean) | Indicates if Merge requests are enabled for the current user. |
|
||||
| <a id="projectmergerequestsffonlyenabled"></a>`mergeRequestsFfOnlyEnabled` | [`Boolean`](#boolean) | Indicates if no merge commits should be created and all merges should instead be fast-forwarded, which means that merging is only allowed if the branch could be fast-forwarded. |
|
||||
| <a id="projectname"></a>`name` | [`String!`](#string) | Name of the project (without namespace). |
|
||||
| <a id="projectnamewithnamespace"></a>`nameWithNamespace` | [`String!`](#string) | Full name of the project with its namespace. |
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ DETAILS:
|
|||
**Status:** Beta
|
||||
|
||||
> - [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/10401) in GitLab 16.2 as an [experiment](../../../policy/experiment-beta-support.md#experiment).
|
||||
> - [Changed](https://gitlab.com/gitlab-org/gitlab/-/issues/429882) to beta in GitLab 16.10.
|
||||
|
||||
Use GitLab Duo Merge request summary to create a merge request description when you
|
||||
create or edit a merge request.
|
||||
|
|
|
|||
|
|
@ -240,7 +240,25 @@ performance problems.
|
|||
You can use [`git-sizer`](https://github.com/github/git-sizer) to get a snapshot
|
||||
of repository characteristics and discover problem aspects of your monorepo.
|
||||
|
||||
For example:
|
||||
To get a _full_ clone of your repository, you need a full Git mirror or bare clone to
|
||||
ensure all Git references are present. To profile your repository:
|
||||
|
||||
1. [Install `git-sizer`](https://github.com/github/git-sizer?tab=readme-ov-file#getting-started).
|
||||
1. Get a full clone of your repository:
|
||||
|
||||
```shell
|
||||
git clone --mirror <git_repo_url>
|
||||
```
|
||||
|
||||
After cloning, the repository will be in the bare Git format that is compatible with `git-sizer`.
|
||||
1. Run `git-sizer` with all statistics in the directory of your Git repository:
|
||||
|
||||
```shell
|
||||
git-sizer -v
|
||||
```
|
||||
|
||||
After processing, the output of `git-sizer` should look like the following with a level of concern
|
||||
on each aspect of the repository:
|
||||
|
||||
```shell
|
||||
Processing blobs: 1652370
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Gitlab
|
||||
module BackgroundMigration
|
||||
class BackfillSecurityOrchestrationPolicyRuleSchedulesNamespaceId < BackfillDesiredShardingKeyJob
|
||||
operation_name :backfill_security_orchestration_policy_rule_schedules_namespace_id
|
||||
feature_category :security_policy_management
|
||||
end
|
||||
end
|
||||
end
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue