diff --git a/config/feature_flags/development/jira_issues_show_integration.yml b/config/feature_flags/development/jira_issues_show_integration.yml new file mode 100644 index 0000000000000000000000000000000000000000..dd89ace22bed6b80635072e67484c5c8a85edb37 --- /dev/null +++ b/config/feature_flags/development/jira_issues_show_integration.yml @@ -0,0 +1,8 @@ +--- +name: jira_issues_show_integration +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/52446 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/299832 +milestone: '13.9' +type: development +group: group::ecosystem +default_enabled: false diff --git a/ee/app/assets/javascripts/integrations/jira/issues_show/components/jira_issues_show_root.vue b/ee/app/assets/javascripts/integrations/jira/issues_show/components/jira_issues_show_root.vue new file mode 100644 index 0000000000000000000000000000000000000000..e6f3631bf2c54722bc32fca5ce150acd4dae34ee --- /dev/null +++ b/ee/app/assets/javascripts/integrations/jira/issues_show/components/jira_issues_show_root.vue @@ -0,0 +1,9 @@ +<script> +export default { + name: 'JiraIssuesShow', +}; +</script> + +<template> + <div></div> +</template> diff --git a/ee/app/assets/javascripts/integrations/jira/issues_show/jira_issues_show_bundle.js b/ee/app/assets/javascripts/integrations/jira/issues_show/jira_issues_show_bundle.js new file mode 100644 index 0000000000000000000000000000000000000000..18b094ba437c56d10d19b84cd9da3864dde3f713 --- /dev/null +++ b/ee/app/assets/javascripts/integrations/jira/issues_show/jira_issues_show_bundle.js @@ -0,0 +1,16 @@ +import Vue from 'vue'; + +import JiraIssuesShowApp from './components/jira_issues_show_root.vue'; + +export default function initJiraIssueShow({ mountPointSelector }) { + const mountPointEl = document.querySelector(mountPointSelector); + + if (!mountPointEl) { + return null; + } + + return new Vue({ + el: mountPointEl, + render: (createElement) => createElement(JiraIssuesShowApp), + }); +} diff --git a/ee/app/assets/javascripts/pages/projects/integrations/jira/issues/show/index.js b/ee/app/assets/javascripts/pages/projects/integrations/jira/issues/show/index.js new file mode 100644 index 0000000000000000000000000000000000000000..aa5c0b83bb8927b182dd8eabcc9c5ae4ab7b51cb --- /dev/null +++ b/ee/app/assets/javascripts/pages/projects/integrations/jira/issues/show/index.js @@ -0,0 +1,3 @@ +import initJiraIssueShow from 'ee/integrations/jira/issues_show/jira_issues_show_bundle'; + +initJiraIssueShow({ mountPointSelector: '.js-jira-issues-show-app' }); diff --git a/ee/app/controllers/projects/integrations/jira/issues_controller.rb b/ee/app/controllers/projects/integrations/jira/issues_controller.rb index 604d417392c8d4258767d1efb623a5a763d0a0ed..a4c742d3eabdecbb70e0fcbb1c8a15dc4530e57d 100644 --- a/ee/app/controllers/projects/integrations/jira/issues_controller.rb +++ b/ee/app/controllers/projects/integrations/jira/issues_controller.rb @@ -9,6 +9,7 @@ class IssuesController < Projects::ApplicationController include SortingPreference before_action :check_feature_enabled! + before_action :check_issues_show_enabled!, only: :show before_action do push_frontend_feature_flag(:jira_issues_integration, project, type: :licensed, default_enabled: true) @@ -76,6 +77,10 @@ def check_feature_enabled! return render_404 unless project.jira_issues_integration_available? && project.jira_service.issues_enabled end + def check_issues_show_enabled! + render_404 unless ::Feature.enabled?(:jira_issues_show_integration, @project, default_enabled: :yaml) + end + # Return the informational message to the user def render_integration_error(exception) render json: { errors: [exception.message] }, status: :bad_request diff --git a/ee/app/views/projects/integrations/jira/issues/show.html.haml b/ee/app/views/projects/integrations/jira/issues/show.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..9a009709603586acd19cc67ab441ea6f3fd8751c --- /dev/null +++ b/ee/app/views/projects/integrations/jira/issues/show.html.haml @@ -0,0 +1 @@ +.js-jira-issues-show-app diff --git a/ee/config/routes/project.rb b/ee/config/routes/project.rb index 9efc0d55f1d250a75acd7395e9a21b375ca9ed66..5c0189a5c18e5f26c042e93f6f0df99608011eba 100644 --- a/ee/config/routes/project.rb +++ b/ee/config/routes/project.rb @@ -110,7 +110,7 @@ namespace :integrations do namespace :jira do - resources :issues, only: [:index] + resources :issues, only: [:index, :show] end end diff --git a/ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb b/ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb index e0b852f18644ac3bfab1db08986b2e43898ceaee..2ad55241ec9da84c578d765b3d7e1bb342daadc8 100644 --- a/ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb +++ b/ee/spec/controllers/projects/integrations/jira/issues_controller_spec.rb @@ -172,4 +172,30 @@ end end end + + describe 'GET #show' do + context 'when `jira_issues_show_integration` feature is disabled' do + before do + stub_feature_flags(jira_issues_show_integration: false) + end + + it 'returns 404 status' do + get :show, params: { namespace_id: project.namespace, project_id: project, id: 1 } + + expect(response).to have_gitlab_http_status(:not_found) + end + end + + context 'when `jira_issues_show_integration` feature is enabled' do + before do + stub_feature_flags(jira_issues_show_integration: true) + end + + it 'renders `show` template' do + get :show, params: { namespace_id: project.namespace, project_id: project, id: 1 } + + expect(response).to render_template(:show) + end + end + end end