diff --git a/app/components/viewable_champ/header_sections_summary_component.rb b/app/components/viewable_champ/header_sections_summary_component.rb index bc8e407ec..73484422e 100644 --- a/app/components/viewable_champ/header_sections_summary_component.rb +++ b/app/components/viewable_champ/header_sections_summary_component.rb @@ -7,15 +7,16 @@ class ViewableChamp::HeaderSectionsSummaryComponent < ApplicationComponent @dossier = dossier @is_private = is_private - @header_sections = @dossier.revision - .types_de_champ_for(scope: @is_private ? :private : :public) - .filter(&:header_section?) - .map { @dossier.project_champ(_1, nil) } # row_id not needed, do not link to repetiion header_sections + @header_sections = if is_private + dossier.revision.types_de_champ_private + else + dossier.revision.types_de_champ_public + end.filter(&:header_section?) end def render? = header_sections.any? def href(header_section) # used by viewable champs to anchor elements - "##{header_section.input_group_id}" + "##{header_section.html_id}" end end diff --git a/app/models/champ.rb b/app/models/champ.rb index 20dcc3133..0b5e7cbf5 100644 --- a/app/models/champ.rb +++ b/app/models/champ.rb @@ -262,7 +262,7 @@ class Champ < ApplicationRecord end def html_id - "champ-#{public_id}" + type_de_champ.html_id(row_id) end def needs_dossier_id? diff --git a/app/models/procedure_revision_type_de_champ.rb b/app/models/procedure_revision_type_de_champ.rb index b8e538c97..1a0d27c01 100644 --- a/app/models/procedure_revision_type_de_champ.rb +++ b/app/models/procedure_revision_type_de_champ.rb @@ -13,7 +13,7 @@ class ProcedureRevisionTypeDeChamp < ApplicationRecord scope :public_only, -> { joins(:type_de_champ).where(types_de_champ: { private: false }) } scope :private_only, -> { joins(:type_de_champ).where(types_de_champ: { private: true }) } - delegate :stable_id, :libelle, :description, :type_champ, :mandatory?, :private?, :to_typed_id, to: :type_de_champ + delegate :stable_id, :libelle, :description, :type_champ, :header_section?, :mandatory?, :private?, :to_typed_id, to: :type_de_champ def child? parent_id.present? diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb index 3d1d3b164..f8640127a 100644 --- a/app/models/type_de_champ.rb +++ b/app/models/type_de_champ.rb @@ -763,6 +763,10 @@ class TypeDeChamp < ApplicationRecord end end + def html_id(row_id = nil) + "champ-#{public_id(row_id)}" + end + private def populate_stable_id diff --git a/spec/components/champ_header_sections_summary_component_spec.rb b/spec/components/champ_header_sections_summary_component_spec.rb new file mode 100644 index 000000000..ac2610ff0 --- /dev/null +++ b/spec/components/champ_header_sections_summary_component_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +RSpec.describe ViewableChamp::HeaderSectionsSummaryComponent, type: :component do + subject { render_inline(component).to_html } + + let(:is_private) { false } + let(:types_de_champ) do + [ + { type: :header_section, level: 1 }, + { type: :text }, + { type: :header_section, level: 2 }, + { type: :repetition, children: [{ type: :text }, { type: :header_section, level: 1 }] }, + { type: :header_section, level: 3 }, + { type: :text } + ] + end + let(:procedure) { create(:procedure, types_de_champ_public: types_de_champ, types_de_champ_private: types_de_champ) } + let(:dossier) { create(:dossier, procedure:) } + let(:component) { described_class.new(dossier:, is_private:) } + let(:types_de_champ_public) { dossier.revision.types_de_champ_public.filter(&:header_section?) } + let(:types_de_champ_private) { dossier.revision.types_de_champ_private.filter(&:header_section?) } + + context 'public' do + it do + types_de_champ_public.each { expect(subject).to have_selector("a[href='##{_1.html_id}']") } + end + end + + context 'private' do + let(:is_private) { true } + it do + types_de_champ_private.each { expect(subject).to have_selector("a[href='##{_1.html_id}']") } + end + end +end diff --git a/spec/components/type_de_champ_header_sections_summary_component_spec.rb b/spec/components/type_de_champ_header_sections_summary_component_spec.rb new file mode 100644 index 000000000..f303856a4 --- /dev/null +++ b/spec/components/type_de_champ_header_sections_summary_component_spec.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +RSpec.describe TypesDeChampEditor::HeaderSectionsSummaryComponent, type: :component do + include ActionView::RecordIdentifier + + subject { render_inline(component).to_html } + + let(:is_private) { false } + let(:types_de_champ) do + [ + { type: :header_section, level: 1 }, + { type: :text }, + { type: :header_section, level: 2 }, + { type: :repetition, children: [{ type: :text }, { type: :header_section, level: 1 }] }, + { type: :header_section, level: 3 }, + { type: :text } + ] + end + let(:procedure) { create(:procedure, types_de_champ_public: types_de_champ, types_de_champ_private: types_de_champ) } + let(:component) { described_class.new(procedure:, is_private:) } + let(:types_de_champ_public) { procedure.draft_revision.revision_types_de_champ_public.filter(&:header_section?) } + let(:types_de_champ_private) { procedure.draft_revision.revision_types_de_champ_private.filter(&:header_section?) } + + context 'public' do + it do + types_de_champ_public.each { expect(subject).to have_selector("a[href='##{dom_id(_1, :type_de_champ_editor)}']") } + end + end + + context 'private' do + let(:is_private) { true } + it do + types_de_champ_private.each { expect(subject).to have_selector("a[href='##{dom_id(_1, :type_de_champ_editor)}']") } + end + end +end