Skip to content

Commit 1252510

Browse files
author
GitLab Bot
committed
Add latest changes from gitlab-org/gitlab@master
1 parent b1cfb65 commit 1252510

File tree

90 files changed

+1572
-277
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+1572
-277
lines changed

.rubocop_todo/gitlab/bounded_contexts.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -3768,7 +3768,7 @@ Gitlab/BoundedContexts:
37683768
- 'ee/lib/quality/seeders/dependencies.rb'
37693769
- 'ee/lib/quality/seeders/insights/issues.rb'
37703770
- 'ee/lib/quality/seeders/vulnerabilities.rb'
3771-
- 'ee/lib/sidebars/admin/menus/ai_powered_features_menu.rb'
3771+
- 'ee/lib/sidebars/admin/menus/self_hosted_models_menu.rb'
37723772
- 'ee/lib/sidebars/admin/menus/code_suggestions_menu.rb'
37733773
- 'ee/lib/sidebars/admin/menus/credentials_menu.rb'
37743774
- 'ee/lib/sidebars/admin/menus/geo_menu.rb'

.rubocop_todo/layout/line_length.yml

-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,6 @@ Layout/LineLength:
342342
- 'app/models/namespace.rb'
343343
- 'app/models/namespace/package_setting.rb'
344344
- 'app/models/namespace_setting.rb'
345-
- 'app/models/namespace_statistics.rb'
346345
- 'app/models/namespaces/traversal/linear.rb'
347346
- 'app/models/notification_setting.rb'
348347
- 'app/models/oauth_access_token.rb'

.rubocop_todo/performance/string_identifier_argument.yml

-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,6 @@ Performance/StringIdentifierArgument:
217217
- 'spec/support/shared_examples/models/concerns/cascading_namespace_setting_shared_examples.rb'
218218
- 'spec/support/shared_examples/models/concerns/cascading_project_setting_shared_examples.rb'
219219
- 'spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb'
220-
- 'spec/support/shared_examples/models/concerns/update_namespace_statistics_shared_examples.rb'
221220
- 'spec/support/shared_examples/models/email_format_shared_examples.rb'
222221
- 'spec/support/shared_examples/models/project_ci_cd_settings_shared_examples.rb'
223222
- 'spec/support/shared_examples/policies/project_policy_shared_examples.rb'

.rubocop_todo/rspec/expect_in_hook.yml

-1
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,6 @@ RSpec/ExpectInHook:
392392
- 'spec/support/shared_examples/lib/wikis_api_examples.rb'
393393
- 'spec/support/shared_examples/metrics/sampler_shared_examples.rb'
394394
- 'spec/support/shared_examples/models/concerns/has_wiki_shared_examples.rb'
395-
- 'spec/support/shared_examples/models/concerns/update_namespace_statistics_shared_examples.rb'
396395
- 'spec/support/shared_examples/models/mentionable_shared_examples.rb'
397396
- 'spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb'
398397
- 'spec/support/shared_examples/requests/api/helm_packages_shared_examples.rb'

app/assets/javascripts/access_level/constants.js

+19
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,25 @@ export const ACCESS_LEVEL_MAINTAINER_INTEGER = 40;
1010
export const ACCESS_LEVEL_OWNER_INTEGER = 50;
1111
export const ACCESS_LEVEL_ADMIN_INTEGER = 60;
1212

