Class: ArMenuRenderer
- Inherits:
-
Object
- Object
- ArMenuRenderer
- 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
-
#default ⇒ Object
Creates default menu.
-
#find_selected ⇒ Object
Return selected topmenu level.
-
#initialize(env, opts) ⇒ ArMenuRenderer
constructor
Object initialization.
-
#link_4menu(item, prepend) ⇒ Object
Returns html code required to create single link in a menu.
-
#link_for_edit(opts) ⇒ Object
Creates edit link if in edit mode.
-
#menu_do ⇒ Object
Creates HTML code required for submenu on single level.
-
#render_css ⇒ Object
Return CSS part of code.
-
#render_html ⇒ Object
Renderer dispatcher.
-
#submenu_do(items, env, prepend) ⇒ Object
Creates HTML code required for submenu on single level.
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.) @opts = opts self end |
Instance Method Details
#default ⇒ Object
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#{()}\n</nav>) end |
#find_selected ⇒ Object
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. = @env.page. = @env.page..split(';')[1] if @env.page..match(';') ret = @menu..find() end # return first if not found (something is wrong) ret || @menu.[0] end |
#link_4menu(item, prepend) ⇒ Object
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 (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 |
#link_for_edit(opts) ⇒ Object
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 |
#menu_do ⇒ Object
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 html = '<ul>' if @opts[:edit_mode] > 1 = { table: :ar_menu, title: @menu.name, id: @menu.id } html += link_for_edit() 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}">#{(item, [])}\n) # SUBMENUS if = @menu_items[item.id] html += (, item, []) end html += '</li>' end html += '</ul>' end |
#render_css ⇒ Object
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_html ⇒ Object
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 |
#submenu_do(items, env, prepend) ⇒ Object
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 (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 = { table: 'ar_menu;ar_menu_item', form_name: :ar_menu_item, id: item.id, ids: "#{@menu.id};#{env.id}" } html += link_for_edit() end prepend_path = item.prepend_path ? prepend + [env.link] : [] html += %(<li>#{(item, prepend_path)}\n) if = @menu_items[item.id] html += (, item, prepend_path) end html += '</li>' end html += '</ul>' end |