Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2024-08-21 00:07:26 +00:00
parent a07606b8d8
commit dcf94a820d
114 changed files with 746 additions and 333 deletions

View File

@ -1 +1 @@
27b3a74b0ac39329e049167a7a1d7109c344f441
1a16fa05c2645a0abba4e2f028e1fdbe5d85be2f

View File

@ -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": {

View File

@ -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(),

View File

@ -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);
});

View File

@ -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';

View File

@ -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"

View File

@ -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'),

View File

@ -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"

View File

@ -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>

View File

@ -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"

View File

@ -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

View File

@ -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>

View File

@ -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">

View File

@ -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>

View File

@ -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>

View File

@ -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 }}

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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>

View File

@ -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"

View File

@ -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,
};
},

View File

@ -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"

View File

@ -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 }}

View File

@ -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>

View File

@ -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"

View File

@ -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>

View File

@ -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"

View File

@ -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"

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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.

View File

@ -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>

View File

@ -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>

View File

@ -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"

View File

@ -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}`"

View File

@ -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>
{{

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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>

View File

@ -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"
/>

View File

@ -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 }}

View File

@ -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>

View File

@ -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

View File

@ -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"
/>

View File

@ -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

View File

@ -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>

View File

@ -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') }}

View File

@ -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>

View File

@ -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">

View File

@ -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
>

View File

@ -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">

View File

@ -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"

View File

@ -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"

View File

@ -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"
>

View File

@ -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 }}

View File

@ -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>

View File

@ -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;
}

View File

@ -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'

View File

@ -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'

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
698591914a287c7e1adc5d1a8e14ec9031b83a6303a9350eb717c877e2e35a25

View File

@ -0,0 +1 @@
0f0d86c9f51479f1965925e44562c3c9f9fca03b9f54ae8e41a0e293c7c40bc4

View File

@ -0,0 +1 @@
be42be622fea41feb5af424406863d9b1eb4589dcb0ae1e5053899ca77c3d10e

View File

@ -0,0 +1 @@
ba6ac80d4fed53f434c78c9dafb1c611d4ec2066702db8bbf52ec521a6add5e9

View File

@ -0,0 +1 @@
cc1e8f00f4575739f6069beb99f337eb25a102f7f8076a29b2112420f1d854db

View File

@ -0,0 +1 @@
ccb1ef219032a7a5becfdd60ab6589c41f272b3df71fa34ae7492a0f442316dc

View File

@ -0,0 +1 @@
fc9ea3f83a625c49721f783e99e430e0254af2c509647b5a98fe6589afa74430

View File

@ -0,0 +1 @@
10cbb42b0fe55922f8c5aa833452c86361500e741f0278ae83e59dd580314039

View File

@ -0,0 +1 @@
215432d95d3ecfee7afb128a01f12219b2410de12b0f30ad5f5554c66bacb442

View File

@ -0,0 +1 @@
2ba6ff4456a2c2093880f0d746466763acd674eb9c61b1d30c689da9740a1434

View File

@ -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;

View File

@ -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. |

View File

@ -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.

View File

@ -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

View File

@ -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