13+
// Matches `app/graphql/types/access_level_enum.rb`
14+
export const ACCESS_LEVEL_NO_ACCESS_STRING = 'NO_ACCESS';
15+
export const ACCESS_LEVEL_MINIMAL_ACCESS_STRING = 'MINIMAL_ACCESS';
16+
export const ACCESS_LEVEL_GUEST_STRING = 'GUEST';
17+
export const ACCESS_LEVEL_REPORTER_STRING = 'REPORTER';
18+
export const ACCESS_LEVEL_DEVELOPER_STRING = 'DEVELOPER';
19+
export const ACCESS_LEVEL_MAINTAINER_STRING = 'MAINTAINER';
20+
export const ACCESS_LEVEL_OWNER_STRING = 'OWNER';
21+
22+
export const ACCESS_LEVELS_INTEGER_TO_STRING = {
23+
[ACCESS_LEVEL_NO_ACCESS_INTEGER]: ACCESS_LEVEL_NO_ACCESS_STRING,
24+
[ACCESS_LEVEL_MINIMAL_ACCESS_INTEGER]: ACCESS_LEVEL_MINIMAL_ACCESS_STRING,
25+
[ACCESS_LEVEL_GUEST_INTEGER]: ACCESS_LEVEL_GUEST_STRING,
26+
[ACCESS_LEVEL_REPORTER_INTEGER]: ACCESS_LEVEL_REPORTER_STRING,
27+
[ACCESS_LEVEL_DEVELOPER_INTEGER]: ACCESS_LEVEL_DEVELOPER_STRING,
28+
[ACCESS_LEVEL_MAINTAINER_INTEGER]: ACCESS_LEVEL_MAINTAINER_STRING,
29+
[ACCESS_LEVEL_OWNER_INTEGER]: ACCESS_LEVEL_OWNER_STRING,
30+
};
31+
1332
const ACCESS_LEVEL_NO_ACCESS = __('No access');
1433
const ACCESS_LEVEL_MINIMAL_ACCESS = __('Minimal Access');
1534
const ACCESS_LEVEL_GUEST = __('Guest');

app/assets/javascripts/merge_requests/list/components/merge_requests_list_app.vue

