+ def element_icon(type, object)
+ selected_icon_data = { :filename => "#{type}.svg", :priority => 1 }
+
+ unless object.redacted?
+ target_tags = object.tags.find_all { |k, _v| BROWSE_ICONS.key? k }.sort
+ title = target_tags.map { |k, v| "#{k}=#{v}" }.to_sentence unless target_tags.empty?
+
+ target_tags.each do |k, v|
+ icon_data = BROWSE_ICONS[k][v] || BROWSE_ICONS[k][:*]
+ selected_icon_data = icon_data if icon_data && icon_data[:priority] > selected_icon_data[:priority]
+ end
+ end
+
+ image_tag "browse/#{selected_icon_data[:filename]}",
+ :size => 20,
+ :class => ["align-bottom object-fit-none browse-icon", { "browse-icon-invertible" => selected_icon_data[:invert] }],
+ :title => title
+ end
+
+ def element_single_current_link(type, object)
+ link_to object, { :rel => (link_follow(object) if type == "node") } do
+ element_strikethrough object do
+ printable_element_name object
+ end
+ end
+ end
+
+ def element_list_item(type, object, &)
+ tag.li(tag.div(element_icon(type, object) + tag.div(:class => "align-self-center", &), :class => "d-flex gap-1"))
+ end
+
+ def element_list_item_with_strikethrough(type, object, &)
+ element_list_item type, object do
+ element_strikethrough object, &
+ end
+ end
+
+ def printable_element_name(object)