3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
# File 'app/helpers/rails_pulse/breadcrumbs_helper.rb', line 3
def breadcrumbs
mount_segments = RailsPulse::Engine.routes.find_script_name({}).split("/").reject(&:empty?)
path_segments = request.path.split("/").reject(&:empty?)
mount_end_index = nil
(0..path_segments.length - mount_segments.length).each do |i|
if path_segments[i, mount_segments.length] == mount_segments
mount_end_index = i + mount_segments.length - 1
break
end
end
return [] if mount_end_index.nil? || mount_end_index == path_segments.length - 1
path_segments = path_segments[(mount_end_index + 1)..-1]
engine_root = "/" + mount_segments.join("/")
crumbs = [ {
title: "Home",
path: engine_root,
current: path_segments.empty?
} ]
return crumbs if path_segments.empty?
current_path = engine_root
path_segments.each_with_index do |segment, index|
current_path += "/#{segment}"
title = if segment =~ /^\d+$/
resource_name = path_segments[index - 1]&.singularize
resource_class = "RailsPulse::#{resource_name&.classify}".safe_constantize
if resource_class
resource = resource_class.find(segment)
resource.try(:to_breadcrumb) || resource.to_s
else
segment
end
else
segment.titleize
end
is_last = index == path_segments.length - 1
breadcrumb_path = if !is_last &&
segment !~ /^\d+$/ &&
index > 0 &&
path_segments[index - 1] =~ /^\d+$/ &&
path_segments[index + 1] =~ /^\d+$/
path_segments[0..index-1].inject(engine_root) { |path, seg| path + "/#{seg}" }
else
current_path
end
crumbs << {
title: title,
path: breadcrumb_path,
current: is_last
}
end
crumbs
end
|