From 05f0ebba3a2c8ddf39e436f412dc2ab5bf1353b2 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 18 Jan 2023 19:00:14 +0000 Subject: Add latest changes from gitlab-org/gitlab@15-8-stable-ee --- app/helpers/admin/components_helper.rb | 15 +++++++++++ app/helpers/appearances_helper.rb | 4 +++ app/helpers/application_helper.rb | 20 ++++++--------- app/helpers/application_settings_helper.rb | 5 +++- app/helpers/broadcast_messages_helper.rb | 8 ------ app/helpers/button_helper.rb | 4 +-- app/helpers/ci/runners_helper.rb | 2 +- app/helpers/emails_helper.rb | 35 ++++++++++++++++++-------- app/helpers/environment_helper.rb | 5 ++-- app/helpers/feature_flags_helper.rb | 3 ++- app/helpers/form_helper.rb | 12 ++++++--- app/helpers/graph_helper.rb | 2 +- app/helpers/groups/group_members_helper.rb | 4 ++- app/helpers/groups/observability_helper.rb | 10 +++++--- app/helpers/import_helper.rb | 2 +- app/helpers/integrations_helper.rb | 8 ++++++ app/helpers/issuables_helper.rb | 22 +++++++++------- app/helpers/issues_helper.rb | 28 +++++++-------------- app/helpers/markup_helper.rb | 15 ----------- app/helpers/merge_requests_helper.rb | 6 +++++ app/helpers/nav_helper.rb | 4 +++ app/helpers/preferences_helper.rb | 17 ++++++++----- app/helpers/projects/ml/experiments_helper.rb | 23 ++++++++++++++--- app/helpers/projects/project_members_helper.rb | 4 ++- app/helpers/projects_helper.rb | 30 ++-------------------- app/helpers/protected_branches_helper.rb | 19 ++++++++++++++ app/helpers/search_helper.rb | 2 +- app/helpers/selects_helper.rb | 14 ----------- app/helpers/sidebars_helper.rb | 12 +++++++++ app/helpers/timeboxes_helper.rb | 14 ++++++++++- app/helpers/todos_helper.rb | 4 +-- app/helpers/url_helper.rb | 11 ++++++++ app/helpers/users/callouts_helper.rb | 4 +-- app/helpers/users_helper.rb | 2 +- app/helpers/version_check_helper.rb | 2 +- app/helpers/visibility_level_helper.rb | 2 +- app/helpers/work_items_helper.rb | 4 ++- 37 files changed, 225 insertions(+), 153 deletions(-) create mode 100644 app/helpers/admin/components_helper.rb create mode 100644 app/helpers/protected_branches_helper.rb create mode 100644 app/helpers/url_helper.rb (limited to 'app/helpers') diff --git a/app/helpers/admin/components_helper.rb b/app/helpers/admin/components_helper.rb new file mode 100644 index 00000000000..577c12a0184 --- /dev/null +++ b/app/helpers/admin/components_helper.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Admin + module ComponentsHelper + def database_versions + Gitlab::Database.database_base_models.transform_values do |base_model| + reflection = ::Gitlab::Database::Reflection.new(base_model) + { + adapter_name: reflection.human_adapter_name, + version: reflection.version + } + end.symbolize_keys + end + end +end diff --git a/app/helpers/appearances_helper.rb b/app/helpers/appearances_helper.rb index 9a323852996..ab743e27603 100644 --- a/app/helpers/appearances_helper.rb +++ b/app/helpers/appearances_helper.rb @@ -4,6 +4,10 @@ module AppearancesHelper include MarkupHelper include Gitlab::Utils::StrongMemoize + def appearance_short_name + Appearance.current&.pwa_short_name.presence || _('GitLab') + end + def brand_title current_appearance&.title.presence || default_brand_title end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c78563a9a5f..f4b34044e0e 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -20,23 +20,15 @@ module ApplicationHelper def dispensable_render(...) render(...) rescue StandardError => e - if Feature.enabled?(:dispensable_render) - Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e) - nil - else - raise e - end + Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e) + nil end def dispensable_render_if_exists(...) render_if_exists(...) rescue StandardError => e - if Feature.enabled?(:dispensable_render) - Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e) - nil - else - raise e - end + Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e) + nil end def partial_exists?(partial) @@ -183,6 +175,8 @@ module ApplicationHelper # # Returns an HTML-safe String def time_ago_with_tooltip(time, placement: 'top', html_class: '', short_format: false) + return "" if time.nil? + css_classes = [short_format ? 'js-short-timeago' : 'js-timeago'] css_classes << html_class unless html_class.blank? @@ -242,7 +236,7 @@ module ApplicationHelper end def instance_review_permitted? - ::Gitlab::CurrentSettings.instance_review_permitted? && current_user&.admin? + ::Gitlab::CurrentSettings.instance_review_permitted? && current_user&.can_read_all_resources? end def static_objects_external_storage_enabled? diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index 2b2ac262848..339938245a0 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -273,6 +273,7 @@ module ApplicationSettingsHelper :housekeeping_full_repack_period, :housekeeping_gc_period, :housekeeping_incremental_repack_period, + :housekeeping_optimize_repository_period, :html_emails_enabled, :import_sources, :in_product_marketing_emails_enabled, @@ -447,7 +448,9 @@ module ApplicationSettingsHelper :pipeline_limit_per_project_user_sha, :invitation_flow_enforcement, :can_create_group, - :bulk_import_enabled + :bulk_import_enabled, + :allow_runner_registration_token, + :user_defaults_to_private_profile ].tap do |settings| next if Gitlab.com? diff --git a/app/helpers/broadcast_messages_helper.rb b/app/helpers/broadcast_messages_helper.rb index 9827f075e54..01d28ed3221 100644 --- a/app/helpers/broadcast_messages_helper.rb +++ b/app/helpers/broadcast_messages_helper.rb @@ -50,14 +50,6 @@ module BroadcastMessagesHelper end end - def broadcast_type_options - BroadcastMessage.broadcast_types.keys.map { |w| [w.humanize, w] } - end - - def broadcast_theme_options - BroadcastMessage.themes.keys - end - def target_access_level_options BroadcastMessage::ALLOWED_TARGET_ACCESS_LEVELS.map do |access_level| [Gitlab::Access.human_access(access_level), access_level] diff --git a/app/helpers/button_helper.rb b/app/helpers/button_helper.rb index c47aef24367..64d6ba155cd 100644 --- a/app/helpers/button_helper.rb +++ b/app/helpers/button_helper.rb @@ -20,8 +20,8 @@ module ButtonHelper # # See http://clipboardjs.com/#usage def clipboard_button(data = {}) - css_class = data[:class] || 'btn-clipboard gl-button btn-default-tertiary btn-icon btn-sm' - title = data[:title] || _('Copy') + css_class = data.delete(:class) || 'btn-clipboard gl-button btn-default-tertiary btn-icon btn-sm' + title = data.delete(:title) || _('Copy') button_text = data[:button_text] || nil hide_tooltip = data[:hide_tooltip] || false hide_button_icon = data[:hide_button_icon] || false diff --git a/app/helpers/ci/runners_helper.rb b/app/helpers/ci/runners_helper.rb index 8df30ee1f0d..ac36c867baf 100644 --- a/app/helpers/ci/runners_helper.rb +++ b/app/helpers/ci/runners_helper.rb @@ -78,7 +78,7 @@ module Ci parent_shared_runners_setting: group.parent&.shared_runners_setting, runner_enabled_value: Namespace::SR_ENABLED, runner_disabled_value: Namespace::SR_DISABLED_AND_UNOVERRIDABLE, - runner_allow_override_value: Namespace::SR_DISABLED_WITH_OVERRIDE + runner_allow_override_value: Namespace::SR_DISABLED_AND_OVERRIDABLE } end diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index cad39854c0e..f6de405cecb 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -284,23 +284,38 @@ module EmailsHelper end def change_reviewer_notification_text(new_reviewers, previous_reviewers, html_tag = nil) - new = new_reviewers.any? ? users_to_sentence(new_reviewers) : s_('ChangeReviewer|Unassigned') - old = previous_reviewers.any? ? users_to_sentence(previous_reviewers) : nil + if new_reviewers.empty? + s_('ChangeReviewer|All reviewers were removed.') + else + added_reviewers = new_reviewers - previous_reviewers + removed_reviewers = previous_reviewers - new_reviewers - if html_tag.present? - new = content_tag(html_tag, new) - old = content_tag(html_tag, old) if old.present? - end + added_reviewers_template_text = added_reviewers.size > 1 ? "were added as reviewers.
" : "was added as a reviewer.
" + removed_reviewers_template_text = removed_reviewers.size > 1 ? "were removed from reviewers." : "was removed from reviewers." - if old.present? - s_('ChangeReviewer|Reviewer changed from %{old} to %{new}').html_safe % { old: old, new: new } - else - s_('ChangeReviewer|Reviewer changed to %{new}').html_safe % { new: new } + added = format_reviewers_string(added_reviewers, html_tag) + removed = format_reviewers_string(removed_reviewers, html_tag) + + added_reviewers_text = added ? "#{added} #{added_reviewers_template_text}".html_safe : '' + removed_reviewers_text = removed ? "#{removed} #{removed_reviewers_template_text}".html_safe : '' + s_('ChangeReviewer|%{added_reviewers_text}%{removed_reviewers_text}').html_safe % { added_reviewers_text: added_reviewers_text, removed_reviewers_text: removed_reviewers_text } end end private + def format_reviewers_string(reviewers, html_tag = nil) + return unless reviewers.any? + + formatted_reviewers = users_to_sentence(reviewers) + + if html_tag.present? + content_tag(html_tag, formatted_reviewers) + else + formatted_reviewers + end + end + def users_to_sentence(users) sanitize_name(users.map(&:name).to_sentence) end diff --git a/app/helpers/environment_helper.rb b/app/helpers/environment_helper.rb index 0e64a98c9da..2b3700a9f21 100644 --- a/app/helpers/environment_helper.rb +++ b/app/helpers/environment_helper.rb @@ -58,8 +58,9 @@ module EnvironmentHelper s_('Deployment|blocked') end - klass = "ci-status ci-#{status.dasherize}" - text = "#{ci_icon_for_status(status)} #{status_text}".html_safe + ci_icon_utilities = "gl-display-inline-flex gl-align-items-center gl-line-height-0 gl-px-3 gl-py-2 gl-rounded-base" + klass = "ci-status ci-#{status.dasherize} #{ci_icon_utilities}" + text = "#{ci_icon_for_status(status)} #{status_text}".html_safe if deployment.deployable link_to(text, deployment_path(deployment), class: klass) diff --git a/app/helpers/feature_flags_helper.rb b/app/helpers/feature_flags_helper.rb index e12c6c605d2..3dde29dce91 100644 --- a/app/helpers/feature_flags_helper.rb +++ b/app/helpers/feature_flags_helper.rb @@ -18,7 +18,8 @@ module FeatureFlagsHelper feature_flags_path: project_feature_flags_path(@project), environments_endpoint: search_project_environments_path(@project, format: :json), strategy_type_docs_page_path: help_page_path('operations/feature_flags', anchor: 'feature-flag-strategies'), - environments_scope_docs_path: help_page_path('ci/environments/index.md', anchor: 'scope-environments-with-specs') + environments_scope_docs_path: help_page_path('ci/environments/index.md', + anchor: 'limit-the-environment-scope-of-a-cicd-variable') } end end diff --git a/app/helpers/form_helper.rb b/app/helpers/form_helper.rb index 963f0b7afc4..8f0d01c7d6d 100644 --- a/app/helpers/form_helper.rb +++ b/app/helpers/form_helper.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module FormHelper - def form_errors(model, type: 'form', truncate: []) + def form_errors(model, type: 'form', truncate: [], custom_message: []) errors = model.errors return unless errors.any? @@ -16,9 +16,15 @@ module FormHelper messages = errors.map do |error| attribute = error.attribute - message = error.message - message = html_escape_once(errors.full_message(attribute, message)).html_safe + message = errors.full_message(attribute, error.message) + + # When error message is custom and does not follow the default pattern + # " " (e.g. "You have already reported this + # user"), use the message as-is + message = error.message if custom_message.include?(attribute) + + message = html_escape_once(message).html_safe message = tag.span(message, class: 'str-truncated-100') if truncate.include?(attribute) message = append_help_page_link(message, error.options) if error.options[:help_page_url].present? diff --git a/app/helpers/graph_helper.rb b/app/helpers/graph_helper.rb index 788002f126d..ab72442857b 100644 --- a/app/helpers/graph_helper.rb +++ b/app/helpers/graph_helper.rb @@ -14,7 +14,7 @@ module GraphHelper end def parents_zip_spaces(parents, parent_spaces) - ids = parents.map { |p| p.id } + ids = parents.map(&:id) ids.zip(parent_spaces) end diff --git a/app/helpers/groups/group_members_helper.rb b/app/helpers/groups/group_members_helper.rb index 5034a4cb9b4..60011e31d43 100644 --- a/app/helpers/groups/group_members_helper.rb +++ b/app/helpers/groups/group_members_helper.rb @@ -13,7 +13,9 @@ module Groups::GroupMembersHelper access_request: group_members_list_data(group, access_requests.nil? ? [] : access_requests), source_id: group.id, can_manage_members: can?(current_user, :admin_group_member, group), - can_manage_access_requests: can?(current_user, :admin_member_access_request, group) + can_manage_access_requests: can?(current_user, :admin_member_access_request, group), + group_name: group.name, + group_path: group.full_path } end diff --git a/app/helpers/groups/observability_helper.rb b/app/helpers/groups/observability_helper.rb index 26caac4ce7f..6cd6566cee1 100644 --- a/app/helpers/groups/observability_helper.rb +++ b/app/helpers/groups/observability_helper.rb @@ -5,15 +5,19 @@ module Groups ACTION_TO_PATH = { 'dashboards' => { path: '/', - title: -> { _('Dashboards') } + title: -> { s_('Observability|Dashboards') } }, 'manage' => { path: '/dashboards', - title: -> { _('Manage Dashboards') } + title: -> { s_('Observability|Manage dashboards') } }, 'explore' => { path: '/explore', - title: -> { _('Explore') } + title: -> { s_('Observability|Explore telemetry data') } + }, + 'datasources' => { + path: '/datasources', + title: -> { s_('Observability|Data sources') } } }.freeze diff --git a/app/helpers/import_helper.rb b/app/helpers/import_helper.rb index 329bbb5ad82..81b881592d0 100644 --- a/app/helpers/import_helper.rb +++ b/app/helpers/import_helper.rb @@ -62,7 +62,7 @@ module ImportHelper def import_configure_github_admin_message github_integration_link = link_to 'GitHub integration', help_page_path('integration/github') - if current_user.admin? + if current_user.can_admin_all_resources? _('Note: As an administrator you may like to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token.').html_safe % { github_integration_link: github_integration_link } else _('Note: Consider asking your GitLab administrator to configure %{github_integration_link}, which will allow login via GitHub and allow importing repositories without generating a Personal Access Token.').html_safe % { github_integration_link: github_integration_link } diff --git a/app/helpers/integrations_helper.rb b/app/helpers/integrations_helper.rb index 0650af33e37..5471109e6d5 100644 --- a/app/helpers/integrations_helper.rb +++ b/app/helpers/integrations_helper.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true module IntegrationsHelper + # rubocop:disable Metrics/CyclomaticComplexity def integration_event_title(event) case event when "push", "push_events" @@ -27,8 +28,11 @@ module IntegrationsHelper _("Deployment") when "alert" _("Alert") + when "incident" + _("Incident") end end + # rubocop:enable Metrics/CyclomaticComplexity def integration_event_description(integration, event) case integration @@ -230,6 +234,7 @@ module IntegrationsHelper end end + # rubocop:disable Metrics/CyclomaticComplexity def default_integration_event_description(event) case event when "push", "push_events" @@ -256,8 +261,11 @@ module IntegrationsHelper s_("ProjectService|Trigger event when a deployment starts or finishes.") when "alert" s_("ProjectService|Trigger event when a new, unique alert is recorded.") + when "incident" + s_("ProjectService|Trigger event when an incident is created.") end end + # rubocop:enable Metrics/CyclomaticComplexity def trigger_events_for_integration(integration) Integrations::EventSerializer.new(integration: integration).represent(integration.configurable_events).to_json diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index 2b21d8c51e6..fb407aa7eed 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -207,14 +207,10 @@ module IssuablesHelper def assigned_issuables_count(issuable_type) case issuable_type when :issues - if Feature.enabled?(:limit_assigned_issues_count) - ::Users::AssignedIssuesCountService.new( - current_user: current_user, - max_limit: User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT - ).count - else - current_user.assigned_open_issues_count - end + ::Users::AssignedIssuesCountService.new( + current_user: current_user, + max_limit: User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT + ).count when :merge_requests current_user.assigned_open_merge_requests_count else @@ -225,7 +221,7 @@ module IssuablesHelper def assigned_open_issues_count_text count = assigned_issuables_count(:issues) - if Feature.enabled?(:limit_assigned_issues_count) && count > User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT - 1 + if count > User::MAX_LIMIT_FOR_ASSIGNEED_ISSUES_COUNT - 1 "#{count - 1}+" else count.to_s @@ -372,6 +368,14 @@ module IssuablesHelper end end + def hidden_issuable_icon(issuable) + title = format(_('This %{issuable} is hidden because its author has been banned'), + issuable: issuable.is_a?(Issue) ? _('issue') : _('merge request')) + content_tag(:span, class: 'has-tooltip', title: title) do + sprite_icon('spam', css_class: 'gl-vertical-align-text-bottom') + end + end + private def sidebar_gutter_collapsed? diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 1d68dccc741..362f1e65425 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -35,20 +35,6 @@ module IssuesHelper end end - def status_box_class(item) - if item.try(:expired?) - 'gl-bg-orange-500' - elsif item.try(:merged?) - 'badge-info' - elsif item.closed? - item.is_a?(MergeRequest) ? 'badge-danger' : 'gl-bg-red-500' - elsif item.try(:upcoming?) - 'gl-bg-gray-500' - else - item.is_a?(MergeRequest) ? 'badge-success' : 'gl-bg-green-500' - end - end - def issue_status_visibility(issue, status_box:) case status_box when :open @@ -77,9 +63,7 @@ module IssuesHelper def hidden_issue_icon(issue) return unless issue_hidden?(issue) - content_tag(:span, class: 'has-tooltip', title: _('This issue is hidden because its author has been banned')) do - sprite_icon('spam', css_class: 'gl-vertical-align-text-bottom') - end + hidden_issuable_icon(issue) end def award_user_list(awards, current_user, limit: 10) @@ -197,7 +181,9 @@ module IssuesHelper issue_type: issuable_display_type(issuable), new_issue_path: new_project_issue_path(project, new_issuable_params), project_path: project.full_path, - report_abuse_path: new_abuse_report_path(user_id: issuable.author.id, ref_url: issue_url(issuable)), + report_abuse_path: add_category_abuse_reports_path, + reported_user_id: issuable.author.id, + reported_from_url: issue_url(issuable), submit_as_spam_path: mark_as_spam_project_issue_path(project, issuable) } end @@ -258,8 +244,12 @@ module IssuesHelper def dashboard_issues_list_data(current_user) { + autocomplete_award_emojis_path: autocomplete_award_emojis_path, calendar_path: url_for(safe_params.merge(calendar_url_options)), - empty_state_svg_path: image_path('illustrations/issue-dashboard_results-without-filter.svg'), + dashboard_labels_path: dashboard_labels_path(format: :json, include_ancestor_groups: true), + dashboard_milestones_path: dashboard_milestones_path(format: :json), + empty_state_with_filter_svg_path: image_path('illustrations/issues.svg'), + empty_state_without_filter_svg_path: image_path('illustrations/issue-dashboard_results-without-filter.svg'), initial_sort: current_user&.user_preference&.issues_sort, is_public_visibility_restricted: Gitlab::CurrentSettings.restricted_visibility_levels&.include?(Gitlab::VisibilityLevel::PUBLIC).to_s, diff --git a/app/helpers/markup_helper.rb b/app/helpers/markup_helper.rb index ed9129ff78b..4a5720e757d 100644 --- a/app/helpers/markup_helper.rb +++ b/app/helpers/markup_helper.rb @@ -63,17 +63,8 @@ module MarkupHelper md = markdown_field(object, attribute, options.merge(post_process: false)) return unless md.present? - includes_code = false - tags = %w(a gl-emoji b strong i em pre code p span) - if is_todo - fragment = Nokogiri::HTML.fragment(md) - includes_code = fragment.css('code').any? - - md = fragment - end - context = markdown_field_render_context(object, attribute, options) context.reverse_merge!(truncate_visible_max_chars: max_chars || md.length) @@ -89,12 +80,6 @@ module MarkupHelper ) ) - # Extra span with relative positioning relative due to system font being behind - # background color when username is first word of mention - if is_todo && !includes_code - text = "\"#{text}\"" - end - # since tags are stripped, this can leave empty tags hanging around # (as our markdown wraps images in links) strip_empty_link_tags(text).html_safe diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 1d7d812dc5d..ec395baef9e 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -276,6 +276,12 @@ module MergeRequestsHelper data end + + def hidden_merge_request_icon(merge_request) + return unless merge_request.hidden? + + hidden_issuable_icon(merge_request) + end end MergeRequestsHelper.prepend_mod_with('MergeRequestsHelper') diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb index bf3b132e33a..d0421cd5184 100644 --- a/app/helpers/nav_helper.rb +++ b/app/helpers/nav_helper.rb @@ -65,6 +65,10 @@ module NavHelper %w(dev_ops_report usage_trends) end + def show_super_sidebar? + Feature.enabled?(:super_sidebar_nav, current_user) && current_user&.use_new_navigation + end + private def get_header_links diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index f2b7c0064e4..88e68a52199 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -17,8 +17,11 @@ module PreferencesHelper dashboards -= excluded_dashboard_choices dashboards.map do |key| - # Use `fetch` so `KeyError` gets raised when a key is missing - [localized_dashboard_choices.fetch(key), key] + { + # Use `fetch` so `KeyError` gets raised when a key is missing + text: localized_dashboard_choices.fetch(key), + value: key + } end end @@ -99,10 +102,12 @@ module PreferencesHelper end def language_choices - options_for_select( - selectable_locales_with_translation_level(Gitlab::I18n::MINIMUM_TRANSLATION_LEVEL).sort, - current_user.preferred_language - ) + selectable_locales_with_translation_level(Gitlab::I18n::MINIMUM_TRANSLATION_LEVEL).sort.map do |lang, key| + { + text: lang, + value: key + } + end end def default_preferred_language_choices diff --git a/app/helpers/projects/ml/experiments_helper.rb b/app/helpers/projects/ml/experiments_helper.rb index a67484e3d2f..b9a219b3021 100644 --- a/app/helpers/projects/ml/experiments_helper.rb +++ b/app/helpers/projects/ml/experiments_helper.rb @@ -11,7 +11,10 @@ module Projects **candidate.params.to_h { |p| [p.name, p.value] }, **candidate.latest_metrics.to_h { |m| [m.name, number_with_precision(m.value, precision: 4)] }, artifact: link_to_artifact(candidate), - details: link_to_details(candidate) + details: link_to_details(candidate), + name: candidate.name, + created_at: candidate.created_at, + user: user_info(candidate) } end @@ -32,7 +35,8 @@ module Projects experiment_name: candidate.experiment.name, path_to_experiment: link_to_experiment(candidate), status: candidate.status - } + }, + metadata: candidate.metadata } Gitlab::Json.generate(data) @@ -45,11 +49,11 @@ module Projects return unless artifact.present? - project_package_path(candidate.experiment.project, artifact) + project_package_path(candidate.project, artifact) end def link_to_details(candidate) - project_ml_candidate_path(candidate.experiment.project, candidate.iid) + project_ml_candidate_path(candidate.project, candidate.iid) end def link_to_experiment(candidate) @@ -57,6 +61,17 @@ module Projects project_ml_experiment_path(experiment.project, experiment.iid) end + + def user_info(candidate) + user = candidate.user + + return unless user.present? + + { + username: user.username, + path: user_path(user) + } + end end end end diff --git a/app/helpers/projects/project_members_helper.rb b/app/helpers/projects/project_members_helper.rb index 6026124abb9..634f6e8ba59 100644 --- a/app/helpers/projects/project_members_helper.rb +++ b/app/helpers/projects/project_members_helper.rb @@ -9,7 +9,9 @@ module Projects::ProjectMembersHelper access_request: project_members_list_data(project, access_requests.nil? ? [] : access_requests), source_id: project.id, can_manage_members: Ability.allowed?(current_user, :admin_project_member, project), - can_manage_access_requests: Ability.allowed?(current_user, :admin_member_access_request, project) + can_manage_access_requests: Ability.allowed?(current_user, :admin_member_access_request, project), + group_name: project.group&.name, + group_path: project.group&.full_path }.to_json end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 682febe9dc9..507e05b9967 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -479,32 +479,6 @@ module ProjectsHelper format_cached_count(1000, number) end - def fork_divergence_message(counts) - messages = [] - - if counts[:behind].nil? || counts[:ahead].nil? - return s_('ForksDivergence|Fork has diverged from upstream repository') - end - - if counts[:behind] > 0 - messages << s_("ForksDivergence|%{behind} %{commit_word} behind") % { - behind: counts[:behind], commit_word: n_('commit', 'commits', counts[:behind]) - } - end - - if counts[:ahead] > 0 - messages << s_("ForksDivergence|%{ahead} %{commit_word} ahead of") % { - ahead: counts[:ahead], commit_word: n_('commit', 'commits', counts[:ahead]) - } - end - - if messages.blank? - s_('ForksDivergence|Up to date with upstream repository') - else - s_("ForksDivergence|%{messages} upstream repository") % { messages: messages.join(', ') } - end - end - private def localized_access_names @@ -520,7 +494,7 @@ module ProjectsHelper end def configure_oauth_import_message(provider, help_url) - str = if current_user.admin? + str = if current_user.can_admin_all_resources? 'ImportProjects|To enable importing projects from %{provider}, as administrator you need to configure %{link_start}OAuth integration%{link_end}' else 'ImportProjects|To enable importing projects from %{provider}, ask your GitLab administrator to configure %{link_start}OAuth integration%{link_end}' @@ -658,7 +632,7 @@ module ProjectsHelper end def restricted_levels - return [] if current_user.admin? + return [] if current_user.can_admin_all_resources? Gitlab::CurrentSettings.restricted_visibility_levels || [] end diff --git a/app/helpers/protected_branches_helper.rb b/app/helpers/protected_branches_helper.rb new file mode 100644 index 00000000000..07b07bfd33c --- /dev/null +++ b/app/helpers/protected_branches_helper.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module ProtectedBranchesHelper + def protected_branch_can_admin_entity?(protected_branch_entity) + if protected_branch_entity.is_a?(Group) + can?(current_user, :admin_group, protected_branch_entity) + else + can?(current_user, :admin_project, protected_branch_entity) + end + end + + def protected_branch_path_by_entity(protected_branch, protected_branch_entity) + if protected_branch_entity.is_a?(Group) + group_protected_branch_path(protected_branch_entity, protected_branch) + else + project_protected_branch_path(protected_branch_entity, protected_branch) + end + end +end diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index e03365ad5f1..ca5436ff019 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -49,7 +49,7 @@ module SearchHelper search_pattern = Regexp.new(Regexp.escape(term), "i") generic_results = project_autocomplete + default_autocomplete + help_autocomplete - generic_results.concat(default_autocomplete_admin) if current_user.admin? + generic_results.concat(default_autocomplete_admin) if current_user.can_read_all_resources? generic_results.select { |result| result[:label] =~ search_pattern } end diff --git a/app/helpers/selects_helper.rb b/app/helpers/selects_helper.rb index 99da9a7af6c..7ee40c28bad 100644 --- a/app/helpers/selects_helper.rb +++ b/app/helpers/selects_helper.rb @@ -1,20 +1,6 @@ # frozen_string_literal: true module SelectsHelper - def groups_select_tag(id, opts = {}) - classes = Array.wrap(opts[:class]) - classes << 'ajax-groups-select' - - # EE requires this line to be present, but there is no easy way of injecting - # this into EE without causing merge conflicts. Given this line is very - # simple and not really EE specific on its own, we just include it in CE. - classes << 'multiselect' if opts[:multiple] - - opts[:class] = classes.join(' ') - - select2_tag(id, opts) - end - def project_select_tag(id, opts = {}) opts[:class] = [*opts[:class], 'ajax-project-select'].join(' ') diff --git a/app/helpers/sidebars_helper.rb b/app/helpers/sidebars_helper.rb index cbee02a28c0..f6257c92f3f 100644 --- a/app/helpers/sidebars_helper.rb +++ b/app/helpers/sidebars_helper.rb @@ -31,6 +31,18 @@ module SidebarsHelper Sidebars::Groups::Context.new(**context_data) end + def super_sidebar_context(user) + { + name: user.name, + username: user.username, + avatar_url: user.avatar_url, + assigned_open_issues_count: user.assigned_open_issues_count, + assigned_open_merge_requests_count: user.assigned_open_merge_requests_count, + todos_pending_count: user.todos_pending_count, + issues_dashboard_path: issues_dashboard_path(assignee_username: user.username) + } + end + private def sidebar_attributes_for_object(object) diff --git a/app/helpers/timeboxes_helper.rb b/app/helpers/timeboxes_helper.rb index 307f03e0d64..66c9011fbcc 100644 --- a/app/helpers/timeboxes_helper.rb +++ b/app/helpers/timeboxes_helper.rb @@ -8,7 +8,7 @@ module TimeboxesHelper if milestone.closed? _('Closed') elsif milestone.expired? - _('Past due') + _('Expired') elsif milestone.upcoming? _('Upcoming') else @@ -16,6 +16,18 @@ module TimeboxesHelper end end + def milestone_badge_variant(milestone) + if milestone.closed? + :danger + elsif milestone.expired? + :warning + elsif milestone.upcoming? + :neutral + else + :success + end + end + def milestones_filter_path(opts = {}) if @project project_milestones_path(@project, opts) diff --git a/app/helpers/todos_helper.rb b/app/helpers/todos_helper.rb index d7c4540544b..daaf86e55a0 100644 --- a/app/helpers/todos_helper.rb +++ b/app/helpers/todos_helper.rb @@ -28,7 +28,7 @@ module TodosHelper when Todo::UNMERGEABLE then s_('Todos|Could not merge') when Todo::MERGE_TRAIN_REMOVED then s_("Todos|Removed from Merge Train") when Todo::MEMBER_ACCESS_REQUESTED then format( - s_("Todos|has requested access to group %{which}"), which: _(todo.target.name) + s_("Todos|has requested access to %{what} %{which}"), what: _(todo.member_access_type), which: _(todo.target.name) ) end end @@ -99,7 +99,7 @@ module TodosHelper path_options[:only_path] = true Gitlab::UrlBuilder.build(todo.target, **path_options) elsif todo.member_access_requested? - todo.access_request_url + todo.access_request_url(only_path: true) else path = [todo.resource_parent, todo.target] diff --git a/app/helpers/url_helper.rb b/app/helpers/url_helper.rb new file mode 100644 index 00000000000..9083ca4e8dd --- /dev/null +++ b/app/helpers/url_helper.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +module UrlHelper + def escaped_url(url) + return unless url + + Addressable::URI.escape(url) + rescue Addressable::URI::InvalidURIError + nil + end +end diff --git a/app/helpers/users/callouts_helper.rb b/app/helpers/users/callouts_helper.rb index a9fd219bbac..6ab78b58457 100644 --- a/app/helpers/users/callouts_helper.rb +++ b/app/helpers/users/callouts_helper.rb @@ -49,7 +49,7 @@ module Users def show_registration_enabled_user_callout? !Gitlab.com? && - current_user&.admin? && + current_user&.can_admin_all_resources? && signup_enabled? && !user_dismissed?(REGISTRATION_ENABLED_CALLOUT) && REGISTRATION_ENABLED_CALLOUT_ALLOWED_CONTROLLER_PATHS.any? { |path| controller.controller_path.match?(path) } @@ -59,7 +59,7 @@ module Users end def show_security_newsletter_user_callout? - current_user&.admin? && + current_user&.can_admin_all_resources? && !user_dismissed?(SECURITY_NEWSLETTER_CALLOUT) end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 4f345fdeb9c..a382b5e7b74 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -93,7 +93,7 @@ module UsersHelper def user_badges_in_admin_section(user) [].tap do |badges| badges << blocked_user_badge(user) if user.blocked? - badges << { text: s_('AdminUsers|Admin'), variant: 'success' } if user.admin? + badges << { text: s_('AdminUsers|Admin'), variant: 'success' } if user.admin? # rubocop:disable Cop/UserAdmin badges << { text: s_('AdminUsers|Bot'), variant: 'muted' } if user.bot? badges << { text: s_('AdminUsers|External'), variant: 'secondary' } if user.external? badges << { text: s_("AdminUsers|It's you!"), variant: 'muted' } if current_user == user diff --git a/app/helpers/version_check_helper.rb b/app/helpers/version_check_helper.rb index 0bb92dfd118..4bd89a3d4e2 100644 --- a/app/helpers/version_check_helper.rb +++ b/app/helpers/version_check_helper.rb @@ -18,7 +18,7 @@ module VersionCheckHelper strong_memoize_attr :gitlab_version_check def show_security_patch_upgrade_alert? - return false unless show_version_check? && gitlab_version_check + return false unless Feature.enabled?(:critical_security_alert) && show_version_check? && gitlab_version_check gitlab_version_check['severity'] === SECURITY_ALERT_SEVERITY end diff --git a/app/helpers/visibility_level_helper.rb b/app/helpers/visibility_level_helper.rb index 1baeeda0ef7..5ed341ee5e5 100644 --- a/app/helpers/visibility_level_helper.rb +++ b/app/helpers/visibility_level_helper.rb @@ -39,7 +39,7 @@ module VisibilityLevelHelper end def restricted_visibility_levels(show_all = false) - return [] if current_user.admin? && !show_all + return [] if current_user.can_admin_all_resources? && !show_all Gitlab::CurrentSettings.restricted_visibility_levels || [] end diff --git a/app/helpers/work_items_helper.rb b/app/helpers/work_items_helper.rb index 2c61fc20ca8..efa9a2bd463 100644 --- a/app/helpers/work_items_helper.rb +++ b/app/helpers/work_items_helper.rb @@ -4,7 +4,9 @@ module WorkItemsHelper def work_items_index_data(project) { full_path: project.full_path, - issues_list_path: project_issues_path(project) + issues_list_path: project_issues_path(project), + register_path: new_user_registration_path(redirect_to_referer: 'yes'), + sign_in_path: new_session_path(:user, redirect_to_referer: 'yes') } end end -- cgit v1.2.3