Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
b49ea2b72f
commit
9fe0324bb2
|
@ -247,7 +247,6 @@ variables:
|
||||||
RSPEC_MATCHING_JS_FILES_PATH: rspec/js_matching_files.txt
|
RSPEC_MATCHING_JS_FILES_PATH: rspec/js_matching_files.txt
|
||||||
RSPEC_MATCHING_TESTS_EE_PATH: rspec/matching_tests-ee.txt
|
RSPEC_MATCHING_TESTS_EE_PATH: rspec/matching_tests-ee.txt
|
||||||
RSPEC_MATCHING_TESTS_FOSS_PATH: rspec/matching_tests-foss.txt
|
RSPEC_MATCHING_TESTS_FOSS_PATH: rspec/matching_tests-foss.txt
|
||||||
RSPEC_MATCHING_TEST_FILES_PATH: rspec/matching_test_files.txt
|
|
||||||
RSPEC_PACKED_TESTS_MAPPING_PATH: crystalball/packed-mapping.json
|
RSPEC_PACKED_TESTS_MAPPING_PATH: crystalball/packed-mapping.json
|
||||||
RSPEC_PACKED_TESTS_MAPPING_ALT_PATH: crystalball/packed-mapping-alt.json
|
RSPEC_PACKED_TESTS_MAPPING_ALT_PATH: crystalball/packed-mapping-alt.json
|
||||||
RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML: .gitlab/ci/rails/rspec-predictive.gitlab-ci.yml.erb
|
RSPEC_PREDICTIVE_PIPELINE_TEMPLATE_YML: .gitlab/ci/rails/rspec-predictive.gitlab-ci.yml.erb
|
||||||
|
|
|
@ -132,35 +132,27 @@ detect-tests:
|
||||||
needs: []
|
needs: []
|
||||||
stage: prepare
|
stage: prepare
|
||||||
before_script:
|
before_script:
|
||||||
- source ./scripts/utils.sh
|
|
||||||
- source ./scripts/rspec_helpers.sh
|
|
||||||
# Use alternative coverage based mappings for tier-2 pipeline
|
# Use alternative coverage based mappings for tier-2 pipeline
|
||||||
- |
|
- |
|
||||||
if echo "$CI_MERGE_REQUEST_LABELS" | grep -q "pipeline::tier-2"; then
|
if echo "$CI_MERGE_REQUEST_LABELS" | grep -q "pipeline::tier-2"; then
|
||||||
echo "Using alternative coverage based mappings"
|
|
||||||
MAPPING_TYPE=coverage
|
MAPPING_TYPE=coverage
|
||||||
else
|
else
|
||||||
echo "Using standard described_class based mappings"
|
|
||||||
MAPPING_TYPE=described_class
|
MAPPING_TYPE=described_class
|
||||||
fi
|
fi
|
||||||
script:
|
script:
|
||||||
- |
|
- |
|
||||||
# $FIND_CHANGES_MERGE_REQUEST_IID is defined in as-if-foss.gitlab-ci.yml
|
# $FIND_CHANGES_MERGE_REQUEST_IID is defined in as-if-foss.gitlab-ci.yml
|
||||||
if [ -n "$CI_MERGE_REQUEST_IID" ] || [ -n "$FIND_CHANGES_MERGE_REQUEST_IID" ]; then
|
if [ -n "$CI_MERGE_REQUEST_IID" ] || [ -n "$FIND_CHANGES_MERGE_REQUEST_IID" ]; then
|
||||||
mkdir -p $(dirname "$RSPEC_CHANGED_FILES_PATH")
|
tooling/bin/predictive_tests \
|
||||||
|
--ci \
|
||||||
tooling/bin/predictive_tests --ci --select-tests --with-crystalball-mappings --mapping-type $MAPPING_TYPE
|
--with-crystalball-mappings \
|
||||||
|
--mapping-type $MAPPING_TYPE \
|
||||||
filter_rspec_matched_foss_tests ${RSPEC_MATCHING_TEST_FILES_PATH} ${RSPEC_MATCHING_TESTS_FOSS_PATH};
|
--with-frontend-fixture-mappings \
|
||||||
filter_rspec_matched_ee_tests ${RSPEC_MATCHING_TEST_FILES_PATH} ${RSPEC_MATCHING_TESTS_EE_PATH};
|
--frontend-fixtures-mapping-path $FRONTEND_FIXTURES_MAPPING_PATH \
|
||||||
|
--matching-foss-rspec-test-files-path $RSPEC_MATCHING_TESTS_FOSS_PATH \
|
||||||
echoinfo 'Related FOSS RSpec tests:'
|
--matching-ee-rspec-test-files-path $RSPEC_MATCHING_TESTS_EE_PATH \
|
||||||
echoinfo "$(tr ' ' '\n' < $RSPEC_MATCHING_TESTS_FOSS_PATH)"
|
--matching-jest-test-files-path $RSPEC_MATCHING_JS_FILES_PATH \
|
||||||
echo ""
|
--changed-files-path $RSPEC_CHANGED_FILES_PATH
|
||||||
|
|
||||||
echoinfo 'Related EE RSpec tests:'
|
|
||||||
echoinfo "$(tr ' ' '\n' < $RSPEC_MATCHING_TESTS_EE_PATH)"
|
|
||||||
echo ""
|
|
||||||
fi
|
fi
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 7d
|
expire_in: 7d
|
||||||
|
@ -170,7 +162,6 @@ detect-tests:
|
||||||
- ${RSPEC_MATCHING_JS_FILES_PATH}
|
- ${RSPEC_MATCHING_JS_FILES_PATH}
|
||||||
- ${RSPEC_MATCHING_TESTS_EE_PATH}
|
- ${RSPEC_MATCHING_TESTS_EE_PATH}
|
||||||
- ${RSPEC_MATCHING_TESTS_FOSS_PATH}
|
- ${RSPEC_MATCHING_TESTS_FOSS_PATH}
|
||||||
- ${RSPEC_MATCHING_TEST_FILES_PATH}
|
|
||||||
|
|
||||||
detect-previous-failed-tests:
|
detect-previous-failed-tests:
|
||||||
extends:
|
extends:
|
||||||
|
|
|
@ -82,35 +82,16 @@ export-predictive-test-metrics:
|
||||||
dependencies: []
|
dependencies: []
|
||||||
variables:
|
variables:
|
||||||
GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR: "tmp/predictive_tests"
|
GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR: "tmp/predictive_tests"
|
||||||
GLCI_ALL_FAILED_RSPEC_TESTS_FILE: "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}/rspec_all_failed_tests.txt"
|
|
||||||
before_script:
|
before_script:
|
||||||
- source ./scripts/utils.sh
|
- source ./scripts/utils.sh
|
||||||
- source ./scripts/rspec_helpers.sh
|
- source ./scripts/rspec_helpers.sh
|
||||||
- retrieve_failed_tests "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}" "oneline" "latest"
|
- retrieve_failed_tests "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}" "oneline" "latest"
|
||||||
script:
|
script:
|
||||||
- tooling/bin/predictive_tests --export-predictive-backend-metrics
|
- |
|
||||||
|
tooling/bin/predictive_test_metrics \
|
||||||
|
--export-backend-metrics \
|
||||||
|
--failed-backend-tests-file "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}/rspec_all_failed_tests.txt"
|
||||||
artifacts:
|
artifacts:
|
||||||
expire_in: 7d
|
expire_in: 7d
|
||||||
paths:
|
paths:
|
||||||
- $GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR
|
- $GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR
|
||||||
|
|
||||||
export-predictive-test-metrics-frontend:
|
|
||||||
extends:
|
|
||||||
- export-predictive-test-metrics
|
|
||||||
- .yarn-cache
|
|
||||||
- .with-ci-node-image
|
|
||||||
dependencies:
|
|
||||||
- detect-tests
|
|
||||||
- graphql-schema-dump
|
|
||||||
variables:
|
|
||||||
GLCI_JEST_FAILED_TESTS_FILE: "${GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR}/jest_failed_tests.txt"
|
|
||||||
before_script:
|
|
||||||
- !reference [export-predictive-test-metrics, before_script]
|
|
||||||
- yarn_install_script
|
|
||||||
script:
|
|
||||||
- tooling/bin/predictive_tests --export-predictive-frontend-metrics
|
|
||||||
artifacts:
|
|
||||||
expire_in: 7d
|
|
||||||
paths:
|
|
||||||
- $GLCI_PREDICTIVE_TEST_METRICS_OUTPUT_DIR
|
|
||||||
- $JEST_MATCHING_TEST_FILES_PATH
|
|
||||||
|
|
|
@ -45,6 +45,8 @@ instructions:
|
||||||
fileFilters:
|
fileFilters:
|
||||||
- "spec/**/*_spec.rb"
|
- "spec/**/*_spec.rb"
|
||||||
- "ee/spec/**/*_spec.rb"
|
- "ee/spec/**/*_spec.rb"
|
||||||
|
- "!spec/factories/**/*"
|
||||||
|
- "!spec/support/**/*"
|
||||||
instructions: |
|
instructions: |
|
||||||
1. Test both happy paths and edge cases
|
1. Test both happy paths and edge cases
|
||||||
2. Include error scenarios
|
2. Include error scenarios
|
||||||
|
|
2
Gemfile
2
Gemfile
|
@ -164,7 +164,7 @@ gem 'grape-path-helpers', '~> 2.0.1', feature_category: :api
|
||||||
gem 'rack-cors', '~> 2.0.1', require: 'rack/cors', feature_category: :shared
|
gem 'rack-cors', '~> 2.0.1', require: 'rack/cors', feature_category: :shared
|
||||||
|
|
||||||
# GraphQL API
|
# GraphQL API
|
||||||
gem 'graphql', '2.4.13', feature_category: :api
|
gem 'graphql', '2.5.11', feature_category: :api
|
||||||
gem 'graphql-docs', '~> 5.0.0', group: [:development, :test], feature_category: :api
|
gem 'graphql-docs', '~> 5.0.0', group: [:development, :test], feature_category: :api
|
||||||
gem 'apollo_upload_server', '~> 2.1.6', feature_category: :api
|
gem 'apollo_upload_server', '~> 2.1.6', feature_category: :api
|
||||||
|
|
||||||
|
|
|
@ -292,7 +292,7 @@
|
||||||
{"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"},
|
{"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"},
|
||||||
{"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"},
|
{"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"},
|
||||||
{"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"},
|
{"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"},
|
||||||
{"name":"graphql","version":"2.4.13","platform":"ruby","checksum":"fb1db6e9e24c93c995f8083d66ec65ea70991aa2b68da1b15a360b418af5aa9d"},
|
{"name":"graphql","version":"2.5.11","platform":"ruby","checksum":"1169ffc6e215fd4d60056455b672c40a0cafa0607262049c2cca343b0f6bdb5c"},
|
||||||
{"name":"graphql-docs","version":"5.0.0","platform":"ruby","checksum":"76baca6e5a803a4b6a9fbbbfdbf16742b7c4c546c8592b6e1a7aa4e79e562d04"},
|
{"name":"graphql-docs","version":"5.0.0","platform":"ruby","checksum":"76baca6e5a803a4b6a9fbbbfdbf16742b7c4c546c8592b6e1a7aa4e79e562d04"},
|
||||||
{"name":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"},
|
{"name":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"},
|
||||||
{"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"},
|
{"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"},
|
||||||
|
|
|
@ -948,7 +948,7 @@ GEM
|
||||||
grape
|
grape
|
||||||
rack
|
rack
|
||||||
graphlyte (1.0.0)
|
graphlyte (1.0.0)
|
||||||
graphql (2.4.13)
|
graphql (2.5.11)
|
||||||
base64
|
base64
|
||||||
fiber-storage
|
fiber-storage
|
||||||
logger
|
logger
|
||||||
|
@ -2205,7 +2205,7 @@ DEPENDENCIES
|
||||||
grape-swagger-entity (~> 0.5.5)
|
grape-swagger-entity (~> 0.5.5)
|
||||||
grape_logging (~> 1.8, >= 1.8.4)
|
grape_logging (~> 1.8, >= 1.8.4)
|
||||||
graphlyte (~> 1.0.0)
|
graphlyte (~> 1.0.0)
|
||||||
graphql (= 2.4.13)
|
graphql (= 2.5.11)
|
||||||
graphql-docs (~> 5.0.0)
|
graphql-docs (~> 5.0.0)
|
||||||
grpc (= 1.63.0)
|
grpc (= 1.63.0)
|
||||||
gssapi (~> 1.3.1)
|
gssapi (~> 1.3.1)
|
||||||
|
|
|
@ -292,7 +292,7 @@
|
||||||
{"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"},
|
{"name":"grape-swagger-entity","version":"0.5.5","platform":"ruby","checksum":"a2a0eb28964b1a56775a3571358a9f0a300b703dbaee1ee535adb2a7bed7ece6"},
|
||||||
{"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"},
|
{"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"},
|
||||||
{"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"},
|
{"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"},
|
||||||
{"name":"graphql","version":"2.4.13","platform":"ruby","checksum":"fb1db6e9e24c93c995f8083d66ec65ea70991aa2b68da1b15a360b418af5aa9d"},
|
{"name":"graphql","version":"2.5.11","platform":"ruby","checksum":"1169ffc6e215fd4d60056455b672c40a0cafa0607262049c2cca343b0f6bdb5c"},
|
||||||
{"name":"graphql-docs","version":"5.0.0","platform":"ruby","checksum":"76baca6e5a803a4b6a9fbbbfdbf16742b7c4c546c8592b6e1a7aa4e79e562d04"},
|
{"name":"graphql-docs","version":"5.0.0","platform":"ruby","checksum":"76baca6e5a803a4b6a9fbbbfdbf16742b7c4c546c8592b6e1a7aa4e79e562d04"},
|
||||||
{"name":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"},
|
{"name":"grpc","version":"1.63.0","platform":"aarch64-linux","checksum":"dc75c5fd570b819470781d9512105dddfdd11d984f38b8e60bb946f92d1f79ee"},
|
||||||
{"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"},
|
{"name":"grpc","version":"1.63.0","platform":"arm64-darwin","checksum":"91b93a354508a9d1772f095554f2e4c04358c2b32d7a670e3705b7fc4695c996"},
|
||||||
|
|
|
@ -942,7 +942,7 @@ GEM
|
||||||
grape
|
grape
|
||||||
rack
|
rack
|
||||||
graphlyte (1.0.0)
|
graphlyte (1.0.0)
|
||||||
graphql (2.4.13)
|
graphql (2.5.11)
|
||||||
base64
|
base64
|
||||||
fiber-storage
|
fiber-storage
|
||||||
logger
|
logger
|
||||||
|
@ -2200,7 +2200,7 @@ DEPENDENCIES
|
||||||
grape-swagger-entity (~> 0.5.5)
|
grape-swagger-entity (~> 0.5.5)
|
||||||
grape_logging (~> 1.8, >= 1.8.4)
|
grape_logging (~> 1.8, >= 1.8.4)
|
||||||
graphlyte (~> 1.0.0)
|
graphlyte (~> 1.0.0)
|
||||||
graphql (= 2.4.13)
|
graphql (= 2.5.11)
|
||||||
graphql-docs (~> 5.0.0)
|
graphql-docs (~> 5.0.0)
|
||||||
grpc (= 1.63.0)
|
grpc (= 1.63.0)
|
||||||
gssapi (~> 1.3.1)
|
gssapi (~> 1.3.1)
|
||||||
|
|
|
@ -9,7 +9,7 @@ import {
|
||||||
import GroupsList from '~/vue_shared/components/groups_list/groups_list.vue';
|
import GroupsList from '~/vue_shared/components/groups_list/groups_list.vue';
|
||||||
import { formatGraphQLGroups } from '~/vue_shared/components/groups_list/formatter';
|
import { formatGraphQLGroups } from '~/vue_shared/components/groups_list/formatter';
|
||||||
import ResourceListsEmptyState from '~/vue_shared/components/resource_lists/empty_state.vue';
|
import ResourceListsEmptyState from '~/vue_shared/components/resource_lists/empty_state.vue';
|
||||||
import adminGroupsQuery from 'ee_else_ce/admin/groups/index/graphql/queries/groups.query.graphql';
|
import adminGroupsQuery from './graphql/queries/groups.query.graphql';
|
||||||
|
|
||||||
const baseTab = {
|
const baseTab = {
|
||||||
formatter: (groups) =>
|
formatter: (groups) =>
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
# id field is requested by ~/graphql_shared/fragments/group.fragment.graphql
|
||||||
|
# eslint-disable-next-line @graphql-eslint/require-selections
|
||||||
|
fragment AdminGroup on Group {
|
||||||
|
projectStatistics {
|
||||||
|
storageSize
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
#import "~/graphql_shared/fragments/group.fragment.graphql"
|
#import "~/graphql_shared/fragments/group.fragment.graphql"
|
||||||
#import "~/graphql_shared/fragments/page_info.fragment.graphql"
|
#import "~/graphql_shared/fragments/page_info.fragment.graphql"
|
||||||
|
#import "ee_else_ce/admin/groups/index/graphql/fragments/admin_group.fragment.graphql"
|
||||||
|
|
||||||
query adminGroupsQuery(
|
query adminGroupsQuery(
|
||||||
$first: Int
|
$first: Int
|
||||||
|
@ -22,9 +23,7 @@ query adminGroupsQuery(
|
||||||
) {
|
) {
|
||||||
nodes {
|
nodes {
|
||||||
...Group
|
...Group
|
||||||
projectStatistics {
|
...AdminGroup
|
||||||
storageSize
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
pageInfo {
|
pageInfo {
|
||||||
...PageInfo
|
...PageInfo
|
||||||
|
|
|
@ -190,7 +190,10 @@ export const TOGGLE_MARKDOWN_PREVIEW = {
|
||||||
// However, this particular shortcut has been in place since before the `mod` key was available.
|
// However, this particular shortcut has been in place since before the `mod` key was available.
|
||||||
// We've chosen to leave this implemented as-is for the time being to avoid breaking people's workflows.
|
// We've chosen to leave this implemented as-is for the time being to avoid breaking people's workflows.
|
||||||
// See discussion in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45308#note_527490548.
|
// See discussion in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/45308#note_527490548.
|
||||||
defaultKeys: ['ctrl+shift+p', 'command+shift+p'],
|
// Update 2025-07-17: Adding `alt` version to fix an issue in Windows
|
||||||
|
// This new combination is compatible across Mac, Linux and Windows.
|
||||||
|
// See https://gitlab.com/gitlab-org/gitlab/-/issues/17600#note_2633177789
|
||||||
|
defaultKeys: ['ctrl+shift+p', 'command+shift+p', 'alt+shift+p'],
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
import { DiffFile } from '~/rapid_diffs/diff_file';
|
import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
|
||||||
import { VIEWER_ADAPTERS } from '~/rapid_diffs/adapters';
|
import { VIEWER_ADAPTERS } from '~/rapid_diffs/app/adapters';
|
||||||
|
|
||||||
customElements.define('diff-file', DiffFile);
|
customElements.define('diff-file', DiffFile);
|
||||||
customElements.define(
|
customElements.define(
|
||||||
'diff-file-mounted',
|
'diff-file-mounted',
|
||||||
class extends HTMLElement {
|
class extends HTMLElement {
|
||||||
connectedCallback() {
|
connectedCallback() {
|
||||||
this.parentElement.mount({ adapterConfig: VIEWER_ADAPTERS, observe: () => {} });
|
this.parentElement.mount({
|
||||||
|
adapterConfig: VIEWER_ADAPTERS,
|
||||||
|
observe: () => {},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<script>
|
<script>
|
||||||
import { GlIcon, GlSkeletonLoader } from '@gitlab/ui';
|
import { GlIcon, GlSkeletonLoader } from '@gitlab/ui';
|
||||||
import { STATUS_CLOSED } from '~/issues/constants';
|
import { STATUS_CLOSED } from '~/issues/constants';
|
||||||
import { humanTimeframe, isInPast, localeDateFormat, newDate } from '~/lib/utils/datetime_utility';
|
import { humanTimeframe, isInPast, newDate } from '~/lib/utils/datetime_utility';
|
||||||
import { __ } from '~/locale';
|
import { __ } from '~/locale';
|
||||||
import { STATE_CLOSED, METADATA_KEYS } from '~/work_items/constants';
|
import { STATE_CLOSED, METADATA_KEYS } from '~/work_items/constants';
|
||||||
import {
|
import {
|
||||||
|
@ -46,12 +46,10 @@ export default {
|
||||||
return this.issue.dueDate || findStartAndDueDateWidget(this.issue)?.dueDate;
|
return this.issue.dueDate || findStartAndDueDateWidget(this.issue)?.dueDate;
|
||||||
},
|
},
|
||||||
datesText() {
|
datesText() {
|
||||||
if (this.startDate) {
|
if (this.startDate || this.dueDate) {
|
||||||
return humanTimeframe(newDate(this.startDate), newDate(this.dueDate));
|
return humanTimeframe(newDate(this.startDate), newDate(this.dueDate));
|
||||||
}
|
}
|
||||||
if (this.dueDate) {
|
|
||||||
return localeDateFormat.asDate.format(newDate(this.dueDate));
|
|
||||||
}
|
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
isClosed() {
|
isClosed() {
|
||||||
|
|
|
@ -176,7 +176,7 @@ export function initPolling() {
|
||||||
noteable_id: this.notesData.noteableId,
|
noteable_id: this.notesData.noteableId,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
connected() {
|
connected: () => {
|
||||||
this.fetchUpdatedNotes();
|
this.fetchUpdatedNotes();
|
||||||
},
|
},
|
||||||
received(data) {
|
received(data) {
|
||||||
|
|
|
@ -1,10 +1,3 @@
|
||||||
import { initGroupsListWithFilteredSearch } from '~/groups/init_groups_list_with_filtered_search';
|
|
||||||
import { initYourWorkGroups } from '~/groups/your_work';
|
import { initYourWorkGroups } from '~/groups/your_work';
|
||||||
import { DASHBOARD_FILTERED_SEARCH_NAMESPACE } from '~/groups/constants';
|
|
||||||
import DashboardGroupsEmptyState from '~/groups/components/empty_states/dashboard_groups_empty_state.vue';
|
|
||||||
|
|
||||||
initGroupsListWithFilteredSearch({
|
|
||||||
filteredSearchNamespace: DASHBOARD_FILTERED_SEARCH_NAMESPACE,
|
|
||||||
EmptyState: DashboardGroupsEmptyState,
|
|
||||||
});
|
|
||||||
initYourWorkGroups();
|
initYourWorkGroups();
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import initCommitActions from '~/projects/commit';
|
import initCommitActions from '~/projects/commit';
|
||||||
import { initCommitBoxInfo } from '~/projects/commit_box/info';
|
import { initCommitBoxInfo } from '~/projects/commit_box/info';
|
||||||
import { createRapidDiffsApp } from '~/rapid_diffs/app';
|
import { createRapidDiffsApp } from '~/rapid_diffs';
|
||||||
|
|
||||||
initCommitBoxInfo();
|
initCommitBoxInfo();
|
||||||
initCommitActions();
|
initCommitActions();
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import initCompareSelector from '~/projects/compare';
|
import initCompareSelector from '~/projects/compare';
|
||||||
import { createRapidDiffsApp } from '~/rapid_diffs/app';
|
import { createRapidDiffsApp } from '~/rapid_diffs';
|
||||||
|
|
||||||
initCompareSelector();
|
initCompareSelector();
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ import initPipelines from '~/commit/pipelines/pipelines_bundle';
|
||||||
import MergeRequest from '~/merge_request';
|
import MergeRequest from '~/merge_request';
|
||||||
import CompareApp from '~/merge_requests/components/compare_app.vue';
|
import CompareApp from '~/merge_requests/components/compare_app.vue';
|
||||||
import { __ } from '~/locale';
|
import { __ } from '~/locale';
|
||||||
import { createRapidDiffsApp } from '~/rapid_diffs/app';
|
import { createRapidDiffsApp } from '~/rapid_diffs';
|
||||||
|
|
||||||
const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare');
|
const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare');
|
||||||
if (mrNewCompareNode) {
|
if (mrNewCompareNode) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { initMrPage } from '~/pages/projects/merge_requests/page';
|
import { initMrPage } from '~/pages/projects/merge_requests/page';
|
||||||
import { createRapidDiffsApp } from '~/rapid_diffs/app';
|
import { createRapidDiffsApp } from '~/rapid_diffs';
|
||||||
|
|
||||||
initMrPage(createRapidDiffsApp);
|
initMrPage(createRapidDiffsApp);
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
export const MOUNTED = 'MOUNTED';
|
||||||
|
export const CLICK = 'CLICK';
|
||||||
|
export const VISIBLE = 'VISIBLE';
|
||||||
|
export const INVISIBLE = 'INVISIBLE';
|
||||||
|
export const EXPAND_FILE = 'EXPAND_FILE';
|
||||||
|
export const COLLAPSE_FILE = 'COLLAPSE_FILE';
|
|
@ -1,16 +0,0 @@
|
||||||
import { ExpandLinesAdapter } from '~/rapid_diffs/expand_lines/adapter';
|
|
||||||
import { OptionsMenuAdapter } from '~/rapid_diffs/options_menu/adapter';
|
|
||||||
import { ToggleFileAdapter } from '~/rapid_diffs/toggle_file/adapter';
|
|
||||||
import { DisableDiffSideAdapter } from '~/rapid_diffs/disable_diff_side/adapter';
|
|
||||||
import { ImageAdapter } from '~/rapid_diffs/image_viewer/adapter';
|
|
||||||
import { LoadFileAdapter } from '~/rapid_diffs/load_file/adapter';
|
|
||||||
import { LineLinkAdapter } from '~/rapid_diffs/line_link/adapter';
|
|
||||||
|
|
||||||
const HEADER_ADAPTERS = [OptionsMenuAdapter, ToggleFileAdapter];
|
|
||||||
|
|
||||||
export const VIEWER_ADAPTERS = {
|
|
||||||
text_inline: [...HEADER_ADAPTERS, ExpandLinesAdapter, LineLinkAdapter],
|
|
||||||
text_parallel: [...HEADER_ADAPTERS, ExpandLinesAdapter, DisableDiffSideAdapter, LineLinkAdapter],
|
|
||||||
image: [...HEADER_ADAPTERS, ImageAdapter],
|
|
||||||
no_preview: [...HEADER_ADAPTERS, LoadFileAdapter],
|
|
||||||
};
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { INVISIBLE, VISIBLE } from '~/rapid_diffs/events';
|
import { INVISIBLE, VISIBLE } from '~/rapid_diffs/adapter_events';
|
||||||
|
|
||||||
const opposingSides = {
|
const opposingSides = {
|
||||||
old: 'new',
|
old: 'new',
|
||||||
|
@ -14,7 +14,7 @@ function disableDiffsSideHandler(e) {
|
||||||
|
|
||||||
const getBody = (diffElement) => diffElement.querySelector('[data-file-body]');
|
const getBody = (diffElement) => diffElement.querySelector('[data-file-body]');
|
||||||
|
|
||||||
export const DisableDiffSideAdapter = {
|
export const disableDiffSideAdapter = {
|
||||||
[VISIBLE]() {
|
[VISIBLE]() {
|
||||||
this.sink.disableDiffsSideHandler = disableDiffsSideHandler.bind(this);
|
this.sink.disableDiffsSideHandler = disableDiffsSideHandler.bind(this);
|
||||||
getBody(this.diffElement).addEventListener('mousedown', this.sink.disableDiffsSideHandler);
|
getBody(this.diffElement).addEventListener('mousedown', this.sink.disableDiffsSideHandler);
|
|
@ -1,5 +1,5 @@
|
||||||
import { getLines } from '~/rapid_diffs/expand_lines/get_lines';
|
import { getLines } from '~/rapid_diffs/adapters/expand_lines/get_lines';
|
||||||
import { DiffLineRow } from '~/rapid_diffs/expand_lines/diff_line_row';
|
import { DiffLineRow } from '~/rapid_diffs/adapters/expand_lines/diff_line_row';
|
||||||
import { createAlert } from '~/alert';
|
import { createAlert } from '~/alert';
|
||||||
import { s__ } from '~/locale';
|
import { s__ } from '~/locale';
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ const getSurroundingLines = (hunkHeaderRow) => {
|
||||||
return [lineBefore, lineAfter].map((lineRow) => (lineRow ? new DiffLineRow(lineRow) : null));
|
return [lineBefore, lineAfter].map((lineRow) => (lineRow ? new DiffLineRow(lineRow) : null));
|
||||||
};
|
};
|
||||||
|
|
||||||
export const ExpandLinesAdapter = {
|
export const expandLinesAdapter = {
|
||||||
clicks: {
|
clicks: {
|
||||||
async expandLines(event, button) {
|
async expandLines(event, button) {
|
||||||
const { expandDirection } = button.dataset;
|
const { expandDirection } = button.dataset;
|
|
@ -1,8 +1,8 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import ImageDiffViewer from '~/vue_shared/components/diff_viewer/viewers/image_diff_viewer.vue';
|
import ImageDiffViewer from '~/vue_shared/components/diff_viewer/viewers/image_diff_viewer.vue';
|
||||||
import { MOUNTED } from '../events';
|
import { MOUNTED } from '../adapter_events';
|
||||||
|
|
||||||
export const ImageAdapter = {
|
export const imageAdapter = {
|
||||||
[MOUNTED]() {
|
[MOUNTED]() {
|
||||||
const data = JSON.parse(this.diffElement.querySelector('[data-image-data]').dataset.imageData);
|
const data = JSON.parse(this.diffElement.querySelector('[data-image-data]').dataset.imageData);
|
||||||
// eslint-disable-next-line no-new
|
// eslint-disable-next-line no-new
|
|
@ -1,4 +1,4 @@
|
||||||
import { INVISIBLE, VISIBLE } from '~/rapid_diffs/events';
|
import { INVISIBLE, VISIBLE } from '~/rapid_diffs/adapter_events';
|
||||||
import { NO_SCROLL_TO_HASH_CLASS } from '~/lib/utils/common_utils';
|
import { NO_SCROLL_TO_HASH_CLASS } from '~/lib/utils/common_utils';
|
||||||
|
|
||||||
function disableScrollToLink(e) {
|
function disableScrollToLink(e) {
|
||||||
|
@ -24,7 +24,7 @@ function disableScrollToLink(e) {
|
||||||
|
|
||||||
const getBody = (diffElement) => diffElement.querySelector('[data-file-body]');
|
const getBody = (diffElement) => diffElement.querySelector('[data-file-body]');
|
||||||
|
|
||||||
export const LineLinkAdapter = {
|
export const lineLinkAdapter = {
|
||||||
[VISIBLE]() {
|
[VISIBLE]() {
|
||||||
this.sink.disableScrollToLink = disableScrollToLink.bind(this);
|
this.sink.disableScrollToLink = disableScrollToLink.bind(this);
|
||||||
getBody(this.diffElement).addEventListener('click', this.sink.disableScrollToLink);
|
getBody(this.diffElement).addEventListener('click', this.sink.disableScrollToLink);
|
|
@ -10,7 +10,7 @@ function htmlToElement(html) {
|
||||||
return doc.body.firstChild;
|
return doc.body.firstChild;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const LoadFileAdapter = {
|
export const loadFileAdapter = {
|
||||||
clicks: {
|
clicks: {
|
||||||
async showChanges(event, button) {
|
async showChanges(event, button) {
|
||||||
const { parallelView, showWhitespace } = useDiffsView(pinia);
|
const { parallelView, showWhitespace } = useDiffsView(pinia);
|
|
@ -6,7 +6,7 @@ function getMenuItems(container) {
|
||||||
return JSON.parse(container.querySelector('script').textContent);
|
return JSON.parse(container.querySelector('script').textContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
export const OptionsMenuAdapter = {
|
export const optionsMenuAdapter = {
|
||||||
clicks: {
|
clicks: {
|
||||||
toggleOptionsMenu(event, button) {
|
toggleOptionsMenu(event, button) {
|
||||||
const menuContainer = this.diffElement.querySelector('[data-options-menu]');
|
const menuContainer = this.diffElement.querySelector('[data-options-menu]');
|
|
@ -1,4 +1,4 @@
|
||||||
import { COLLAPSE_FILE, EXPAND_FILE, MOUNTED } from '~/rapid_diffs/events';
|
import { COLLAPSE_FILE, EXPAND_FILE, MOUNTED } from '~/rapid_diffs/adapter_events';
|
||||||
|
|
||||||
function getDetails(root) {
|
function getDetails(root) {
|
||||||
return root.querySelector('[data-file-body]');
|
return root.querySelector('[data-file-body]');
|
||||||
|
@ -32,7 +32,7 @@ function stopTransition(element) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export const ToggleFileAdapter = {
|
export const toggleFileAdapter = {
|
||||||
clicks: {
|
clicks: {
|
||||||
toggleFile(event, button) {
|
toggleFile(event, button) {
|
||||||
const collapsed = this.diffElement.dataset.collapsed === 'true';
|
const collapsed = this.diffElement.dataset.collapsed === 'true';
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { expandLinesAdapter } from '~/rapid_diffs/adapters/expand_lines';
|
||||||
|
import { optionsMenuAdapter } from '~/rapid_diffs/adapters/options_menu';
|
||||||
|
import { toggleFileAdapter } from '~/rapid_diffs/adapters/toggle_file';
|
||||||
|
import { disableDiffSideAdapter } from '~/rapid_diffs/adapters/disable_diff_side';
|
||||||
|
import { imageAdapter } from '~/rapid_diffs/adapters/image_viewer';
|
||||||
|
import { loadFileAdapter } from '~/rapid_diffs/adapters/load_file';
|
||||||
|
import { lineLinkAdapter } from '~/rapid_diffs/adapters/line_link';
|
||||||
|
|
||||||
|
const HEADER_ADAPTERS = [optionsMenuAdapter, toggleFileAdapter];
|
||||||
|
|
||||||
|
export const VIEWER_ADAPTERS = {
|
||||||
|
text_inline: [...HEADER_ADAPTERS, expandLinesAdapter, lineLinkAdapter],
|
||||||
|
text_parallel: [...HEADER_ADAPTERS, expandLinesAdapter, disableDiffSideAdapter, lineLinkAdapter],
|
||||||
|
image: [...HEADER_ADAPTERS, imageAdapter],
|
||||||
|
no_preview: [...HEADER_ADAPTERS, loadFileAdapter],
|
||||||
|
};
|
|
@ -1,7 +1,7 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import axios from '~/lib/utils/axios_utils';
|
import axios from '~/lib/utils/axios_utils';
|
||||||
import { pinia } from '~/pinia/instance';
|
import { pinia } from '~/pinia/instance';
|
||||||
import { DiffFile } from '~/rapid_diffs/diff_file';
|
import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
|
||||||
import FileBrowserToggle from '~/diffs/components/file_browser_toggle.vue';
|
import FileBrowserToggle from '~/diffs/components/file_browser_toggle.vue';
|
||||||
import { generateTreeList } from '~/diffs/utils/tree_worker_utils';
|
import { generateTreeList } from '~/diffs/utils/tree_worker_utils';
|
||||||
import { SET_TREE_DATA } from '~/diffs/store/mutation_types';
|
import { SET_TREE_DATA } from '~/diffs/store/mutation_types';
|
|
@ -1,20 +1,20 @@
|
||||||
// eslint-disable-next-line max-classes-per-file
|
|
||||||
import { pinia } from '~/pinia/instance';
|
import { pinia } from '~/pinia/instance';
|
||||||
import { initViewSettings } from '~/rapid_diffs/app/view_settings';
|
import { initViewSettings } from '~/rapid_diffs/app/view_settings';
|
||||||
import { DiffFile } from '~/rapid_diffs/diff_file';
|
import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
|
||||||
import { useDiffsList } from '~/rapid_diffs/stores/diffs_list';
|
import { useDiffsList } from '~/rapid_diffs/stores/diffs_list';
|
||||||
import { initFileBrowser } from '~/rapid_diffs/app/init_file_browser';
|
import { initFileBrowser } from '~/rapid_diffs/app/file_browser';
|
||||||
import { StreamingError } from '~/rapid_diffs/streaming_error';
|
import { StreamingError } from '~/rapid_diffs/web_components/streaming_error';
|
||||||
import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
|
import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
|
||||||
import { initHiddenFilesWarning } from '~/rapid_diffs/app/init_hidden_files_warning';
|
import { initHiddenFilesWarning } from '~/rapid_diffs/app/init_hidden_files_warning';
|
||||||
import { createAlert } from '~/alert';
|
import { createAlert } from '~/alert';
|
||||||
import { __ } from '~/locale';
|
import { __ } from '~/locale';
|
||||||
import { fixWebComponentsStreamingOnSafari } from '~/rapid_diffs/app/safari_fix';
|
import { fixWebComponentsStreamingOnSafari } from '~/rapid_diffs/app/quirks/safari_fix';
|
||||||
import { DIFF_FILE_MOUNTED } from '~/rapid_diffs/dom_events';
|
import { DIFF_FILE_MOUNTED } from '~/rapid_diffs/dom_events';
|
||||||
import { VIEWER_ADAPTERS } from '~/rapid_diffs/adapters';
|
import { VIEWER_ADAPTERS } from '~/rapid_diffs/app/adapters';
|
||||||
import { camelizeKeys } from '~/lib/utils/object_utils';
|
import { camelizeKeys } from '~/lib/utils/object_utils';
|
||||||
import { disableBrokenContentVisibility } from '~/rapid_diffs/app/content_visibility_fix';
|
import { disableBrokenContentVisibility } from '~/rapid_diffs/app/quirks/content_visibility_fix';
|
||||||
import { useApp } from '~/rapid_diffs/stores/app';
|
import { useApp } from '~/rapid_diffs/stores/app';
|
||||||
|
import { createDiffFileMounted } from '~/rapid_diffs/web_components/diff_file_mounted';
|
||||||
|
|
||||||
// This facade interface joins together all the bits and pieces of Rapid Diffs: DiffFile, Settings, File browser, etc.
|
// This facade interface joins together all the bits and pieces of Rapid Diffs: DiffFile, Settings, File browser, etc.
|
||||||
// It's a unified entrypoint for Rapid Diffs and all external communications should happen through this interface.
|
// It's a unified entrypoint for Rapid Diffs and all external communications should happen through this interface.
|
||||||
|
@ -25,9 +25,11 @@ export class RapidDiffsFacade {
|
||||||
adapterConfig = VIEWER_ADAPTERS;
|
adapterConfig = VIEWER_ADAPTERS;
|
||||||
|
|
||||||
#DiffFileImplementation;
|
#DiffFileImplementation;
|
||||||
|
#DiffFileMounted;
|
||||||
|
|
||||||
constructor({ DiffFileImplementation = DiffFile } = {}) {
|
constructor({ DiffFileImplementation = DiffFile } = {}) {
|
||||||
this.#DiffFileImplementation = DiffFileImplementation;
|
this.#DiffFileImplementation = DiffFileImplementation;
|
||||||
|
this.#DiffFileMounted = createDiffFileMounted(this);
|
||||||
this.root = document.querySelector('[data-rapid-diffs]');
|
this.root = document.querySelector('[data-rapid-diffs]');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,15 +107,6 @@ export class RapidDiffsFacade {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
get #DiffFileMounted() {
|
|
||||||
const appContext = this;
|
|
||||||
return class extends HTMLElement {
|
|
||||||
connectedCallback() {
|
|
||||||
this.parentElement.mount(appContext);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#initHeader() {
|
#initHeader() {
|
||||||
useDiffsView(pinia).diffsStatsEndpoint = this.appData.diffsStatsEndpoint;
|
useDiffsView(pinia).diffsStatsEndpoint = this.appData.diffsStatsEndpoint;
|
||||||
useDiffsView(pinia).streamUrl = this.appData.reloadStreamUrl;
|
useDiffsView(pinia).streamUrl = this.appData.reloadStreamUrl;
|
||||||
|
@ -155,7 +148,3 @@ export class RapidDiffsFacade {
|
||||||
return this.appData.lazy;
|
return this.appData.lazy;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createRapidDiffsApp = (options) => {
|
|
||||||
return new RapidDiffsFacade(options);
|
|
||||||
};
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
|
||||||
import { pinia } from '~/pinia/instance';
|
import { pinia } from '~/pinia/instance';
|
||||||
import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
|
import HiddenFilesWarning from '~/diffs/components/hidden_files_warning.vue';
|
||||||
|
|
||||||
export async function initHiddenFilesWarning(el) {
|
export function initHiddenFilesWarning(el) {
|
||||||
// eslint-disable-next-line no-new
|
// eslint-disable-next-line no-new
|
||||||
new Vue({
|
new Vue({
|
||||||
el,
|
el,
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
import Vue from 'vue';
|
|
||||||
import { createPinia, PiniaVuePlugin } from 'pinia';
|
|
||||||
|
|
||||||
Vue.use(PiniaVuePlugin);
|
|
||||||
export const pinia = createPinia();
|
|
|
@ -3,8 +3,8 @@ import { mapState, mapActions } from 'pinia';
|
||||||
import { parseBoolean } from '~/lib/utils/common_utils';
|
import { parseBoolean } from '~/lib/utils/common_utils';
|
||||||
import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
|
import { useDiffsView } from '~/rapid_diffs/stores/diffs_view';
|
||||||
import DiffAppControls from '~/diffs/components/diff_app_controls.vue';
|
import DiffAppControls from '~/diffs/components/diff_app_controls.vue';
|
||||||
import { DiffFile } from '~/rapid_diffs/diff_file';
|
import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
|
||||||
import { COLLAPSE_FILE, EXPAND_FILE } from '~/rapid_diffs/events';
|
import { COLLAPSE_FILE, EXPAND_FILE } from '~/rapid_diffs/adapter_events';
|
||||||
import { useDiffsList } from '~/rapid_diffs/stores/diffs_list';
|
import { useDiffsList } from '~/rapid_diffs/stores/diffs_list';
|
||||||
|
|
||||||
const collapseAllFiles = () => {
|
const collapseAllFiles = () => {
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
export const MOUNTED = 'mounted';
|
|
||||||
export const CLICK = 'click';
|
|
||||||
export const VISIBLE = 'visible';
|
|
||||||
export const INVISIBLE = 'invisible';
|
|
||||||
export const EXPAND_FILE = 'EXPAND_FILE';
|
|
||||||
export const COLLAPSE_FILE = 'COLLAPSE_FILE';
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
import { RapidDiffsFacade } from '~/rapid_diffs/app';
|
||||||
|
|
||||||
|
export const createRapidDiffsApp = (options) => {
|
||||||
|
return new RapidDiffsFacade(options);
|
||||||
|
};
|
|
@ -2,7 +2,7 @@ import { defineStore } from 'pinia';
|
||||||
import { debounce } from 'lodash';
|
import { debounce } from 'lodash';
|
||||||
import { renderHtmlStreams } from '~/streaming/render_html_streams';
|
import { renderHtmlStreams } from '~/streaming/render_html_streams';
|
||||||
import { toPolyfillReadable } from '~/streaming/polyfills';
|
import { toPolyfillReadable } from '~/streaming/polyfills';
|
||||||
import { DiffFile } from '~/rapid_diffs/diff_file';
|
import { DiffFile } from '~/rapid_diffs/web_components/diff_file';
|
||||||
import { performanceMarkAndMeasure } from '~/performance/utils';
|
import { performanceMarkAndMeasure } from '~/performance/utils';
|
||||||
|
|
||||||
export const statuses = {
|
export const statuses = {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @typedef {import('./app/index.js').RapidDiffsFacade} */
|
/** @typedef {import('../app').RapidDiffsFacade} */
|
||||||
import { camelizeKeys } from '~/lib/utils/object_utils';
|
import { camelizeKeys } from '~/lib/utils/object_utils';
|
||||||
import { DIFF_FILE_MOUNTED } from './dom_events';
|
import { DIFF_FILE_MOUNTED } from '../dom_events';
|
||||||
import * as events from './events';
|
import * as events from '../adapter_events';
|
||||||
|
|
||||||
const eventNames = Object.values(events);
|
const eventNames = Object.values(events);
|
||||||
const dataCacheKey = Symbol('data');
|
const dataCacheKey = Symbol('data');
|
||||||
|
@ -66,7 +66,7 @@ export class DiffFile extends HTMLElement {
|
||||||
_trigger(event, ...args) {
|
_trigger(event, ...args) {
|
||||||
if (!eventNames.includes(event))
|
if (!eventNames.includes(event))
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Missing event declaration: ${event}. Did you forget to declare this in ~/rapid_diffs/events.js?`,
|
`Missing event declaration: ${event}. Did you forget to declare this in ~/rapid_diffs/adapter_events.js?`,
|
||||||
);
|
);
|
||||||
this.adapters.forEach((adapter) => adapter[event]?.call?.(this.adapterContext, ...args));
|
this.adapters.forEach((adapter) => adapter[event]?.call?.(this.adapterContext, ...args));
|
||||||
}
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
export const createDiffFileMounted = (appContext) => {
|
||||||
|
return class extends HTMLElement {
|
||||||
|
connectedCallback() {
|
||||||
|
// this context is injected into the DiffFile component
|
||||||
|
this.parentElement.mount(appContext);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
|
@ -273,11 +273,7 @@ export default {
|
||||||
class="gl-flex gl-flex-wrap gl-items-center gl-gap-3 gl-self-end"
|
class="gl-flex gl-flex-wrap gl-items-center gl-gap-3 gl-self-end"
|
||||||
data-testid="blob-controls"
|
data-testid="blob-controls"
|
||||||
>
|
>
|
||||||
<open-mr-badge
|
<open-mr-badge :project-path="projectPath" :blob-path="filePath" />
|
||||||
v-if="glFeatures.filterBlobPath"
|
|
||||||
:project-path="projectPath"
|
|
||||||
:blob-path="filePath"
|
|
||||||
/>
|
|
||||||
<gl-button
|
<gl-button
|
||||||
v-gl-tooltip.html="findFileTooltip"
|
v-gl-tooltip.html="findFileTooltip"
|
||||||
:title="findFileTooltip"
|
:title="findFileTooltip"
|
||||||
|
|
|
@ -4,7 +4,9 @@ import {
|
||||||
GlTooltipDirective,
|
GlTooltipDirective,
|
||||||
GlDisclosureDropdownGroup,
|
GlDisclosureDropdownGroup,
|
||||||
GlDisclosureDropdownItem,
|
GlDisclosureDropdownItem,
|
||||||
|
GlLink,
|
||||||
} from '@gitlab/ui';
|
} from '@gitlab/ui';
|
||||||
|
import { isMetaClick } from '~/lib/utils/common_utils';
|
||||||
import { visitUrl } from '~/lib/utils/url_utility';
|
import { visitUrl } from '~/lib/utils/url_utility';
|
||||||
import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue';
|
import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue';
|
||||||
import { __, s__ } from '~/locale';
|
import { __, s__ } from '~/locale';
|
||||||
|
@ -13,9 +15,9 @@ import {
|
||||||
TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN,
|
TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN,
|
||||||
} from '~/invite_members/constants';
|
} from '~/invite_members/constants';
|
||||||
import {
|
import {
|
||||||
|
BASE_ALLOWED_CREATE_TYPES,
|
||||||
WORK_ITEM_TYPE_NAME_EPIC,
|
WORK_ITEM_TYPE_NAME_EPIC,
|
||||||
CREATE_NEW_WORK_ITEM_MODAL,
|
CREATE_NEW_WORK_ITEM_MODAL,
|
||||||
CREATE_NEW_GROUP_WORK_ITEM_MODAL,
|
|
||||||
NAME_TO_TEXT_LOWERCASE_MAP,
|
NAME_TO_TEXT_LOWERCASE_MAP,
|
||||||
sprintfWorkItem,
|
sprintfWorkItem,
|
||||||
} from '~/work_items/constants';
|
} from '~/work_items/constants';
|
||||||
|
@ -30,6 +32,7 @@ export default {
|
||||||
GlDisclosureDropdown,
|
GlDisclosureDropdown,
|
||||||
GlDisclosureDropdownGroup,
|
GlDisclosureDropdownGroup,
|
||||||
GlDisclosureDropdownItem,
|
GlDisclosureDropdownItem,
|
||||||
|
GlLink,
|
||||||
InviteMembersTrigger,
|
InviteMembersTrigger,
|
||||||
CreateWorkItemModal: () => import('~/work_items/components/create_work_item_modal.vue'),
|
CreateWorkItemModal: () => import('~/work_items/components/create_work_item_modal.vue'),
|
||||||
},
|
},
|
||||||
|
@ -39,7 +42,7 @@ export default {
|
||||||
i18n: {
|
i18n: {
|
||||||
createNew: __('Create new…'),
|
createNew: __('Create new…'),
|
||||||
},
|
},
|
||||||
inject: ['isImpersonating', 'fullPath', 'workItemPlanningViewEnabled'],
|
inject: ['isGroup', 'isImpersonating', 'fullPath', 'workItemPlanningViewEnabled'],
|
||||||
props: {
|
props: {
|
||||||
groups: {
|
groups: {
|
||||||
type: Array,
|
type: Array,
|
||||||
|
@ -49,17 +52,27 @@ export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
dropdownOpen: false,
|
dropdownOpen: false,
|
||||||
showCreateGroupWorkItemModal: false,
|
|
||||||
showCreateWorkItemModal: false,
|
showCreateWorkItemModal: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
allowedWorkItemTypes() {
|
||||||
|
if (this.isGroup) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return BASE_ALLOWED_CREATE_TYPES;
|
||||||
|
},
|
||||||
dropdownOffset() {
|
dropdownOffset() {
|
||||||
return {
|
return {
|
||||||
mainAxis: DROPDOWN_Y_OFFSET,
|
mainAxis: DROPDOWN_Y_OFFSET,
|
||||||
crossAxis: this.isImpersonating ? DROPDOWN_X_OFFSET_IMPERSONATING : DROPDOWN_X_OFFSET_BASE,
|
crossAxis: this.isImpersonating ? DROPDOWN_X_OFFSET_IMPERSONATING : DROPDOWN_X_OFFSET_BASE,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
preselectedWorkItemType() {
|
||||||
|
return !this.workItemPlanningViewEnabled && this.isGroup
|
||||||
|
? WORK_ITEM_TYPE_NAME_EPIC
|
||||||
|
: undefined;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
isInvitedMembers(groupItem) {
|
isInvitedMembers(groupItem) {
|
||||||
|
@ -68,15 +81,24 @@ export default {
|
||||||
isCreateWorkItem(groupItem) {
|
isCreateWorkItem(groupItem) {
|
||||||
return groupItem.component === CREATE_NEW_WORK_ITEM_MODAL;
|
return groupItem.component === CREATE_NEW_WORK_ITEM_MODAL;
|
||||||
},
|
},
|
||||||
isCreateGroupWorkItem(groupItem) {
|
getCreateWorkItemItem(groupItem) {
|
||||||
return groupItem.component === CREATE_NEW_GROUP_WORK_ITEM_MODAL;
|
// Make sure <gl-disclosure-dropdown-item> doesn't have an href so it's
|
||||||
|
// not rendered as <a> which prevents us from opening the create modal
|
||||||
|
return { ...groupItem, href: undefined };
|
||||||
},
|
},
|
||||||
handleCreateWorkItemClick() {
|
getCreateWorkItemHref(groupItem) {
|
||||||
if (this.workItemPlanningViewEnabled) {
|
return this.workItemPlanningViewEnabled ? undefined : groupItem.href;
|
||||||
this.showCreateWorkItemModal = true;
|
},
|
||||||
} else {
|
handleCreateWorkItemClick(event) {
|
||||||
this.showCreateGroupWorkItemModal = true;
|
if (event && isMetaClick(event)) {
|
||||||
|
// opening in a new tab
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// don't follow the link for normal clicks - open in modal
|
||||||
|
event?.preventDefault?.();
|
||||||
|
|
||||||
|
this.showCreateWorkItemModal = true;
|
||||||
},
|
},
|
||||||
handleWorkItemCreated(workItem) {
|
handleWorkItemCreated(workItem) {
|
||||||
// Triggering the toast at this component, because we want to lazy load the modal
|
// Triggering the toast at this component, because we want to lazy load the modal
|
||||||
|
@ -85,7 +107,6 @@ export default {
|
||||||
|
|
||||||
// Hide the modal first to prevent the component from being destroyed
|
// Hide the modal first to prevent the component from being destroyed
|
||||||
// before we can capture the event data
|
// before we can capture the event data
|
||||||
this.showCreateGroupWorkItemModal = false;
|
|
||||||
this.showCreateWorkItemModal = false;
|
this.showCreateWorkItemModal = false;
|
||||||
|
|
||||||
const workItemType = NAME_TO_TEXT_LOWERCASE_MAP[workItem?.workItemType?.name];
|
const workItemType = NAME_TO_TEXT_LOWERCASE_MAP[workItem?.workItemType?.name];
|
||||||
|
@ -134,40 +155,37 @@ export default {
|
||||||
trigger-source="top_nav"
|
trigger-source="top_nav"
|
||||||
:trigger-element="$options.TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN"
|
:trigger-element="$options.TRIGGER_ELEMENT_DISCLOSURE_DROPDOWN"
|
||||||
/>
|
/>
|
||||||
<gl-disclosure-dropdown-item
|
|
||||||
v-else-if="isCreateGroupWorkItem(groupItem)"
|
|
||||||
:key="`${groupItem.text}-group-modal-trigger`"
|
|
||||||
:item="groupItem"
|
|
||||||
data-testid="new-group-work-item-trigger"
|
|
||||||
@action="showCreateGroupWorkItemModal = true"
|
|
||||||
/>
|
|
||||||
<gl-disclosure-dropdown-item
|
<gl-disclosure-dropdown-item
|
||||||
v-else-if="isCreateWorkItem(groupItem)"
|
v-else-if="isCreateWorkItem(groupItem)"
|
||||||
:key="`${groupItem.text}-modal-trigger`"
|
:key="`${groupItem.text}-modal-trigger`"
|
||||||
:item="groupItem"
|
:item="getCreateWorkItemItem(groupItem)"
|
||||||
data-testid="new-work-item-trigger"
|
data-testid="new-work-item-trigger"
|
||||||
@action="handleCreateWorkItemClick"
|
@action="handleCreateWorkItemClick"
|
||||||
/>
|
>
|
||||||
|
<template #list-item>
|
||||||
|
<gl-link
|
||||||
|
v-if="getCreateWorkItemHref(groupItem)"
|
||||||
|
class="gl-block gl-text-default hover:gl-text-default hover:gl-no-underline"
|
||||||
|
:href="getCreateWorkItemHref(groupItem)"
|
||||||
|
@click.stop="handleCreateWorkItemClick"
|
||||||
|
>
|
||||||
|
{{ groupItem.text }}
|
||||||
|
</gl-link>
|
||||||
|
</template>
|
||||||
|
</gl-disclosure-dropdown-item>
|
||||||
<gl-disclosure-dropdown-item v-else :key="groupItem.text" :item="groupItem" />
|
<gl-disclosure-dropdown-item v-else :key="groupItem.text" :item="groupItem" />
|
||||||
</template>
|
</template>
|
||||||
</gl-disclosure-dropdown-group>
|
</gl-disclosure-dropdown-group>
|
||||||
<create-work-item-modal
|
|
||||||
v-if="showCreateGroupWorkItemModal"
|
|
||||||
visible
|
|
||||||
:full-path="fullPath"
|
|
||||||
hide-button
|
|
||||||
is-group
|
|
||||||
data-testid="new-group-work-item-modal"
|
|
||||||
:preselected-work-item-type="$options.WORK_ITEM_TYPE_NAME_EPIC"
|
|
||||||
@hideModal="showCreateGroupWorkItemModal = false"
|
|
||||||
@workItemCreated="handleWorkItemCreated"
|
|
||||||
/>
|
|
||||||
<create-work-item-modal
|
<create-work-item-modal
|
||||||
v-if="showCreateWorkItemModal"
|
v-if="showCreateWorkItemModal"
|
||||||
visible
|
:allowed-work-item-types="allowedWorkItemTypes"
|
||||||
hide-button
|
:always-show-work-item-type-select="!isGroup"
|
||||||
data-testid="new-work-item-modal"
|
|
||||||
:full-path="fullPath"
|
:full-path="fullPath"
|
||||||
|
hide-button
|
||||||
|
:is-group="isGroup"
|
||||||
|
:preselected-work-item-type="preselectedWorkItemType"
|
||||||
|
visible
|
||||||
|
data-testid="new-work-item-modal"
|
||||||
@hideModal="showCreateWorkItemModal = false"
|
@hideModal="showCreateWorkItemModal = false"
|
||||||
@workItemCreated="handleWorkItemCreated"
|
@workItemCreated="handleWorkItemCreated"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -14,13 +14,18 @@ export const availableGraphQLGroupActions = ({
|
||||||
isSelfDeletionInProgress,
|
isSelfDeletionInProgress,
|
||||||
isSelfDeletionScheduled,
|
isSelfDeletionScheduled,
|
||||||
}) => {
|
}) => {
|
||||||
|
// No actions available when group deletion is in progress
|
||||||
|
if (isSelfDeletionInProgress) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
const baseActions = [];
|
const baseActions = [];
|
||||||
|
|
||||||
if (userPermissions.viewEditPage) {
|
if (userPermissions.viewEditPage) {
|
||||||
baseActions.push(ACTION_EDIT);
|
baseActions.push(ACTION_EDIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userPermissions.removeGroup && isSelfDeletionScheduled && !isSelfDeletionInProgress) {
|
if (userPermissions.removeGroup && isSelfDeletionScheduled) {
|
||||||
baseActions.push(ACTION_RESTORE);
|
baseActions.push(ACTION_RESTORE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +38,7 @@ export const availableGraphQLGroupActions = ({
|
||||||
if (!markedForDeletion) {
|
if (!markedForDeletion) {
|
||||||
baseActions.push(ACTION_DELETE);
|
baseActions.push(ACTION_DELETE);
|
||||||
// Groups with self deletion scheduled can be deleted immediately
|
// Groups with self deletion scheduled can be deleted immediately
|
||||||
} else if (isSelfDeletionScheduled && !isSelfDeletionInProgress) {
|
} else if (isSelfDeletionScheduled) {
|
||||||
baseActions.push(ACTION_DELETE_IMMEDIATELY);
|
baseActions.push(ACTION_DELETE_IMMEDIATELY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,6 @@ import {
|
||||||
} from '../../constants';
|
} from '../../constants';
|
||||||
import workItemBulkUpdateMutation from '../../graphql/list/work_item_bulk_update.mutation.graphql';
|
import workItemBulkUpdateMutation from '../../graphql/list/work_item_bulk_update.mutation.graphql';
|
||||||
import getAvailableBulkEditWidgets from '../../graphql/list/get_available_bulk_edit_widgets.query.graphql';
|
import getAvailableBulkEditWidgets from '../../graphql/list/get_available_bulk_edit_widgets.query.graphql';
|
||||||
import workItemParent from '../../graphql/list/work_item_parent.query.graphql';
|
|
||||||
import WorkItemBulkEditAssignee from './work_item_bulk_edit_assignee.vue';
|
import WorkItemBulkEditAssignee from './work_item_bulk_edit_assignee.vue';
|
||||||
import WorkItemBulkEditDropdown from './work_item_bulk_edit_dropdown.vue';
|
import WorkItemBulkEditDropdown from './work_item_bulk_edit_dropdown.vue';
|
||||||
import WorkItemBulkEditLabels from './work_item_bulk_edit_labels.vue';
|
import WorkItemBulkEditLabels from './work_item_bulk_edit_labels.vue';
|
||||||
|
@ -84,7 +83,6 @@ export default {
|
||||||
assigneeId: undefined,
|
assigneeId: undefined,
|
||||||
confidentiality: undefined,
|
confidentiality: undefined,
|
||||||
healthStatus: undefined,
|
healthStatus: undefined,
|
||||||
parentNamespaceId: undefined,
|
|
||||||
removeLabelIds: [],
|
removeLabelIds: [],
|
||||||
state: undefined,
|
state: undefined,
|
||||||
subscription: undefined,
|
subscription: undefined,
|
||||||
|
@ -94,22 +92,6 @@ export default {
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
apollo: {
|
apollo: {
|
||||||
parentNamespaceId: {
|
|
||||||
query: workItemParent,
|
|
||||||
variables() {
|
|
||||||
return {
|
|
||||||
fullPath: this.isGroup
|
|
||||||
? this.fullPath
|
|
||||||
: this.fullPath.substring(0, this.fullPath.lastIndexOf('/')),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
update(data) {
|
|
||||||
return data.namespace.id;
|
|
||||||
},
|
|
||||||
skip() {
|
|
||||||
return !this.shouldUseGraphQLBulkEdit;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
availableWidgets: {
|
availableWidgets: {
|
||||||
query: getAvailableBulkEditWidgets,
|
query: getAvailableBulkEditWidgets,
|
||||||
variables() {
|
variables() {
|
||||||
|
@ -196,7 +178,7 @@ export default {
|
||||||
mutation: workItemBulkUpdateMutation,
|
mutation: workItemBulkUpdateMutation,
|
||||||
variables: {
|
variables: {
|
||||||
input: {
|
input: {
|
||||||
parentId: this.parentNamespaceId,
|
fullPath: this.fullPath,
|
||||||
ids: this.checkedItems.map((item) => item.id),
|
ids: this.checkedItems.map((item) => item.id),
|
||||||
labelsWidget: hasLabelsToUpdate
|
labelsWidget: hasLabelsToUpdate
|
||||||
? {
|
? {
|
||||||
|
|
|
@ -270,7 +270,7 @@ export default {
|
||||||
mounted() {
|
mounted() {
|
||||||
const DEFAULT_TEMPLATE_NAME = 'default';
|
const DEFAULT_TEMPLATE_NAME = 'default';
|
||||||
const templateNameFromRoute =
|
const templateNameFromRoute =
|
||||||
this.$route.query[paramName] || this.$route.query[oldParamNameFromPreWorkItems];
|
this.$route?.query[paramName] || this.$route?.query[oldParamNameFromPreWorkItems];
|
||||||
const templateName = !this.isNewWorkItemRoute
|
const templateName = !this.isNewWorkItemRoute
|
||||||
? DEFAULT_TEMPLATE_NAME
|
? DEFAULT_TEMPLATE_NAME
|
||||||
: templateNameFromRoute || DEFAULT_TEMPLATE_NAME;
|
: templateNameFromRoute || DEFAULT_TEMPLATE_NAME;
|
||||||
|
@ -459,7 +459,7 @@ export default {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const params = new URLSearchParams(this.$route.query);
|
const params = new URLSearchParams(this.$route?.query);
|
||||||
params.delete(paramName);
|
params.delete(paramName);
|
||||||
params.delete(oldParamNameFromPreWorkItems);
|
params.delete(oldParamNameFromPreWorkItems);
|
||||||
if (this.selectedTemplate && this.isNewWorkItemRoute) {
|
if (this.selectedTemplate && this.isNewWorkItemRoute) {
|
||||||
|
|
|
@ -206,7 +206,6 @@ export const DEFAULT_EPIC_COLORS = '#1068bf';
|
||||||
export const MAX_FREQUENT_PROJECTS = 3;
|
export const MAX_FREQUENT_PROJECTS = 3;
|
||||||
export const MAX_FREQUENT_ITEMS = 3;
|
export const MAX_FREQUENT_ITEMS = 3;
|
||||||
export const CREATE_NEW_WORK_ITEM_MODAL = 'create_new_work_item_modal';
|
export const CREATE_NEW_WORK_ITEM_MODAL = 'create_new_work_item_modal';
|
||||||
export const CREATE_NEW_GROUP_WORK_ITEM_MODAL = 'create_new_group_work_item_modal';
|
|
||||||
export const RELATED_ITEM_ID_URL_QUERY_PARAM = 'related_item_id';
|
export const RELATED_ITEM_ID_URL_QUERY_PARAM = 'related_item_id';
|
||||||
|
|
||||||
export const WORK_ITEM_REFERENCE_CHAR = '#';
|
export const WORK_ITEM_REFERENCE_CHAR = '#';
|
||||||
|
|
|
@ -8,6 +8,9 @@ class Admin::GroupsController < Admin::ApplicationController
|
||||||
feature_category :groups_and_projects, [:create, :destroy, :edit, :index, :members_update, :new, :show, :update]
|
feature_category :groups_and_projects, [:create, :destroy, :edit, :index, :members_update, :new, :show, :update]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
|
# Groups are loaded via GraphQL query on frontend
|
||||||
|
return if Feature.enabled?(:admin_groups_vue, current_user)
|
||||||
|
|
||||||
@groups = groups.sort_by_attribute(@sort = pagination_params[:sort])
|
@groups = groups.sort_by_attribute(@sort = pagination_params[:sort])
|
||||||
@groups = @groups.search(safe_params[:name]) if safe_params[:name].present?
|
@groups = @groups.search(safe_params[:name]) if safe_params[:name].present?
|
||||||
@groups = @groups.page(pagination_params[:page])
|
@groups = @groups.page(pagination_params[:page])
|
||||||
|
|
|
@ -548,11 +548,15 @@ class ApplicationController < BaseActionController
|
||||||
auth_user if strong_memoized?(:auth_user)
|
auth_user if strong_memoized?(:auth_user)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Used by `set_current_organization` in BaseActionController
|
def set_current_organization
|
||||||
def organization_params
|
return if ::Current.organization_assigned
|
||||||
params.permit(
|
|
||||||
|
::Current.organization = Gitlab::Current::Organization.new(
|
||||||
|
params: params.permit(
|
||||||
:controller, :namespace_id, :group_id, :id, :organization_path
|
:controller, :namespace_id, :group_id, :id, :organization_path
|
||||||
)
|
),
|
||||||
|
user: current_user
|
||||||
|
).organization
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -30,21 +30,6 @@ class BaseActionController < ActionController::Base
|
||||||
connect_src_values = Array.wrap(default_connect_src) | [Gitlab::CurrentSettings.snowplow_collector_hostname]
|
connect_src_values = Array.wrap(default_connect_src) | [Gitlab::CurrentSettings.snowplow_collector_hostname]
|
||||||
p.connect_src(*connect_src_values)
|
p.connect_src(*connect_src_values)
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_current_organization
|
|
||||||
return if ::Current.organization_assigned
|
|
||||||
|
|
||||||
organization = Gitlab::Current::Organization.new(
|
|
||||||
params: organization_params,
|
|
||||||
user: current_user,
|
|
||||||
session: session
|
|
||||||
).organization
|
|
||||||
|
|
||||||
session_key = Gitlab::Current::Organization::SESSION_KEY
|
|
||||||
session[session_key] = organization.id if organization && session[session_key] != organization.id
|
|
||||||
|
|
||||||
::Current.organization = organization
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
# rubocop:enable Gitlab/NamespacedClass
|
# rubocop:enable Gitlab/NamespacedClass
|
||||||
# rubocop:enable Rails/ApplicationController
|
# rubocop:enable Rails/ApplicationController
|
||||||
|
|
|
@ -148,9 +148,8 @@ class Oauth::AuthorizationsController < Doorkeeper::AuthorizationsController
|
||||||
) && !doorkeeper_application&.trusted?
|
) && !doorkeeper_application&.trusted?
|
||||||
end
|
end
|
||||||
|
|
||||||
# Used by `set_current_organization` in BaseActionController
|
def set_current_organization
|
||||||
def organization_params
|
::Current.organization = Gitlab::Current::Organization.new(user: current_user).organization
|
||||||
{}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,6 @@ class Projects::BlobController < Projects::ApplicationController
|
||||||
|
|
||||||
before_action do
|
before_action do
|
||||||
push_frontend_feature_flag(:inline_blame, @project)
|
push_frontend_feature_flag(:inline_blame, @project)
|
||||||
push_frontend_feature_flag(:filter_blob_path, current_user)
|
|
||||||
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
|
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
|
||||||
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
|
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
|
||||||
push_frontend_feature_flag(:repository_file_tree_browser, @project)
|
push_frontend_feature_flag(:repository_file_tree_browser, @project)
|
||||||
|
|
|
@ -19,7 +19,6 @@ class Projects::TreeController < Projects::ApplicationController
|
||||||
|
|
||||||
before_action do
|
before_action do
|
||||||
push_frontend_feature_flag(:inline_blame, @project)
|
push_frontend_feature_flag(:inline_blame, @project)
|
||||||
push_frontend_feature_flag(:filter_blob_path, current_user)
|
|
||||||
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
|
push_licensed_feature(:file_locks) if @project.licensed_feature_available?(:file_locks)
|
||||||
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
|
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
|
||||||
push_frontend_feature_flag(:repository_file_tree_browser, @project)
|
push_frontend_feature_flag(:repository_file_tree_browser, @project)
|
||||||
|
|
|
@ -42,7 +42,6 @@ class ProjectsController < Projects::ApplicationController
|
||||||
push_frontend_feature_flag(:edit_branch_rules, @project)
|
push_frontend_feature_flag(:edit_branch_rules, @project)
|
||||||
# TODO: We need to remove the FF eventually when we rollout page_specific_styles
|
# TODO: We need to remove the FF eventually when we rollout page_specific_styles
|
||||||
push_frontend_feature_flag(:page_specific_styles, current_user)
|
push_frontend_feature_flag(:page_specific_styles, current_user)
|
||||||
push_frontend_feature_flag(:filter_blob_path, current_user)
|
|
||||||
push_licensed_feature(:file_locks) if @project.present? && @project.licensed_feature_available?(:file_locks)
|
push_licensed_feature(:file_locks) if @project.present? && @project.licensed_feature_available?(:file_locks)
|
||||||
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
|
push_frontend_feature_flag(:directory_code_dropdown_updates, current_user)
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,6 @@ module ResolvesMergeRequests
|
||||||
args[:include_subgroups] = true
|
args[:include_subgroups] = true
|
||||||
end
|
end
|
||||||
|
|
||||||
args.delete(:blob_path) if Feature.disabled?(:filter_blob_path, current_user)
|
|
||||||
|
|
||||||
validate_blob_path!(args)
|
validate_blob_path!(args)
|
||||||
|
|
||||||
rewrite_param_name(args, :reviewer_wildcard_id, :reviewer_id)
|
rewrite_param_name(args, :reviewer_wildcard_id, :reviewer_id)
|
||||||
|
|
|
@ -90,7 +90,6 @@ module Resolvers
|
||||||
description: <<~DESC
|
description: <<~DESC
|
||||||
Path of the blob changed in merge request.
|
Path of the blob changed in merge request.
|
||||||
Requires state, targetBranches, and createdAfter arguments.
|
Requires state, targetBranches, and createdAfter arguments.
|
||||||
Available only when the feature flag `filter_blob_path` is enabled.
|
|
||||||
DESC
|
DESC
|
||||||
|
|
||||||
argument :created_after, Types::TimeType,
|
argument :created_after, Types::TimeType,
|
||||||
|
|
|
@ -61,7 +61,7 @@ module Nav
|
||||||
::Gitlab::Nav::TopNavMenuItem.build(
|
::Gitlab::Nav::TopNavMenuItem.build(
|
||||||
id: 'new_group_work_item',
|
id: 'new_group_work_item',
|
||||||
title: _('New work item'),
|
title: _('New work item'),
|
||||||
component: 'create_new_group_work_item_modal',
|
component: 'create_new_work_item_modal',
|
||||||
data: {
|
data: {
|
||||||
track_action: 'click_link_new_group_work_item',
|
track_action: 'click_link_new_group_work_item',
|
||||||
track_label: 'plus_menu_dropdown',
|
track_label: 'plus_menu_dropdown',
|
||||||
|
@ -109,6 +109,7 @@ module Nav
|
||||||
id: 'new_issue',
|
id: 'new_issue',
|
||||||
title: _('New issue'),
|
title: _('New issue'),
|
||||||
href: new_project_issue_path(project),
|
href: new_project_issue_path(project),
|
||||||
|
component: 'create_new_work_item_modal',
|
||||||
data: {
|
data: {
|
||||||
track_action: 'click_link_new_issue',
|
track_action: 'click_link_new_issue',
|
||||||
track_label: 'plus_menu_dropdown',
|
track_label: 'plus_menu_dropdown',
|
||||||
|
|
|
@ -81,6 +81,18 @@ module Emails
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def pipeline_variables_migration_complete_email(user, group, counts)
|
||||||
|
@user = user
|
||||||
|
@group = group
|
||||||
|
@updated_count = counts[:updated_count]
|
||||||
|
@skipped_count = counts[:skipped_count]
|
||||||
|
|
||||||
|
email_with_layout(
|
||||||
|
to: @user.notification_email_for(@group),
|
||||||
|
subject: subject("Pipeline variables settings migration complete")
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def repository_push_email(project_id, opts = {})
|
def repository_push_email(project_id, opts = {})
|
||||||
@message =
|
@message =
|
||||||
Gitlab::Email::Message::RepositoryPush.new(self, project_id, opts)
|
Gitlab::Email::Message::RepositoryPush.new(self, project_id, opts)
|
||||||
|
|
|
@ -253,6 +253,22 @@ class NotifyPreview < ActionMailer::Preview
|
||||||
Notify.pipeline_fixed_email(pipeline, pipeline.user.try(:email))
|
Notify.pipeline_fixed_email(pipeline, pipeline.user.try(:email))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def pipeline_variables_migration_complete_email
|
||||||
|
Notify.pipeline_variables_migration_complete_email(user, group, { updated_count: 5, skipped_count: 3 }).message
|
||||||
|
end
|
||||||
|
|
||||||
|
def pipeline_variables_migration_complete_email_all_updated
|
||||||
|
Notify.pipeline_variables_migration_complete_email(user, group, { updated_count: 10, skipped_count: 0 }).message
|
||||||
|
end
|
||||||
|
|
||||||
|
def pipeline_variables_migration_complete_email_single_project
|
||||||
|
Notify.pipeline_variables_migration_complete_email(user, group, { updated_count: 1, skipped_count: 0 }).message
|
||||||
|
end
|
||||||
|
|
||||||
|
def pipeline_variables_migration_complete_email_single_skipped
|
||||||
|
Notify.pipeline_variables_migration_complete_email(user, group, { updated_count: 2, skipped_count: 1 }).message
|
||||||
|
end
|
||||||
|
|
||||||
def pipeline_schedule_owner_unavailable
|
def pipeline_schedule_owner_unavailable
|
||||||
Notify.pipeline_schedule_owner_unavailable_email(pipeline_schedule, user)
|
Notify.pipeline_schedule_owner_unavailable_email(pipeline_schedule, user)
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,11 +13,14 @@ module Ci
|
||||||
return ServiceResponse.error(message: 'You are not authorized to perform this action') unless authorized?
|
return ServiceResponse.error(message: 'You are not authorized to perform this action') unless authorized?
|
||||||
|
|
||||||
updated_count = 0
|
updated_count = 0
|
||||||
|
total_projects_with_pipeline_variables = 0
|
||||||
|
|
||||||
parent_group.self_and_descendants.each_batch do |group_batch|
|
parent_group.self_and_descendants.each_batch do |group_batch|
|
||||||
all_projects_ci_cd_settings = ProjectCiCdSetting.for_namespace(group_batch)
|
all_projects_ci_cd_settings = ProjectCiCdSetting.for_namespace(group_batch)
|
||||||
.with_pipeline_variables_enabled
|
.with_pipeline_variables_enabled
|
||||||
|
|
||||||
|
total_projects_with_pipeline_variables += all_projects_ci_cd_settings.count
|
||||||
|
|
||||||
all_projects_ci_cd_settings
|
all_projects_ci_cd_settings
|
||||||
.each_batch(of: PROJECTS_BATCH_SIZE) do |ci_cd_settings|
|
.each_batch(of: PROJECTS_BATCH_SIZE) do |ci_cd_settings|
|
||||||
batch_updated_count =
|
batch_updated_count =
|
||||||
|
@ -29,7 +32,12 @@ module Ci
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
ServiceResponse.success(payload: { updated_count: updated_count })
|
skipped_count = total_projects_with_pipeline_variables - updated_count
|
||||||
|
|
||||||
|
ServiceResponse.success(payload: {
|
||||||
|
updated_count: updated_count,
|
||||||
|
skipped_count: skipped_count
|
||||||
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
#js-groups-list-with-filtered-search{ data: { app_data: groups_list_with_filtered_search_app_data(dashboard_groups_path(format: :json, archived: false)) } }
|
|
|
@ -3,26 +3,5 @@
|
||||||
= render_dashboard_ultimate_trial(current_user)
|
= render_dashboard_ultimate_trial(current_user)
|
||||||
= render_product_usage_data_collection_changes(current_user)
|
= render_product_usage_data_collection_changes(current_user)
|
||||||
|
|
||||||
- if Feature.enabled?(:your_work_groups_vue, current_user)
|
= render 'dashboard/groups_head'
|
||||||
= render 'dashboard/groups_head'
|
#js-your-work-groups-app{ data: { app_data: groups_list_with_filtered_search_app_data(dashboard_groups_path(format: :json)) } }
|
||||||
#js-your-work-groups-app{ data: { app_data: groups_list_with_filtered_search_app_data(dashboard_groups_path(format: :json)) } }
|
|
||||||
- else
|
|
||||||
%div{ data: { testid: 'groups-page' } }
|
|
||||||
- if current_user.groups.exists?
|
|
||||||
= render 'dashboard/groups_head'
|
|
||||||
= render 'groups'
|
|
||||||
- else
|
|
||||||
- button_text = _("New group") if current_user.can_create_group?
|
|
||||||
- button_link = new_group_path if current_user.can_create_group?
|
|
||||||
= render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-state/empty-groups-md.svg',
|
|
||||||
title: s_('GroupsEmptyState|A group is a collection of several projects'),
|
|
||||||
primary_button_text: button_text,
|
|
||||||
primary_button_link: button_link,
|
|
||||||
primary_button_options: { data: { testid: "new-group-button" } },
|
|
||||||
secondary_button_text: _("Explore groups"),
|
|
||||||
secondary_button_link: explore_groups_path,
|
|
||||||
secondary_button_options: { data: { testid: "explore-groups-button" } },
|
|
||||||
empty_state_options: { data: { testid: 'groups-empty-state' } }) do |c|
|
|
||||||
|
|
||||||
- c.with_description do
|
|
||||||
= s_("GroupsEmptyState|If you organize your projects under a group, it works like a folder. You can manage your group member's permissions and access to each project in the group.")
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
%p
|
||||||
|
= s_('Notify|All projects in the %{group_name} group were checked for pipeline variables usage.').html_safe % { group_name: link_to(@group.name, @group.web_url) }
|
||||||
|
%p
|
||||||
|
- if @updated_count == 1
|
||||||
|
= s_('Notify|1 project was not using pipeline variables. CI/CD settings were updated to prevent future pipeline variable usage.')
|
||||||
|
- else
|
||||||
|
= s_('Notify|%{updated_count} projects were not using pipeline variables. CI/CD settings were updated to prevent future pipeline variable usage.') % { updated_count: @updated_count }
|
||||||
|
%p
|
||||||
|
- if @skipped_count == 0
|
||||||
|
= s_('Notify|All projects in this group have CI/CD setting set to prevent pipeline variable usage. 🎉')
|
||||||
|
- else
|
||||||
|
- if @skipped_count == 1
|
||||||
|
= s_('Notify|1 project has used pipeline variables in the past. This project\'s CI/CD settings were not updated as there is a risk the setting change would impact pipelines.')
|
||||||
|
- else
|
||||||
|
= s_('Notify|%{skipped_count} have used pipeline variables in the past. These projects\' CI/CD settings were not updated as there is a risk the setting change would impact pipelines.') % { skipped_count: @skipped_count }
|
||||||
|
%p
|
||||||
|
= s_('Notify|Projects that could not be updated need manual review. You can check the documentation for more information about the pipeline variable setting migration tool.')
|
|
@ -0,0 +1,7 @@
|
||||||
|
Pipeline variables migration has completed for group <%= @group.name %>
|
||||||
|
|
||||||
|
Group URL: <%= @group.web_url %>
|
||||||
|
|
||||||
|
<%= @updated_count %> project CI/CD settings were updated to restrict pipeline variable access.
|
||||||
|
|
||||||
|
Projects in this group hierarchy now have pipeline variables restricted to maintainers and owners only.
|
|
@ -28,6 +28,13 @@ module Ci
|
||||||
return unless result.success?
|
return unless result.success?
|
||||||
|
|
||||||
log_extra_metadata_on_done(:disabled_pipeline_variables_count, result.payload[:updated_count])
|
log_extra_metadata_on_done(:disabled_pipeline_variables_count, result.payload[:updated_count])
|
||||||
|
|
||||||
|
Notify.pipeline_variables_migration_complete_email(
|
||||||
|
current_user, group, {
|
||||||
|
updated_count: result.payload[:updated_count],
|
||||||
|
skipped_count: result.payload[:skipped_count]
|
||||||
|
}
|
||||||
|
).deliver_later
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
---
|
|
||||||
name: filter_blob_path
|
|
||||||
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/499245
|
|
||||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/172997
|
|
||||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/505449
|
|
||||||
milestone: '17.7'
|
|
||||||
group: group::source code
|
|
||||||
type: beta
|
|
||||||
default_enabled: true
|
|
|
@ -1,9 +0,0 @@
|
||||||
---
|
|
||||||
name: your_work_groups_vue
|
|
||||||
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/502477
|
|
||||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/183596
|
|
||||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/542790
|
|
||||||
milestone: '17.10'
|
|
||||||
group: group::organizations
|
|
||||||
type: beta
|
|
||||||
default_enabled: false
|
|
|
@ -8,20 +8,29 @@
|
||||||
module Rack
|
module Rack
|
||||||
class Request
|
class Request
|
||||||
def trusted_proxy?(ip)
|
def trusted_proxy?(ip)
|
||||||
Rails.application.config.action_dispatch.trusted_proxies.any? { |proxy| proxy === ip }
|
Rails.application.config.action_dispatch.trusted_proxies.any? { |proxy| proxy.include?(ip) }
|
||||||
rescue IPAddr::InvalidAddressError
|
rescue IPAddr::InvalidAddressError
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
gitlab_trusted_proxies = Array(Gitlab.config.gitlab.trusted_proxies).map do |proxy|
|
# Trust custom proxies from config.
|
||||||
|
trusted_proxies = Array(Gitlab.config.gitlab.trusted_proxies).map do |proxy|
|
||||||
IPAddr.new(proxy)
|
IPAddr.new(proxy)
|
||||||
rescue IPAddr::InvalidAddressError
|
rescue IPAddr::InvalidAddressError
|
||||||
end.compact
|
end
|
||||||
|
|
||||||
Rails.application.config.action_dispatch.trusted_proxies = (
|
# Default to private IPs if no proxies configured.
|
||||||
['127.0.0.1', '::1'] + gitlab_trusted_proxies)
|
trusted_proxies = ActionDispatch::RemoteIp::TRUSTED_PROXIES if trusted_proxies.empty?
|
||||||
|
|
||||||
|
# Always trust localhost.
|
||||||
|
trusted_proxies += [IPAddr.new('127.0.0.1'), IPAddr.new('::1')]
|
||||||
|
|
||||||
|
# Trust all proxies in their IPv6 mapped format.
|
||||||
|
trusted_proxies += trusted_proxies.compact.select(&:ipv4?).map(&:ipv4_mapped)
|
||||||
|
|
||||||
|
Rails.application.config.action_dispatch.trusted_proxies = trusted_proxies.uniq
|
||||||
|
|
||||||
# A monkey patch to make trusted proxies work with Rails 5.0.
|
# A monkey patch to make trusted proxies work with Rails 5.0.
|
||||||
# Inspired by https://github.com/rails/rails/issues/5223#issuecomment-263778719
|
# Inspired by https://github.com/rails/rails/issues/5223#issuecomment-263778719
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AddTopLevelAncestorToSbomGraphPaths < Gitlab::Database::Migration[2.3]
|
||||||
|
milestone '18.3'
|
||||||
|
|
||||||
|
def change
|
||||||
|
add_column :sbom_graph_paths, :top_level_ancestor, :boolean, default: false, null: false
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
322a14c59203133addd60adada1e77b5b81e6ab540186756ef1b72304cf25959
|
|
@ -23019,7 +23019,8 @@ CREATE TABLE sbom_graph_paths (
|
||||||
project_id bigint NOT NULL,
|
project_id bigint NOT NULL,
|
||||||
path_length integer NOT NULL,
|
path_length integer NOT NULL,
|
||||||
created_at timestamp with time zone NOT NULL,
|
created_at timestamp with time zone NOT NULL,
|
||||||
updated_at timestamp with time zone NOT NULL
|
updated_at timestamp with time zone NOT NULL,
|
||||||
|
top_level_ancestor boolean DEFAULT false NOT NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE SEQUENCE sbom_graph_paths_id_seq
|
CREATE SEQUENCE sbom_graph_paths_id_seq
|
||||||
|
|
|
@ -21650,7 +21650,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="addonuserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="addonuserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="addonuserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="addonuserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="addonuserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="addonuserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="addonuserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="addonuserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="addonuserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="addonuserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="addonuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="addonuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="addonuserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="addonuserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -21708,7 +21708,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="addonuserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
| <a id="addonuserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
||||||
| <a id="addonuserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="addonuserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="addonuserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="addonuserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="addonuserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="addonuserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="addonuserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="addonuserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="addonuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="addonuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="addonuserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="addonuserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -21828,7 +21828,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="addonuserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="addonuserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="addonuserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="addonuserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="addonuserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="addonuserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="addonuserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="addonuserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="addonuserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="addonuserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="addonuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="addonuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="addonuserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="addonuserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -22875,7 +22875,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="autocompleteduserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="autocompleteduserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="autocompleteduserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="autocompleteduserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="autocompleteduserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="autocompleteduserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="autocompleteduserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="autocompleteduserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="autocompleteduserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="autocompleteduserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="autocompleteduserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="autocompleteduserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="autocompleteduserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="autocompleteduserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -22933,7 +22933,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="autocompleteduserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
| <a id="autocompleteduserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
||||||
| <a id="autocompleteduserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="autocompleteduserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="autocompleteduserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="autocompleteduserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="autocompleteduserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="autocompleteduserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="autocompleteduserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="autocompleteduserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="autocompleteduserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="autocompleteduserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="autocompleteduserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="autocompleteduserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -23065,7 +23065,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="autocompleteduserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="autocompleteduserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="autocompleteduserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="autocompleteduserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="autocompleteduserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="autocompleteduserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="autocompleteduserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="autocompleteduserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="autocompleteduserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="autocompleteduserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="autocompleteduserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="autocompleteduserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="autocompleteduserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="autocompleteduserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -25974,7 +25974,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="currentuserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="currentuserassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="currentuserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="currentuserassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="currentuserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="currentuserassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="currentuserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="currentuserassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="currentuserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="currentuserassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="currentuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="currentuserassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="currentuserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="currentuserassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -26035,7 +26035,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="currentuserassigneeorreviewermergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="currentuserassigneeorreviewermergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="currentuserassigneeorreviewermergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="currentuserassigneeorreviewermergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="currentuserassigneeorreviewermergerequestsassignedreviewstates"></a>`assignedReviewStates` | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | Reviewer states for merge requests the current user is assigned to. |
|
| <a id="currentuserassigneeorreviewermergerequestsassignedreviewstates"></a>`assignedReviewStates` | [`[MergeRequestReviewState!]`](#mergerequestreviewstate) | Reviewer states for merge requests the current user is assigned to. |
|
||||||
| <a id="currentuserassigneeorreviewermergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="currentuserassigneeorreviewermergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="currentuserassigneeorreviewermergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="currentuserassigneeorreviewermergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="currentuserassigneeorreviewermergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="currentuserassigneeorreviewermergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="currentuserassigneeorreviewermergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="currentuserassigneeorreviewermergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -26092,7 +26092,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="currentuserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
| <a id="currentuserauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
||||||
| <a id="currentuserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="currentuserauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="currentuserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="currentuserauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="currentuserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="currentuserauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="currentuserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="currentuserauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="currentuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="currentuserauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="currentuserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="currentuserauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -26212,7 +26212,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="currentuserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="currentuserreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="currentuserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="currentuserreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="currentuserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="currentuserreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="currentuserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="currentuserreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="currentuserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="currentuserreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="currentuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="currentuserreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="currentuserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="currentuserreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -30124,7 +30124,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="groupmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="groupmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="groupmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="groupmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="groupmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="groupmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="groupmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="groupmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="groupmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="groupmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="groupmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="groupmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="groupmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="groupmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -32808,7 +32808,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestassigneeassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="mergerequestassigneeassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="mergerequestassigneeassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="mergerequestassigneeassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="mergerequestassigneeassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="mergerequestassigneeassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="mergerequestassigneeassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestassigneeassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestassigneeassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestassigneeassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestassigneeassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestassigneeassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestassigneeassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestassigneeassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -32866,7 +32866,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestassigneeauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
| <a id="mergerequestassigneeauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
||||||
| <a id="mergerequestassigneeauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="mergerequestassigneeauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="mergerequestassigneeauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="mergerequestassigneeauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="mergerequestassigneeauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestassigneeauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestassigneeauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestassigneeauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestassigneeauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestassigneeauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestassigneeauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestassigneeauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -32986,7 +32986,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestassigneereviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="mergerequestassigneereviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="mergerequestassigneereviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="mergerequestassigneereviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="mergerequestassigneereviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="mergerequestassigneereviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="mergerequestassigneereviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestassigneereviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestassigneereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestassigneereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestassigneereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestassigneereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestassigneereviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestassigneereviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -33229,7 +33229,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestauthorassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="mergerequestauthorassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="mergerequestauthorassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="mergerequestauthorassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="mergerequestauthorassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="mergerequestauthorassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="mergerequestauthorassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestauthorassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestauthorassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestauthorassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestauthorassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestauthorassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestauthorassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestauthorassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -33287,7 +33287,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestauthorauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
| <a id="mergerequestauthorauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
||||||
| <a id="mergerequestauthorauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="mergerequestauthorauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="mergerequestauthorauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="mergerequestauthorauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="mergerequestauthorauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestauthorauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestauthorauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestauthorauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestauthorauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestauthorauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestauthorauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestauthorauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -33407,7 +33407,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestauthorreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="mergerequestauthorreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="mergerequestauthorreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="mergerequestauthorreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="mergerequestauthorreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="mergerequestauthorreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="mergerequestauthorreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestauthorreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestauthorreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestauthorreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestauthorreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestauthorreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestauthorreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestauthorreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -33701,7 +33701,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestparticipantassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="mergerequestparticipantassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="mergerequestparticipantassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="mergerequestparticipantassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="mergerequestparticipantassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="mergerequestparticipantassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="mergerequestparticipantassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestparticipantassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestparticipantassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestparticipantassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestparticipantassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestparticipantassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestparticipantassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestparticipantassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -33759,7 +33759,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestparticipantauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
| <a id="mergerequestparticipantauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
||||||
| <a id="mergerequestparticipantauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="mergerequestparticipantauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="mergerequestparticipantauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="mergerequestparticipantauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="mergerequestparticipantauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestparticipantauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestparticipantauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestparticipantauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestparticipantauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestparticipantauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestparticipantauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestparticipantauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -33879,7 +33879,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestparticipantreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="mergerequestparticipantreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="mergerequestparticipantreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="mergerequestparticipantreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="mergerequestparticipantreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="mergerequestparticipantreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="mergerequestparticipantreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestparticipantreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestparticipantreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestparticipantreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestparticipantreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestparticipantreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestparticipantreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestparticipantreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -34141,7 +34141,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestreviewerassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="mergerequestreviewerassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="mergerequestreviewerassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="mergerequestreviewerassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="mergerequestreviewerassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="mergerequestreviewerassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="mergerequestreviewerassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestreviewerassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestreviewerassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestreviewerassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestreviewerassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestreviewerassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestreviewerassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestreviewerassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -34199,7 +34199,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestreviewerauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
| <a id="mergerequestreviewerauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
||||||
| <a id="mergerequestreviewerauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="mergerequestreviewerauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="mergerequestreviewerauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="mergerequestreviewerauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="mergerequestreviewerauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestreviewerauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestreviewerauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestreviewerauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestreviewerauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestreviewerauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestreviewerauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestreviewerauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -34319,7 +34319,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="mergerequestreviewerreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="mergerequestreviewerreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="mergerequestreviewerreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="mergerequestreviewerreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="mergerequestreviewerreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="mergerequestreviewerreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="mergerequestreviewerreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="mergerequestreviewerreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="mergerequestreviewerreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="mergerequestreviewerreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="mergerequestreviewerreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="mergerequestreviewerreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="mergerequestreviewerreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="mergerequestreviewerreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -38352,7 +38352,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="projectmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="projectmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="projectmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="projectmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="projectmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="projectmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="projectmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="projectmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="projectmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="projectmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="projectmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="projectmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="projectmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="projectmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -42124,7 +42124,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="usercoreassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="usercoreassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="usercoreassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="usercoreassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="usercoreassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="usercoreassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="usercoreassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="usercoreassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="usercoreassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="usercoreassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="usercoreassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="usercoreassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="usercoreassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="usercoreassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -42182,7 +42182,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="usercoreauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
| <a id="usercoreauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
||||||
| <a id="usercoreauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="usercoreauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="usercoreauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="usercoreauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="usercoreauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="usercoreauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="usercoreauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="usercoreauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="usercoreauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="usercoreauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="usercoreauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="usercoreauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -42302,7 +42302,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="usercorereviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="usercorereviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="usercorereviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="usercorereviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="usercorereviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="usercorereviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="usercorereviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="usercorereviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="usercorereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="usercorereviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="usercorereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="usercorereviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="usercorereviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="usercorereviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -51348,7 +51348,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="userassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
| <a id="userassignedmergerequestsapprovedby"></a>`approvedBy` | [`[String!]`](#string) | Usernames of the approvers. |
|
||||||
| <a id="userassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
| <a id="userassignedmergerequestsapprover"></a>`approver` | [`[String!]`](#string) | Usernames of possible approvers. |
|
||||||
| <a id="userassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="userassignedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="userassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="userassignedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="userassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="userassignedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="userassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="userassignedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="userassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="userassignedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -51406,7 +51406,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="userauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
| <a id="userauthoredmergerequestsassigneeusername"></a>`assigneeUsername` | [`String`](#string) | Username of the assignee. |
|
||||||
| <a id="userauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="userauthoredmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="userauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="userauthoredmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="userauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="userauthoredmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="userauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="userauthoredmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="userauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="userauthoredmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="userauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="userauthoredmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
@ -51526,7 +51526,7 @@ four standard [pagination arguments](#pagination-arguments):
|
||||||
| <a id="userreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
| <a id="userreviewrequestedmergerequestsassigneeusernames"></a>`assigneeUsernames` | [`[String!]`](#string) | Usernames of users assigned to the merge request. |
|
||||||
| <a id="userreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
| <a id="userreviewrequestedmergerequestsassigneewildcardid"></a>`assigneeWildcardId` | [`AssigneeWildcardId`](#assigneewildcardid) | Filter by assignee presence. Incompatible with assigneeUsernames and assigneeUsername. |
|
||||||
| <a id="userreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
| <a id="userreviewrequestedmergerequestsauthorusername"></a>`authorUsername` | [`String`](#string) | Username of the author. |
|
||||||
| <a id="userreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. Available only when the feature flag `filter_blob_path` is enabled. |
|
| <a id="userreviewrequestedmergerequestsblobpath"></a>`blobPath` {{< icon name="warning-solid" >}} | [`String`](#string) | **Introduced** in GitLab 17.7. **Status**: Experiment. Path of the blob changed in merge request. Requires state, targetBranches, and createdAfter arguments. |
|
||||||
| <a id="userreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
| <a id="userreviewrequestedmergerequestscreatedafter"></a>`createdAfter` | [`Time`](#time) | Merge requests created after the timestamp. |
|
||||||
| <a id="userreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
| <a id="userreviewrequestedmergerequestscreatedbefore"></a>`createdBefore` | [`Time`](#time) | Merge requests created before the timestamp. |
|
||||||
| <a id="userreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
| <a id="userreviewrequestedmergerequestsdeployedafter"></a>`deployedAfter` | [`Time`](#time) | Merge requests deployed after the timestamp. |
|
||||||
|
|
|
@ -377,6 +377,90 @@ To define the retry interval for failed namespaces:
|
||||||
(for example, `30m` (30 minutes), `2h` (two hours), or `1d` (one day)).
|
(for example, `30m` (30 minutes), `2h` (two hours), or `1d` (one day)).
|
||||||
1. Select **Save changes**.
|
1. Select **Save changes**.
|
||||||
|
|
||||||
|
## Sizing recommendations
|
||||||
|
|
||||||
|
The following recommendations might be over-provisioned for some deployments.
|
||||||
|
You should monitor your deployment to ensure:
|
||||||
|
|
||||||
|
- No out-of-memory events occur.
|
||||||
|
- CPU throttling is not excessive.
|
||||||
|
- Indexing performance meets your requirements.
|
||||||
|
|
||||||
|
Adjust resources based on your specific workload characteristics, including:
|
||||||
|
|
||||||
|
- Repository size and complexity
|
||||||
|
- Number of active developers
|
||||||
|
- Frequency of code changes
|
||||||
|
- Indexing patterns
|
||||||
|
|
||||||
|
### Nodes
|
||||||
|
|
||||||
|
For optimal performance, proper sizing of Zoekt nodes is crucial.
|
||||||
|
Sizing recommendations differ between Kubernetes and VM deployments
|
||||||
|
due to how resources are allocated and managed.
|
||||||
|
|
||||||
|
#### Kubernetes deployments
|
||||||
|
|
||||||
|
The following table shows recommended resources for Kubernetes deployments
|
||||||
|
based on index storage requirements:
|
||||||
|
|
||||||
|
| Disk | Webserver CPU | Webserver memory | Indexer CPU | Indexer memory |
|
||||||
|
|--------|---------------|-------------------|-------------|----------------|
|
||||||
|
| 128 GB | 1 | 16 GiB | 1 | 6 GiB |
|
||||||
|
| 256 GB | 1.5 | 32 GiB | 1 | 8 GiB |
|
||||||
|
| 512 GB | 2 | 64 GiB | 1 | 12 GiB |
|
||||||
|
| 1 TB | 3 | 128 GiB | 1.5 | 24 GiB |
|
||||||
|
| 2 TB | 4 | 256 GiB | 2 | 32 GiB |
|
||||||
|
|
||||||
|
To manage resources more granularly, you can allocate
|
||||||
|
CPU and memory separately to different containers.
|
||||||
|
|
||||||
|
For Kubernetes deployments:
|
||||||
|
|
||||||
|
- Do not set CPU limits for Zoekt containers.
|
||||||
|
CPU limits might cause unnecessary throttling during indexing bursts,
|
||||||
|
which would significantly impact performance.
|
||||||
|
Instead, rely on resource requests to guarantee minimum CPU availability
|
||||||
|
and ensure containers use additional CPU when available and needed.
|
||||||
|
- Set appropriate memory limits to prevent resource contention
|
||||||
|
and out-of-memory conditions.
|
||||||
|
- Use high-performance storage classes for better indexing performance.
|
||||||
|
GitLab.com uses `pd-balanced` on GCP, which balances performance and cost.
|
||||||
|
Equivalent options include `gp3` on AWS and `Premium_LRS` on Azure.
|
||||||
|
|
||||||
|
#### VM and bare metal deployments
|
||||||
|
|
||||||
|
The following table shows recommended resources for VM and bare metal deployments
|
||||||
|
based on index storage requirements:
|
||||||
|
|
||||||
|
| Disk | VM size | Total CPU | Total memory | AWS | GCP | Azure |
|
||||||
|
|--------|----------|-----------|--------------|--------------|-----------------|-------|
|
||||||
|
| 128 GB | Small | 2 cores | 16 GB | `r5.large` | `n1-highmem-2` | `Standard_E2s_v3` |
|
||||||
|
| 256 GB | Medium | 4 cores | 32 GB | `r5.xlarge` | `n1-highmem-4` | `Standard_E4s_v3` |
|
||||||
|
| 512 GB | Large | 4 cores | 64 GB | `r5.2xlarge` | `n1-highmem-8` | `Standard_E8s_v3` |
|
||||||
|
| 1 TB | X-Large | 8 cores | 128 GB | `r5.4xlarge` | `n1-highmem-16` | `Standard_E16s_v3` |
|
||||||
|
| 2 TB | 2X-Large | 16 cores | 256 GB | `r5.8xlarge` | `n1-highmem-32` | `Standard_E32s_v3` |
|
||||||
|
|
||||||
|
You can allocate these resources only to the entire node.
|
||||||
|
|
||||||
|
For VM and bare metal deployments:
|
||||||
|
|
||||||
|
- Monitor CPU, memory, and disk usage to identify bottlenecks.
|
||||||
|
Both webserver and indexer processes share the same CPU and memory resources.
|
||||||
|
- Consider using SSD storage for better indexing performance.
|
||||||
|
- Ensure adequate network bandwidth for data transfer between GitLab and Zoekt nodes.
|
||||||
|
|
||||||
|
### Storage
|
||||||
|
|
||||||
|
Storage requirements for Zoekt vary significantly based on repository characteristics,
|
||||||
|
including the number of large and binary files.
|
||||||
|
|
||||||
|
As a starting point, you can estimate your Zoekt storage to be half your Gitaly storage.
|
||||||
|
For example, if your Gitaly storage is 1 TB, you might need approximately 500 GB of Zoekt storage.
|
||||||
|
|
||||||
|
To monitor the use of Zoekt nodes, see [check indexing status](#check-indexing-status).
|
||||||
|
If namespaces are not being indexed due to low disk space, consider adding or scaling up nodes.
|
||||||
|
|
||||||
## Run Zoekt on a separate server
|
## Run Zoekt on a separate server
|
||||||
|
|
||||||
{{< history >}}
|
{{< history >}}
|
||||||
|
|
|
@ -12,6 +12,7 @@ Choose and manage the subscription that's right for you and your organization.
|
||||||
|
|
||||||
- [GitLab plans](choosing_subscription.md)
|
- [GitLab plans](choosing_subscription.md)
|
||||||
- [Manage subscription](manage_subscription.md)
|
- [Manage subscription](manage_subscription.md)
|
||||||
|
- [Manage users and seats](manage_users_and_seats.md)
|
||||||
- [GitLab.com subscription](gitlab_com/_index.md)
|
- [GitLab.com subscription](gitlab_com/_index.md)
|
||||||
- [GitLab Self-Managed subscription](self_managed/_index.md)
|
- [GitLab Self-Managed subscription](self_managed/_index.md)
|
||||||
- [GitLab Dedicated](gitlab_dedicated/_index.md)
|
- [GitLab Dedicated](gitlab_dedicated/_index.md)
|
||||||
|
|
|
@ -14,5 +14,6 @@ Use these examples to instruct GitLab Duo.
|
||||||
- [Refactor legacy code](refactor_legacy_code.md)
|
- [Refactor legacy code](refactor_legacy_code.md)
|
||||||
- [Generate tests](generate_tests.md)
|
- [Generate tests](generate_tests.md)
|
||||||
- [Debug failing code](debug_failing_code.md)
|
- [Debug failing code](debug_failing_code.md)
|
||||||
|
- [Analyze security vulnerabilities](analyze_vulnerabilities.md)
|
||||||
|
|
||||||
{{< /cards >}}
|
{{< /cards >}}
|
||||||
|
|
|
@ -0,0 +1,100 @@
|
||||||
|
---
|
||||||
|
stage: AI-powered
|
||||||
|
group: AI Framework
|
||||||
|
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
|
||||||
|
description: Analyze security vulnerabilities and prioritize fixes based on business impact.
|
||||||
|
title: Analyze security vulnerabilities and prioritize fixes
|
||||||
|
---
|
||||||
|
|
||||||
|
Follow these guidelines when you need to evaluate multiple security vulnerabilities
|
||||||
|
and determine which ones require immediate attention.
|
||||||
|
|
||||||
|
- Time estimate: 15-25 minutes
|
||||||
|
- Level: Intermediate
|
||||||
|
- Prerequisites: GitLab Duo Enterprise add-on, vulnerabilities available in the vulnerability report
|
||||||
|
|
||||||
|
## The challenge
|
||||||
|
|
||||||
|
Security scans often generate numerous vulnerability alerts, making it difficult
|
||||||
|
to identify false positives and determine which issues pose the greatest business risk.
|
||||||
|
|
||||||
|
## The approach
|
||||||
|
|
||||||
|
Analyze vulnerabilities, assess business impact, and create prioritized remediation plans
|
||||||
|
by using GitLab Duo Chat, Vulnerability Explanation, and Vulnerability Resolution.
|
||||||
|
|
||||||
|
### Step 1: Explain vulnerabilities
|
||||||
|
|
||||||
|
Go to the vulnerability report for your project.
|
||||||
|
For each high or critical vulnerability, use Vulnerability Explanation to explain the issue. Then, use Duo Chat to ask follow-up questions.
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Based on the earlier vulnerability explanation:
|
||||||
|
|
||||||
|
1. What specific security risk does this pose?
|
||||||
|
2. How could this be exploited in our [application_type]?
|
||||||
|
3. What data or systems could be compromised?
|
||||||
|
4. Is this a true positive or likely false positive?
|
||||||
|
5. What is the realistic business impact?
|
||||||
|
|
||||||
|
Consider our application stack: [technology_stack] and deployment environment: [environment_details].
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected outcome: Clear explanation of each vulnerability's real-world impact and how it could be exploited.
|
||||||
|
|
||||||
|
### Step 2: Prioritize risks
|
||||||
|
|
||||||
|
Use GitLab Duo Chat to analyze multiple vulnerabilities together and create a priority matrix.
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Based on these vulnerability explanations, help me prioritize fixes:
|
||||||
|
|
||||||
|
[paste_vulnerability_summaries]
|
||||||
|
|
||||||
|
Create a priority matrix considering:
|
||||||
|
1. Exploitability (how easy to exploit)
|
||||||
|
2. Business impact (what gets compromised)
|
||||||
|
3. Exposure level (public-facing vs internal)
|
||||||
|
4. Fix complexity (simple patch vs major changes)
|
||||||
|
|
||||||
|
Rank as Critical/High/Medium/Low priority with justification.
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected outcome: Prioritized vulnerability list with business-focused risk assessment.
|
||||||
|
|
||||||
|
### Step 3: Generate fix plans
|
||||||
|
|
||||||
|
For high-priority vulnerabilities, use Vulnerability Resolution or Chat to get specific remediation guidance.
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
Provide a detailed remediation plan for this [vulnerability_type]:
|
||||||
|
|
||||||
|
1. Immediate steps to reduce risk
|
||||||
|
2. Code changes needed (with examples)
|
||||||
|
3. Configuration updates required
|
||||||
|
4. Testing approach to verify the fix
|
||||||
|
5. Timeline estimate for implementation
|
||||||
|
|
||||||
|
Focus on [security_framework] compliance and our [coding_standards].
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected outcome: Actionable remediation plans with specific implementation steps.
|
||||||
|
|
||||||
|
## Tips
|
||||||
|
|
||||||
|
- Start with Critical and High severity vulnerabilities first.
|
||||||
|
- Use Vulnerability Explanation to understand the context before diving into fixes.
|
||||||
|
- Consider your specific application architecture when assessing business impact.
|
||||||
|
- Ask GitLab Duo Chat to explain technical terms or attack vectors you're unfamiliar with.
|
||||||
|
- Group similar vulnerabilities together for batch analysis and consistent fixes.
|
||||||
|
- Use the Security Dashboard to track progress on remediation efforts.
|
||||||
|
|
||||||
|
## Verify
|
||||||
|
|
||||||
|
Ensure that:
|
||||||
|
|
||||||
|
- Priority rankings reflect actual business risk, not just CVSS scores.
|
||||||
|
- Remediation plans include specific code examples and testing steps.
|
||||||
|
- False positives are clearly identified and documented.
|
||||||
|
- Critical vulnerabilities have immediate mitigation strategies identified.
|
||||||
|
- Fix timelines are realistic and account for testing and deployment processes.
|
|
@ -110,6 +110,7 @@ To explore all public or internal groups:
|
||||||
{{< history >}}
|
{{< history >}}
|
||||||
|
|
||||||
- **Member** tab [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13781) in GitLab 18.2 [with a flag](../../administration/feature_flags/_index.md) named `your_work_groups_vue`. Disabled by default.
|
- **Member** tab [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13781) in GitLab 18.2 [with a flag](../../administration/feature_flags/_index.md) named `your_work_groups_vue`. Disabled by default.
|
||||||
|
- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/542790) in GitLab 18.3. Feature flag `your_work_groups_vue` removed.
|
||||||
|
|
||||||
{{< /history >}}
|
{{< /history >}}
|
||||||
|
|
||||||
|
@ -123,8 +124,6 @@ This page shows groups that you are a member of through:
|
||||||
- Membership of a subgroup's parent group.
|
- Membership of a subgroup's parent group.
|
||||||
- Direct or inherited membership of a project in the group or subgroup.
|
- Direct or inherited membership of a project in the group or subgroup.
|
||||||
|
|
||||||
If the `your_work_groups_vue` feature flag is enabled, groups that you are a member of appear in the **Member** tab.
|
|
||||||
|
|
||||||
## View a group
|
## View a group
|
||||||
|
|
||||||
{{< history >}}
|
{{< history >}}
|
||||||
|
@ -283,18 +282,18 @@ the deletion job will instead restore and unarchive the group, so the group will
|
||||||
{{< history >}}
|
{{< history >}}
|
||||||
|
|
||||||
- **Inactive** tab [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13781) in GitLab 18.2 [with a flag](../../administration/feature_flags/_index.md) named `your_work_groups_vue`. Disabled by default.
|
- **Inactive** tab [introduced](https://gitlab.com/groups/gitlab-org/-/epics/13781) in GitLab 18.2 [with a flag](../../administration/feature_flags/_index.md) named `your_work_groups_vue`. Disabled by default.
|
||||||
|
- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/542790) in GitLab 18.3. Feature flag `your_work_groups_vue` removed.
|
||||||
|
|
||||||
{{< /history >}}
|
{{< /history >}}
|
||||||
|
|
||||||
To view a list of the subgroups that are pending deletion in a group:
|
To view a list of the groups that are pending deletion:
|
||||||
|
|
||||||
1. On the left sidebar, select **Search or go to** and find your group.
|
1. On the left sidebar, select **Search or go to** and find your group.
|
||||||
1. Select **Subgroups and projects**.
|
1. Select **View all my groups**.
|
||||||
|
1. Select the **Inactive** tab.
|
||||||
|
|
||||||
Groups that are marked for deletion are labeled **Pending deletion**.
|
Groups that are marked for deletion are labeled **Pending deletion**.
|
||||||
|
|
||||||
If the `your_work_groups_vue` feature flag is enabled, groups marked for deletion appear in the **Inactive** tab.
|
|
||||||
|
|
||||||
## Delete a group immediately
|
## Delete a group immediately
|
||||||
|
|
||||||
{{< history >}}
|
{{< history >}}
|
||||||
|
|
|
@ -118,6 +118,7 @@ To create a permalink:
|
||||||
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/448868) in GitLab 17.10 [with a flag](../../../../administration/feature_flags/_index.md) named `filter_blob_path`.
|
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/448868) in GitLab 17.10 [with a flag](../../../../administration/feature_flags/_index.md) named `filter_blob_path`.
|
||||||
- [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/505449) in GitLab 17.11.
|
- [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/505449) in GitLab 17.11.
|
||||||
- [Enabled on GitLab Self-Managed and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/issues/505449) in GitLab 18.0.
|
- [Enabled on GitLab Self-Managed and GitLab Dedicated](https://gitlab.com/gitlab-org/gitlab/-/issues/505449) in GitLab 18.0.
|
||||||
|
- [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/539215) in GitLab 18.2. Feature flag `filter_blob_path` removed.
|
||||||
|
|
||||||
{{< /history >}}
|
{{< /history >}}
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,7 @@ module Banzai
|
||||||
node['href'] = new_href
|
node['href'] = new_href
|
||||||
|
|
||||||
# the rich text editor needs to know what the original placeholders were
|
# the rich text editor needs to know what the original placeholders were
|
||||||
|
node['data-canonical-src'] = href
|
||||||
node['data-placeholder'] = href
|
node['data-placeholder'] = href
|
||||||
|
|
||||||
sanitize_link(node)
|
sanitize_link(node)
|
||||||
|
@ -174,9 +175,9 @@ module Banzai
|
||||||
end
|
end
|
||||||
|
|
||||||
node['data-src'] = new_url
|
node['data-src'] = new_url
|
||||||
node['data-canonical-src'] = url
|
|
||||||
|
|
||||||
# the rich text editor needs to know what the original placeholders were
|
# the rich text editor needs to know what the original placeholders were
|
||||||
|
node['data-canonical-src'] = url
|
||||||
node['data-placeholder'] = url
|
node['data-placeholder'] = url
|
||||||
|
|
||||||
sanitize_link(node)
|
sanitize_link(node)
|
||||||
|
|
|
@ -53,10 +53,14 @@ module Gitlab
|
||||||
|
|
||||||
def trusted_ips
|
def trusted_ips
|
||||||
strong_memoize(:trusted_ips) do
|
strong_memoize(:trusted_ips) do
|
||||||
config.ip_whitelist.map do |proxy|
|
trusted = config.ip_whitelist.map do |proxy|
|
||||||
IPAddr.new(proxy)
|
IPAddr.new(proxy)
|
||||||
rescue IPAddr::InvalidAddressError
|
rescue IPAddr::InvalidAddressError
|
||||||
end.compact
|
end
|
||||||
|
|
||||||
|
trusted += trusted.compact.select(&:ipv4?).map(&:ipv4_mapped)
|
||||||
|
|
||||||
|
trusted.uniq
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,18 +3,15 @@
|
||||||
module Gitlab
|
module Gitlab
|
||||||
module Current
|
module Current
|
||||||
class Organization
|
class Organization
|
||||||
attr_reader :params, :user, :session
|
attr_reader :params, :user
|
||||||
|
|
||||||
SESSION_KEY = :organization_id
|
def initialize(params: {}, user: nil)
|
||||||
|
|
||||||
def initialize(params: {}, session: nil, user: nil)
|
|
||||||
@params = params
|
@params = params
|
||||||
@user = user
|
@user = user
|
||||||
@session = session
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def organization
|
def organization
|
||||||
from_params || from_session || from_user || fallback_organization
|
from_params || from_user || fallback_organization
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
@ -29,12 +26,6 @@ module Gitlab
|
||||||
::Organizations::Organization.with_user(user).first
|
::Organizations::Organization.with_user(user).first
|
||||||
end
|
end
|
||||||
|
|
||||||
def from_session
|
|
||||||
return unless session.respond_to?(:[]) && session[SESSION_KEY]
|
|
||||||
|
|
||||||
::Organizations::Organization.find_by_id(session[SESSION_KEY])
|
|
||||||
end
|
|
||||||
|
|
||||||
def from_group_params
|
def from_group_params
|
||||||
path = params[:namespace_id] || params[:group_id]
|
path = params[:namespace_id] || params[:group_id]
|
||||||
path ||= params[:id] if params[:controller] == 'groups'
|
path ||= params[:id] if params[:controller] == 'groups'
|
||||||
|
|
|
@ -6054,7 +6054,7 @@ msgstr ""
|
||||||
msgid "AiPowered|Failed to disable GitLab Duo Workflow."
|
msgid "AiPowered|Failed to disable GitLab Duo Workflow."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "AiPowered|Failed to enable GitLab Duo Workflow."
|
msgid "AiPowered|Failed to enable GitLab Duo Agent Platform."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "AiPowered|Features are available. However, any group, subgroup, or project can turn them off."
|
msgid "AiPowered|Features are available. However, any group, subgroup, or project can turn them off."
|
||||||
|
@ -6072,6 +6072,12 @@ msgstr ""
|
||||||
msgid "AiPowered|Get started with GitLab Duo Core"
|
msgid "AiPowered|Get started with GitLab Duo Core"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "AiPowered|GitLab Duo Agent Platform is now on for the instance and the service account (%{accountId}) was created. To use Agent Platform in your groups, you must turn on AI features for specific groups."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "AiPowered|GitLab Duo Agent Platform is now on for the instance. To use Agent Platform in your groups, you must turn on AI features for specific groups."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "AiPowered|GitLab Duo Chat conversation expiration"
|
msgid "AiPowered|GitLab Duo Chat conversation expiration"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -6093,12 +6099,6 @@ msgstr ""
|
||||||
msgid "AiPowered|GitLab Duo Workflow has successfully been turned off."
|
msgid "AiPowered|GitLab Duo Workflow has successfully been turned off."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "AiPowered|GitLab Duo Workflow is now on for the instance and the service account (%{accountId}) was created. To use Workflow in your groups, you must turn on AI features for specific groups."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "AiPowered|GitLab Duo Workflow is now on for the instance. To use Workflow in your groups, you must turn on AI features for specific groups."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "AiPowered|GitLab Duo availability"
|
msgid "AiPowered|GitLab Duo availability"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -42369,6 +42369,9 @@ msgstr ""
|
||||||
msgid "Notify|%{singular_or_plural_line} %{error_lines}: Work item type is not available. Please check your license and permissions."
|
msgid "Notify|%{singular_or_plural_line} %{error_lines}: Work item type is not available. Please check your license and permissions."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Notify|%{skipped_count} have used pipeline variables in the past. These projects' CI/CD settings were not updated as there is a risk the setting change would impact pipelines."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Notify|%{strong_open}%{user_name}%{strong_close} updated the custom email address credentials for the Service Desk of %{project_link_start}%{project_name}%{project_link_end} and triggered the verification process."
|
msgid "Notify|%{strong_open}%{user_name}%{strong_close} updated the custom email address credentials for the Service Desk of %{project_link_start}%{project_name}%{project_link_end} and triggered the verification process."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -42381,9 +42384,18 @@ msgstr ""
|
||||||
msgid "Notify|%{updated_by_user_name} pushed new commits to merge request %{mr_link}"
|
msgid "Notify|%{updated_by_user_name} pushed new commits to merge request %{mr_link}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Notify|%{updated_count} projects were not using pipeline variables. CI/CD settings were updated to prevent future pipeline variable usage."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Notify|%{work_items} successfully imported."
|
msgid "Notify|%{work_items} successfully imported."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Notify|1 project has used pipeline variables in the past. This project's CI/CD settings were not updated as there is a risk the setting change would impact pipelines."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Notify|1 project was not using pipeline variables. CI/CD settings were updated to prevent future pipeline variable usage."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Notify|A new GPG key was added to your account:"
|
msgid "Notify|A new GPG key was added to your account:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -42399,6 +42411,12 @@ msgstr ""
|
||||||
msgid "Notify|All discussions on merge request %{mr_link} were resolved by %{name}"
|
msgid "Notify|All discussions on merge request %{mr_link} were resolved by %{name}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Notify|All projects in the %{group_name} group were checked for pipeline variables usage."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Notify|All projects in this group have CI/CD setting set to prevent pipeline variable usage. 🎉"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Notify|And %{total_stripped_new_commits_count} more"
|
msgid "Notify|And %{total_stripped_new_commits_count} more"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -42564,6 +42582,9 @@ msgstr ""
|
||||||
msgid "Notify|Project %{project_name} was exported successfully."
|
msgid "Notify|Project %{project_name} was exported successfully."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Notify|Projects that could not be updated need manual review. You can check the documentation for more information about the pipeline variable setting migration tool."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Notify|Read timeout:"
|
msgid "Notify|Read timeout:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -70873,6 +70894,9 @@ msgstr ""
|
||||||
msgid "WorkItems|Fields"
|
msgid "WorkItems|Fields"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "WorkItems|How do I use statuses?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "WorkItems|Open items in side panel"
|
msgid "WorkItems|Open items in side panel"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@
|
||||||
"@gitlab/favicon-overlay": "2.0.0",
|
"@gitlab/favicon-overlay": "2.0.0",
|
||||||
"@gitlab/fonts": "^1.3.0",
|
"@gitlab/fonts": "^1.3.0",
|
||||||
"@gitlab/query-language-rust": "0.13.1",
|
"@gitlab/query-language-rust": "0.13.1",
|
||||||
"@gitlab/svgs": "3.138.0",
|
"@gitlab/svgs": "3.141.0",
|
||||||
"@gitlab/ui": "115.5.0",
|
"@gitlab/ui": "115.5.0",
|
||||||
"@gitlab/vue-router-vue3": "npm:vue-router@4.5.1",
|
"@gitlab/vue-router-vue3": "npm:vue-router@4.5.1",
|
||||||
"@gitlab/vuex-vue3": "npm:vuex@4.1.0",
|
"@gitlab/vuex-vue3": "npm:vuex@4.1.0",
|
||||||
|
|
|
@ -43,7 +43,13 @@ module Gitlab
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
gitlab: { "gitlab-exporter": { enabled: false } },
|
gitlab: {
|
||||||
|
"gitlab-exporter": { enabled: false },
|
||||||
|
"gitlab-shell": {
|
||||||
|
sshDaemon: 'gitlab-sshd',
|
||||||
|
config: { proxyProtocol: true }
|
||||||
|
}
|
||||||
|
},
|
||||||
redis: { metrics: { enabled: false } },
|
redis: { metrics: { enabled: false } },
|
||||||
prometheus: { install: false },
|
prometheus: { install: false },
|
||||||
certmanager: { install: false },
|
certmanager: { install: false },
|
||||||
|
|
|
@ -72,7 +72,13 @@ RSpec.describe Gitlab::Orchestrator::Deployment::DefaultValues do
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
gitlab: { "gitlab-exporter": { enabled: false } },
|
gitlab: {
|
||||||
|
"gitlab-exporter": { enabled: false },
|
||||||
|
"gitlab-shell": {
|
||||||
|
sshDaemon: 'gitlab-sshd',
|
||||||
|
config: { proxyProtocol: true }
|
||||||
|
}
|
||||||
|
},
|
||||||
redis: { metrics: { enabled: false } },
|
redis: { metrics: { enabled: false } },
|
||||||
prometheus: { install: false },
|
prometheus: { install: false },
|
||||||
certmanager: { install: false },
|
certmanager: { install: false },
|
||||||
|
|
|
@ -10,7 +10,7 @@ module QA
|
||||||
element 'new-group-button'
|
element 'new-group-button'
|
||||||
end
|
end
|
||||||
|
|
||||||
view 'app/views/dashboard/groups/index.html.haml' do
|
view 'app/assets/javascripts/groups/your_work/constants.js' do
|
||||||
element 'groups-empty-state'
|
element 'groups-empty-state'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,10 @@ module QA
|
||||||
|
|
||||||
base.class_eval do
|
base.class_eval do
|
||||||
include QA::Page::SubMenus::CreateNewMenu
|
include QA::Page::SubMenus::CreateNewMenu
|
||||||
|
|
||||||
|
view 'app/assets/javascripts/work_items/components/create_work_item_modal.vue' do
|
||||||
|
element 'new-work-item-modal-link'
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -19,6 +23,9 @@ module QA
|
||||||
within_new_item_menu do
|
within_new_item_menu do
|
||||||
click_element(:create_menu_item, create_menu_item: 'new_issue')
|
click_element(:create_menu_item, create_menu_item: 'new_issue')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Click the "Open in full page" link if modal appears
|
||||||
|
click_element('new-work-item-modal-link') if has_element?('new-work-item-modal-link')
|
||||||
end
|
end
|
||||||
|
|
||||||
def go_to_new_merge_request
|
def go_to_new_merge_request
|
||||||
|
|
|
@ -92,15 +92,13 @@ module QA
|
||||||
project.visit!
|
project.visit!
|
||||||
Page::Project::Menu.perform(&:go_to_new_issue)
|
Page::Project::Menu.perform(&:go_to_new_issue)
|
||||||
work_item_view_enabled = Page::Project::Issue::Show.perform(&:work_item_enabled?)
|
work_item_view_enabled = Page::Project::Issue::Show.perform(&:work_item_enabled?)
|
||||||
|
|
||||||
if work_item_view_enabled
|
|
||||||
resource = Resource::WorkItem.fabricate_via_browser_ui! { |work_item| work_item.project = project }
|
|
||||||
index_page_type = Page::Project::Issue::Index
|
index_page_type = Page::Project::Issue::Index
|
||||||
show_page_type = Page::Project::WorkItem::Show
|
show_page_type = Page::Project::WorkItem::Show
|
||||||
|
|
||||||
|
resource = if work_item_view_enabled
|
||||||
|
Resource::WorkItem.fabricate_via_browser_ui! { |work_item| work_item.project = project }
|
||||||
else
|
else
|
||||||
resource = Resource::Issue.fabricate_via_browser_ui! { |issue| issue.project = project }
|
Resource::Issue.fabricate_via_browser_ui! { |issue| issue.project = project }
|
||||||
index_page_type = Page::Project::Issue::Index
|
|
||||||
show_page_type = Page::Project::Issue::Show
|
|
||||||
end
|
end
|
||||||
|
|
||||||
[resource, index_page_type, show_page_type]
|
[resource, index_page_type, show_page_type]
|
||||||
|
|
|
@ -15,19 +15,6 @@ function update_tests_metadata() {
|
||||||
cleanup_individual_job_reports
|
cleanup_individual_job_reports
|
||||||
}
|
}
|
||||||
|
|
||||||
function retrieve_tests_mapping() {
|
|
||||||
local mapping_archive="${1:-$RSPEC_PACKED_TESTS_MAPPING_PATH}"
|
|
||||||
local mapping_path="${2:-$RSPEC_TESTS_MAPPING_PATH}"
|
|
||||||
|
|
||||||
mkdir -p $(dirname "$mapping_archive")
|
|
||||||
|
|
||||||
if [[ ! -f "${mapping_archive}" ]]; then
|
|
||||||
(curl --fail --location -o "${mapping_archive}.gz" "https://gitlab-org.gitlab.io/gitlab/${mapping_archive}.gz" && gzip -d "${mapping_archive}.gz") || echo "{}" > "${mapping_archive}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
scripts/unpack-test-mapping "${mapping_archive}" "${mapping_path}"
|
|
||||||
}
|
|
||||||
|
|
||||||
function retrieve_frontend_fixtures_mapping() {
|
function retrieve_frontend_fixtures_mapping() {
|
||||||
mkdir -p $(dirname "$FRONTEND_FIXTURES_MAPPING_PATH")
|
mkdir -p $(dirname "$FRONTEND_FIXTURES_MAPPING_PATH")
|
||||||
|
|
||||||
|
@ -526,22 +513,6 @@ function rspec_fail_fast() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
function filter_rspec_matched_foss_tests() {
|
|
||||||
local matching_tests_file="${1}"
|
|
||||||
local foss_matching_tests_file="${2}"
|
|
||||||
|
|
||||||
# Keep only FOSS files that exists
|
|
||||||
cat ${matching_tests_file} | ruby -e 'puts $stdin.read.split(" ").select { |f| f.start_with?("spec/") && File.exist?(f) }.join(" ")' > "${foss_matching_tests_file}"
|
|
||||||
}
|
|
||||||
|
|
||||||
function filter_rspec_matched_ee_tests() {
|
|
||||||
local matching_tests_file="${1}"
|
|
||||||
local ee_matching_tests_file="${2}"
|
|
||||||
|
|
||||||
# Keep only EE files that exists
|
|
||||||
cat ${matching_tests_file} | ruby -e 'puts $stdin.read.split(" ").select { |f| f.start_with?("ee/spec/") && File.exist?(f) }.join(" ")' > "${ee_matching_tests_file}"
|
|
||||||
}
|
|
||||||
|
|
||||||
function generate_frontend_fixtures_mapping() {
|
function generate_frontend_fixtures_mapping() {
|
||||||
local pattern=""
|
local pattern=""
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,11 @@ RSpec.describe Admin::GroupsController, :with_current_organization, feature_cate
|
||||||
let!(:group_2) { create(:group, name: 'Ygroup') }
|
let!(:group_2) { create(:group, name: 'Ygroup') }
|
||||||
let!(:group_3) { create(:group, name: 'Jgroup', created_at: 2.days.ago, updated_at: 1.day.ago) }
|
let!(:group_3) { create(:group, name: 'Jgroup', created_at: 2.days.ago, updated_at: 1.day.ago) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
# This endpoint will become a no-op once the `admin_groups_vue` flag has been rolled out.
|
||||||
|
stub_feature_flags(admin_groups_vue: false)
|
||||||
|
end
|
||||||
|
|
||||||
render_views
|
render_views
|
||||||
|
|
||||||
it 'lists available groups' do
|
it 'lists available groups' do
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
RSpec.describe ApplicationController, :with_current_organization, feature_category: :shared do
|
RSpec.describe ApplicationController, feature_category: :shared do
|
||||||
include TermsHelper
|
include TermsHelper
|
||||||
|
|
||||||
let(:user) { create(:user) }
|
let(:user) { create(:user) }
|
||||||
|
@ -68,11 +68,10 @@ RSpec.describe ApplicationController, :with_current_organization, feature_catego
|
||||||
def index; end
|
def index; end
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'sets current organization and session' do
|
it 'sets current organization' do
|
||||||
get :index, format: :json
|
get :index, format: :json
|
||||||
|
|
||||||
expect(Current.organization).to eq(current_organization)
|
expect(Current.organization).to eq(current_organization)
|
||||||
expect(session[Gitlab::Current::Organization::SESSION_KEY]).to eq(current_organization.id)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when multiple calls in one example are done' do
|
context 'when multiple calls in one example are done' do
|
||||||
|
|
|
@ -18,18 +18,6 @@ RSpec.describe 'Dashboard Group', :with_current_organization, :js, feature_categ
|
||||||
sign_in(user)
|
sign_in(user)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when your_work_groups_vue feature flag is disabled' do
|
|
||||||
before do
|
|
||||||
stub_feature_flags(your_work_groups_vue: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'renders empty state' do
|
|
||||||
visit dashboard_groups_path
|
|
||||||
|
|
||||||
expect(page).to have_css '[data-testid="groups-empty-state"]'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'renders empty state' do
|
it 'renders empty state' do
|
||||||
visit dashboard_groups_path
|
visit dashboard_groups_path
|
||||||
|
|
||||||
|
@ -75,18 +63,6 @@ RSpec.describe 'Dashboard Group', :with_current_organization, :js, feature_categ
|
||||||
group.add_developer(user)
|
group.add_developer(user)
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when your_work_groups_vue feature flag is disabled' do
|
|
||||||
before do
|
|
||||||
stub_feature_flags(your_work_groups_vue: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'defaults sort dropdown to Created date' do
|
|
||||||
visit dashboard_groups_path
|
|
||||||
|
|
||||||
expect(page).to have_button('Created date')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'defaults sort dropdown to Updated date' do
|
it 'defaults sort dropdown to Updated date' do
|
||||||
visit dashboard_groups_path
|
visit dashboard_groups_path
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue