Skip to content

Commit 47bc32f

Browse files
author
GitLab Bot
committed
Add latest changes from gitlab-org/gitlab@master
1 parent 944d96f commit 47bc32f

40 files changed

+632
-365
lines changed

app/assets/javascripts/design_management/components/design_presentation.vue

+2
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,10 @@ export default {
158158
const yScrollRatio =
159159
presentationViewport.scrollTop > 0 ? presentationViewport.scrollTop / scrollBarHeight : 0;
160160
const xScrollOffset =
161+
// eslint-disable-next-line no-implicit-coercion
161162
(presentationViewport.scrollWidth - presentationViewport.offsetWidth - 0) * xScrollRatio;
162163
const yScrollOffset =
164+
// eslint-disable-next-line no-implicit-coercion
163165
(presentationViewport.scrollHeight - presentationViewport.offsetHeight - 0) * yScrollRatio;
164166
165167
const viewportCenterX = presentationViewport.offsetWidth / 2;

app/assets/javascripts/ml/model_registry/apps/show_ml_model_version.vue

+4-1
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,10 @@ export default {
268268
:href="editModelVersionPath"
269269
>{{ $options.i18n.editModelVersionButtonLabel }}</gl-button
270270
>
271-
<model-version-actions-dropdown @delete-model-version="deleteModelVersion" />
271+
<model-version-actions-dropdown
272+
:model-version="modelWithModelVersion"
273+
@delete-model-version="deleteModelVersion"
274+
/>
272275
</div>
273276
</div>
274277

app/assets/javascripts/ml/model_registry/components/delete_model_version_disclosure_dropdown_item.vue

+14-9
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,19 @@ export default {
1010
directives: {
1111
GlModalDirective,
1212
},
13-
inject: ['versionName'],
14-
data() {
15-
return {
16-
isDeleteModalVisible: false,
17-
};
13+
props: {
14+
modelVersion: {
15+
type: Object,
16+
required: true,
17+
},
1818
},
1919
computed: {
20+
versionName() {
21+
return this.modelVersion.version;
22+
},
23+
modalId() {
24+
return `ml-model-version-delete-modal-${this.modelVersion.id}`;
25+
},
2026
modalTitle() {
2127
return sprintf(s__('MlModelRegistry|Delete version %{versionName}'), {
2228
versionName: this.versionName,
@@ -25,11 +31,10 @@ export default {
2531
},
2632
methods: {
2733
deleteModelVersion() {
28-
this.$emit('delete-model-version');
34+
this.$emit('delete-model-version', this.modelVersion.id);
2935
},
3036
},
3137
modal: {
32-
id: 'ml-model-version-delete-modal',
3338
actionPrimary: {
3439
text: s__('MlModelRegistry|Delete version'),
3540
attributes: { variant: 'danger' },
@@ -51,7 +56,7 @@ export default {
5156

5257
<template>
5358
<gl-disclosure-dropdown-item
54-
v-gl-modal-directive="$options.modal.id"
59+
v-gl-modal-directive="modalId"
5560
:aria-label="$options.modal.actionPrimary.text"
5661
variant="danger"
5762
>
@@ -61,7 +66,7 @@ export default {
6166
</span>
6267

6368
<gl-modal
64-
:modal-id="$options.modal.id"
69+
:modal-id="modalId"
6570
:title="modalTitle"
6671
:action-primary="$options.modal.actionPrimary"
6772
:action-cancel="$options.modal.actionCancel"

app/assets/javascripts/ml/model_registry/components/model_version_actions_dropdown.vue

+9-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<script>
22
import { GlDisclosureDropdown } from '@gitlab/ui';
3-
import { s__ } from '~/locale';
43
import DeleteModelVersionDisclosureDropdownItem from './delete_model_version_disclosure_dropdown_item.vue';
54
65
export default {
@@ -9,17 +8,16 @@ export default {
98
GlDisclosureDropdown,
109
},
1110
inject: ['canWriteModelRegistry'],
12-
methods: {
13-
deleteModelVersion() {
14-
this.$emit('delete-model-version');
11+
props: {
12+
modelVersion: {
13+
type: Object,
14+
required: true,
1515
},
1616
},
17-
i18n: {
18-
actionPrimaryText: s__('MlModelRegistry|Delete model version'),
19-
modalTitle: s__('MlModelRegistry|Delete model version?'),
20-
deleteConfirmationText: s__(
21-
'MlModelRegistry|Deleting this model version will delete the associated artifacts.',
22-
),
17+
methods: {
18+
deleteModelVersion(modelVersion) {
19+
this.$emit('delete-model-version', modelVersion);
20+
},
2321
},
2422
};
2523
</script>
@@ -34,9 +32,7 @@ export default {
3432
>
3533
<delete-model-version-disclosure-dropdown-item
3634
v-if="canWriteModelRegistry"
37-
:action-primary-text="$options.i18n.actionPrimaryText"
38-
:modal-title="$options.i18n.modalTitle"
39-
:delete-confirmation-text="$options.i18n.deleteConfirmationText"
35+
:model-version="modelVersion"
4036
@delete-model-version="deleteModelVersion"
4137
/>
4238
</gl-disclosure-dropdown>

app/assets/javascripts/ml/model_registry/components/model_versions_table.vue

+57
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
import { GlAvatarLink, GlAvatar, GlTable, GlLink, GlTooltip } from '@gitlab/ui';
33
import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue';
44
import { s__ } from '~/locale';
5+
import { createAlert, VARIANT_DANGER } from '~/alert';
6+
import * as Sentry from '~/sentry/sentry_browser_wrapper';
7+
import deleteModelVersionMutation from '~/ml/model_registry/graphql/mutations/delete_model_version.mutation.graphql';
8+
import { convertToGraphQLId } from '~/graphql_shared/utils';
9+
import { TYPENAME_MODEL_VERSION } from '~/ml/model_registry/constants';
10+
import ModelVersionActionsDropdown from './model_version_actions_dropdown.vue';
511
612
export default {
713
name: 'ModelVersionsTable',
@@ -11,6 +17,7 @@ export default {
1117
TimeAgoTooltip,
1218
GlAvatar,
1319
GlLink,
20+
ModelVersionActionsDropdown,
1421
},
1522
directives: {
1623
GlTooltip,
@@ -20,16 +27,59 @@ export default {
2027
type: Array,
2128
required: true,
2229
},
30+
canWriteModelRegistry: {
31+
type: Boolean,
32+
required: true,
33+
},
2334
},
2435
computed: {
2536
computedFields() {
2637
return [
2738
{ key: 'version', label: s__('ModelRegistry|Version'), thClass: 'gl-w-1/3' },
2839
{ key: 'createdAt', label: s__('ModelRegistry|Created'), thClass: 'gl-w-1/3' },
2940
{ key: 'author', label: s__('ModelRegistry|Created by') },
41+
{
42+
key: 'actions',
43+
label: '',
44+
tdClass: 'lg:gl-w-px gl-whitespace-nowrap',
45+
thClass: 'lg:gl-w-px gl-whitespace-nowrap',
46+
},
3047
];
3148
},
3249
},
50+
methods: {
51+
handleDeleteError(error) {
52+
Sentry.captureException(error, {
53+
tags: {
54+
vue_component: 'model_versions_table',
55+
},
56+
});
57+
createAlert({
58+
message: s__(
59+
'MLOps|Something went wrong while trying to delete the model version. Please try again later.',
60+
),
61+
variant: VARIANT_DANGER,
62+
});
63+
},
64+
async deleteModelVersion(modelVersionId) {
65+
try {
66+
const { data } = await this.$apollo.mutate({
67+
mutation: deleteModelVersionMutation,
68+
variables: {
69+
id: convertToGraphQLId(TYPENAME_MODEL_VERSION, modelVersionId),
70+
},
71+
});
72+
73+
if (data.mlModelVersionDelete?.errors?.length > 0) {
74+
throw data.mlModelVersionDelete.errors.join(', ');
75+
}
76+
77+
this.$emit('model-versions-update');
78+
} catch (error) {
79+
this.handleDeleteError(error);
80+
}
81+
},
82+
},
3383
};
3484
</script>
3585
@@ -53,5 +103,12 @@ export default {
53103
{{ author.name }}
54104
</gl-avatar-link>
55105
</template>
106+
<template #cell(actions)="{ item }">
107+
<model-version-actions-dropdown
108+
v-if="canWriteModelRegistry"
109+
:model-version="item"
110+
@delete-model-version="deleteModelVersion"
111+
/>
112+
</template>
56113
</gl-table>
57114
</template>

app/assets/javascripts/ml/model_registry/components/searchable_table.vue

+6-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,12 @@ export default {
162162
/>
163163
<load-or-error-or-show :is-loading="isLoading" :error-message="errorMessage">
164164
<slot v-if="isListEmpty" name="empty-state"></slot>
165-
<model-versions-table v-else-if="!isModelVersionsEmpty" :items="modelVersions" />
165+
<model-versions-table
166+
v-else-if="!isModelVersionsEmpty"
167+
:items="modelVersions"
168+
can-write-model-registry
169+
@model-versions-update="submitFilters"
170+
/>
166171
<models-table v-else-if="!isModelsEmpty" :items="models" />
167172
<gl-keyset-pagination
168173
v-if="pageInfo.hasPreviousPage || pageInfo.hasNextPage"

app/assets/javascripts/ml/model_registry/constants.js

+2
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,7 @@ export const UPLOAD_STATUS = {
3838
SUCCEEDED: 4,
3939
};
4040

41+
export const TYPENAME_MODEL_VERSION = 'Ml::ModelVersion';
42+
4143
export const ROUTE_DETAILS = 'details';
4244
export const ROUTE_PERFORMANCE = 'performance';

app/assets/javascripts/persistent_user_callouts.js

-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ const PERSISTENT_USER_CALLOUTS = [
2828
'.js-joining-a-project-alert',
2929
'.js-all-seats-used',
3030
'.js-period-in-terraform-state-name-alert',
31-
'.js-duo-free-access-ending-banner',
3231
'.js-new-mr-dashboard-banner',
3332
];
3433

app/assets/javascripts/work_items/components/design_management/design_preview/design_presentation.vue

+2
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,10 @@ export default {
158158
const yScrollRatio =
159159
presentationViewport.scrollTop > 0 ? presentationViewport.scrollTop / scrollBarHeight : 0;
160160
const xScrollOffset =
161+
// eslint-disable-next-line no-implicit-coercion
161162
(presentationViewport.scrollWidth - presentationViewport.offsetWidth - 0) * xScrollRatio;
162163
const yScrollOffset =
164+
// eslint-disable-next-line no-implicit-coercion
163165
(presentationViewport.scrollHeight - presentationViewport.offsetHeight - 0) * yScrollRatio;
164166
165167
const viewportCenterX = presentationViewport.offsetWidth / 2;

app/assets/stylesheets/framework/layout.scss

+15
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,18 @@ html {
169169
padding-right: 0;
170170
}
171171
}
172+
173+
174+
/*
175+
* These are used by the `Tab width` user preference in
176+
* `https://gitlab.com/-/profile/preferences`. The `css_class_for_user` method in
177+
* `lib/gitlab/tab_width.rb` is used to add one of these classes to the `body` element.
178+
*/
179+
180+
@for $i from 1 through 12 {
181+
#{'.tab-width-#{$i}'} {
182+
/* stylelint-disable-next-line property-no-vendor-prefix */
183+
-moz-tab-size: $i;
184+
tab-size: $i;
185+
}
186+
}

app/assets/stylesheets/utilities.scss

-8
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,6 @@ $type-scale: (
4040
}
4141
}
4242

43-
@for $i from 1 through 12 {
44-
#{'.tab-width-#{$i}'} {
45-
/* stylelint-disable-next-line property-no-vendor-prefix */
46-
-moz-tab-size: $i;
47-
tab-size: $i;
48-
}
49-
}
50-
5143
// stylelint-disable-next-line gitlab/no-gl-class
5244
.gl-top-app-header {
5345
top: $calc-application-header-height;

app/models/group.rb

+39-15
Original file line numberDiff line numberDiff line change
@@ -246,22 +246,10 @@ def of_ancestors_and_self
246246
end
247247

248248
scope :project_creation_allowed, ->(user) do
249-
project_creation_allowed_on_levels = [
250-
::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS,
251-
::Gitlab::Access::MAINTAINER_PROJECT_ACCESS,
252-
nil
253-
]
254-
255-
# When the value of application_settings.default_project_creation is set to `NO_ONE_PROJECT_ACCESS`,
256-
# it means that a `nil` value for `groups.project_creation_level` is telling us:
257-
# do not allow project creation in such groups.
258-
# ie, `nil` is a placeholder value for inheriting the value from the ApplicationSetting.
259-
# So we remove `nil` from the list when the application_setting's value is `NO_ONE_PROJECT_ACCESS`
260-
if ::Gitlab::CurrentSettings.default_project_creation == ::Gitlab::Access::NO_ONE_PROJECT_ACCESS
261-
project_creation_allowed_on_levels.delete(nil)
262-
end
249+
project_creation_levels_for_user = project_creation_levels_for_user(user)
263250

264-
with_project_creation_levels(project_creation_allowed_on_levels).excluding_restricted_visibility_levels_for_user(user)
251+
with_project_creation_levels(project_creation_levels_for_user)
252+
.excluding_restricted_visibility_levels_for_user(user)
265253
end
266254

267255
scope :shared_into_ancestors, ->(group) do
@@ -414,6 +402,42 @@ def with_api_scopes
414402
preload(:namespace_settings, :group_feature, :parent)
415403
end
416404

405+
# Handle project creation permissions based on application setting and group setting. The `default_project_creation`
406+
# application setting is the default value and can be overridden by the `project_creation_level` group setting.
407+
# `nil` value of namespaces.project_creation_level` means that allowed creation level has not been explicitly set by
408+
# the group owner and is a placeholder value for inheriting the value from the ApplicationSetting.
409+
def project_creation_levels_for_user(user)
410+
project_creation_allowed_on_levels = [
411+
::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS,
412+
::Gitlab::Access::MAINTAINER_PROJECT_ACCESS,
413+
nil
414+
]
415+
416+
if user.can_admin_all_resources?
417+
project_creation_allowed_on_levels << ::Gitlab::Access::ADMINISTRATOR_PROJECT_ACCESS
418+
end
419+
420+
default_project_creation = ::Gitlab::CurrentSettings.default_project_creation
421+
prevent_project_creation_by_default = prevent_project_creation?(user, default_project_creation)
422+
423+
# Remove nil (i.e. inherited `default_project_creation`) when the application setting is:
424+
# 1. NO_ONE_PROJECT_ACCESS
425+
# 2. ADMINISTRATOR_PROJECT_ACCESS and the user is not an admin
426+
#
427+
# To prevent showing groups in the namespaces dropdown on the project creation page that have no explicit group
428+
# setting for `project_creation_level`.
429+
project_creation_allowed_on_levels.delete(nil) if prevent_project_creation_by_default
430+
431+
project_creation_allowed_on_levels
432+
end
433+
434+
def prevent_project_creation?(user, project_creation_setting)
435+
return true if project_creation_setting == ::Gitlab::Access::NO_ONE_PROJECT_ACCESS
436+
return false if user.can_admin_all_resources?
437+
438+
project_creation_setting == ::Gitlab::Access::ADMINISTRATOR_PROJECT_ACCESS
439+
end
440+
417441
private
418442

419443
def public_to_user_arel(user)

app/models/users/callout.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ class Callout < ApplicationRecord
9494
work_item_epic_feedback: 92, # EE-only
9595
branch_rules_tip_callout: 93,
9696
openssl_callout: 94,
97-
duo_free_access_ending_banner: 95, # EE-only
97+
# 95 removed in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/152981 https://gitlab.com/gitlab-org/gitlab/-/merge_requests/170868
9898
new_mr_dashboard_banner: 96
9999
}
100100

app/policies/group_policy.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class GroupPolicy < Namespaces::GroupProjectNamespaceSharedPolicy
5656
Project.new(namespace: @subject).visibility_level_allowed?(level)
5757
end
5858

59-
@subject.project_creation_level == ::Gitlab::Access::NO_ONE_PROJECT_ACCESS || allowed_visibility_levels.empty?
59+
Group.prevent_project_creation?(user, @subject.project_creation_level) || allowed_visibility_levels.empty?
6060
end
6161

6262
condition(:create_subgroup_disabled, scope: :subject) do

app/views/groups/show.html.haml

-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919

2020
= render partial: 'flash_messages'
2121

22-
= render_if_exists 'shared/duo_free_access_ending_banner', resource: @group
23-
2422
= render 'groups/home_panel'
2523

2624
= render_if_exists 'groups/group_activity_analytics', group: @group

app/views/projects/empty.html.haml

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
- @skip_current_level_breadcrumb = true
55

6-
= render_if_exists 'projects/duo_free_access_ending_banner', project: @project
76
= render partial: 'flash_messages', locals: { project: @project }
87
= render 'clusters_deprecation_alert'
98

0 commit comments

Comments
 (0)