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

gon_helper.rb « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c4c0e48be3fd23682faf1beb167ac75dd8d243cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# frozen_string_literal: true

# rubocop:disable Metrics/AbcSize

module Gitlab
  module GonHelper
    include WebpackHelper

    def add_gon_variables
      gon.api_version                   = 'v4'
      gon.default_avatar_url            = default_avatar_url
      gon.max_file_size                 = Gitlab::CurrentSettings.max_attachment_size
      gon.asset_host                    = ActionController::Base.asset_host
      gon.webpack_public_path           = webpack_public_path
      gon.relative_url_root             = Gitlab.config.gitlab.relative_url_root
      gon.user_color_scheme             = Gitlab::ColorSchemes.for_user(current_user).css_class
      gon.markdown_surround_selection   = current_user&.markdown_surround_selection
      gon.markdown_automatic_lists      = current_user&.markdown_automatic_lists
      gon.math_rendering_limits_enabled = Gitlab::CurrentSettings.math_rendering_limits_enabled

      add_browsersdk_tracking

      if Gitlab.config.sentry.enabled
        gon.sentry_dsn         = Gitlab.config.sentry.clientside_dsn
        gon.sentry_environment = Gitlab.config.sentry.environment
      end

      # Support for Sentry setup via configuration files will be removed in 16.0
      # in favor of Gitlab::CurrentSettings.
      if Feature.enabled?(:enable_new_sentry_clientside_integration,
                          current_user) && Gitlab::CurrentSettings.sentry_enabled
        gon.sentry_dsn           = Gitlab::CurrentSettings.sentry_clientside_dsn
        gon.sentry_environment   = Gitlab::CurrentSettings.sentry_environment
        gon.sentry_clientside_traces_sample_rate = Gitlab::CurrentSettings.sentry_clientside_traces_sample_rate
      end

      gon.recaptcha_api_server_url = ::Recaptcha.configuration.api_server_url
      gon.recaptcha_sitekey      = Gitlab::CurrentSettings.recaptcha_site_key
      gon.gitlab_url             = Gitlab.config.gitlab.url
      gon.revision               = Gitlab.revision
      gon.feature_category       = Gitlab::ApplicationContext.current_context_attribute(:feature_category).presence
      gon.gitlab_logo            = ActionController::Base.helpers.asset_path('gitlab_logo.png')
      gon.secure                 = Gitlab.config.gitlab.https
      gon.sprite_icons           = IconsHelper.sprite_icon_path
      gon.sprite_file_icons      = IconsHelper.sprite_file_icons_path
      gon.emoji_sprites_css_path = ActionController::Base.helpers.stylesheet_path('emoji_sprites')
      gon.gridstack_css_path     = ActionController::Base.helpers.stylesheet_path('lazy_bundles/gridstack.css')
      gon.test_env               = Rails.env.test?
      gon.disable_animations     = Gitlab.config.gitlab['disable_animations']
      gon.suggested_label_colors = LabelsHelper.suggested_colors
      gon.first_day_of_week      = current_user&.first_day_of_week || Gitlab::CurrentSettings.first_day_of_week
      gon.time_display_relative  = true
      gon.time_display_format    = 0
      gon.ee                     = Gitlab.ee?
      gon.jh                     = Gitlab.jh?
      gon.dot_com                = Gitlab.com?
      gon.uf_error_prefix        = ::Gitlab::Utils::ErrorMessage::UF_ERROR_PREFIX
      gon.pat_prefix             = Gitlab::CurrentSettings.current_application_settings.personal_access_token_prefix
      gon.keyboard_shortcuts_enabled = current_user ? current_user.keyboard_shortcuts_enabled : true

      gon.diagramsnet_url = Gitlab::CurrentSettings.diagramsnet_url if Gitlab::CurrentSettings.diagramsnet_enabled

      if current_user
        gon.version = Gitlab::VERSION # publish version only for logged in users
        gon.current_user_id = current_user.id
        gon.current_username = current_user.username
        gon.current_user_fullname = current_user.name
        gon.current_user_avatar_url = current_user.avatar_url
        gon.time_display_relative = current_user.time_display_relative
        gon.time_display_format = current_user.time_display_format
      end

      # Initialize gon.features with any flags that should be
      # made globally available to the frontend
      push_frontend_feature_flag(:usage_data_api, type: :ops)
      push_frontend_feature_flag(:security_auto_fix)
      push_frontend_feature_flag(:source_editor_toolbar)
      push_frontend_feature_flag(:vscode_web_ide, current_user)
      push_frontend_feature_flag(:key_contacts_management, current_user)
      # To be removed with https://gitlab.com/gitlab-org/gitlab/-/issues/399248
      push_frontend_feature_flag(:remove_monitor_metrics)
      push_frontend_feature_flag(:custom_emoji)
      push_frontend_feature_flag(:encoding_logs_tree)
      push_frontend_feature_flag(:group_user_saml)
    end

    # Exposes the state of a feature flag to the frontend code.
    #
    # name - The name of the feature flag, e.g. `my_feature`.
    # args - Any additional arguments to pass to `Feature.enabled?`. This allows
    #        you to check if a flag is enabled for a particular user.
    def push_frontend_feature_flag(name, *args, **kwargs)
      enabled = Feature.enabled?(name, *args, **kwargs)

      push_to_gon_attributes(:features, name, enabled)
    end

    # Exposes the state of a feature flag to the frontend code.
    # Can be used for more complex feature flag checks.
    #
    # name - The name of the feature flag, e.g. `my_feature`.
    # enabled - Boolean to be pushed directly to the frontend. Should be fetched by checking a feature flag.
    def push_force_frontend_feature_flag(name, enabled)
      push_to_gon_attributes(:features, name, !!enabled)
    end

    def push_to_gon_attributes(key, name, enabled)
      var_name = name.to_s.camelize(:lower)
      # Here the `true` argument signals gon that the value should be merged
      # into any existing ones, instead of overwriting them. This allows you to
      # use this method to push multiple feature flags.
      gon.push({ key => { var_name => enabled } }, true)
    end

    def default_avatar_url
      # We can't use ActionController::Base.helpers.image_url because it
      # doesn't return an actual URL because request is nil for some reason.
      #
      # We also can't use Gitlab::Utils.append_path because the image path
      # may be an absolute URL.
      URI.join(Gitlab.config.gitlab.url,
               ActionController::Base.helpers.image_path('no_avatar.png')).to_s
    end

    def add_browsersdk_tracking
      return unless Gitlab.com? && Feature.enabled?(:gl_analytics_tracking,
Feature.current_request)

      return if ENV['GITLAB_ANALYTICS_URL'].blank? || ENV['GITLAB_ANALYTICS_ID'].blank?

      gon.analytics_url = ENV['GITLAB_ANALYTICS_URL']
      gon.analytics_id = ENV['GITLAB_ANALYTICS_ID']
    end
  end
end

Gitlab::GonHelper.prepend_mod_with('Gitlab::GonHelper')