Class: ArMenuRenderer

Inherits:
Object
  • Object
show all
Includes:
AgileApplicationHelper, AgileCommonHelper
Defined in:
app/renderers/ar_menu_renderer.rb

Overview

Default menu renderer from ar_menus table. Renderer produces output for rendering menu with (theoretically) infinite level of sub menus. In practice reasonable maximum level of 4 is advised.

Example (as used in design):

agile_render(:ar_menu, name: 'my_menu')
# when :name option is omitted it will use site document's field menu_name.
agile_render(:ar_menu)

Instance Attribute Summary

Attributes included from AgileApplicationHelper

#design, #footer_record, #form, #ids, #json_ld, #menu, #menu_item, #options, #page, #page_title, #part, #parts, #record, #site, #tables

Instance Method Summary collapse

Methods included from AgileCommonHelper

agile_choices_for_field, #agile_format_date_time, #agile_format_number, #agile_help_body, #agile_help_button, #agile_help_fields, #agile_help_for_tab, #agile_icon_for_boolean, #agile_name_for_id, #agile_steps_menu_get, #agile_text_for_value, #t, #t_label_for_column, #t_label_for_field, #t_table_name, #url_forward_params

Methods included from AgileApplicationHelper

#_agile_link_to, #_origin, #agile_add2_record_cookie, #agile_add_json_ld, #agile_add_meta_tag, #agile_ajax_link_to, #agile_application_menu, #agile_big_table_choices, #agile_big_table_name_for_value, #agile_choices_for, #agile_choices_for_all_tables, #agile_choices_for_folders, #agile_choices_for_menu, #agile_choices_for_site_policies, #agile_deprecate, #agile_dialog_title, #agile_dont?, #agile_edit_frame, #agile_edit_mode?, #agile_edit_title, #agile_error_messages_for, #agile_flash_messages, #agile_get_json_ld, #agile_get_seo_meta_tags, #agile_get_site, #agile_icon_for_link, #agile_img_alt, #agile_img_alt_tag, #agile_internal_var, #agile_limit_string, #agile_link_for_create, #agile_link_for_edit, #agile_link_for_edit1, #agile_link_menu_tag, #agile_link_to, #agile_menu_class, #agile_new_title, #agile_page_bottom, #agile_page_class, #agile_page_edit_menu, #agile_page_top, #agile_render, #agile_render_part, #agile_submit_tag, #agile_user_can_view, #agile_user_has_role?, #agile_warning_messages_for, #decamelize_type

Constructor Details

#initialize(env, opts) ⇒ ArMenuRenderer

Object initialization. Will also prepare menu record.



42
43
44
45
46
47
# File 'app/renderers/ar_menu_renderer.rb', line 42

def initialize( env, opts ) #:nodoc:
  @env  = env
  @menu = opts[:name] ? ArMenu.find_by(name: opts[:name].to_s) : ArMenu.find(@env.site.menu_id)
  @opts = opts
  self
end

Instance Method Details

#defaultObject

Creates default menu.



172
173
174
175
176
177
178
# File 'app/renderers/ar_menu_renderer.rb', line 172

