From fe0411203f44c8dbc1f6bdb970b47ac5a041b684 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 4 Nov 2022 16:26:28 +0100 Subject: [PATCH 1/3] amelioration(types_de_champ/editor): en mode edition d'un champ de type explication, permet de choisir d'afficher ou pas cette explication derriere un collapse --- .../champ_component/champ_component.html.haml | 12 +++++++ .../types_de_champ_controller.rb | 2 ++ app/models/champ.rb | 2 ++ app/models/type_de_champ.rb | 21 ++++++++++- .../explication_component_spec.rb | 35 +++++++++++++++++++ 5 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 spec/components/types_de_champ_editor/explication_component_spec.rb diff --git a/app/components/types_de_champ_editor/champ_component/champ_component.html.haml b/app/components/types_de_champ_editor/champ_component/champ_component.html.haml index 1866089c5..1eb3699d0 100644 --- a/app/components/types_de_champ_editor/champ_component/champ_component.html.haml +++ b/app/components/types_de_champ_editor/champ_component/champ_component.html.haml @@ -71,6 +71,18 @@ = form.label name, for: dom_id(type_de_champ, "layer_#{name}") do = form.check_box name, checked: checked, class: 'small-margin small', id: dom_id(type_de_champ, "layer_#{name}") = t(".layers.#{name}") + - if type_de_champ.explication? + .cell.width-66 + = form.label :collapsible_explanation_enabled, for: dom_id(type_de_champ, :collapsible_explanation_enabled) do + Afficher un texte complementaire affichable au clique + = form.check_box :collapsible_explanation_enabled, class: "small-margin small", id: dom_id(type_de_champ, :collapsible_explanation_enabled) + - if form.object.collapsible_explanation_enabled? + = form.label :collapsible_explanation_text, for: dom_id(type_de_champ, :collapsible_explanation_text) do + = "Text à afficher quand l'utiliser a choisi de l'afficher" + = form.text_area :collapsible_explanation_text, class: "small-margin small", id: dom_id(type_de_champ, :collapsible_explanation_text) + + + - if type_de_champ.block? .flex.justify-start.section.ml-1 .editor-block.flex-grow.cell diff --git a/app/controllers/administrateurs/types_de_champ_controller.rb b/app/controllers/administrateurs/types_de_champ_controller.rb index 42e800d28..e32756bbe 100644 --- a/app/controllers/administrateurs/types_de_champ_controller.rb +++ b/app/controllers/administrateurs/types_de_champ_controller.rb @@ -110,6 +110,8 @@ module Administrateurs :drop_down_other, :drop_down_secondary_libelle, :drop_down_secondary_description, + :collapsible_explanation_enabled, + :collapsible_explanation_text, editable_options: [ :cadastres, :unesco, diff --git a/app/models/champ.rb b/app/models/champ.rb index ac7439d9f..5ee7948cf 100644 --- a/app/models/champ.rb +++ b/app/models/champ.rb @@ -42,6 +42,8 @@ class Champ < ApplicationRecord :drop_down_list_enabled_non_empty_options, :drop_down_secondary_libelle, :drop_down_secondary_description, + :collapsible_explanation_text, + :collapsible_explanation_enabled, :exclude_from_export?, :exclude_from_view?, :repetition?, diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb index c884f0eeb..0573f6d2a 100644 --- a/app/models/type_de_champ.rb +++ b/app/models/type_de_champ.rb @@ -106,7 +106,18 @@ class TypeDeChamp < ApplicationRecord mesri: 'mesri' } - store_accessor :options, :cadastres, :old_pj, :drop_down_options, :skip_pj_validation, :skip_content_type_pj_validation, :drop_down_secondary_libelle, :drop_down_secondary_description, :drop_down_other + store_accessor :options, + :cadastres, + :old_pj, + :drop_down_options, + :skip_pj_validation, + :skip_content_type_pj_validation, + :drop_down_secondary_libelle, + :drop_down_secondary_description, + :drop_down_other, + :collapsible_explanation_enabled, + :collapsible_explanation_text + has_many :revision_types_de_champ, -> { revision_ordered }, class_name: 'ProcedureRevisionTypeDeChamp', dependent: :destroy, inverse_of: :type_de_champ has_one :revision_type_de_champ, -> { revision_ordered }, class_name: 'ProcedureRevisionTypeDeChamp', inverse_of: false has_many :revisions, -> { ordered }, through: :revision_types_de_champ @@ -234,6 +245,10 @@ class TypeDeChamp < ApplicationRecord drop_down_other == "1" || drop_down_other == true end + def collapsible_explanation_enabled? + collapsible_explanation_enabled == "1" + end + def fillable? !non_fillable? end @@ -281,6 +296,10 @@ class TypeDeChamp < ApplicationRecord type_champ == TypeDeChamp.type_champs.fetch(:explication) end + def explication? + type_champ == TypeDeChamp.type_champs.fetch(:explication) + end + def repetition? type_champ == TypeDeChamp.type_champs.fetch(:repetition) end diff --git a/spec/components/types_de_champ_editor/explication_component_spec.rb b/spec/components/types_de_champ_editor/explication_component_spec.rb new file mode 100644 index 000000000..4a37ad881 --- /dev/null +++ b/spec/components/types_de_champ_editor/explication_component_spec.rb @@ -0,0 +1,35 @@ +describe TypesDeChampEditor::ChampComponent, type: :component do + describe 'render by type' do + context 'explication' do + let(:procedure) { create(:procedure, :with_explication) } + let(:tdc) { procedure.types_de_champ.first } + let(:coordinate) { procedure.draft_revision.coordinate_for(tdc) } + let(:component) { described_class.new(coordinate: coordinate, upper_coordinates: []) } + + context 'not enabled' do + before do + allow(component).to receive(:current_user).and_return(procedure.administrateurs.first) + render_inline(component) + end + + it 'renders only collapsible_explanation_enabled checkbox' do + expect(page).to have_selector('input[name="type_de_champ[collapsible_explanation_enabled]"]') + expect(page).not_to have_selector('textarea[name="type_de_champ[collapsible_explanation_text]"]') + end + end + + context 'enabled' do + before do + tdc.update!(collapsible_explanation_enabled: "1") + allow(component).to receive(:current_user).and_return(procedure.administrateurs.first) + render_inline(component) + end + + it 'renders both fields' do + expect(page).to have_selector('input[name="type_de_champ[collapsible_explanation_enabled]"]') + expect(page).to have_selector('textarea[name="type_de_champ[collapsible_explanation_text]"]') + end + end + end + end +end From df54dc04a40c433448ebd38e4b441c4905e49d3b Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 7 Nov 2022 10:05:27 +0100 Subject: [PATCH 2/3] amelioration(champ.explication): ajout du support pour avoir un menu depliant avec plus d'information sur un champs explication amelioration(champ.explication): ajout du support pour avoir un menu depliant avec plus d'information sur un champs explication --- app/components/dsfr/callout_component.rb | 7 ++++--- .../explication_component.html.haml | 14 +++++++++++--- app/models/champ.rb | 3 ++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/components/dsfr/callout_component.rb b/app/components/dsfr/callout_component.rb index da0160990..6a4e83c57 100644 --- a/app/components/dsfr/callout_component.rb +++ b/app/components/dsfr/callout_component.rb @@ -3,16 +3,17 @@ class Dsfr::CalloutComponent < ApplicationComponent renders_one :body renders_one :bottom - attr_reader :title, :theme, :icon + attr_reader :title, :theme, :icon, :extra_class_names - def initialize(title:, theme: :info, icon: nil) + def initialize(title:, theme: :info, icon: nil, extra_class_names: nil) @title = title @theme = theme @icon = icon + @extra_class_names = extra_class_names end def callout_class - ["fr-callout", theme_class, icon] + ["fr-callout", theme_class, icon, extra_class_names].compact.flatten end private diff --git a/app/components/editable_champ/explication_component/explication_component.html.haml b/app/components/editable_champ/explication_component/explication_component.html.haml index 9fbc82439..2ed40f2be 100644 --- a/app/components/editable_champ/explication_component/explication_component.html.haml +++ b/app/components/editable_champ/explication_component/explication_component.html.haml @@ -1,3 +1,11 @@ -%h2.explication-libelle= @champ.libelle -.explication - = string_to_html(@champ.description) += render Dsfr::CalloutComponent.new(title: @champ.libelle, extra_class_names: ['fr-mb-2w', 'fr-callout--blue-cumulus']) do |c| + - c.with_body do + + = string_to_html(@champ.description) + + - if @champ.collapsible_explanation_enabled? && @champ.collapsible_explanation_text.present? + %div + %p.fr-my-2w + %button{type: "button", "aria-controls" => "champs-text-#{@champ.id}", "aria-expanded" => "false", href: "#champs-text-#{@champ.id}"} Lire plus + %p.fr-collapse{ id: "champs-text-#{@champ.id}"} + = @champ.collapsible_explanation_text diff --git a/app/models/champ.rb b/app/models/champ.rb index 5ee7948cf..a4a16dc09 100644 --- a/app/models/champ.rb +++ b/app/models/champ.rb @@ -42,8 +42,9 @@ class Champ < ApplicationRecord :drop_down_list_enabled_non_empty_options, :drop_down_secondary_libelle, :drop_down_secondary_description, - :collapsible_explanation_text, :collapsible_explanation_enabled, + :collapsible_explanation_enabled?, + :collapsible_explanation_text, :exclude_from_export?, :exclude_from_view?, :repetition?, From b3f80dc5f9f361e09a1e40f059c30c0d9d50540b Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 8 Nov 2022 09:26:34 +0100 Subject: [PATCH 3/3] amelioration(Procedure.revision_changes): ajout du support pour les texte complementaire affichable au clique des champs de type explication Co-authored-by: Paul Chavard --- .../explication_component.html.haml | 4 +- app/models/champ.rb | 1 - app/models/procedure_revision.rb | 24 ++++ .../_revision_change_type_de_champ.html.haml | 11 ++ .../administrateurs/revision_changes/fr.yml | 8 ++ spec/models/procedure_revision_spec.rb | 110 ++++++++++++------ 6 files changed, 118 insertions(+), 40 deletions(-) diff --git a/app/components/editable_champ/explication_component/explication_component.html.haml b/app/components/editable_champ/explication_component/explication_component.html.haml index 2ed40f2be..9ab7ded71 100644 --- a/app/components/editable_champ/explication_component/explication_component.html.haml +++ b/app/components/editable_champ/explication_component/explication_component.html.haml @@ -6,6 +6,6 @@ - if @champ.collapsible_explanation_enabled? && @champ.collapsible_explanation_text.present? %div %p.fr-my-2w - %button{type: "button", "aria-controls" => "champs-text-#{@champ.id}", "aria-expanded" => "false", href: "#champs-text-#{@champ.id}"} Lire plus - %p.fr-collapse{ id: "champs-text-#{@champ.id}"} + %button{type: "button", "aria-controls": dom_id(@champ, :explanation), "aria-expanded": "false", href: dom_id(@champ, :explanation)} Lire plus + %p.fr-collapse{ id: dom_id(@champ, :explanation)} = @champ.collapsible_explanation_text diff --git a/app/models/champ.rb b/app/models/champ.rb index a4a16dc09..720b51967 100644 --- a/app/models/champ.rb +++ b/app/models/champ.rb @@ -42,7 +42,6 @@ class Champ < ApplicationRecord :drop_down_list_enabled_non_empty_options, :drop_down_secondary_libelle, :drop_down_secondary_description, - :collapsible_explanation_enabled, :collapsible_explanation_enabled?, :collapsible_explanation_text, :exclude_from_export?, diff --git a/app/models/procedure_revision.rb b/app/models/procedure_revision.rb index ca5b85733..16e3f303f 100644 --- a/app/models/procedure_revision.rb +++ b/app/models/procedure_revision.rb @@ -359,6 +359,30 @@ class ProcedureRevision < ApplicationRecord stable_id: from_type_de_champ.stable_id } end + if from_type_de_champ.collapsible_explanation_enabled? != to_type_de_champ.collapsible_explanation_enabled? + changes << { + model: :type_de_champ, + op: :update, + attribute: :collapsible_explanation_enabled, + label: from_type_de_champ.libelle, + private: from_type_de_champ.private?, + from: from_type_de_champ.collapsible_explanation_enabled?, + to: to_type_de_champ.collapsible_explanation_enabled?, + stable_id: from_type_de_champ.stable_id + } + end + if from_type_de_champ.collapsible_explanation_text != to_type_de_champ.collapsible_explanation_text + changes << { + model: :type_de_champ, + op: :update, + attribute: :collapsible_explanation_text, + label: from_type_de_champ.libelle, + private: from_type_de_champ.private?, + from: from_type_de_champ.collapsible_explanation_text, + to: to_type_de_champ.collapsible_explanation_text, + stable_id: from_type_de_champ.stable_id + } + end if from_type_de_champ.description != to_type_de_champ.description changes << { model: :type_de_champ, diff --git a/app/views/administrateurs/procedures/_revision_change_type_de_champ.html.haml b/app/views/administrateurs/procedures/_revision_change_type_de_champ.html.haml index ba145355a..3f3742d8e 100644 --- a/app/views/administrateurs/procedures/_revision_change_type_de_champ.html.haml +++ b/app/views/administrateurs/procedures/_revision_change_type_de_champ.html.haml @@ -70,6 +70,17 @@ - if removed.present? - list.with_item do = t(:remove_option, scope: [:administrateurs, :revision_changes], items: removed.map{ |term| "« #{t(term, scope: [:administrateurs, :carte_layers])} »" }.join(", ")) + - when :collapsible_explanation_enabled + - if change[:to] + - list.with_item do + = t("administrateurs.revision_changes.update_collapsible_explanation_enabled#{postfix}.enabled", label: change[:label]) + - else + - list.with_item do + = t("administrateurs.revision_changes.update_collapsible_explanation_enabled#{postfix}.disabled", label: change[:label]) + - when :collapsible_explanation_text + - list.with_item do + = t("administrateurs.revision_changes.update_collapsible_explanation_text#{postfix}", label: change[:label], text: change[:to]) + - when :condition - if change[:from].nil? - list.with_item do diff --git a/config/locales/views/administrateurs/revision_changes/fr.yml b/config/locales/views/administrateurs/revision_changes/fr.yml index 4513d4bec..3972a6264 100644 --- a/config/locales/views/administrateurs/revision_changes/fr.yml +++ b/config/locales/views/administrateurs/revision_changes/fr.yml @@ -29,6 +29,10 @@ fr: enabled: Le champ « %{label} » comporte maintenant un choix « Autre » disabled: Le champ « %{label} » ne comporte plus de choix « Autre » update_carte_layers: Les référentiels cartographiques du champ « %{label} » ont été modifiés + update_collapsible_explanation_enabled: + enabled: "Le texte complementaire affichable au clique du champ « %{label} » a été ajouté" + disabled: "Le texte complementaire affichable au clique du champ « %{label} » a été supprimée" + update_collapsible_explanation_text: "Le texte complementaire affichable au clique du champ « %{label} » a été modifié. Il est maintenant « %{text} »." add_private: L’annotation privée « %{label} » a été ajoutée remove_private: L’annotation privée « %{label} » a été supprimée move_private: @@ -45,6 +49,10 @@ fr: update_piece_justificative_template_private: Le modèle de pièce justificative de l’annotation privée « %{label} » a été modifié update_drop_down_options_private: Les options de sélection de l’annotation privée « %{label} » ont été modifiées update_carte_layers_private: Les référentiels cartographiques de l’annotation privée « %{label} » ont été modifiés + update_collapsible_explanation_enabled_private: + enabled: "Le texte complementaire affichable au clique de l’annotation privée « %{label} » a été ajouté" + disabled: "Le texte complementaire affichable au clique de l’annotation privée « %{label} » a été supprimée" + update_collapsible_explanation_private: "Le texte complementaire affichable au clique de l’annotation privée « %{label} » a été modifié. Il est maintenant « %{text} »." add_option: "ajoutés : %{items}" remove_option: "supprimés : %{items}" add_condition: Une condition a été ajoutée sur le champ « %{label} ». La nouvelle condition est « %{to} » diff --git a/spec/models/procedure_revision_spec.rb b/spec/models/procedure_revision_spec.rb index 3867106d7..d311c2b45 100644 --- a/spec/models/procedure_revision_spec.rb +++ b/spec/models/procedure_revision_spec.rb @@ -440,47 +440,83 @@ describe ProcedureRevision do end context 'when a type de champ is changed' do - let(:procedure) { create(:procedure, :with_type_de_champ) } + context 'when libelle, description, and mandatory are changed' do + let(:procedure) { create(:procedure, :with_type_de_champ) } - before do - updated_tdc = new_draft.find_and_ensure_exclusive_use(first_tdc.stable_id) + before do + updated_tdc = new_draft.find_and_ensure_exclusive_use(first_tdc.stable_id) - updated_tdc.update(libelle: 'modifier le libelle', description: 'une description', mandatory: !updated_tdc.mandatory) + updated_tdc.update(libelle: 'modifier le libelle', description: 'une description', mandatory: !updated_tdc.mandatory) + end + + it do + is_expected.to eq([ + { + model: :type_de_champ, + op: :update, + attribute: :libelle, + label: first_tdc.libelle, + private: false, + from: first_tdc.libelle, + to: "modifier le libelle", + stable_id: first_tdc.stable_id + }, + { + model: :type_de_champ, + op: :update, + attribute: :description, + label: first_tdc.libelle, + private: false, + from: first_tdc.description, + to: "une description", + stable_id: first_tdc.stable_id + }, + { + model: :type_de_champ, + op: :update, + attribute: :mandatory, + label: first_tdc.libelle, + private: false, + from: false, + to: true, + stable_id: first_tdc.stable_id + } + ]) + end end - it do - is_expected.to eq([ - { - model: :type_de_champ, - op: :update, - attribute: :libelle, - label: first_tdc.libelle, - private: false, - from: first_tdc.libelle, - to: "modifier le libelle", - stable_id: first_tdc.stable_id - }, - { - model: :type_de_champ, - op: :update, - attribute: :description, - label: first_tdc.libelle, - private: false, - from: first_tdc.description, - to: "une description", - stable_id: first_tdc.stable_id - }, - { - model: :type_de_champ, - op: :update, - attribute: :mandatory, - label: first_tdc.libelle, - private: false, - from: false, - to: true, - stable_id: first_tdc.stable_id - } - ]) + context 'when collapsible_explanation_enabled and collapsible_explanation_text are changed' do + let(:procedure) { create(:procedure, :with_explication) } + + before do + updated_tdc = new_draft.find_and_ensure_exclusive_use(first_tdc.stable_id) + + updated_tdc.update(collapsible_explanation_enabled: "1", collapsible_explanation_text: 'afficher au clique') + end + it do + is_expected.to eq([ + { + model: :type_de_champ, + op: :update, + attribute: :collapsible_explanation_enabled, + label: first_tdc.libelle, + private: first_tdc.private?, + from: false, + to: true, + stable_id: first_tdc.stable_id + }, + { + model: :type_de_champ, + op: :update, + attribute: :collapsible_explanation_text, + label: first_tdc.libelle, + private: first_tdc.private?, + from: nil, + to: 'afficher au clique', + stable_id: first_tdc.stable_id + } + ]) + end end end