Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/helpers/integrations_helper.rb')
-rw-r--r--app/helpers/integrations_helper.rb210
1 files changed, 210 insertions, 0 deletions
diff --git a/app/helpers/integrations_helper.rb b/app/helpers/integrations_helper.rb
new file mode 100644
index 00000000000..ab305d822e8
--- /dev/null
+++ b/app/helpers/integrations_helper.rb
@@ -0,0 +1,210 @@
+# frozen_string_literal: true
+
+module IntegrationsHelper
+ def integration_event_description(integration, event)
+ case integration
+ when Integrations::Jira
+ jira_integration_event_description(event)
+ when Integrations::Teamcity
+ teamcity_integration_event_description(event)
+ else
+ default_integration_event_description(event)
+ end
+ end
+
+ def integration_event_field_name(event)
+ event = event.pluralize if %w[merge_request issue confidential_issue].include?(event)
+ "#{event}_events"
+ end
+
+ def scoped_integrations_path
+ if @project.present?
+ project_settings_integrations_path(@project)
+ elsif @group.present?
+ group_settings_integrations_path(@group)
+ else
+ integrations_admin_application_settings_path
+ end
+ end
+
+ def scoped_integration_path(integration)
+ if @project.present?
+ project_service_path(@project, integration)
+ elsif @group.present?
+ group_settings_integration_path(@group, integration)
+ else
+ admin_application_settings_integration_path(integration)
+ end
+ end
+
+ def scoped_edit_integration_path(integration)
+ if @project.present?
+ edit_project_service_path(@project, integration)
+ elsif @group.present?
+ edit_group_settings_integration_path(@group, integration)
+ else
+ edit_admin_application_settings_integration_path(integration)
+ end
+ end
+
+ def scoped_test_integration_path(integration)
+ if @project.present?
+ test_project_service_path(@project, integration)
+ elsif @group.present?
+ test_group_settings_integration_path(@group, integration)
+ else
+ test_admin_application_settings_integration_path(integration)
+ end
+ end
+
+ def scoped_reset_integration_path(integration, group: nil)
+ return '' unless integration.persisted?
+
+ if group.present?
+ reset_group_settings_integration_path(group, integration)
+ else
+ reset_admin_application_settings_integration_path(integration)
+ end
+ end
+
+ def integration_form_data(integration, group: nil)
+ form_data = {
+ id: integration.id,
+ show_active: integration.show_active_box?.to_s,
+ activated: (integration.active || integration.new_record?).to_s,
+ type: integration.to_param,
+ merge_request_events: integration.merge_requests_events.to_s,
+ commit_events: integration.commit_events.to_s,
+ enable_comments: integration.comment_on_event_enabled.to_s,
+ comment_detail: integration.comment_detail,
+ learn_more_path: integrations_help_page_path,
+ trigger_events: trigger_events_for_integration(integration),
+ fields: fields_for_integration(integration),
+ inherit_from_id: integration.inherit_from_id,
+ integration_level: integration_level(integration),
+ editable: integration.editable?.to_s,
+ cancel_path: scoped_integrations_path,
+ can_test: integration.testable?.to_s,
+ test_path: scoped_test_integration_path(integration),
+ reset_path: scoped_reset_integration_path(integration, group: group)
+ }
+
+ if integration.is_a?(Integrations::Jira)
+ form_data[:jira_issue_transition_automatic] = integration.jira_issue_transition_automatic
+ form_data[:jira_issue_transition_id] = integration.jira_issue_transition_id
+ end
+
+ form_data
+ end
+
+ def integration_list_data(integrations)
+ {
+ integrations: integrations.map { |i| serialize_integration(i) }.to_json
+ }
+ end
+
+ def integrations_help_page_path
+ help_page_path('user/admin_area/settings/project_integration_management')
+ end
+
+ def project_jira_issues_integration?
+ false
+ end
+
+ def instance_level_integrations?
+ !Gitlab.com?
+ end
+
+ def jira_issue_breadcrumb_link(issue_reference)
+ link_to '', { class: 'gl-display-flex gl-align-items-center gl-white-space-nowrap' } do
+ icon = image_tag image_path('illustrations/logos/jira.svg'), width: 15, height: 15, class: 'gl-mr-2'
+ [icon, issue_reference].join.html_safe
+ end
+ end
+
+ extend self
+
+ private
+
+ def jira_integration_event_description(event)
+ case event
+ when "merge_request", "merge_request_events"
+ s_("JiraService|Jira comments are created when an issue is referenced in a merge request.")
+ when "commit", "commit_events"
+ s_("JiraService|Jira comments are created when an issue is referenced in a commit.")
+ end
+ end
+
+ def teamcity_integration_event_description(event)
+ case event
+ when 'push', 'push_events'
+ s_('TeamcityIntegration|Trigger TeamCity CI after every push to the repository, except branch delete')
+ when 'merge_request', 'merge_request_events'
+ s_('TeamcityIntegration|Trigger TeamCity CI after a merge request has been created or updated')
+ end
+ end
+
+ def default_integration_event_description(event)
+ case event
+ when "push", "push_events"
+ s_("ProjectService|Trigger event for pushes to the repository.")
+ when "tag_push", "tag_push_events"
+ s_("ProjectService|Trigger event for new tags pushed to the repository.")
+ when "note", "note_events"
+ s_("ProjectService|Trigger event for new comments.")
+ when "confidential_note", "confidential_note_events"
+ s_("ProjectService|Trigger event for new comments on confidential issues.")
+ when "issue", "issue_events"
+ s_("ProjectService|Trigger event when an issue is created, updated, or closed.")
+ when "confidential_issue", "confidential_issue_events"
+ s_("ProjectService|Trigger event when a confidential issue is created, updated, or closed.")
+ when "merge_request", "merge_request_events"
+ s_("ProjectService|Trigger event when a merge request is created, updated, or merged.")
+ when "pipeline", "pipeline_events"
+ s_("ProjectService|Trigger event when a pipeline status changes.")
+ when "wiki_page", "wiki_page_events"
+ s_("ProjectService|Trigger event when a wiki page is created or updated.")
+ when "commit", "commit_events"
+ s_("ProjectService|Trigger event when a commit is created or updated.")
+ when "deployment"
+ s_("ProjectService|Trigger event when a deployment starts or finishes.")
+ when "alert"
+ s_("ProjectService|Trigger event when a new, unique alert is recorded.")
+ end
+ end
+
+ def trigger_events_for_integration(integration)
+ ServiceEventSerializer.new(service: integration).represent(integration.configurable_events).to_json
+ end
+
+ def fields_for_integration(integration)
+ ServiceFieldSerializer.new(service: integration).represent(integration.global_fields).to_json
+ end
+
+ def integration_level(integration)
+ if integration.instance_level?
+ 'instance'
+ elsif integration.group_level?
+ 'group'
+ else
+ 'project'
+ end
+ end
+
+ def serialize_integration(integration)
+ {
+ active: integration.operating?,
+ title: integration.title,
+ description: integration.description,
+ updated_at: integration.updated_at,
+ edit_path: scoped_edit_integration_path(integration),
+ name: integration.to_param
+ }
+ end
+end
+
+IntegrationsHelper.prepend_mod_with('IntegrationsHelper')
+
+# The methods in `EE::IntegrationsHelper` should be available as both instance and
+# class methods.
+IntegrationsHelper.extend_mod_with('IntegrationsHelper')