Skip to content

Commit f37c709

Browse files
committed
fix: update documentation page slugs to use correct path format and enhance sidebar navigation association
1 parent 7bc587e commit f37c709

File tree

2 files changed

+54
-15
lines changed

2 files changed

+54
-15
lines changed

app/builders/better_together/navigation_builder.rb

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,7 @@ def create_documentation_navigation_item(area, entry, position, parent: nil) # r
656656
if entry[:type] == :directory
657657
attributes[:item_type] = 'dropdown'
658658
if entry[:default_path].present?
659-
attributes[:linkable] = documentation_page_for(entry[:title], entry[:default_path])
659+
attributes[:linkable] = documentation_page_for(entry[:title], entry[:default_path], area)
660660
else
661661
attributes[:url] = '#'
662662
end
@@ -666,7 +666,7 @@ def create_documentation_navigation_item(area, entry, position, parent: nil) # r
666666
end
667667
else
668668
attributes[:item_type] = 'link'
669-
attributes[:linkable] = documentation_page_for(entry[:title], entry[:path])
669+
attributes[:linkable] = documentation_page_for(entry[:title], entry[:path], area)
670670
create_documentation_item_with_context(area, attributes)
671671
end
672672
end
@@ -693,9 +693,9 @@ def create_documentation_item_with_context(area, attributes)
693693
raise ActiveRecord::RecordInvalid.new(e.record), "#{e.message} -- #{attributes.inspect}"
694694
end
695695

696-
def documentation_page_for(title, relative_path)
696+
def documentation_page_for(title, relative_path, sidebar_nav_area = nil)
697697
slug = documentation_slug(relative_path)
698-
attrs = documentation_page_attributes(title, slug, relative_path)
698+
attrs = documentation_page_attributes(title, slug, relative_path, sidebar_nav_area)
699699
page = ::BetterTogether::Page.i18n.find_by(slug: slug)
700700

701701
if page
@@ -704,16 +704,22 @@ def documentation_page_for(title, relative_path)
704704
locked_page.reload
705705
locked_page.assign_attributes(attrs)
706706
locked_page.save!
707+
# Re-set the slug after save in case FriendlyId regenerated it
708+
locked_page.update_columns(slug: slug) if locked_page.slug != slug
707709
locked_page
708710
else
709-
::BetterTogether::Page.create!(attrs)
711+
new_page = ::BetterTogether::Page.create!(attrs)
712+
# Re-set the slug after creation in case FriendlyId regenerated it
713+
new_page.slug = slug if new_page.slug != slug
714+
new_page.save!(validate: false) if new_page.changed?
715+
new_page
710716
end
711717
end
712718

713-
def documentation_page_attributes(title, slug, relative_path) # rubocop:todo Metrics/MethodLength
714-
{
719+
def documentation_page_attributes(title, slug, relative_path, sidebar_nav_area = nil) # rubocop:todo Metrics/MethodLength
720+
attrs = {
715721
title_en: title,
716-
slug_en: slug,
722+
slug_en: slug, # Set slug directly via Mobility to bypass FriendlyId normalization
717723
published_at: Time.zone.now,
718724
privacy: 'public',
719725
protected: true,
@@ -727,13 +733,19 @@ def documentation_page_attributes(title, slug, relative_path) # rubocop:todo Met
727733
}
728734
]
729735
}
736+
737+
# Associate the documentation navigation area as the sidebar nav
738+
attrs[:sidebar_nav] = sidebar_nav_area if sidebar_nav_area.present?
739+
740+
attrs
730741
end
731742

732743
def documentation_slug(path)
733744
relative = path.is_a?(Pathname) ? documentation_relative_path(path) : path.to_s
734-
base_slug = relative.sub(/\.md\z/i, '').tr('/', '-').parameterize
735-
base_slug = 'docs' if base_slug.blank?
736-
"docs-#{base_slug}"
745+
# Remove .md extension, downcase, and preserve directory structure with slashes
746+
base_slug = relative.sub(/\.md\z/i, '').downcase.tr('_', '-')
747+
base_slug = 'overview' if base_slug.blank?
748+
"docs/#{base_slug}"
737749
end
738750

739751
def documentation_file_path(relative_path)

spec/builders/better_together/navigation_builder_spec.rb

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,28 +212,55 @@
212212
expect(area).to be_present
213213
expect(area.navigation_items.top_level.count).to eq(2)
214214

215-
root_file_item = area.navigation_items.find { |item| item.linkable&.slug == 'docs-readme' }
215+
root_file_item = area.navigation_items.find { |item| item.linkable&.slug == 'docs/readme' }
216216
expect(root_file_item).to be_present
217217
expect(root_file_item.title).to eq('Overview')
218218
expect(root_file_item.linkable).to be_a(BetterTogether::Page)
219219
markdown_block = root_file_item.linkable.page_blocks.first.block
220220
expect(markdown_block).to be_a(BetterTogether::Content::Markdown)
221221
expect(markdown_block.markdown_file_path).to eq(tmp_docs_root.join('README.md').to_s)
222222

223-
developers_item = area.navigation_items.find { |item| item.linkable&.slug == 'docs-developers-readme' }
223+
developers_item = area.navigation_items.find { |item| item.linkable&.slug == 'docs/developers/readme' }
224224
expect(developers_item).to be_present
225225
expect(developers_item.item_type).to eq('dropdown')
226-
expect(developers_item.linkable&.slug).to eq('docs-developers-readme')
226+
expect(developers_item.linkable&.slug).to eq('docs/developers/readme')
227227
expect(developers_item.children.count).to eq(3) # README, api, systems directory
228228

229229
systems_dropdown = developers_item.children.find { |child| child.title == 'Systems' }
230230
expect(systems_dropdown.item_type).to eq('dropdown')
231231
expect(systems_dropdown.children.count).to eq(1)
232232
systems_page = systems_dropdown.children.first.linkable
233-
expect(systems_page.slug).to eq('docs-developers-systems-caching')
233+
expect(systems_page.slug).to eq('docs/developers/systems/caching')
234234
systems_markdown = systems_page.page_blocks.first.block
235235
expect(systems_markdown.markdown_file_path).to eq(tmp_docs_root.join('developers/systems/caching.md').to_s)
236236
end
237+
238+
it 'assigns the documentation navigation area as sidebar_nav for all documentation pages' do
239+
described_class.build_documentation_navigation
240+
241+
area = BetterTogether::NavigationArea.i18n.find_by(slug: 'documentation')
242+
expect(area).to be_present
243+
244+
# Check root file page
245+
root_page = BetterTogether::Page.i18n.find_by(slug: 'docs/readme')
246+
expect(root_page).to be_present
247+
expect(root_page.sidebar_nav).to eq(area)
248+
249+
# Check developers guide page
250+
developers_page = BetterTogether::Page.i18n.find_by(slug: 'docs/developers/readme')
251+
expect(developers_page).to be_present
252+
expect(developers_page.sidebar_nav).to eq(area)
253+
254+
# Check API page
255+
api_page = BetterTogether::Page.i18n.find_by(slug: 'docs/developers/api')
256+
expect(api_page).to be_present
257+
expect(api_page.sidebar_nav).to eq(area)
258+
259+
# Check nested systems/caching page
260+
caching_page = BetterTogether::Page.i18n.find_by(slug: 'docs/developers/systems/caching')
261+
expect(caching_page).to be_present
262+
expect(caching_page.sidebar_nav).to eq(area)
263+
end
237264
end
238265

239266
describe 'navigation item relationships' do

0 commit comments

Comments
 (0)