diff --git a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue index c1a79134136..ca37f888ab9 100644 --- a/app/assets/javascripts/invite_members/components/invite_members_trigger.vue +++ b/app/assets/javascripts/invite_members/components/invite_members_trigger.vue @@ -32,6 +32,11 @@ export default { required: false, default: undefined, }, + category: { + type: String, + required: false, + default: undefined, + }, triggerSource: { type: String, required: true, @@ -82,6 +87,7 @@ export default { v-if="isButtonTrigger" v-bind="componentAttributes" :variant="variant" + :category="category" :icon="icon" @click="openModal" > diff --git a/app/assets/javascripts/merge_requests/components/reviewers/reviewer_dropdown.vue b/app/assets/javascripts/merge_requests/components/reviewers/reviewer_dropdown.vue index 0d85c5dba7d..ea9bb7ee887 100644 --- a/app/assets/javascripts/merge_requests/components/reviewers/reviewer_dropdown.vue +++ b/app/assets/javascripts/merge_requests/components/reviewers/reviewer_dropdown.vue @@ -6,6 +6,7 @@ import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants'; import { TYPENAME_MERGE_REQUEST } from '~/graphql_shared/constants'; import { convertToGraphQLId } from '~/graphql_shared/utils'; import userAutocompleteWithMRPermissionsQuery from '~/graphql_shared/queries/project_autocomplete_users_with_mr_permissions.query.graphql'; +import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue'; import UpdateReviewers from './update_reviewers.vue'; import userPermissionsQuery from './queries/user_permissions.query.graphql'; @@ -27,8 +28,9 @@ export default { GlAvatar, GlIcon, UpdateReviewers, + InviteMembersTrigger, }, - inject: ['projectPath', 'issuableId', 'issuableIid'], + inject: ['projectPath', 'issuableId', 'issuableIid', 'directlyInviteMembers'], props: { users: { type: Array, @@ -125,6 +127,13 @@ export default { this.fetchedUsers = users; this.searching = false; }, + removeAllReviewers() { + this.currentSelectedReviewers = []; + }, + }, + i18n: { + selectReviewer: __('Select reviewer'), + unassign: __('Unassign'), }, }; @@ -138,8 +147,10 @@ export default { + + diff --git a/app/assets/javascripts/ml/model_registry/components/import_artifact_zone.vue b/app/assets/javascripts/ml/model_registry/components/import_artifact_zone.vue index 7840ee50686..e3bff29f948 100644 --- a/app/assets/javascripts/ml/model_registry/components/import_artifact_zone.vue +++ b/app/assets/javascripts/ml/model_registry/components/import_artifact_zone.vue @@ -13,7 +13,6 @@ import { joinPaths } from '~/lib/utils/url_utility'; import { s__ } from '~/locale'; import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue'; import { uploadModel } from '../services/upload_model'; -import { emptyArtifactFile } from '../constants'; export default { name: 'ImportArtifactZone', @@ -42,16 +41,11 @@ export default { required: false, default: true, }, - value: { - type: Object, - required: false, - default: () => emptyArtifactFile, - }, }, data() { return { - file: this.value.file, - subfolder: this.value.subfolder, + file: null, + subfolder: '', alert: null, progressLoaded: null, progressTotal: null, @@ -87,7 +81,7 @@ export default { this.progressTotal = progressEvent.total; this.progressLoaded = progressEvent.loaded; }, - submitRequest(importPath) { + uploadArtifact(importPath) { this.progressLoaded = 0; this.progressTotal = this.file.size; uploadModel({ @@ -107,19 +101,14 @@ export default { this.alert = { message: error, variant: 'danger' }; }); }, - emitInput(value) { - this.$emit('input', { ...value }); - }, changeSubfolder(subfolder) { this.subfolder = subfolder; - this.emitInput({ file: this.file, subfolder }); }, - uploadFile(file) { + changeFile(file) { this.file = file; - this.emitInput({ file, subfolder: this.subfolder }); if (this.submitOnSelect && this.path) { - this.submitRequest(this.path); + this.uploadArtifact(this.path); } }, hideAlert() { @@ -128,7 +117,6 @@ export default { discardFile() { this.file = null; this.subfolder = ''; - this.emitInput(emptyArtifactFile); }, }, i18n: { @@ -188,7 +176,7 @@ export default { :upload-single-message="$options.i18n.uploadSingleMessage" :drop-to-start-message="$options.i18n.dropToStartMessage" :is-file-valid="() => true" - @change="uploadFile" + @change="changeFile" > diff --git a/app/assets/javascripts/ml/model_registry/components/model_create.vue b/app/assets/javascripts/ml/model_registry/components/model_create.vue index 6e93c7d4587..9e428777bc2 100644 --- a/app/assets/javascripts/ml/model_registry/components/model_create.vue +++ b/app/assets/javascripts/ml/model_registry/components/model_create.vue @@ -14,10 +14,9 @@ import * as Sentry from '~/sentry/sentry_browser_wrapper'; import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue'; import { helpPagePath } from '~/helpers/help_page_helper'; import { semverRegex, noSpacesRegex } from '~/lib/utils/regexp'; -import { uploadModel } from '../services/upload_model'; import createModelVersionMutation from '../graphql/mutations/create_model_version.mutation.graphql'; import createModelMutation from '../graphql/mutations/create_model.mutation.graphql'; -import { emptyArtifactFile, MODEL_CREATION_MODAL_ID } from '../constants'; +import { MODEL_CREATION_MODAL_ID } from '../constants'; export default { name: 'ModelCreate', @@ -49,7 +48,6 @@ export default { description: '', versionDescription: '', errorMessage: null, - selectedFile: emptyArtifactFile, modelData: null, versionData: null, markdownDocPath: helpPagePath('user/markdown'), @@ -137,22 +135,14 @@ export default { this.versionData = await this.createModelVersion(this.modelData.mlModelCreate.model.id); } const versionErrors = this.versionData?.mlModelVersionCreate?.errors || []; - if (versionErrors.length) { this.errorMessage = versionErrors.join(', '); this.versionData = null; } else { // Attempt importing model artifacts - const { importPath } = this.versionData.mlModelVersionCreate.modelVersion._links; - await uploadModel({ - importPath, - file: this.selectedFile.file, - subfolder: this.selectedFile.subfolder, - maxAllowedFileSize: this.maxAllowedFileSize, - onUploadProgress: this.$refs.importArtifactZoneRef.onUploadProgress, - }); - - const { showPath } = this.versionData.mlModelVersionCreate.modelVersion._links; + const { showPath, importPath } = + this.versionData.mlModelVersionCreate.modelVersion._links; + await this.$refs.importArtifactZoneRef.uploadArtifact(importPath); visitUrl(showPath); } } else { @@ -162,7 +152,6 @@ export default { } catch (error) { Sentry.captureException(error); this.errorMessage = error; - this.selectedFile = emptyArtifactFile; } }, resetModal() { @@ -171,7 +160,6 @@ export default { this.description = ''; this.versionDescription = ''; this.errorMessage = null; - this.selectedFile = emptyArtifactFile; this.modelData = null; this.versionData = null; }, @@ -341,7 +329,6 @@ export default { diff --git a/app/assets/javascripts/ml/model_registry/components/model_edit.vue b/app/assets/javascripts/ml/model_registry/components/model_edit.vue index 84fce4edecf..af168d03383 100644 --- a/app/assets/javascripts/ml/model_registry/components/model_edit.vue +++ b/app/assets/javascripts/ml/model_registry/components/model_edit.vue @@ -16,7 +16,7 @@ import { helpPagePath } from '~/helpers/help_page_helper'; import { noSpacesRegex } from '~/lib/utils/regexp'; import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import editModelMutation from '../graphql/mutations/edit_model.mutation.graphql'; -import { emptyArtifactFile, MODEL_EDIT_MODAL_ID } from '../constants'; +import { MODEL_EDIT_MODAL_ID } from '../constants'; export default { name: 'ModelEdit', @@ -98,7 +98,6 @@ export default { } catch (error) { Sentry.captureException(error); this.errorMessage = error; - this.selectedFile = emptyArtifactFile; } }, resetModal() { diff --git a/app/assets/javascripts/ml/model_registry/components/model_version_create.vue b/app/assets/javascripts/ml/model_registry/components/model_version_create.vue index de5eba99135..7dac78c268f 100644 --- a/app/assets/javascripts/ml/model_registry/components/model_version_create.vue +++ b/app/assets/javascripts/ml/model_registry/components/model_version_create.vue @@ -14,9 +14,8 @@ import * as Sentry from '~/sentry/sentry_browser_wrapper'; import { semverRegex } from '~/lib/utils/regexp'; import MarkdownEditor from '~/vue_shared/components/markdown/markdown_editor.vue'; import { helpPagePath } from '~/helpers/help_page_helper'; -import { uploadModel } from '../services/upload_model'; import createModelVersionMutation from '../graphql/mutations/create_model_version.mutation.graphql'; -import { emptyArtifactFile, MODEL_VERSION_CREATION_MODAL_ID } from '../constants'; +import { MODEL_VERSION_CREATION_MODAL_ID } from '../constants'; export default { name: 'ModelVersionCreate', @@ -50,7 +49,6 @@ export default { version: null, description: '', errorMessage: null, - selectedFile: emptyArtifactFile, versionData: null, submitButtonDisabled: true, markdownDocPath: helpPagePath('user/markdown'), @@ -128,29 +126,20 @@ export default { this.errorMessage = errors.join(', '); this.versionData = null; } else { - const { importPath } = this.versionData.mlModelVersionCreate.modelVersion._links; - - await uploadModel({ - importPath, - file: this.selectedFile.file, - subfolder: this.selectedFile.subfolder, - maxAllowedFileSize: this.maxAllowedFileSize, - onUploadProgress: this.$refs.importArtifactZoneRef.onUploadProgress, - }); - const { showPath } = this.versionData.mlModelVersionCreate.modelVersion._links; + const { showPath, importPath } = + this.versionData.mlModelVersionCreate.modelVersion._links; + await this.$refs.importArtifactZoneRef.uploadArtifact(importPath); visitUrl(showPath); } } catch (error) { Sentry.captureException(error); this.errorMessage = error; - this.selectedFile = emptyArtifactFile; } }, resetModal() { this.version = null; this.description = ''; this.errorMessage = null; - this.selectedFile = emptyArtifactFile; this.versionData = null; }, hideAlert() { @@ -251,7 +240,6 @@ export default { diff --git a/app/assets/javascripts/ml/model_registry/constants.js b/app/assets/javascripts/ml/model_registry/constants.js index 4639faa33e9..e26752427ef 100644 --- a/app/assets/javascripts/ml/model_registry/constants.js +++ b/app/assets/javascripts/ml/model_registry/constants.js @@ -27,8 +27,3 @@ export const MLFLOW_USAGE_MODAL_ID = 'model-registry-mlflow-usage-modal'; export const MODEL_VERSION_CREATION_MODAL_ID = 'create-model-version-modal'; export const MODEL_CREATION_MODAL_ID = 'create-model-modal'; export const MODEL_EDIT_MODAL_ID = 'edit-model-modal'; - -export const emptyArtifactFile = { - file: null, - subfolder: '', -}; diff --git a/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue b/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue index e5b6167f0a3..74547239237 100644 --- a/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue +++ b/app/assets/javascripts/sidebar/components/reviewers/reviewer_title.vue @@ -4,7 +4,7 @@ import { MountingPortal } from 'portal-vue'; import { GlLoadingIcon, GlButton, GlTooltipDirective } from '@gitlab/ui'; import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; -import { n__ } from '~/locale'; +import { n__, s__ } from '~/locale'; import ReviewerDrawer from '~/merge_requests/components/reviewers/reviewer_drawer.vue'; export default { @@ -52,6 +52,11 @@ export default { this.drawerOpen = drawerOpen; }, }, + i18n: { + addEditReviewers: s__('MergeRequest|Add or edit reviewers'), + changeReviewer: s__('MergeRequest|Change reviewer'), + quickAdd: s__('MergeRequest|Quick add reviewers'), + }, };