+24
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import { GlFilteredSearchToken, GlButton, GlLink, GlIcon, GlTooltipDirective } from '@gitlab/ui';
33
import { isEmpty } from 'lodash';
44
import ApprovalCount from 'ee_else_ce/merge_requests/components/approval_count.vue';
5+
import { sprintf, __ } from '~/locale';
56
import Api from '~/api';
67
import * as Sentry from '~/sentry/sentry_browser_wrapper';
78
import { STATUS_ALL, STATUS_CLOSED, STATUS_OPEN, STATUS_MERGED } from '~/issues/constants';
@@ -129,6 +130,7 @@ export default {
129130
canBulkUpdate: { default: false },
130131
environmentNamesPath: { default: '' },
131132
mergeTrainsPath: { default: undefined },
133+
defaultBranch: { default: '' },
132134
},
133135
data() {
134136
return {
@@ -676,6 +678,11 @@ export default {
676678
issuableEventHub.$emit('issuables:updateBulkEdit');
677679
});
678680
},
681+
targetBranchTooltip(mergeRequest) {
682+
return sprintf(__('Target branch: %{target_branch}'), {
683+
target_branch: mergeRequest.targetBranch,
684+
});
685+
},
679686
},
680687
STATUS_OPEN,
681688
};
@@ -758,6 +765,23 @@ export default {
758765
<issuable-milestone v-if="issuable.milestone" :milestone="issuable.milestone" />
759766
</template>
760767
768+
<template #target-branch="{ issuable = {} }">
769+
<span
770+
v-if="issuable.targetBranch !== defaultBranch"
771+
class="project-ref-path gl-inline-block gl-max-w-26 gl-truncate gl-align-bottom"
772+
data-testid="target-branch"
773+
>
774+
<gl-link
775+
v-gl-tooltip
776+
:href="issuable.targetBranchPath"
777+
:title="targetBranchTooltip(issuable)"
778+
class="ref-name !gl-text-gray-500"
779+
>
780+
<gl-icon name="branch" :size="12" class="gl-mr-2" />{{ issuable.targetBranch }}
781+
</gl-link>
782+
</span>
783+
</template>
784+
761785
<template #statistics="{ issuable = {} }">
762786
<merge-request-statistics :merge-request="issuable" />
763787
</template>

app/assets/javascripts/merge_requests/list/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export async function mountMergeRequestListsApp() {
3535
canBulkUpdate,
3636
environmentNamesPath,
3737
mergeTrainsPath,
38+
defaultBranch,
3839
} = el.dataset;
3940

4041
return new Vue({
@@ -67,6 +68,7 @@ export async function mountMergeRequestListsApp() {
6768
canBulkUpdate: parseBoolean(canBulkUpdate),
6869
environmentNamesPath,
6970
mergeTrainsPath,
71+
defaultBranch,
7072
},
7173
render: (createComponent) => createComponent(MergeRequestsListApp),
7274
});

app/assets/javascripts/merge_requests/list/queries/merge_request.fragment.graphql

+2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ fragment MergeRequestFragment on MergeRequest {
4848
commitCount
4949
sourceBranchExists
5050
targetBranchExists
51+
targetBranch
52+
targetBranchPath
5153
taskCompletionStatus {
5254
completedCount
5355
count

app/assets/javascripts/projects/your_work/components/app.vue

+25-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script>
22
import { GlTabs, GlTab, GlBadge, GlFilteredSearchToken } from '@gitlab/ui';
3-
import { isEqual } from 'lodash';
3+
import { isEqual, pick } from 'lodash';
44
import { __ } from '~/locale';
55
import { TIMESTAMP_TYPE_UPDATED_AT } from '~/vue_shared/components/resource_lists/constants';
66
import { QUERY_PARAM_END_CURSOR, QUERY_PARAM_START_CURSOR } from '~/graphql_shared/constants';
@@ -23,6 +23,8 @@ import {
2323
CONTRIBUTED_TAB,
2424
CUSTOM_DASHBOARD_ROUTE_NAMES,
2525
PROJECT_DASHBOARD_TABS,
26+
FILTERED_SEARCH_TOKEN_LANGUAGE,
27+
FILTERED_SEARCH_TOKEN_MIN_ACCESS_LEVEL,
2628
} from '../constants';
2729
import projectCountsQuery from '../graphql/queries/project_counts.query.graphql';
2830
import TabView from './tab_view.vue';
@@ -90,7 +92,7 @@ export default {
9092
filteredSearchTokens() {
9193
return [
9294
{
93-
type: 'language',
95+
type: FILTERED_SEARCH_TOKEN_LANGUAGE,
9496
icon: 'lock',
9597
title: __('Language'),
9698
token: GlFilteredSearchToken,
@@ -103,7 +105,7 @@ export default {
103105
})),
104106
},
105107
{
106-
type: 'min_access_level',
108+
type: FILTERED_SEARCH_TOKEN_MIN_ACCESS_LEVEL,
107109
icon: 'user',
108110
title: __('Role'),
109111
token: GlFilteredSearchToken,
@@ -141,6 +143,22 @@ export default {
141143
endCursor() {
142144
return this.$route.query[QUERY_PARAM_END_CURSOR];
143145
},
146+
routeQueryWithoutPagination() {
147+
const {
148+
[QUERY_PARAM_START_CURSOR]: startCursor,
149+
[QUERY_PARAM_END_CURSOR]: endCursor,
150+
...routeQuery
151+
} = this.$route.query;
152+
153+
return routeQuery;
154+
},
155+
filters() {
156+
return pick(this.routeQueryWithoutPagination, [
157+
FILTERED_SEARCH_TOKEN_LANGUAGE,
158+
FILTERED_SEARCH_TOKEN_MIN_ACCESS_LEVEL,
159+
FILTERED_SEARCH_TERM_KEY,
160+
]);
161+
},
144162
},
145163
methods: {
146164
numberToMetricPrefix,
@@ -178,12 +196,12 @@ export default {
178196
onSortDirectionChange(isAscending) {
179197
const sort = this.createSortQuery({ sortBy: this.activeSortOption.value, isAscending });
180198
181-
this.pushQuery({ ...this.$route.query, sort });
199+
this.pushQuery({ ...this.routeQueryWithoutPagination, sort });
182200
},
183201
onSortByChange(sortBy) {
184202
const sort = this.createSortQuery({ sortBy, isAscending: this.isAscending });
185203
186-
this.pushQuery({ ...this.$route.query, sort });
204+
this.pushQuery({ ...this.routeQueryWithoutPagination, sort });
187205
},
188206
onFilter(filters) {
189207
const { sort } = this.$route.query;
@@ -219,6 +237,8 @@ export default {
219237
:tab="tab"
220238
:start-cursor="startCursor"
221239
:end-cursor="endCursor"
240+
:sort="sort"
241+
:filters="filters"
222242
@page-change="onPageChange"
223243
/>
224244
<template v-else>{{ tab.text }}</template>

app/assets/javascripts/projects/your_work/components/tab_view.vue

+46-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ import { __ } from '~/locale';
77
import { createAlert } from '~/alert';
88
import { formatGraphQLProjects } from '~/vue_shared/components/projects_list/utils';
99
import { TIMESTAMP_TYPE_UPDATED_AT } from '~/vue_shared/components/resource_lists/constants';
10+
import { FILTERED_SEARCH_TERM_KEY } from '~/projects/filtered_search_and_sort/constants';
11+
import { ACCESS_LEVELS_INTEGER_TO_STRING } from '~/access_level/constants';
12+
import {
13+
FILTERED_SEARCH_TOKEN_LANGUAGE,
14+
FILTERED_SEARCH_TOKEN_MIN_ACCESS_LEVEL,
15+
} from '../constants';
1016
1117
export default {
1218
name: 'YourWorkProjectsTabView',
@@ -21,6 +27,7 @@ export default {
2127
GlKeysetPagination,
2228
ProjectsList,
2329
},
30+
inject: ['programmingLanguages'],
2431
props: {
2532
tab: {
2633
required: true,
@@ -36,6 +43,14 @@ export default {
3643
required: false,
3744
default: null,
3845
},
46+
sort: {
47+
type: String,
48+
required: true,
49+
},
50+
filters: {
51+
type: Object,
52+
required: true,
53+
},
3954
},
4055
data() {
4156
return {
@@ -47,7 +62,21 @@ export default {
4762
return {
4863
query: this.tab.query,
4964
variables() {
50-
return { ...this.pagination, ...this.tab.variables };
65+
const { transformVariables } = this.tab;
66+
67+
const variables = {
68+
...this.pagination,
69+
...this.tab.variables,
70+
sort: this.sort,
71+
programmingLanguageName: this.programmingLanguageName,
72+
minAccessLevel: this.minAccessLevel,
73+
search: this.search,
74+
};
75+
const transformedVariables = transformVariables
76+
? transformVariables(variables)
77+
: variables;
78+
79+
return transformedVariables;
5180
},
5281
update(response) {
5382
const { nodes, pageInfo } = get(response, this.tab.queryPath);
@@ -90,6 +119,22 @@ export default {
90119
isLoading() {
91120
return this.$apollo.queries.projects.loading;
92121
},
122+
search() {
123+
return this.filters[FILTERED_SEARCH_TERM_KEY];
124+
},
125+
minAccessLevel() {
126+
const { [FILTERED_SEARCH_TOKEN_MIN_ACCESS_LEVEL]: minAccessLevelInteger } = this.filters;
127+
128+
return minAccessLevelInteger && ACCESS_LEVELS_INTEGER_TO_STRING[minAccessLevelInteger];
129+
},
130+
programmingLanguageName() {
131+
const { [FILTERED_SEARCH_TOKEN_LANGUAGE]: programmingLanguageId } = this.filters;
132+
133+
return (
134+
programmingLanguageId &&
135+
this.programmingLanguages.find(({ id }) => id === parseInt(programmingLanguageId, 10))?.name
136+
);
137+
},
93138
},
94139
methods: {
95140
onDeleteComplete() {

app/assets/javascripts/projects/your_work/constants.js

+9
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,18 @@ import { __ } from '~/locale';
22
import projectsQuery from './graphql/queries/projects.query.graphql';
33
import userProjectsQuery from './graphql/queries/user_projects.query.graphql';
44

5+
const transformSortToUpperCase = (variables) => ({
6+
...variables,
7+
sort: variables.sort.toUpperCase(),
8+
});
9+
510
export const CONTRIBUTED_TAB = {
611
text: __('Contributed'),
712
value: 'contributed',
813
query: userProjectsQuery,
914
variables: { contributed: true },
1015
queryPath: 'currentUser.contributedProjects',
16+
transformVariables: transformSortToUpperCase,
1117
};
1218

1319
export const STARRED_TAB = {
@@ -16,6 +22,7 @@ export const STARRED_TAB = {
1622
query: userProjectsQuery,
1723
variables: { starred: true },
1824
queryPath: 'currentUser.starredProjects',
25+
transformVariables: transformSortToUpperCase,
1926
};
2027

2128
export const PERSONAL_TAB = {
@@ -66,3 +73,5 @@ export const CUSTOM_DASHBOARD_ROUTE_NAMES = [
6673

6774
export const FILTERED_SEARCH_NAMESPACE = 'dashboard';
6875
export const FILTERED_SEARCH_TERM_KEY = 'name';
76+
export const FILTERED_SEARCH_TOKEN_LANGUAGE = 'language';
77+
export const FILTERED_SEARCH_TOKEN_MIN_ACCESS_LEVEL = 'min_access_level';

app/assets/javascripts/projects/your_work/graphql/queries/projects.query.graphql

+8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ query getYourWorkProjects(
99
$last: Int
1010
$before: String
1111
$after: String
12+
$sort: String
13+
$search: String
14+
$minAccessLevel: AccessLevelEnum
15+
$programmingLanguageName: String
1216
) {
1317
projects(
1418
archived: $archived
@@ -18,6 +22,10 @@ query getYourWorkProjects(
1822
last: $last
1923
before: $before
2024
after: $after
25+
sort: $sort
26+
search: $search
27+
minAccessLevel: $minAccessLevel
28+
programmingLanguageName: $programmingLanguageName
2129
) {
2230
nodes {
2331
...Project

app/assets/javascripts/projects/your_work/graphql/queries/user_projects.query.graphql

+24-4
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,40 @@ query getYourWorkUserProjects(
88
$last: Int
99
$before: String
1010
$after: String
11+
$sort: ProjectSort
12+
$search: String
13+
$minAccessLevel: AccessLevelEnum
14+
$programmingLanguageName: String
1115
) {
1216
currentUser {
1317
id
14-
contributedProjects(first: $first, last: $last, before: $before, after: $after)
15-
@include(if: $contributed) {
18+
contributedProjects(
19+
first: $first
20+
last: $last
21+
before: $before
22+
after: $after
23+
sort: $sort
24+
search: $search
25+
minAccessLevel: $minAccessLevel
26+
programmingLanguageName: $programmingLanguageName
27+
) @include(if: $contributed) {
1628
nodes {
1729
...Project
1830
}
1931
pageInfo {
2032
...PageInfo
2133
}
2234
}
23-
starredProjects(first: $first, last: $last, before: $before, after: $after)
24-
@include(if: $starred) {
35+
starredProjects(
36+
first: $first
37+
last: $last
38+
before: $before
39+
after: $after
40+
sort: $sort
41+
search: $search
42+
minAccessLevel: $minAccessLevel
43+
programmingLanguageName: $programmingLanguageName
44+
) @include(if: $starred) {
2545
nodes {
2646
...Project
2747
}

0 commit comments

Comments
 (0)