diff options
| author | Kamil Trzciński <ayufan@ayufan.eu> | 2018-02-28 20:36:55 +0100 | 
|---|---|---|
| committer | Kamil Trzciński <ayufan@ayufan.eu> | 2018-02-28 20:36:55 +0100 | 
| commit | 965dc28691e2d70b7040e28d90ccbc3721a9e416 (patch) | |
| tree | 84258f35b72f2e7ce6a7198db66032df4ad5aadb /app/helpers | |
| parent | e3fafa7632e038927085cf8c8228c93be44b36bd (diff) | |
| parent | 7fabc892f251740dbd9a4755baede662e6854870 (diff) | |
| download | gitlab-ce-965dc28691e2d70b7040e28d90ccbc3721a9e416.tar.gz | |
Merge commit '7fabc892f251740dbd9a4755baede662e6854870' into object-storage-ee-to-ce-backport
Diffstat (limited to 'app/helpers')
| -rw-r--r-- | app/helpers/appearances_helper.rb | 25 | ||||
| -rw-r--r-- | app/helpers/application_settings_helper.rb | 43 | ||||
| -rw-r--r-- | app/helpers/auto_devops_helper.rb | 2 | ||||
| -rw-r--r-- | app/helpers/boards_helper.rb | 2 | ||||
| -rw-r--r-- | app/helpers/builds_helper.rb | 3 | ||||
| -rw-r--r-- | app/helpers/button_helper.rb | 56 | ||||
| -rw-r--r-- | app/helpers/ci_status_helper.rb | 5 | ||||
| -rw-r--r-- | app/helpers/commits_helper.rb | 12 | ||||
| -rw-r--r-- | app/helpers/diff_helper.rb | 7 | ||||
| -rw-r--r-- | app/helpers/emails_helper.rb | 1 | ||||
| -rw-r--r-- | app/helpers/graph_helper.rb | 2 | ||||
| -rw-r--r-- | app/helpers/icons_helper.rb | 9 | ||||
| -rw-r--r-- | app/helpers/issuables_helper.rb | 1 | ||||
| -rw-r--r-- | app/helpers/markup_helper.rb | 13 | ||||
| -rw-r--r-- | app/helpers/merge_requests_helper.rb | 24 | ||||
| -rw-r--r-- | app/helpers/namespaces_helper.rb | 7 | ||||
| -rw-r--r-- | app/helpers/notifications_helper.rb | 1 | ||||
| -rw-r--r-- | app/helpers/projects_helper.rb | 4 | ||||
| -rw-r--r-- | app/helpers/search_helper.rb | 3 | ||||
| -rw-r--r-- | app/helpers/storage_health_helper.rb | 6 | ||||
| -rw-r--r-- | app/helpers/tree_helper.rb | 16 | ||||
| -rw-r--r-- | app/helpers/visibility_level_helper.rb | 2 | 
22 files changed, 152 insertions, 92 deletions
diff --git a/app/helpers/appearances_helper.rb b/app/helpers/appearances_helper.rb index 8ad94d3f723..c037de33c22 100644 --- a/app/helpers/appearances_helper.rb +++ b/app/helpers/appearances_helper.rb @@ -1,33 +1,36 @@  module AppearancesHelper    def brand_title -    if brand_item && brand_item.title -      brand_item.title -    else -      'GitLab Community Edition' -    end +    brand_item&.title.presence || 'GitLab Community Edition'    end    def brand_image -    if brand_item.logo? -      image_tag brand_item.logo -    else -      nil -    end +    image_tag(brand_item.logo) if brand_item&.logo?    end    def brand_text      markdown_field(brand_item, :description)    end +  def brand_new_project_guidelines +    markdown_field(brand_item, :new_project_guidelines) +  end +    def brand_item      @appearance ||= Appearance.current    end    def brand_header_logo -    if brand_item && brand_item.header_logo? +    if brand_item&.header_logo?        image_tag brand_item.header_logo      else        render 'shared/logo.svg'      end    end + +  # Skip the 'GitLab' type logo when custom brand logo is set +  def brand_header_logo_type +    unless brand_item&.header_logo? +      render 'shared/logo_type.svg' +    end +  end  end diff --git a/app/helpers/application_settings_helper.rb b/app/helpers/application_settings_helper.rb index cd1ecaadb85..b12ea760668 100644 --- a/app/helpers/application_settings_helper.rb +++ b/app/helpers/application_settings_helper.rb @@ -3,9 +3,9 @@ module ApplicationSettingsHelper    include Gitlab::CurrentSettings -  delegate  :gravatar_enabled?, -            :signup_enabled?, -            :password_authentication_enabled?, +  delegate  :allow_signup?, +            :gravatar_enabled?, +            :password_authentication_enabled_for_web?,              :akismet_enabled?,              :koding_enabled?,              to: :current_application_settings @@ -30,9 +30,9 @@ module ApplicationSettingsHelper    def enabled_project_button(project, protocol)      case protocol      when 'ssh' -      ssh_clone_button(project, 'bottom', append_link: false) +      ssh_clone_button(project, append_link: false)      else -      http_clone_button(project, 'bottom', append_link: false) +      http_clone_button(project, append_link: false)      end    end @@ -124,17 +124,6 @@ module ApplicationSettingsHelper      _('The number of attempts GitLab will make to access a storage.')    end -  def circuitbreaker_backoff_threshold_help_text -    _("The number of failures after which GitLab will start temporarily "\ -      "disabling access to a storage shard on a host") -  end - -  def circuitbreaker_failure_wait_time_help_text -    _("When access to a storage fails. GitLab will prevent access to the "\ -      "storage for the time specified here. This allows the filesystem to "\ -      "recover. Repositories on failing shards are temporarly unavailable") -  end -    def circuitbreaker_failure_reset_time_help_text      _("The time in seconds GitLab will keep failure information. When no "\        "failures occur during this time, information about the mount is reset.") @@ -145,6 +134,11 @@ module ApplicationSettingsHelper        "timeout error will be raised.")    end +  def circuitbreaker_check_interval_help_text +    _("The time in seconds between storage checks. When a previous check did "\ +      "complete yet, GitLab will skip a check.") +  end +    def visible_attributes      [        :admin_notification_email, @@ -154,10 +148,9 @@ module ApplicationSettingsHelper        :akismet_enabled,        :auto_devops_enabled,        :circuitbreaker_access_retries, -      :circuitbreaker_backoff_threshold, +      :circuitbreaker_check_interval,        :circuitbreaker_failure_count_threshold,        :circuitbreaker_failure_reset_time, -      :circuitbreaker_failure_wait_time,        :circuitbreaker_storage_timeout,        :clientside_sentry_dsn,        :clientside_sentry_enabled, @@ -177,6 +170,9 @@ module ApplicationSettingsHelper        :ed25519_key_restriction,        :email_author_in_body,        :enabled_git_access_protocol, +      :gitaly_timeout_default, +      :gitaly_timeout_medium, +      :gitaly_timeout_fast,        :gravatar_enabled,        :hashed_storage_enabled,        :help_page_hide_commercial_content, @@ -203,7 +199,7 @@ module ApplicationSettingsHelper        :metrics_port,        :metrics_sample_interval,        :metrics_timeout, -      :password_authentication_enabled, +      :password_authentication_enabled_for_web,        :performance_bar_allowed_group_id,        :performance_bar_enabled,        :plantuml_enabled, @@ -231,6 +227,15 @@ module ApplicationSettingsHelper        :sign_in_text,        :signup_enabled,        :terminal_max_session_time, +      :throttle_unauthenticated_enabled, +      :throttle_unauthenticated_requests_per_period, +      :throttle_unauthenticated_period_in_seconds, +      :throttle_authenticated_web_enabled, +      :throttle_authenticated_web_requests_per_period, +      :throttle_authenticated_web_period_in_seconds, +      :throttle_authenticated_api_enabled, +      :throttle_authenticated_api_requests_per_period, +      :throttle_authenticated_api_period_in_seconds,        :two_factor_grace_period,        :unique_ips_limit_enabled,        :unique_ips_limit_per_user, diff --git a/app/helpers/auto_devops_helper.rb b/app/helpers/auto_devops_helper.rb index 483b957decb..f4310ca2f06 100644 --- a/app/helpers/auto_devops_helper.rb +++ b/app/helpers/auto_devops_helper.rb @@ -10,7 +10,7 @@ module AutoDevopsHelper    def auto_devops_warning_message(project)      missing_domain = !project.auto_devops&.has_domain? -    missing_service = !project.kubernetes_service&.active? +    missing_service = !project.deployment_platform&.active?      if missing_service        params = { diff --git a/app/helpers/boards_helper.rb b/app/helpers/boards_helper.rb index c4a621160af..12b3d9bac1a 100644 --- a/app/helpers/boards_helper.rb +++ b/app/helpers/boards_helper.rb @@ -6,7 +6,7 @@ module BoardsHelper    def board_data      {        boards_endpoint: @boards_endpoint, -      lists_endpoint: board_lists_url(board), +      lists_endpoint: board_lists_path(board),        board_id: board.id,        disabled: "#{!can?(current_user, :admin_list, current_board_parent)}",        issue_link_base: build_issue_link_base, diff --git a/app/helpers/builds_helper.rb b/app/helpers/builds_helper.rb index aa3a9a055a0..4ec63fdaffc 100644 --- a/app/helpers/builds_helper.rb +++ b/app/helpers/builds_helper.rb @@ -20,8 +20,7 @@ module BuildsHelper    def javascript_build_options      { -      page_url: project_job_url(@project, @build), -      build_url: project_job_url(@project, @build, :json), +      page_path: project_job_path(@project, @build),        build_status: @build.status,        build_stage: @build.stage,        log_state: '' diff --git a/app/helpers/button_helper.rb b/app/helpers/button_helper.rb index 48cf30a48ab..3605d6a3c95 100644 --- a/app/helpers/button_helper.rb +++ b/app/helpers/button_helper.rb @@ -56,42 +56,36 @@ module ButtonHelper      end    end -  def http_clone_button(project, placement = 'right', append_link: true) -    klass = 'http-selector' -    klass << ' has-tooltip' if current_user.try(:require_password_creation?) || current_user.try(:require_personal_access_token_creation_for_git_auth?) - +  def http_clone_button(project, append_link: true)      protocol = gitlab_config.protocol.upcase +    dropdown_description = http_dropdown_description(protocol) +    append_url = project.http_url_to_repo if append_link + +    dropdown_item_with_description(protocol, dropdown_description, href: append_url) +  end + +  def http_dropdown_description(protocol) +    if current_user.try(:require_password_creation_for_git?) +      _("Set a password on your account to pull or push via %{protocol}.") % { protocol: protocol } +    else +      _("Create a personal access token on your account to pull or push via %{protocol}.") % { protocol: protocol } +    end +  end -    tooltip_title = -      if current_user.try(:require_password_creation?) -        _("Set a password on your account to pull or push via %{protocol}.") % { protocol: protocol } -      else -        _("Create a personal access token on your account to pull or push via %{protocol}.") % { protocol: protocol } -      end +  def ssh_clone_button(project, append_link: true) +    dropdown_description = _("You won't be able to pull or push project code via SSH until you add an SSH key to your profile") if current_user.try(:require_ssh_key?) +    append_url = project.ssh_url_to_repo if append_link -    content_tag (append_link ? :a : :span), protocol, -      class: klass, -      href: (project.http_url_to_repo if append_link), -      data: { -        html: true, -        placement: placement, -        container: 'body', -        title: tooltip_title -      } +    dropdown_item_with_description('SSH', dropdown_description, href: append_url)    end -  def ssh_clone_button(project, placement = 'right', append_link: true) -    klass = 'ssh-selector' -    klass << ' has-tooltip' if current_user.try(:require_ssh_key?) +  def dropdown_item_with_description(title, description, href: nil) +    button_content = content_tag(:strong, title, class: 'dropdown-menu-inner-title') +    button_content << content_tag(:span, description, class: 'dropdown-menu-inner-content') if description -    content_tag (append_link ? :a : :span), 'SSH', -      class: klass, -      href: (project.ssh_url_to_repo if append_link), -      data: { -        html: true, -        placement: placement, -        container: 'body', -        title: _('Add an SSH key to your profile to pull or push via SSH.') -      } +    content_tag (href ? :a : :span), +      (href ? button_content : title), +      class: "#{title.downcase}-selector", +      href: (href if href)    end  end diff --git a/app/helpers/ci_status_helper.rb b/app/helpers/ci_status_helper.rb index 4dd573c61f1..636316da80a 100644 --- a/app/helpers/ci_status_helper.rb +++ b/app/helpers/ci_status_helper.rb @@ -6,11 +6,6 @@  # See 'detailed_status?` method and `Gitlab::Ci::Status` module.  #  module CiStatusHelper -  def ci_status_path(pipeline) -    project = pipeline.project -    project_pipeline_path(project, pipeline) -  end -    def ci_label_for_status(status)      if detailed_status?(status)        return status.label diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index f9a666fa1e6..2d304f7eb91 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -63,7 +63,7 @@ module CommitsHelper    # Returns a link formatted as a commit branch link    def commit_branch_link(url, text)      link_to(url, class: 'label label-gray ref-name branch-link') do -      icon('code-fork') + " #{text}" +      icon('code-fork', class: 'append-right-5') + "#{text}"      end    end @@ -77,7 +77,7 @@ module CommitsHelper    # Returns a link formatted as a commit tag link    def commit_tag_link(url, text)      link_to(url, class: 'label label-gray ref-name') do -      icon('tag') + " #{text}" +      icon('tag', class: 'append-right-5') + "#{text}"      end    end @@ -228,4 +228,12 @@ module CommitsHelper        [commits, 0]      end    end + +  def commit_path(project, commit, merge_request: nil) +    if merge_request&.persisted? +      diffs_project_merge_request_path(project, merge_request, commit_id: commit.id) +    else +      project_commit_path(project, commit) +    end +  end  end diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb index 4e4a66e8a02..e82136f0177 100644 --- a/app/helpers/diff_helper.rb +++ b/app/helpers/diff_helper.rb @@ -111,6 +111,7 @@ module DiffHelper    def diff_file_old_blob_raw_path(diff_file)      sha = diff_file.old_content_sha      return unless sha +      project_raw_path(@project, tree_join(diff_file.old_content_sha, diff_file.old_path))    end @@ -152,11 +153,11 @@ module DiffHelper    def diff_file_changed_icon(diff_file)      if diff_file.deleted_file? || diff_file.renamed_file? -      "minus" +      "file-deletion"      elsif diff_file.new_file? -      "plus" +      "file-addition"      else -      "adjust" +      "file-modified"      end    end diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index 5f11fe62030..878bc9b5c9c 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -24,6 +24,7 @@ module EmailsHelper    def action_title(url)      return unless url +      %w(merge_requests issues commit).each do |action|        if url.split("/").include?(action)          return "View #{action.humanize.singularize}" diff --git a/app/helpers/graph_helper.rb b/app/helpers/graph_helper.rb index f7e17f5cc01..6d303ba857d 100644 --- a/app/helpers/graph_helper.rb +++ b/app/helpers/graph_helper.rb @@ -8,7 +8,7 @@ module GraphHelper      # append note count      notes_count = @graph.notes[commit.id] -    refs << "[#{notes_count} #{pluralize(notes_count, 'note')}]" if notes_count > 0 +    refs << "[#{pluralize(notes_count, 'note')}]" if notes_count > 0      refs    end diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb index ec779c1c447..c6a83f21ceb 100644 --- a/app/helpers/icons_helper.rb +++ b/app/helpers/icons_helper.rb @@ -23,10 +23,17 @@ module IconsHelper      render "shared/icons/#{icon_name}.svg", size: size    end +  def sprite_icon_path +    # SVG Sprites currently don't work across domains, so in the case of a CDN +    # we have to set the current path deliberately to prevent addition of asset_host +    sprite_base_url = Gitlab.config.gitlab.url if ActionController::Base.asset_host +    ActionController::Base.helpers.image_path('icons.svg', host: sprite_base_url) +  end +    def sprite_icon(icon_name, size: nil, css_class: nil)      css_classes = size ? "s#{size}" : ""      css_classes << " #{css_class}" unless css_class.blank? -    content_tag(:svg, content_tag(:use, "", { "xlink:href" => "#{image_path('icons.svg')}##{icon_name}" } ), class: css_classes.empty? ? nil : css_classes) +    content_tag(:svg, content_tag(:use, "", { "xlink:href" => "#{sprite_icon_path}##{icon_name}" } ), class: css_classes.empty? ? nil : css_classes)    end    def audit_icon(names, options = {}) diff --git a/app/helpers/issuables_helper.rb b/app/helpers/issuables_helper.rb index a9840d19178..4c60f4b0cd0 100644 --- a/app/helpers/issuables_helper.rb +++ b/app/helpers/issuables_helper.rb @@ -212,6 +212,7 @@ module IssuablesHelper    def issuable_initial_data(issuable)      data = {        endpoint: issuable_path(issuable), +      updateEndpoint: "#{issuable_path(issuable)}.json",        canUpdate: can?(current_user, :"update_#{issuable.to_ability_name}", issuable),        canDestroy: can?(current_user, :"destroy_#{issuable.to_ability_name}", issuable),        issuableRef: issuable.to_reference, diff --git a/app/helpers/markup_helper.rb b/app/helpers/markup_helper.rb index 2c85d7d7720..f78d41a0448 100644 --- a/app/helpers/markup_helper.rb +++ b/app/helpers/markup_helper.rb @@ -53,6 +53,7 @@ module MarkupHelper        # text, wrapping anything found in the requested link        fragment.children.each do |node|          next unless node.text? +          node.replace(link_to(node.text, url, html_options))        end      end @@ -85,6 +86,8 @@ module MarkupHelper      return '' unless text.present?      context[:project] ||= @project +    context[:group] ||= @group +      html = markdown_unsafe(text, context)      prepare_for_rendering(html, context)    end @@ -112,7 +115,13 @@ module MarkupHelper      text = wiki_page.content      return '' unless text.present? -    context = { pipeline: :wiki, project: @project, project_wiki: @project_wiki, page_slug: wiki_page.slug } +    context = { +      pipeline: :wiki, +      project: @project, +      project_wiki: @project_wiki, +      page_slug: wiki_page.slug, +      issuable_state_filter_enabled: true +    }      html =        case wiki_page.format @@ -221,7 +230,7 @@ module MarkupHelper      data = options[:data].merge({ container: 'body' })      content_tag :button,        type: 'button', -      class: 'toolbar-btn js-md has-tooltip hidden-xs', +      class: 'toolbar-btn js-md has-tooltip',        tabindex: -1,        data: data,        title: options[:title], diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 5b2c58d193d..ce57422f45d 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -101,6 +101,30 @@ module MergeRequestsHelper      }.merge(merge_params_ee(merge_request))    end +  def tab_link_for(merge_request, tab, options = {}, &block) +    data_attrs = { +      action: tab.to_s, +      target: "##{tab}", +      toggle: options.fetch(:force_link, false) ? '' : 'tab' +    } + +    url = case tab +          when :show +            data_attrs[:target] = '#notes' +            method(:project_merge_request_path) +          when :commits +            method(:commits_project_merge_request_path) +          when :pipelines +            method(:pipelines_project_merge_request_path) +          when :diffs +            method(:diffs_project_merge_request_path) +          else +            raise "Cannot create tab #{tab}." +          end + +    link_to(url[merge_request.project, merge_request], data: data_attrs, &block) +  end +    def merge_params_ee(merge_request)      {}    end diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb index d7df9bb06d2..b78d3072186 100644 --- a/app/helpers/namespaces_helper.rb +++ b/app/helpers/namespaces_helper.rb @@ -4,8 +4,11 @@ module NamespacesHelper    end    def namespaces_options(selected = :current_user, display_path: false, extra_group: nil) -    groups  = current_user.owned_groups + current_user.masters_groups -    users   = [current_user.namespace] +    groups = current_user.manageable_groups +               .joins(:route) +               .includes(:route) +               .order('routes.path') +    users = [current_user.namespace]      unless extra_group.nil? || extra_group.is_a?(Group)        extra_group = Group.find(extra_group) if Namespace.find(extra_group).kind == 'group' diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index fde961e2da4..3e42063224e 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -78,6 +78,7 @@ module NotificationsHelper    # Create hidden field to send notification setting source to controller    def hidden_setting_source_input(notification_setting)      return unless notification_setting.source_type +      hidden_field_tag "#{notification_setting.source_type.downcase}_id", notification_setting.source_id    end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index f48d47953e4..4a6b22b5ff6 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -234,11 +234,11 @@ module ProjectsHelper    def show_no_password_message?      cookies[:hide_no_password_message].blank? && !current_user.hide_no_password && -      ( current_user.require_password_creation? || current_user.require_personal_access_token_creation_for_git_auth? ) +      current_user.require_extra_setup_for_git_auth?    end    def link_to_set_password -    if current_user.require_password_creation? +    if current_user.require_password_creation_for_git?        link_to s_('SetPasswordToCloneLink|set a password'), edit_profile_password_path      else        link_to s_('CreateTokenToCloneLink|create a personal access token'), profile_personal_access_tokens_path diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index cf28a917fd1..2f57660516d 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -140,7 +140,8 @@ module SearchHelper          placeholder: 'Search or filter results...',          data: {            'username-params' => @users.to_json(only: [:id, :username]) -        } +        }, +        autocomplete: 'off'        }      if @project.present? diff --git a/app/helpers/storage_health_helper.rb b/app/helpers/storage_health_helper.rb index 4d2180f7eee..b76c1228220 100644 --- a/app/helpers/storage_health_helper.rb +++ b/app/helpers/storage_health_helper.rb @@ -18,16 +18,12 @@ module StorageHealthHelper      current_failures = circuit_breaker.failure_count      translation_params = { number_of_failures: current_failures, -                           maximum_failures: maximum_failures, -                           number_of_seconds: circuit_breaker.failure_wait_time } +                           maximum_failures: maximum_failures }      if circuit_breaker.circuit_broken?        s_("%{number_of_failures} of %{maximum_failures} failures. GitLab will not "\           "retry automatically. Reset storage information when the problem is "\           "resolved.") % translation_params -    elsif circuit_breaker.backing_off? -      _("%{number_of_failures} of %{maximum_failures} failures. GitLab will "\ -        "block access for %{number_of_seconds} seconds.") % translation_params      else        _("%{number_of_failures} of %{maximum_failures} failures. GitLab will "\          "allow access on the next attempt.") % translation_params diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index c4ea0f5ac53..5b2ea38a03d 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -1,14 +1,23 @@  module TreeHelper +  FILE_LIMIT = 1_000 +    # Sorts a repository's tree so that folders are before files and renders    # their corresponding partials    # -  # contents - A Grit::Tree object for the current tree +  # tree - A `Tree` object for the current tree    def render_tree(tree)      # Sort submodules and folders together by name ahead of files      folders, files, submodules = tree.trees, tree.blobs, tree.submodules -    tree = "" +    tree = ''      items = (folders + submodules).sort_by(&:name) + files -    tree << render(partial: "projects/tree/tree_row", collection: items) if items.present? + +    if items.size > FILE_LIMIT +      tree << render(partial: 'projects/tree/truncated_notice_tree_row', +                     locals: { limit: FILE_LIMIT, total: items.size }) +      items = items.take(FILE_LIMIT) +    end + +    tree << render(partial: 'projects/tree/tree_row', collection: items) if items.present?      tree.html_safe    end @@ -88,6 +97,7 @@ module TreeHelper          part_path = part if part_path.empty?          next if parts.count > max_links && !parts.last(2).include?(part) +          yield(part, part_path)        end      end diff --git a/app/helpers/visibility_level_helper.rb b/app/helpers/visibility_level_helper.rb index 46867d2d974..c3d5628f241 100644 --- a/app/helpers/visibility_level_helper.rb +++ b/app/helpers/visibility_level_helper.rb @@ -150,6 +150,7 @@ module VisibilityLevelHelper    def restricted_visibility_levels(show_all = false)      return [] if current_user.admin? && !show_all +      current_application_settings.restricted_visibility_levels || []    end @@ -159,6 +160,7 @@ module VisibilityLevelHelper    def disallowed_visibility_level?(form_model, level)      return false unless form_model.respond_to?(:visibility_level_allowed?) +      !form_model.visibility_level_allowed?(level)    end  | 
