additionals/app/helpers/additionals_menu_helper.rb

225 lines
8.6 KiB
Ruby
Raw Normal View History

2018-09-12 17:04:39 +03:00
module AdditionalsMenuHelper
2018-09-12 21:42:36 +03:00
def additionals_top_menu_setup
2020-09-17 08:22:08 +03:00
return if Redmine::Plugin.installed? 'redmine_hrm'
2018-09-12 21:42:36 +03:00
2020-08-06 09:18:30 +03:00
if Additionals.setting? :remove_mypage
2018-09-12 21:42:36 +03:00
Redmine::MenuManager.map(:top_menu).delete(:my_page) if Redmine::MenuManager.map(:top_menu).exists?(:my_page)
else
handle_top_menu_item(:my_page, { url: my_page_path, after: :home, if: proc { User.current.logged? } })
2018-09-12 21:42:36 +03:00
end
2020-08-06 09:18:30 +03:00
if Additionals.setting? :remove_help
2018-09-12 21:42:36 +03:00
Redmine::MenuManager.map(:top_menu).delete(:help) if Redmine::MenuManager.map(:top_menu).exists?(:help)
elsif User.current.logged?
handle_top_submenu_item :help, url: '#', symbol: 'fas_question', last: true
2018-09-12 21:42:36 +03:00
@additionals_help_items = additionals_help_menu_items
else
handle_top_menu_item :help, url: Redmine::Info.help_url, symbol: 'fas_question', last: true
2018-09-12 21:42:36 +03:00
end
end
def handle_top_submenu_item(menu_name, item)
handle_top_menu_item menu_name, item, with_submenu: true
end
def handle_top_menu_item(menu_name, item, with_submenu: false)
2018-09-12 17:04:39 +03:00
Redmine::MenuManager.map(:top_menu).delete(menu_name.to_sym) if Redmine::MenuManager.map(:top_menu).exists?(menu_name.to_sym)
html_options = {}
css_classes = []
css_classes << 'top-submenu' if with_submenu
css_classes << 'external' if item[:url].include? '://'
html_options[:class] = css_classes.join(' ') if css_classes.present?
2018-09-12 17:04:39 +03:00
html_options[:title] = item[:title] if item[:title].present?
menu_options = { parent: item[:parent].present? ? item[:parent].to_sym : nil,
html: html_options }
menu_options[:if] = menu_options[:if] if menu_options[:if].present?
menu_options[:caption] = if item[:symbol].present? && item[:name].present?
font_awesome_icon(item[:symbol], post_text: item[:name])
elsif item[:symbol].present?
font_awesome_icon(item[:symbol])
elsif item[:name].present?
item[:name].to_s
end
if item[:last].present? && item[:last]
menu_options[:last] = true
elsif item[:before].present?
menu_options[:before] = item[:before]
elsif item[:after].present?
menu_options[:after] = item[:after]
else
menu_options[:before] = :help
end
2020-08-06 09:18:30 +03:00
Redmine::MenuManager.map(:top_menu).push menu_name, item[:url], menu_options
2018-09-12 17:04:39 +03:00
end
def render_custom_top_menu_item
items = additionals_build_custom_items
return if items.empty?
user_roles = Role.givable
2020-09-22 11:58:48 +03:00
.joins(members: :project)
.where(members: { user_id: User.current.id },
projects: { status: Project::STATUS_ACTIVE })
.distinct
.reorder(nil)
2020-07-27 11:49:23 +03:00
.ids
items.each do |item|
2020-08-06 09:18:30 +03:00
additionals_custom_top_menu_item item, user_roles
2018-09-12 17:04:39 +03:00
end
end
def additionals_build_custom_items
items = []
Additionals::MAX_CUSTOM_MENU_ITEMS.times do |num|
menu_name = "custom_menu#{num}"
item = { menu_name: menu_name.to_sym,
2020-08-06 09:18:30 +03:00
url: Additionals.setting("#{menu_name}_url"),
name: Additionals.setting("#{menu_name}_name"),
title: Additionals.setting("#{menu_name}_title"),
roles: Additionals.setting("#{menu_name}_roles") }
if item[:name].present? && item[:url].present? && item[:roles].present?
items << item
elsif Redmine::MenuManager.map(:top_menu).exists?(item[:menu_name])
Redmine::MenuManager.map(:top_menu).delete(item[:menu_name])
end
end
items
end
2018-09-12 17:04:39 +03:00
def additionals_custom_top_menu_item(item, user_roles)
2018-09-12 17:04:39 +03:00
show_entry = false
item[:roles].each do |role|
2020-11-12 19:15:15 +03:00
if user_roles.empty? && role.to_i == Role::BUILTIN_ANONYMOUS ||
# if user is logged in and non_member is active in item, always show it
User.current.logged? && role.to_i == Role::BUILTIN_NON_MEMBER
2018-09-12 17:04:39 +03:00
show_entry = true
break
end
user_roles.each do |user_role|
if role.to_i == user_role
2018-09-12 17:04:39 +03:00
show_entry = true
break
end
end
break if show_entry == true
end
if show_entry
2020-09-02 14:40:05 +03:00
handle_top_menu_item item[:menu_name], item
elsif Redmine::MenuManager.map(:top_menu).exists?(item[:menu_name])
Redmine::MenuManager.map(:top_menu).delete(item[:menu_name])
2018-09-12 17:04:39 +03:00
end
end
def addtionals_help_plugin_items
user_items = [{ title: 'Redmine Guide', url: Redmine::Info.help_url },
2020-08-08 19:44:40 +03:00
{ title: "Redmine #{l :label_macro_plural}", url: additionals_macros_path }]
admin_items = [{ title: 'Additionals',
url: 'https://additionals.readthedocs.io/en/latest/manual/', manual: true },
{ title: 'Redmine Changelog',
url: "https://www.redmine.org/projects/redmine/wiki/Changelog_#{Redmine::VERSION::MAJOR}_#{Redmine::VERSION::MINOR}" },
{ title: 'Redmine Upgrade',
url: 'https://www.redmine.org/projects/redmine/wiki/RedmineUpgrade' },
{ title: 'Redmine Security Advisories',
url: 'https://www.redmine.org/projects/redmine/wiki/Security_Advisories' }]
Redmine::Plugin.all.each do |plugin|
next if plugin.id == :additionals
2018-09-14 18:55:25 +03:00
plugin_item_base = nil
begin
2018-09-14 18:55:25 +03:00
plugin_item_base = plugin.id.to_s.camelize.constantize
rescue LoadError
Rails.logger.debug "Ignore plugin #{plugin.id} for help integration"
rescue StandardError => e
raise e unless e.class.to_s == 'NameError'
end
2018-09-14 18:55:25 +03:00
plugin_item = plugin_item_base.try(:additionals_help_items) unless plugin_item_base.nil?
plugin_item = additionals_help_items_fallbacks(plugin.id) if plugin_item.nil?
2018-09-14 18:55:25 +03:00
next if plugin_item.nil?
plugin_item.each do |temp_item|
u_items = if !temp_item[:manual].nil? && temp_item[:manual]
2020-08-08 19:44:40 +03:00
{ title: "#{temp_item[:title]} #{l :label_help_manual}", url: temp_item[:url] }
2018-09-14 18:55:25 +03:00
else
{ title: temp_item[:title], url: temp_item[:url] }
end
if !temp_item[:admin].nil? && temp_item[:admin]
admin_items << u_items
else
user_items << u_items
end
end
end
{ user: user_items, admin: admin_items }
end
2018-09-12 17:04:39 +03:00
def additionals_help_menu_items
plugin_items = addtionals_help_plugin_items
pages = plugin_items[:user].sort_by { |k| k[:title] }
2018-09-12 17:04:39 +03:00
if User.current.admin?
pages << { title: '-' }
pages += plugin_items[:admin].sort_by { |k| k[:title] }
2018-09-12 17:04:39 +03:00
end
s = []
2018-09-12 17:21:31 +03:00
pages.each_with_index do |item, idx|
s << if item[:title] == '-'
2020-08-09 11:11:52 +03:00
tag.li tag.hr
else
2020-08-06 09:18:30 +03:00
html_options = { class: "help_item_#{idx}" }
if item[:url].include? '://'
html_options[:class] << ' external'
html_options[:target] = '_blank'
end
2020-07-27 11:49:23 +03:00
tag.li(link_to(item[:title], item[:url], html_options))
end
2018-09-12 17:04:39 +03:00
end
2020-08-09 11:11:52 +03:00
safe_join s
2018-09-12 17:04:39 +03:00
end
# Plugin help items definition for plugins,
# which do not have additionals_help_menu_items integration
def additionals_help_items_fallbacks(plugin_id)
2018-12-02 10:35:44 +03:00
plugins = { redmine_wiki_lists: [{ title: 'Wiki Lists Macros',
url: 'https://www.r-labs.org/projects/wiki_lists/wiki/Wiki_Lists_en' }],
redmine_wiki_extensions: [{ title: 'Wiki Extensions',
2018-09-14 18:55:25 +03:00
url: 'https://www.r-labs.org/projects/r-labs/wiki/Wiki_Extensions_en' }],
redmine_git_hosting: [{ title: 'Redmine Git Hosting',
url: 'http://redmine-git-hosting.io/get_started/',
admin: true }],
redmine_contacts: [{ title: 'Redmine CRM',
2018-09-14 18:55:25 +03:00
url: 'https://www.redmineup.com/pages/help/crm',
admin: true }],
redmine_contacts_helpdesk: [{ title: 'Redmine Helpdesk',
2018-09-14 18:55:25 +03:00
url: 'https://www.redmineup.com/pages/help/helpdesk',
admin: true }],
redmine_ldap_sync: [{ title: 'Redmine LDAP',
2018-09-14 18:55:25 +03:00
url: 'https://www.redmine.org/projects/redmine/wiki/RedmineLDAP',
admin: true },
{ title: 'Redmine LDAP Sync',
2018-09-14 18:55:25 +03:00
url: 'https://github.com/thorin/redmine_ldap_sync/blob/master/README.md',
admin: true }] }
plugins[plugin_id]
end
2018-09-12 17:04:39 +03:00
end