diff --git a/.rubocop_todo/gitlab/bounded_contexts.yml b/.rubocop_todo/gitlab/bounded_contexts.yml index 99a325f7367..1375f30acd2 100644 --- a/.rubocop_todo/gitlab/bounded_contexts.yml +++ b/.rubocop_todo/gitlab/bounded_contexts.yml @@ -3280,7 +3280,6 @@ Gitlab/BoundedContexts: - 'ee/app/services/llm/explain_code_service.rb' - 'ee/app/services/llm/generate_commit_message_service.rb' - 'ee/app/services/llm/generate_description_service.rb' - - 'ee/app/services/llm/generate_summary_service.rb' - 'ee/app/services/llm/git_command_service.rb' - 'ee/app/services/llm/internal/categorize_chat_question_service.rb' - 'ee/app/services/llm/internal/completion_service.rb' diff --git a/.rubocop_todo/gitlab/rspec/misplaced_ee_spec_file.yml b/.rubocop_todo/gitlab/rspec/misplaced_ee_spec_file.yml index 8f36af26d1d..fd745e56214 100644 --- a/.rubocop_todo/gitlab/rspec/misplaced_ee_spec_file.yml +++ b/.rubocop_todo/gitlab/rspec/misplaced_ee_spec_file.yml @@ -274,7 +274,6 @@ Gitlab/RSpec/MisplacedEeSpecFile: - 'ee/spec/services/groups/destroy_service_spec.rb' - 'ee/spec/services/groups/ssh_certificates/create_service_spec.rb' - 'ee/spec/services/groups/ssh_certificates/destroy_service_spec.rb' - - 'ee/spec/services/groups/transfer_service_spec.rb' - 'ee/spec/services/groups/update_service_spec.rb' - 'ee/spec/services/ide/schemas_config_service_spec.rb' - 'ee/spec/services/issues/build_service_spec.rb' diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml index 59958261564..b1b2f61d189 100644 --- a/.rubocop_todo/layout/line_length.yml +++ b/.rubocop_todo/layout/line_length.yml @@ -1637,7 +1637,6 @@ Layout/LineLength: - 'ee/spec/services/geo/container_repository_sync_spec.rb' - 'ee/spec/services/geo/framework_repository_sync_service_spec.rb' - 'ee/spec/services/gitlab_subscriptions/check_future_renewal_service_spec.rb' - - 'ee/spec/services/groups/transfer_service_spec.rb' - 'ee/spec/services/groups/update_repository_storage_service_spec.rb' - 'ee/spec/services/incident_management/escalation_policies/create_service_spec.rb' - 'ee/spec/services/incident_management/escalation_policies/destroy_service_spec.rb' diff --git a/.rubocop_todo/rspec/before_all_role_assignment.yml b/.rubocop_todo/rspec/before_all_role_assignment.yml index 6f093a8b2d7..e3d439eed61 100644 --- a/.rubocop_todo/rspec/before_all_role_assignment.yml +++ b/.rubocop_todo/rspec/before_all_role_assignment.yml @@ -555,7 +555,6 @@ RSpec/BeforeAllRoleAssignment: - 'ee/spec/services/groups/destroy_service_spec.rb' - 'ee/spec/services/groups/enterprise_users/associate_service_spec.rb' - 'ee/spec/services/groups/epics_count_service_spec.rb' - - 'ee/spec/services/groups/transfer_service_spec.rb' - 'ee/spec/services/ide/schemas_config_service_spec.rb' - 'ee/spec/services/incident_management/oncall_rotations/destroy_service_spec.rb' - 'ee/spec/services/incident_management/oncall_rotations/edit_service_spec.rb' @@ -571,7 +570,6 @@ RSpec/BeforeAllRoleAssignment: - 'ee/spec/services/llm/chat_service_spec.rb' - 'ee/spec/services/llm/generate_commit_message_service_spec.rb' - 'ee/spec/services/llm/generate_description_service_spec.rb' - - 'ee/spec/services/llm/generate_summary_service_spec.rb' - 'ee/spec/services/llm/merge_requests/summarize_review_service_spec.rb' - 'ee/spec/services/members/activate_service_spec.rb' - 'ee/spec/services/merge_trains/create_pipeline_service_spec.rb' diff --git a/.rubocop_todo/rspec/named_subject.yml b/.rubocop_todo/rspec/named_subject.yml index d54c5630b0e..eaf7b4c02b9 100644 --- a/.rubocop_todo/rspec/named_subject.yml +++ b/.rubocop_todo/rspec/named_subject.yml @@ -892,7 +892,6 @@ RSpec/NamedSubject: - 'ee/spec/services/groups/compliance_report_csv_service_spec.rb' - 'ee/spec/services/groups/destroy_service_spec.rb' - 'ee/spec/services/groups/epics_count_service_spec.rb' - - 'ee/spec/services/groups/transfer_service_spec.rb' - 'ee/spec/services/groups/update_repository_storage_service_spec.rb' - 'ee/spec/services/groups/update_service_spec.rb' - 'ee/spec/services/ide/schemas_config_service_spec.rb' diff --git a/Gemfile b/Gemfile index 96987fdcfe7..8e2a063d65e 100644 --- a/Gemfile +++ b/Gemfile @@ -165,7 +165,7 @@ gem 'rack-cors', '~> 2.0.1', require: 'rack/cors', feature_category: :shared # GraphQL 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.2.0', group: [:development, :test], feature_category: :api gem 'apollo_upload_server', '~> 2.1.6', feature_category: :api # Cells diff --git a/Gemfile.checksum b/Gemfile.checksum index cc637b4bb74..b51f5aeab31 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -293,7 +293,7 @@ {"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"}, {"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"}, {"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.2.0","platform":"ruby","checksum":"44d41724529f531adf9265ded7478b74b0c4b927cddc8b9f114337a73f32de08"}, {"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":"ruby","checksum":"5f4383c4ee2886e92c31b90422261b7527f26e3baa585d877e9804e715983686"}, diff --git a/Gemfile.lock b/Gemfile.lock index 9bfc65eaf06..d42f8f29518 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -952,13 +952,15 @@ GEM base64 fiber-storage logger - graphql-docs (5.0.0) + graphql-docs (5.2.0) commonmarker (~> 0.23, >= 0.23.6) escape_utils (~> 1.2) extended-markdown-filter (~> 0.4) gemoji (~> 3.0) graphql (~> 2.0) html-pipeline (~> 2.14, >= 2.14.3) + logger (~> 1.6) + ostruct (~> 0.6) sass-embedded (~> 1.58) grpc (1.63.0) google-protobuf (~> 3.25) @@ -2206,7 +2208,7 @@ DEPENDENCIES grape_logging (~> 1.8, >= 1.8.4) graphlyte (~> 1.0.0) graphql (= 2.5.11) - graphql-docs (~> 5.0.0) + graphql-docs (~> 5.2.0) grpc (= 1.63.0) gssapi (~> 1.3.1) guard-rspec diff --git a/Gemfile.next.checksum b/Gemfile.next.checksum index 82b31797eba..ed3dc52b15d 100644 --- a/Gemfile.next.checksum +++ b/Gemfile.next.checksum @@ -293,7 +293,7 @@ {"name":"grape_logging","version":"1.8.4","platform":"ruby","checksum":"efcc3e322dbd5d620a68f078733b7db043cf12680144cd03c982f14115c792d1"}, {"name":"graphlyte","version":"1.0.0","platform":"ruby","checksum":"b5af4ab67dde6e961f00ea1c18f159f73b52ed11395bb4ece297fe628fa1804d"}, {"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.2.0","platform":"ruby","checksum":"44d41724529f531adf9265ded7478b74b0c4b927cddc8b9f114337a73f32de08"}, {"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":"ruby","checksum":"5f4383c4ee2886e92c31b90422261b7527f26e3baa585d877e9804e715983686"}, diff --git a/Gemfile.next.lock b/Gemfile.next.lock index 034f4540a34..1209c9c516a 100644 --- a/Gemfile.next.lock +++ b/Gemfile.next.lock @@ -946,13 +946,15 @@ GEM base64 fiber-storage logger - graphql-docs (5.0.0) + graphql-docs (5.2.0) commonmarker (~> 0.23, >= 0.23.6) escape_utils (~> 1.2) extended-markdown-filter (~> 0.4) gemoji (~> 3.0) graphql (~> 2.0) html-pipeline (~> 2.14, >= 2.14.3) + logger (~> 1.6) + ostruct (~> 0.6) sass-embedded (~> 1.58) grpc (1.63.0) google-protobuf (~> 3.25) @@ -2201,7 +2203,7 @@ DEPENDENCIES grape_logging (~> 1.8, >= 1.8.4) graphlyte (~> 1.0.0) graphql (= 2.5.11) - graphql-docs (~> 5.0.0) + graphql-docs (~> 5.2.0) grpc (= 1.63.0) gssapi (~> 1.3.1) guard-rspec diff --git a/app/assets/javascripts/ci/common/private/jobs_filtered_search/app.vue b/app/assets/javascripts/ci/common/private/jobs_filtered_search/app.vue index 2a5385dd239..f2bc560e053 100644 --- a/app/assets/javascripts/ci/common/private/jobs_filtered_search/app.vue +++ b/app/assets/javascripts/ci/common/private/jobs_filtered_search/app.vue @@ -127,7 +127,7 @@ export default { :placeholder="s__('Jobs|Search or filter jobs…')" :available-tokens="tokens" :value="filteredSearchValue" - :search-text-option-label="__('Search for this text')" + :search-text-option-label="__('Search for this text (experiment)')" terms-as-tokens @submit="onSubmit" /> diff --git a/app/assets/javascripts/content_editor/services/autocomplete_helper.js b/app/assets/javascripts/content_editor/services/autocomplete_helper.js index e3e8a779795..00d41b07816 100644 --- a/app/assets/javascripts/content_editor/services/autocomplete_helper.js +++ b/app/assets/javascripts/content_editor/services/autocomplete_helper.js @@ -2,6 +2,7 @@ import { identity, memoize, isEmpty } from 'lodash'; import { initEmojiMap, getAllEmoji, searchEmoji } from '~/emoji'; import { newDate } from '~/lib/utils/datetime_utility'; import axios from '~/lib/utils/axios_utils'; +import { currentAssignees } from '~/graphql_shared/issuable_client'; import { COMMANDS } from '../constants'; export function defaultSorter(searchFields) { @@ -116,6 +117,8 @@ export function createDataSource({ } export default class AutocompleteHelper { + tiptapEditor; + constructor({ dataSourceUrls, sidebarMediator }) { this.updateDataSources(dataSourceUrls); @@ -175,13 +178,21 @@ export default class AutocompleteHelper { }), user: (items) => items.filter((item) => { - const assigned = this.sidebarMediator?.store?.assignees.some( + let assigned = this.sidebarMediator?.store?.assignees.some( (assignee) => assignee.username === item.username, ); const assignedReviewer = this.sidebarMediator?.store?.reviewers.some( (reviewer) => reviewer.username === item.username, ); + const { workItemId } = + this.tiptapEditor?.view.dom.closest('.js-gfm-wrapper')?.dataset || {}; + + if (workItemId) { + const assignees = currentAssignees()[workItemId] || []; + assigned = assignees.some((assignee) => assignee.username === item.username); + } + if (command === COMMANDS.ASSIGN) return !assigned; if (command === COMMANDS.ASSIGN_REVIEWER) return !assignedReviewer; if (command === COMMANDS.UNASSIGN) return assigned; diff --git a/app/assets/javascripts/content_editor/services/create_content_editor.js b/app/assets/javascripts/content_editor/services/create_content_editor.js index 8e43435a8ed..f3c622c9b7e 100644 --- a/app/assets/javascripts/content_editor/services/create_content_editor.js +++ b/app/assets/javascripts/content_editor/services/create_content_editor.js @@ -66,6 +66,8 @@ export const createContentEditor = ({ const trackedExtensions = allExtensions.map(trackInputRulesAndShortcuts); const tiptapEditor = createTiptapEditor({ extensions: trackedExtensions, ...tiptapOptions }); + autocompleteHelper.tiptapEditor = tiptapEditor; + return new ContentEditor({ tiptapEditor, serializer, diff --git a/app/assets/javascripts/pages/projects/merge_requests/creations/new/index.js b/app/assets/javascripts/pages/projects/merge_requests/creations/new/index.js index 6e6fe114fa9..f65a69cb9cc 100644 --- a/app/assets/javascripts/pages/projects/merge_requests/creations/new/index.js +++ b/app/assets/javascripts/pages/projects/merge_requests/creations/new/index.js @@ -7,6 +7,7 @@ import initPipelines from '~/commit/pipelines/pipelines_bundle'; import MergeRequest from '~/merge_request'; import CompareApp from '~/merge_requests/components/compare_app.vue'; import { __ } from '~/locale'; +import { createRapidDiffsApp } from '~/rapid_diffs'; const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare'); if (mrNewCompareNode) { @@ -119,6 +120,7 @@ if (mrNewCompareNode) { // eslint-disable-next-line no-new new MergeRequest({ action: mrNewSubmitNode.dataset.mrSubmitAction, + createRapidDiffsApp, }); initPipelines(); initMarkdownEditor(); diff --git a/app/assets/javascripts/pages/projects/merge_requests/creations/rapid_diffs/index.js b/app/assets/javascripts/pages/projects/merge_requests/creations/rapid_diffs/index.js deleted file mode 100644 index f65a69cb9cc..00000000000 --- a/app/assets/javascripts/pages/projects/merge_requests/creations/rapid_diffs/index.js +++ /dev/null @@ -1,127 +0,0 @@ -import Vue from 'vue'; - -import { initMarkdownEditor } from 'ee_else_ce/pages/projects/merge_requests/init_markdown_editor'; -import { findTargetBranch } from 'ee_else_ce/pages/projects/merge_requests/creations/new/branch_finder'; - -import initPipelines from '~/commit/pipelines/pipelines_bundle'; -import MergeRequest from '~/merge_request'; -import CompareApp from '~/merge_requests/components/compare_app.vue'; -import { __ } from '~/locale'; -import { createRapidDiffsApp } from '~/rapid_diffs'; - -const mrNewCompareNode = document.querySelector('.js-merge-request-new-compare'); -if (mrNewCompareNode) { - const targetCompareEl = document.getElementById('js-target-project-dropdown'); - const sourceCompareEl = document.getElementById('js-source-project-dropdown'); - const compareEl = document.querySelector('.js-merge-request-new-compare'); - const targetBranch = Vue.observable({ name: '' }); - const currentSourceBranch = JSON.parse(sourceCompareEl.dataset.currentBranch); - const sourceBranch = Vue.observable(currentSourceBranch); - - // eslint-disable-next-line no-new - new Vue({ - el: sourceCompareEl, - name: 'SourceCompareApp', - provide: { - currentProject: JSON.parse(sourceCompareEl.dataset.currentProject), - branchCommitPath: compareEl.dataset.sourceBranchUrl, - inputs: { - project: { - id: 'merge_request_source_project_id', - name: 'merge_request[source_project_id]', - }, - branch: { - id: 'merge_request_source_branch', - name: 'merge_request[source_branch]', - }, - }, - i18n: { - projectHeaderText: __('Select source project'), - branchHeaderText: __('Select source branch'), - }, - toggleClass: { - project: 'js-source-project', - branch: 'js-source-branch gl-font-monospace', - }, - compareSide: 'source', - }, - methods: { - async selectedBranch(branchName) { - const targetBranchName = await findTargetBranch(branchName); - - if (targetBranchName) { - targetBranch.name = targetBranchName; - } - - sourceBranch.value = branchName; - sourceBranch.text = branchName; - }, - }, - render(h) { - return h(CompareApp, { - props: { - currentBranch: currentSourceBranch, - }, - on: { - 'select-branch': this.selectedBranch, - }, - }); - }, - }); - - const currentTargetBranch = JSON.parse(targetCompareEl.dataset.currentBranch); - // eslint-disable-next-line no-new - new Vue({ - el: targetCompareEl, - name: 'TargetCompareApp', - provide: { - currentProject: JSON.parse(targetCompareEl.dataset.currentProject), - projectsPath: targetCompareEl.dataset.targetProjectsPath, - branchCommitPath: compareEl.dataset.targetBranchUrl, - inputs: { - project: { - id: 'merge_request_target_project_id', - name: 'merge_request[target_project_id]', - }, - branch: { - id: 'merge_request_target_branch', - name: 'merge_request[target_branch]', - }, - }, - i18n: { - projectHeaderText: __('Select target project'), - branchHeaderText: __('Select target branch'), - }, - toggleClass: { - project: 'js-target-project', - branch: 'js-target-branch gl-font-monospace', - }, - }, - computed: { - currentBranch() { - if (targetBranch.name) { - return { text: targetBranch.name, value: targetBranch.name }; - } - - return currentTargetBranch; - }, - isDisabled() { - return !sourceBranch.value; - }, - }, - render(h) { - return h(CompareApp, { - props: { currentBranch: this.currentBranch, disabled: this.isDisabled }, - }); - }, - }); -} else { - const mrNewSubmitNode = document.querySelector('.js-merge-request-new-submit'); - // eslint-disable-next-line no-new - new MergeRequest({ - action: mrNewSubmitNode.dataset.mrSubmitAction, - createRapidDiffsApp, - }); - initPipelines(); - initMarkdownEditor(); -} diff --git a/app/assets/javascripts/rapid_diffs/app/file_browser/file_browser_drawer.vue b/app/assets/javascripts/rapid_diffs/app/file_browser/file_browser_drawer.vue index e202e1844ea..5c8d8c74589 100644 --- a/app/assets/javascripts/rapid_diffs/app/file_browser/file_browser_drawer.vue +++ b/app/assets/javascripts/rapid_diffs/app/file_browser/file_browser_drawer.vue @@ -63,6 +63,7 @@ export default { v-show="fileBrowserDrawerVisible" :open="openedOnce" :z-index="$options.DRAWER_Z_INDEX" + header-sticky @close="close" >