diff --git a/app/components/instructeurs/filter_buttons_component.rb b/app/components/instructeurs/filter_buttons_component.rb index d8917c277..1da240db4 100644 --- a/app/components/instructeurs/filter_buttons_component.rb +++ b/app/components/instructeurs/filter_buttons_component.rb @@ -48,31 +48,10 @@ class Instructeurs::FilterButtonsComponent < ApplicationComponent def human_value(filter_column) column, filter = filter_column.column, filter_column.filter - if column.type_de_champ? - find_type_de_champ(column.stable_id).dynamic_type.filter_to_human(filter) - elsif column.dossier_state? - if filter == 'pending_correction' - Dossier.human_attribute_name("pending_correction.for_instructeur") - else - Dossier.human_attribute_name("state.#{filter}") - end - elsif column.groupe_instructeur? - current_instructeur.groupe_instructeurs - .find { _1.id == filter.to_i }&.label || filter - elsif column.dossier_labels? - Label.find(filter)&.name || filter - elsif column.type == :date + if column.type == :date || column.type == :datetime helpers.try_parse_format_date(filter) else - filter + column.label_for_value(filter) end end - - def find_type_de_champ(stable_id) - TypeDeChamp - .joins(:revision_types_de_champ) - .where(revision_types_de_champ: { revision_id: @procedure_presentation.procedure.revisions }) - .order(created_at: :desc) - .find_by(stable_id:) - end end diff --git a/app/models/column.rb b/app/models/column.rb index b02feda10..f41ce3cdb 100644 --- a/app/models/column.rb +++ b/app/models/column.rb @@ -51,6 +51,16 @@ class Column def dossier_column? = false def champ_column? = false + def label_for_value(value) + if options_for_select.present? + # options for select store ["trad", :enum_value] + options_for_select.to_h { |(label, value)| [value.to_s, label] } + .fetch(value.to_s, value.to_s) + else + value + end + end + private def column_id = "#{table}/#{column}" diff --git a/app/models/columns/champ_column.rb b/app/models/columns/champ_column.rb index 2d3859774..b4c3977b9 100644 --- a/app/models/columns/champ_column.rb +++ b/app/models/columns/champ_column.rb @@ -69,6 +69,8 @@ class Columns::ChampColumn < Column parse_datetime(value) when :date parse_datetime(value)&.to_date + when :enum + parse_enum(value) when :enums parse_enums(value) else @@ -89,13 +91,13 @@ class Columns::ChampColumn < Column when ['integer_number', 'text'], ['decimal_number', 'text'] # number to text value when ['drop_down_list', 'multiple_drop_down_list'] # single list can become multi - [value] + [parse_enum(value)].compact_blank when ['drop_down_list', 'text'] # single list can become text - value + parse_enum(value) when ['multiple_drop_down_list', 'drop_down_list'] # multi list can become single - parse_enums(value).first - when ['multiple_drop_down_list', 'text'] # single list can become text - parse_enums(value).join(', ') + parse_enums(value)&.first + when ['multiple_drop_down_list', 'text'] # multi list can become text + parse_enums(value)&.join(', ') when ['date', 'datetime'] # date <=> datetime parse_datetime(value)&.to_datetime when ['datetime', 'date'] # may lose some data, but who cares ? @@ -114,7 +116,19 @@ class Columns::ChampColumn < Column end end - def parse_enums(value) = JSON.parse(value) rescue nil + def parse_enum(value) + return value if options_for_select.blank? + value if options_for_select.to_set(&:second).member?(value) + end + + def parse_enums(value) + values = JSON.parse(value) + return values if options_for_select.blank? + options = options_for_select.to_set(&:second) + values.filter { options.member?(_1) } + rescue JSON::ParserError + nil + end def parse_datetime(value) = Time.zone.parse(value) rescue nil end diff --git a/app/models/type_de_champ.rb b/app/models/type_de_champ.rb index 36904f1fe..707848b12 100644 --- a/app/models/type_de_champ.rb +++ b/app/models/type_de_champ.rb @@ -443,7 +443,7 @@ class TypeDeChamp < ApplicationRecord elsif regions? APIGeoService.region_options elsif any_drop_down_list? - drop_down_options + drop_down_options.map { [_1, _1] } elsif yes_no? Champs::YesNoChamp.options elsif checkbox? diff --git a/app/services/exported_column_formatter.rb b/app/services/exported_column_formatter.rb index 824b26d29..c71835a17 100644 --- a/app/services/exported_column_formatter.rb +++ b/app/services/exported_column_formatter.rb @@ -44,9 +44,6 @@ class ExportedColumnFormatter end def self.format_enum(column:, raw_value:) - # options for select store ["trad", :enum_value] - selected_option = column.options_for_select.find { _1[1].to_s == raw_value } - - selected_option ? selected_option.first : raw_value + column.label_for_value(raw_value) end end diff --git a/spec/components/instructeurs/filter_buttons_component_spec.rb b/spec/components/instructeurs/filter_buttons_component_spec.rb index e022bc150..5cffb1832 100644 --- a/spec/components/instructeurs/filter_buttons_component_spec.rb +++ b/spec/components/instructeurs/filter_buttons_component_spec.rb @@ -35,7 +35,7 @@ describe Instructeurs::FilterButtonsComponent, type: :component do let(:filter) { to_filter(['État du dossier', "en_construction"]) } it 'should get i18n value' do - expect(page).to have_text("En construction") + expect(page).to have_text("En construction") end end @@ -57,7 +57,7 @@ describe Instructeurs::FilterButtonsComponent, type: :component do end it 'should display all filters' do - text = "État du dossier : En construction ou État du dossier : En instruction et Date de création : 15/06/2023" + text = "État du dossier : En construction ou État du dossier : En instruction et Date de création : 15/06/2023" expect(page).to have_text(text) end end @@ -78,7 +78,7 @@ describe Instructeurs::FilterButtonsComponent, type: :component do expect(page.all('form').count).to eq(2) del_en_construction = page.all('form').first - expect(del_en_construction).to have_text('En construction') + expect(del_en_construction).to have_text('En construction') expect(del_en_construction).to have_field('filters[]', with: '', type: 'hidden') expect(del_en_construction).to have_field('filters[][id]', with: column_id, type: 'hidden') expect(del_en_construction).to have_field('filters[][filter]', with: 'en_instruction', type: 'hidden') diff --git a/spec/models/columns/champ_column_spec.rb b/spec/models/columns/champ_column_spec.rb index a7dfa85bc..4f4ce0b0e 100644 --- a/spec/models/columns/champ_column_spec.rb +++ b/spec/models/columns/champ_column_spec.rb @@ -100,21 +100,39 @@ describe Columns::ChampColumn do end context 'from a drop_down_list' do - let(:champ) { Champs::DropDownListChamp.new(value: 'val1') } + let(:champ) { Champs::DropDownListChamp.new(value:) } + let(:value) { 'val1' } it do expect(column('multiple_drop_down_list').value(champ)).to eq(['val1']) expect(column('text').value(champ)).to eq('val1') end + + context 'value not in options' do + let(:value) { 'toto' } + + it do + expect(column('simple_drop_down_list').value(champ)).to eq(nil) + end + end end context 'from a multiple_drop_down_list' do - let(:champ) { Champs::MultipleDropDownListChamp.new(value: '["val1","val2"]') } + let(:champ) { Champs::MultipleDropDownListChamp.new(value:) } + let(:value) { '["val1","val2"]' } it do expect(column('simple_drop_down_list').value(champ)).to eq('val1') expect(column('text').value(champ)).to eq('val1, val2') end + + context 'value not in options' do + let(:value) { '["toto","val2"]' } + + it do + expect(column('multiple_drop_down_list').value(champ)).to eq(['val2']) + end + end end end end