def default
  return "(#{@opts[:name]}) menu not found!" if @menu.nil?

  #@selected = find_selected
  div_name = @menu.div_name.blank? ? 'ar-menu' : @menu.div_name
  %(<nav class="#{div_name}">\n#{menu_do()}\n</nav>)
end

#find_selectedObject

Return selected topmenu level.



52
53
54
55
56
57
58
59
60
# File 'app/renderers/ar_menu_renderer.rb', line 52

def find_selected
  if @env.page.menu_id
    top_menu_id = @env.page.menu_id
    top_menu_id = @env.page.menu_id.split(';')[1] if @env.page.menu_id.match(';')
    ret = @menu.ar_menu_items.find(top_menu_id)
  end
  # return first if not found (something is wrong)
  ret || @menu.ar_menu_items[0]
end

Returns html code required to create single link in a menu. Subroutine of do_menu_level.



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'app/renderers/ar_menu_renderer.rb', line 78

def link_4menu(item, prepend)
  link = if item.link_to.present?
              item.link_to
            else
              '/' + (prepend + [item.link.delete_prefix('/')]).join('/')
            end
  target = item.target.blank? ? nil : item.target
  # - in first place won't write caption text
  caption   = item.caption[0] == '-' ? '' : @env.t(item.caption)
  img_title = item.caption.to_s.sub('-', '')
  # add picture if picture is not blank
  html = ''
  if item.picture.present?
    if item.picture[0, 3] == 'mi-'
      # position is delimited with comma
      icon, position = item.picture.split(',')
      caption = if position.to_s == 'right'
                  caption + @env.mi_icon(icon[3..])
                else
                  @env.mi_icon(icon[3..]) + caption
                end
    else
      return @env.link_to( @env.image_tag(item.picture), link, { title: img_title, target: target } ) rescue 'ERROR!'
    end
  end
  html = html + @env.link_to(caption.html_safe, link, { target: target} ) if caption.present?
  html
end

Creates edit link if in edit mode.



65
66
67
68
69
70
71
72
73
# File 'app/renderers/ar_menu_renderer.rb', line 65

def link_for_edit(opts) #:nodoc:
  return '' unless @opts[:edit_mode] > 1

  opts.merge!( { controller: :agile, action: :edit } )
  title = "#{t('agile.edit')}: "
  opts[:title] = "#{title} #{opts[:title]}"

  "<li>#{agile_link_for_edit(opts)}</li>\n"
end

Creates HTML code required for submenu on single level. Subroutine of default.



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'app/renderers/ar_menu_renderer.rb', line 136

def menu_do
  html = '<ul>'
  if @opts[:edit_mode] > 1
    options = { table: :ar_menu, title: @menu.name, id: @menu.id }
    html += link_for_edit(options)
  end
  # read menu into hash
  @menu_items  = {}
  ArMenuItem.where(ar_menu_id: @menu.id, active: :true).each do |item|
    @menu_items[item.parent_id] ||= []
    @menu_items[item.parent_id] << item
  end
  return '' if @menu_items.size == 0

  @menu_items[0].sort_by(&:order).each do |item|
    next if item.hidden

    # menu can be hidden from user
    can_view, msg = agile_user_can_view(@env, item)
    next unless can_view

    selected = 'selected' if @opts[:path]&.first == item.link
    html += %(<li class="#{selected}">#{link_4menu(item, [])}\n)

    # SUBMENUS
    if sub_menus = @menu_items[item.id]
      html += submenu_do(sub_menus, item, [])
    end
    html += '</li>'
  end
  html += '</ul>'
end

#render_cssObject

Return CSS part of code.



191
192
193
# File 'app/renderers/ar_menu_renderer.rb', line 191

def render_css
  @menu.css if @menu
end

#render_htmlObject

Renderer dispatcher. Method returns HTML part of code.



183
184
185
186
# File 'app/renderers/ar_menu_renderer.rb', line 183

def render_html
  method = @opts[:method] || 'default'
  respond_to?(method) ? send(method) : "Error ArMenu: Method #{method} doesn't exist!"
end

Creates HTML code required for submenu on single level. Subroutine of default.



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'app/renderers/ar_menu_renderer.rb', line 110

def submenu_do(items, env, prepend)
  html = '<ul>'
  items.sort_by(&:order).each do |item|
    next if item.hidden

    can_view, msg = agile_user_can_view(@env, item)
    next unless can_view

    if @opts[:edit_mode] > 1
      options = { table: 'ar_menu;ar_menu_item', form_name: :ar_menu_item, id: item.id, ids: "#{@menu.id};#{env.id}" }
      html += link_for_edit(options)
    end

    prepend_path = item.prepend_path ? prepend + [env.link] : []
    html += %(<li>#{link_4menu(item, prepend_path)}\n)
    if sub_menus = @menu_items[item.id]
      html += submenu_do(sub_menus, item, prepend_path)
    end
    html += '</li>'
  end
  html += '</ul>'
end