Improve custom menu items integration for better performance

This commit is contained in:
Alexander Meindl 2018-12-14 08:52:18 +01:00
parent 3b6bbee8b5
commit dbbadbefaf
5 changed files with 58 additions and 32 deletions

View File

@ -1,6 +1,11 @@
Changelog
=========
2.0.18
++++++
- Performance improvement (#36)
2.0.17
++++++

View File

@ -1,6 +1,6 @@
module AdditionalsMenuHelper
def additionals_top_menu_setup
return unless User.current.try(:hrm_user_type_id).nil?
return if Additionals::REDMINE_HRM_SUPPORT
if Additionals.setting?(:remove_mypage)
Redmine::MenuManager.map(:top_menu).delete(:my_page) if Redmine::MenuManager.map(:top_menu).exists?(:my_page)
@ -51,19 +51,43 @@ module AdditionalsMenuHelper
Redmine::MenuManager.map(:top_menu).push(menu_name, item[:url], menu_options)
end
def additionals_custom_top_menu_item(num, user_roles)
menu_name = 'custom_menu' + num.to_s
item = {
url: Additionals.settings[menu_name + '_url'],
name: Additionals.settings[menu_name + '_name'],
title: Additionals.settings[menu_name + '_title'],
roles: Additionals.settings[menu_name + '_roles']
}
if item[:name].blank? || item[:url].blank? || item[:roles].nil?
Redmine::MenuManager.map(:top_menu).delete(menu_name.to_sym) if Redmine::MenuManager.map(:top_menu).exists?(menu_name.to_sym)
return
def render_custom_top_menu_item
items = additionals_build_custom_items
return if items.empty?
user_roles = Role.givable
.joins(:members).where(members: { user_id: User.current.id })
.joins(members: :project).where(projects: { status: Project::STATUS_ACTIVE })
.distinct
.reorder(nil)
.pluck(:id)
items.each do |item|
additionals_custom_top_menu_item(item, user_roles)
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,
url: Additionals.settings[menu_name + '_url'],
name: Additionals.settings[menu_name + '_name'],
title: Additionals.settings[menu_name + '_title'],
roles: Additionals.settings[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
def additionals_custom_top_menu_item(item, user_roles)
show_entry = false
item[:roles].each do |role|
if user_roles.empty? && role.to_i == Role::BUILTIN_ANONYMOUS
@ -77,7 +101,7 @@ module AdditionalsMenuHelper
end
user_roles.each do |user_role|
if role.to_i == user_role.id.to_i
if role.to_i == user_role
show_entry = true
break
end
@ -86,9 +110,9 @@ module AdditionalsMenuHelper
end
if show_entry
handle_top_menu_item(menu_name, item)
elsif Redmine::MenuManager.map(:top_menu).exists?(menu_name.to_sym)
Redmine::MenuManager.map(:top_menu).delete(menu_name.to_sym)
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])
end
end

View File

@ -5,7 +5,5 @@
= javascript_include_tag('noreferrer', plugin: 'additionals')
= additionals_library_load(:font_awesome)
= stylesheet_link_tag 'additionals', plugin: 'additionals'
- if User.current.try(:hrm_user_type_id).nil?
- user_roles = User.current.memberships.includes(:project).collect(&:roles).flatten.uniq
- Additionals::MAX_CUSTOM_MENU_ITEMS.times do |i|
- additionals_custom_top_menu_item(i, user_roles)
- unless Additionals::REDMINE_HRM_SUPPORT
- render_custom_top_menu_item

View File

@ -3,6 +3,7 @@ module Additionals
SELECT2_INIT_ENTRIES = 20
LIST_SEPARATOR = ' &#187; '.html_safe # rubocop:disable Rails/OutputSafety
REDMINE_HRM_SUPPORT = Redmine::Plugin.installed?('redmine_hrm') ? true : false
class << self
def setup

View File

@ -37,18 +37,16 @@ module Additionals
end
def additionals_settings_tabs
tabs = []
tabs << { name: 'general', partial: 'additionals/settings/general', label: :label_general }
tabs << { name: 'content', partial: 'additionals/settings/overview', label: :label_overview_page }
tabs << { name: 'wiki', partial: 'additionals/settings/wiki', label: :label_wiki }
tabs << { name: 'macros', partial: 'additionals/settings/macros', label: :label_macro_plural }
tabs << { name: 'rules', partial: 'additionals/settings/issues', label: :label_issue_plural }
tabs << { name: 'projects', partial: 'additionals/settings/projects', label: :label_project_plural }
tabs << { name: 'users', partial: 'additionals/settings/users', label: :label_user_plural }
if User.current.try(:hrm_user_type_id).nil?
tabs << { name: 'menu', partial: 'additionals/settings/menu', label: :label_settings_menu }
end
tabs << { name: 'web', partial: 'additionals/settings/web_apis', label: :label_web_apis }
tabs = [{ name: 'general', partial: 'additionals/settings/general', label: :label_general },
{ name: 'content', partial: 'additionals/settings/overview', label: :label_overview_page },
{ name: 'wiki', partial: 'additionals/settings/wiki', label: :label_wiki },
{ name: 'macros', partial: 'additionals/settings/macros', label: :label_macro_plural },
{ name: 'rules', partial: 'additionals/settings/issues', label: :label_issue_plural },
{ name: 'projects', partial: 'additionals/settings/projects', label: :label_project_plural },
{ name: 'users', partial: 'additionals/settings/users', label: :label_user_plural },
{ name: 'web', partial: 'additionals/settings/web_apis', label: :label_web_apis }]
tabs << { name: 'menu', partial: 'additionals/settings/menu', label: :label_settings_menu } unless Additionals::REDMINE_HRM_SUPPORT
tabs
end