Commit 654281e6 authored by 🤖 GitLab Bot 🤖's avatar 🤖 GitLab Bot 🤖
Browse files

Add latest changes from gitlab-org/gitlab@master

parent c916c6f7
import * as Sentry from '@sentry/browser';
import { sanitize } from '~/lib/dompurify';
// We currently load + parse the data from the issue app and related merge request
......@@ -7,10 +8,9 @@ export const parseIssuableData = () => {
try {
if (cachedParsedData) return cachedParsedData;
const initialDataEl = document.getElementById('js-issuable-app-initial-data');
const parsedData = JSON.parse(initialDataEl.textContent.replace(/"/g, '"'));
const initialDataEl = document.getElementById('js-issuable-app');
const parsedData = JSON.parse(initialDataEl.dataset.initial);
parsedData.initialTitleHtml = sanitize(parsedData.initialTitleHtml);
parsedData.initialDescriptionHtml = sanitize(parsedData.initialDescriptionHtml);
......@@ -18,7 +18,7 @@ export const parseIssuableData = () => {
return parsedData;
} catch (e) {
console.error(e); // eslint-disable-line no-console
Sentry.captureException(e);
return {};
}
......
<script>
/* eslint-disable vue/no-v-html */
import Vue from 'vue';
import { GlFormGroup, GlDeprecatedButton, GlModal, GlToast, GlToggle } from '@gitlab/ui';
import { GlFormGroup, GlButton, GlModal, GlToast, GlToggle } from '@gitlab/ui';
import { mapState, mapActions } from 'vuex';
import { __, s__, sprintf } from '~/locale';
import { visitUrl, getBaseURL } from '~/lib/utils/url_utility';
......@@ -11,7 +11,7 @@ Vue.use(GlToast);
export default {
components: {
GlFormGroup,
GlDeprecatedButton,
GlButton,
GlModal,
GlToggle,
},
......@@ -123,7 +123,7 @@ export default {
<h4 class="js-section-header">
{{ s__('SelfMonitoring|Self monitoring') }}
</h4>
<gl-deprecated-button class="js-settings-toggle">{{ __('Expand') }}</gl-deprecated-button>
<gl-button class="js-settings-toggle">{{ __('Expand') }}</gl-button>
<p class="js-section-sub-header">
{{ s__('SelfMonitoring|Enable or disable instance self monitoring') }}
</p>
......@@ -146,6 +146,7 @@ export default {
:ok-title="__('Delete project')"
:cancel-title="__('Cancel')"
ok-variant="danger"
category="primary"
@ok="deleteProject"
@cancel="hideSelfMonitorModal"
>
......
<script>
import { GlAvatarLink, GlAvatarLabeled } from '@gitlab/ui';
import { AVATAR_SIZE } from '../constants';
export default {
name: 'GroupAvatar',
avatarSize: AVATAR_SIZE,
components: { GlAvatarLink, GlAvatarLabeled },
props: {
member: {
type: Object,
required: true,
},
},
computed: {
group() {
return this.member.sharedWithGroup;
},
},
};
</script>
<template>
<gl-avatar-link :href="group.webUrl">
<gl-avatar-labeled
:label="group.fullName"
:src="group.avatarUrl"
:alt="group.fullName"
:size="$options.avatarSize"
:entity-name="group.name"
:entity-id="group.id"
/>
</gl-avatar-link>
</template>
<script>
import { GlAvatarLabeled } from '@gitlab/ui';
import { AVATAR_SIZE } from '../constants';
export default {
name: 'InviteAvatar',
avatarSize: AVATAR_SIZE,
components: { GlAvatarLabeled },
props: {
member: {
type: Object,
required: true,
},
},
computed: {
invite() {
return this.member.invite;
},
},
};
</script>
<template>
<gl-avatar-labeled
:label="invite.email"
:src="invite.avatarUrl"
:alt="invite.email"
:size="$options.avatarSize"
:entity-name="invite.email"
:entity-id="member.id"
/>
</template>
<script>
import { GlAvatarLink, GlAvatarLabeled, GlSafeHtmlDirective as SafeHtml } from '@gitlab/ui';
import { __ } from '~/locale';
import { AVATAR_SIZE } from '../constants';
export default {
name: 'UserAvatar',
avatarSize: AVATAR_SIZE,
orphanedUserLabel: __('Orphaned member'),
components: { GlAvatarLink, GlAvatarLabeled },
directives: {
SafeHtml,
},
props: {
member: {
type: Object,
required: true,
},
},
computed: {
user() {
return this.member.user;
},
},
};
</script>
<template>
<gl-avatar-link
v-if="user"
class="js-user-link"
:href="user.webUrl"
:data-user-id="user.id"
:data-username="user.username"
>
<gl-avatar-labeled
:label="user.name"
:sub-label="`@${user.username}`"
:src="user.avatarUrl"
:alt="user.name"
:size="$options.avatarSize"
:entity-name="user.name"
:entity-id="user.id"
/>
</gl-avatar-link>
<gl-avatar-labeled
v-else
:label="$options.orphanedUserLabel"
:alt="$options.orphanedUserLabel"
:size="$options.avatarSize"
:entity-name="$options.orphanedUserLabel"
:entity-id="member.id"
/>
</template>
......@@ -53,3 +53,12 @@ export const FIELDS = [
tdClass: 'col-actions',
},
];
export const AVATAR_SIZE = 48;
export const MEMBER_TYPES = {
user: 'user',
group: 'group',
invite: 'invite',
accessRequest: 'accessRequest',
};
<script>
import { kebabCase } from 'lodash';
import UserAvatar from '../avatars/user_avatar.vue';
import InviteAvatar from '../avatars/invite_avatar.vue';
import GroupAvatar from '../avatars/group_avatar.vue';
export default {
name: 'MemberAvatar',
components: { UserAvatar, InviteAvatar, GroupAvatar, AccessRequestAvatar: UserAvatar },
props: {
memberType: {
type: String,
required: true,
},
member: {
type: Object,
required: true,
},
},
computed: {
avatarComponent() {
// eslint-disable-next-line @gitlab/require-i18n-strings
return `${kebabCase(this.memberType)}-avatar`;
},
},
};
</script>
<template>
<component :is="avatarComponent" :member="member" />
</template>
......@@ -3,11 +3,15 @@ import { mapState } from 'vuex';
import { GlTable } from '@gitlab/ui';
import { FIELDS } from '../constants';
import initUserPopovers from '~/user_popovers';
import MemberAvatar from './member_avatar.vue';
import MembersTableCell from './members_table_cell.vue';
export default {
name: 'MembersTable',
components: {
GlTable,
MemberAvatar,
MembersTableCell,
},
computed: {
...mapState(['members', 'tableFields']),
......@@ -33,6 +37,12 @@ export default {
:empty-text="__('No members found')"
show-empty
>
<template #cell(account)="{ item: member }">
<members-table-cell #default="{ memberType }" :member="member">
<member-avatar :member-type="memberType" :member="member" />
</members-table-cell>
</template>
<template #cell(source)>
<!-- Temporarily empty -->
</template>
......
<script>
import { MEMBER_TYPES } from '../constants';
export default {
name: 'MembersTableCell',
props: {
member: {
type: Object,
required: true,
},
},
computed: {
isGroup() {
return Boolean(this.member.sharedWithGroup);
},
isInvite() {
return Boolean(this.member.invite);
},
isAccessRequest() {
return Boolean(this.member.requestedAt);
},
memberType() {
if (this.isGroup) {
return MEMBER_TYPES.group;
} else if (this.isInvite) {
return MEMBER_TYPES.invite;
} else if (this.isAccessRequest) {
return MEMBER_TYPES.accessRequest;
}
return MEMBER_TYPES.user;
},
},
render() {
return this.$scopedSlots.default({
memberType: this.memberType,
});
},
};
</script>
......@@ -112,6 +112,7 @@ export default {
this.currentHighlightItem += 1;
} else if (e.keyCode === ENTER_KEY_CODE && this.currentHighlightItem > -1) {
this.updateSelectedLabels([this.visibleLabels[this.currentHighlightItem]]);
this.searchKey = '';
} else if (e.keyCode === ESC_KEY_CODE) {
this.toggleDropdownContents();
}
......
......@@ -62,9 +62,7 @@
.issue-details.issuable-details
.detail-page-description.content-block
-# haml-lint:disable InlineJavaScript
%script#js-issuable-app-initial-data{ type: "application/json" }= issuable_initial_data(@issue).to_json
#js-issuable-app
#js-issuable-app{ data: { initial: issuable_initial_data(@issue).to_json} }
.title-container
%h2.title= markdown_field(@issue, :title)
- if @issue.description.present?
......
---
title: Add empty dependencies value to ECS Deploy job
merge_request: 36862
author:
type: fixed
---
title: Reset labels select search text on Enter
merge_request: 43285
author:
type: fixed
---
title: Move job token specs to core
merge_request: 42374
author: Mathieu Parent
type: changed
---
name: container_registry_fast_tag_delete
introduced_by_url:
rollout_issue_url:
group:
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/23325
rollout_issue_url:
group: group::package
type: development
default_enabled: true
---
name: invisible_captcha
introduced_by_url:
rollout_issue_url:
group:
introduced_by_url: https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/31625
rollout_issue_url:
group: group::acquisition
type: development
default_enabled: false
---
# Suggestion: gitlab.InclusionAbleism
#
# Suggests alternatives for words that foster ableism.
#
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: substitution
message: 'Use inclusive language. Consider "%s" instead of "%s".'
link: https://docs.gitlab.com/ee/development/documentation/styleguide.html#inclusive-language
level: suggestion
ignorecase: true
swap:
sanity (?:check|test): check for completeness
dummy: placeholder
---
# Warning: gitlab.InclusionCultural
#
# Suggests alternatives for words that are culturally inappropriate.
#
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: substitution
message: 'Use inclusive language. Consider "%s" instead of "%s".'
link: https://docs.gitlab.com/ee/development/documentation/styleguide.html#inclusive-language
level: warning
ignorecase: true
swap:
blacklist(?:ed|ing|s)?: denylist
whitelist(?:ed|ing|s)?: allowlist
master: primary
slave: secondary
---
# Suggestion: gitlab.InclusionGender
#
# Suggests alternatives for words that are gender-specific.
#
# For a list of all options, see https://errata-ai.gitbook.io/vale/getting-started/styles
extends: substitution
message: 'Use inclusive language. Consider "%s" instead of "%s".'
link: https://docs.gitlab.com/ee/development/documentation/styleguide.html#inclusive-language
level: suggestion
ignorecase: true
swap:
mankind: humanity, people
manpower: GitLab team members
he: they
his: their
she: they
hers: their
......@@ -12,7 +12,6 @@ level: warning
ignorecase: true
swap:
admin: administrator
blacklist(ed|ing)?: denylist
code base: codebase
config: configuration
distro: distribution
......@@ -20,4 +19,3 @@ swap:
filesystem: file system
info: information
repo: repository
whitelist(ed|ing)?: allowlist
......@@ -424,17 +424,17 @@ server (with `gitaly_address`) unless you setup with special
storages:
default:
gitaly_address: tcp://gitaly1.internal:8075
path: /some/dummy/path
path: /some/local/path
storage1:
gitaly_address: tcp://gitaly1.internal:8075
path: /some/dummy/path
path: /some/local/path
storage2:
gitaly_address: tcp://gitaly2.internal:8075
path: /some/dummy/path
path: /some/local/path
```
NOTE: **Note:**
`/some/dummy/path` should be set to a local folder that exists, however no data will be stored in
`/some/local/path` should be set to a local folder that exists, however no data will be stored in
this folder. This will no longer be necessary after
[this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
......@@ -627,17 +627,17 @@ To configure Gitaly with TLS:
storages:
default:
gitaly_address: tls://gitaly1.internal:9999
path: /some/dummy/path
path: /some/local/path
storage1:
gitaly_address: tls://gitaly1.internal:9999
path: /some/dummy/path
path: /some/local/path
storage2:
gitaly_address: tls://gitaly2.internal:9999
path: /some/dummy/path
path: /some/local/path
```
NOTE: **Note:**
`/some/dummy/path` should be set to a local folder that exists, however no data will be stored
`/some/local/path` should be set to a local folder that exists, however no data will be stored
in this folder. This will no longer be necessary after
[Gitaly issue #1282](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
......
......@@ -547,14 +547,14 @@ To configure Praefect with TLS:
storages:
default:
gitaly_address: tls://praefect1.internal:3305
path: /some/dummy/path
path: /some/local/path
storage1:
gitaly_address: tls://praefect2.internal:3305
path: /some/dummy/path
path: /some/local/path
```
NOTE: **Note:**
`/some/dummy/path` should be set to a local folder that exists, however no
`/some/local/path` should be set to a local folder that exists, however no
data will be stored in this folder. This will no longer be necessary after
[this issue](https://gitlab.com/gitlab-org/gitaly/-/issues/1282) is resolved.
......
......@@ -71,7 +71,7 @@ The instructions make the assumption that you will be using the email address `i
sudo postfix start
```
1. Send the new `incoming` user a dummy email to test SMTP, by entering the following into the SMTP prompt:
1. Send the new `incoming` user an email to test SMTP, by entering the following into the SMTP prompt:
```plaintext
ehlo localhost
......@@ -251,7 +251,7 @@ Courier, which we will install later to add IMAP authentication, requires mailbo
If you get a `Connection refused` error instead, make sure your firewall is set up to allow inbound traffic on port 25.
1. Send the `incoming` user a dummy email to test SMTP, by entering the following into the SMTP prompt:
1. Send the `incoming` user an email to test SMTP, by entering the following into the SMTP prompt:
```plaintext
ehlo gitlab.example.com
......
......@@ -6398,7 +6398,7 @@ type GeoNode {
name: String
"""
Package file registries of the GeoNode. Available only when feature flag `geo_package_file_replication` is enabled
Package file registries of the GeoNode
"""
packageFileRegistries(
"""
......@@ -6508,6 +6508,37 @@ type GeoNode {
last: Int
): TerraformStateRegistryConnection
"""
Find terraform state version registries on this Geo node. Available only when
feature flag `geo_terraform_state_version_replication` is enabled
"""
terraformStateVersionRegistries(
"""
Returns the elements in the list that come after the specified cursor.
"""
after: String
"""
Returns the elements in the list that come before the specified cursor.
"""
before: String
"""
Returns the first _n_ elements from the list.
"""
first: Int
"""
Filters registries by their ID
"""
ids: [ID!]
"""
Returns the last _n_ elements from the list.
"""
last: Int
): TerraformStateVersionRegistryConnection
"""
The user-facing URL for this Geo node
"""
......@@ -16923,6 +16954,86 @@ type TerraformStateRegistryEdge {
node: TerraformStateRegistry
}
"""
Represents the Geo sync and verification state of a terraform state vers