PageRenderTime 45ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/app/helpers/icons_helper.rb

https://gitlab.com/klml/gitlab-ee
Ruby | 168 lines | 132 code | 27 blank | 9 comment | 12 complexity | 857a653eeca94a746fb73fbdae1278fc MD5 | raw file
  1. # frozen_string_literal: true
  2. require 'json'
  3. module IconsHelper
  4. extend self
  5. DEFAULT_ICON_SIZE = 16
  6. def custom_icon(icon_name, size: DEFAULT_ICON_SIZE)
  7. memoized_icon("#{icon_name}_#{size}") do
  8. # We can't simply do the below, because there are some .erb SVGs.
  9. # File.read(Rails.root.join("app/views/shared/icons/_#{icon_name}.svg")).html_safe
  10. render "shared/icons/#{icon_name}.svg", size: size
  11. end
  12. end
  13. def sprite_icon_path
  14. @sprite_icon_path ||= begin
  15. # SVG Sprites currently don't work across domains, so in the case of a CDN
  16. # we have to set the current path deliberately to prevent addition of asset_host
  17. sprite_base_url = Gitlab.config.gitlab.url if ActionController::Base.asset_host
  18. ActionController::Base.helpers.image_path('icons.svg', host: sprite_base_url)
  19. end
  20. end
  21. def sprite_file_icons_path
  22. # SVG Sprites currently don't work across domains, so in the case of a CDN
  23. # we have to set the current path deliberately to prevent addition of asset_host
  24. sprite_base_url = Gitlab.config.gitlab.url if ActionController::Base.asset_host
  25. ActionController::Base.helpers.image_path('file_icons.svg', host: sprite_base_url)
  26. end
  27. def sprite_icon(icon_name, size: DEFAULT_ICON_SIZE, css_class: nil)
  28. memoized_icon("#{icon_name}_#{size}_#{css_class}") do
  29. if known_sprites&.exclude?(icon_name)
  30. exception = ArgumentError.new("#{icon_name} is not a known icon in @gitlab-org/gitlab-svg")
  31. Gitlab::ErrorTracking.track_and_raise_for_dev_exception(exception)
  32. end
  33. css_classes = []
  34. css_classes << "s#{size}" if size
  35. css_classes << "#{css_class}" unless css_class.blank?
  36. content_tag(
  37. :svg,
  38. content_tag(:use, '', { 'xlink:href' => "#{sprite_icon_path}##{icon_name}" } ),
  39. class: css_classes.empty? ? nil : css_classes.join(' '),
  40. data: { testid: "#{icon_name}-icon" }
  41. )
  42. end
  43. end
  44. def loading_icon(container: false, color: 'orange', size: 'sm', css_class: nil)
  45. css_classes = ['gl-spinner', "gl-spinner-#{color}", "gl-spinner-#{size}"]
  46. css_classes << "#{css_class}" unless css_class.blank?
  47. spinner = content_tag(:span, "", { class: css_classes.join(' '), aria: { label: _('Loading') } })
  48. container == true ? content_tag(:div, spinner, { class: 'gl-spinner-container' }) : spinner
  49. end
  50. def external_snippet_icon(name)
  51. content_tag(:span, "", class: "gl-snippet-icon gl-snippet-icon-#{name}")
  52. end
  53. def audit_icon(name, css_class: nil)
  54. case name
  55. when "standard"
  56. name = "key"
  57. when "two-factor"
  58. name = "key"
  59. when "google_oauth2"
  60. name = "google"
  61. end
  62. sprite_icon(name, css_class: css_class)
  63. end
  64. def boolean_to_icon(value)
  65. if value
  66. sprite_icon('check', css_class: 'gl-text-green-500')
  67. else
  68. sprite_icon('power', css_class: 'gl-text-gray-500')
  69. end
  70. end
  71. def visibility_level_icon(level, options: {})
  72. name =
  73. case level
  74. when Gitlab::VisibilityLevel::PRIVATE
  75. 'lock'
  76. when Gitlab::VisibilityLevel::INTERNAL
  77. 'shield'
  78. else # Gitlab::VisibilityLevel::PUBLIC
  79. 'earth'
  80. end
  81. css_class = options.delete(:class)
  82. sprite_icon(name, size: DEFAULT_ICON_SIZE, css_class: css_class)
  83. end
  84. def file_type_icon_class(type, mode, name)
  85. if type == 'folder'
  86. icon_class = 'folder-o'
  87. elsif type == 'archive'
  88. icon_class = 'archive'
  89. elsif mode == '120000'
  90. icon_class = 'share'
  91. else
  92. # Guess which icon to choose based on file extension.
  93. # If you think a file extension is missing, feel free to add it on PR
  94. case File.extname(name).downcase
  95. when '.pdf'
  96. icon_class = 'document'
  97. when '.jpg', '.jpeg', '.jif', '.jfif',
  98. '.jp2', '.jpx', '.j2k', '.j2c',
  99. '.apng', '.png', '.gif', '.tif', '.tiff',
  100. '.svg', '.ico', '.bmp', '.webp'
  101. icon_class = 'doc-image'
  102. when '.zip', '.zipx', '.tar', '.gz', '.gzip', '.tgz', '.bz', '.bzip',
  103. '.bz2', '.bzip2', '.car', '.tbz', '.xz', 'txz', '.rar', '.7z',
  104. '.lz', '.lzma', '.tlz'
  105. icon_class = 'doc-compressed'
  106. when '.mp3', '.wma', '.ogg', '.oga', '.wav', '.flac', '.aac', '.3ga',
  107. '.ac3', '.midi', '.m4a', '.ape', '.mpa'
  108. icon_class = 'volume-up'
  109. when '.mp4', '.m4p', '.m4v',
  110. '.mpg', '.mp2', '.mpeg', '.mpe', '.mpv',
  111. '.mpg', '.mpeg', '.m2v', '.m2ts',
  112. '.avi', '.mkv', '.flv', '.ogv', '.mov',
  113. '.3gp', '.3g2'
  114. icon_class = 'live-preview'
  115. when '.doc', '.dot', '.docx', '.docm', '.dotx', '.dotm', '.docb',
  116. '.odt', '.ott', '.uot', '.rtf'
  117. icon_class = 'doc-text'
  118. when '.xls', '.xlt', '.xlm', '.xlsx', '.xlsm', '.xltx', '.xltm',
  119. '.xlsb', '.xla', '.xlam', '.xll', '.xlw', '.ots', '.ods', '.uos'
  120. icon_class = 'document'
  121. when '.ppt', '.pot', '.pps', '.pptx', '.pptm', '.potx', '.potm',
  122. '.ppam', '.ppsx', '.ppsm', '.sldx', '.sldm', '.odp', '.otp', '.uop'
  123. icon_class = 'doc-chart'
  124. else
  125. icon_class = 'doc-text'
  126. end
  127. end
  128. icon_class
  129. end
  130. private
  131. def known_sprites
  132. return if Rails.env.production?
  133. @known_sprites ||= Gitlab::Json.parse(File.read(Rails.root.join('node_modules/@gitlab/svgs/dist/icons.json')))['icons']
  134. end
  135. def memoized_icon(key)
  136. @rendered_icons ||= {}
  137. @rendered_icons[key] || (
  138. @rendered_icons[key] = yield
  139. )
  140. end
  141. end