Merge pull request #5274 from betagouv/radiobuttons-for-small-selects

Boutons radio et checkboxes pour les petits select
This commit is contained in:
Keirua 2020-06-24 14:34:32 +02:00 committed by GitHub
commit d9b5dccef8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 67 additions and 15 deletions

View file

@ -1,2 +1,7 @@
class Champs::DropDownListChamp < Champ
THRESHOLD_NB_OPTIONS_AS_RADIO = 5
def render_as_radios?
drop_down_list.enabled_non_empty_options.size <= THRESHOLD_NB_OPTIONS_AS_RADIO
end
end

View file

@ -1,6 +1,8 @@
class Champs::MultipleDropDownListChamp < Champ
before_save :format_before_save
THRESHOLD_NB_OPTIONS_AS_CHECKBOX = 5
def search_terms
selected_options
end
@ -21,6 +23,10 @@ class Champs::MultipleDropDownListChamp < Champ
value.present? ? selected_options.join(', ') : nil
end
def render_as_checkboxes?
drop_down_list.enabled_non_empty_options.size <= THRESHOLD_NB_OPTIONS_AS_CHECKBOX
end
private
def format_before_save

View file

@ -8,6 +8,10 @@ class DropDownList < ApplicationRecord
result.blank? ? [] : [''] + result
end
def enabled_non_empty_options
(options - disabled_options).reject(&:empty?)
end
def disabled_options
options.filter { |v| (v =~ /^--.*--$/).present? }
end

View file

@ -1,5 +1,14 @@
- if champ.drop_down_list && champ.drop_down_list.options.any?
= form.select :value,
champ.drop_down_list.options,
disabled: champ.drop_down_list.disabled_options,
required: champ.mandatory?
- if champ.render_as_radios?
%fieldset.radios
%legend.mandatory-explanation
Sélectionnez une des valeurs
- champ.drop_down_list.enabled_non_empty_options.each do |option|
%label
= form.radio_button :value, option
= option
- else
= form.select :value,
champ.drop_down_list.options,
disabled: champ.drop_down_list.disabled_options,
required: champ.mandatory?

View file

@ -1,7 +1,15 @@
- if champ.drop_down_list && champ.drop_down_list.options.any?
= form.select :value,
champ.drop_down_list.options,
{ selected: champ.selected_options,
disabled: champ.drop_down_list.disabled_options },
multiple: true,
class: 'select2'
- if champ.render_as_checkboxes?
- champ.drop_down_list.enabled_non_empty_options.each do |option|
.editable-champ.editable-champ-checkbox
%label
= form.check_box :value, { multiple: true, checked: champ&.value&.include?(option) }, option, nil
= option
- else
= form.select :value,
champ.drop_down_list.options,
{ selected: champ.selected_options,
disabled: champ.drop_down_list.disabled_options },
multiple: true,
class: 'select2'

View file

@ -1,5 +1,9 @@
FactoryBot.define do
factory :drop_down_list do
value { "val1\r\nval2\r\n--separateur--\r\nval3" }
trait :long do
value { "alpha\r\nbravo\r\n--separateur--\r\ncharly\r\ndelta\r\necho\r\nfox-trot\r\ngolf" }
end
end
end

View file

@ -233,6 +233,8 @@ FactoryBot.define do
end
build(:"type_de_champ_#{type_champ}", mandatory: true, libelle: libelle, order_place: index)
end
procedure.types_de_champ << build(:type_de_champ_drop_down_list, :long, mandatory: true, libelle: 'simple_choice_drop_down_list_long')
procedure.types_de_champ << build(:type_de_champ_multiple_drop_down_list, :long, mandatory: true, libelle: 'multiple_choice_drop_down_list_long')
end
end

View file

@ -53,10 +53,16 @@ FactoryBot.define do
libelle { 'Menu déroulant' }
type_champ { TypeDeChamp.type_champs.fetch(:drop_down_list) }
drop_down_list { create(:drop_down_list) }
trait :long do
drop_down_list { create(:drop_down_list, :long) }
end
end
factory :type_de_champ_multiple_drop_down_list do
type_champ { TypeDeChamp.type_champs.fetch(:multiple_drop_down_list) }
drop_down_list { create(:drop_down_list) }
trait :long do
drop_down_list { create(:drop_down_list, :long) }
end
end
factory :type_de_champ_linked_drop_down_list do
type_champ { TypeDeChamp.type_champs.fetch(:linked_drop_down_list) }

View file

@ -21,9 +21,12 @@ feature 'The user' do
fill_in('email', with: 'loulou@yopmail.com')
fill_in('phone', with: '1234567890')
choose('Non')
select('val2', from: form_id_for('simple_drop_down_list'))
select('val1', from: form_id_for('multiple_drop_down_list'))
select('val3', from: form_id_for('multiple_drop_down_list'))
choose('val2')
check('val1')
check('val3')
select('bravo', from: form_id_for('simple_choice_drop_down_list_long'))
select('alpha', from: form_id_for('multiple_choice_drop_down_list_long'))
select('charly', from: form_id_for('multiple_choice_drop_down_list_long'))
select('AUSTRALIE', from: 'pays')
select_champ_geo('regions', 'Ma', 'Martinique')
@ -55,6 +58,8 @@ feature 'The user' do
expect(champ_value_for('phone')).to eq('1234567890')
expect(champ_value_for('yes_no')).to eq('false')
expect(champ_value_for('simple_drop_down_list')).to eq('val2')
expect(champ_value_for('simple_choice_drop_down_list_long')).to eq('bravo')
expect(JSON.parse(champ_value_for('multiple_choice_drop_down_list_long'))).to match(['alpha', 'charly'])
expect(JSON.parse(champ_value_for('multiple_drop_down_list'))).to match(['val1', 'val3'])
expect(champ_value_for('pays')).to eq('AUSTRALIE')
expect(champ_value_for('regions')).to eq('Martinique')
@ -76,8 +81,11 @@ feature 'The user' do
expect(page).to have_field('email', with: 'loulou@yopmail.com')
expect(page).to have_field('phone', with: '1234567890')
expect(page).to have_checked_field('Non')
expect(page).to have_selected_value('simple_drop_down_list', selected: 'val2')
expect(page).to have_selected_value('multiple_drop_down_list', selected: ['val1', 'val3'])
expect(page).to have_checked_field('val2')
expect(page).to have_checked_field('val1')
expect(page).to have_checked_field('val3')
expect(page).to have_selected_value('simple_choice_drop_down_list_long', selected: 'bravo')
expect(page).to have_selected_value('multiple_choice_drop_down_list_long', selected: ['alpha', 'charly'])
expect(page).to have_selected_value('pays', selected: 'AUSTRALIE')
expect(page).to have_selected_value('regions', selected: 'Martinique')
expect(page).to have_selected_value('departements', selected: '02 - Aisne')