refactor(regions): champ regions to use simple select
This commit is contained in:
parent
e0b0a42bc3
commit
3f0f5e381f
6 changed files with 89 additions and 28 deletions
|
@ -1,3 +1,13 @@
|
||||||
class EditableChamp::RegionsComponent < EditableChamp::EditableChampBaseComponent
|
class EditableChamp::RegionsComponent < EditableChamp::EditableChampBaseComponent
|
||||||
include ApplicationHelper
|
include ApplicationHelper
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def options
|
||||||
|
APIGeoService.regions.map { [_1[:name], _1[:code]] }
|
||||||
|
end
|
||||||
|
|
||||||
|
def select_options
|
||||||
|
{ selected: @champ.selected }.merge(@champ.mandatory? ? { prompt: '' } : { include_blank: '' })
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,7 +1 @@
|
||||||
= @form.hidden_field :value
|
= @form.select :value, options, select_options, required: @champ.mandatory?, id: @champ.input_id, aria: { describedby: @champ.describedby_id }, class: "width-33-desktop width-100-mobile"
|
||||||
= @form.hidden_field :external_id
|
|
||||||
= react_component("ComboRegionsSearch",
|
|
||||||
required: @champ.required?,
|
|
||||||
id: @champ.input_id,
|
|
||||||
className: "width-33-desktop width-100-mobile",
|
|
||||||
describedby: @champ.describedby_id)
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import { QueryClientProvider } from 'react-query';
|
|
||||||
|
|
||||||
import ComboSearch, { ComboSearchProps } from './ComboSearch';
|
|
||||||
import { queryClient } from './shared/queryClient';
|
|
||||||
|
|
||||||
export default function ComboRegionsSearch(
|
|
||||||
props: ComboSearchProps<{ code: string; nom: string }>
|
|
||||||
) {
|
|
||||||
return (
|
|
||||||
<QueryClientProvider client={queryClient}>
|
|
||||||
<ComboSearch
|
|
||||||
{...props}
|
|
||||||
scope="regions"
|
|
||||||
minimumInputLength={0}
|
|
||||||
transformResult={({ code, nom }) => [code, nom]}
|
|
||||||
/>
|
|
||||||
</QueryClientProvider>
|
|
||||||
);
|
|
||||||
}
|
|
|
@ -21,4 +21,25 @@
|
||||||
# type_de_champ_id :integer
|
# type_de_champ_id :integer
|
||||||
#
|
#
|
||||||
class Champs::RegionChamp < Champs::TextChamp
|
class Champs::RegionChamp < Champs::TextChamp
|
||||||
|
def selected
|
||||||
|
code
|
||||||
|
end
|
||||||
|
|
||||||
|
def name
|
||||||
|
value
|
||||||
|
end
|
||||||
|
|
||||||
|
def code
|
||||||
|
external_id || APIGeoService.region_code(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
def value=(code)
|
||||||
|
if code&.size == 2
|
||||||
|
self.external_id = code
|
||||||
|
super(APIGeoService.region_name(code))
|
||||||
|
elsif code.blank?
|
||||||
|
self.external_id = nil
|
||||||
|
super(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
- if champ.external_id.present?
|
- if champ.external_id.present?
|
||||||
= format_text_value("#{champ.external_id} - #{champ}")
|
= format_text_value("#{champ.external_id} – #{champ}")
|
||||||
- else
|
- else
|
||||||
= format_text_value(champ.to_s)
|
= format_text_value(champ.to_s)
|
||||||
|
|
56
spec/models/champs/region_champ_spec.rb
Normal file
56
spec/models/champs/region_champ_spec.rb
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
describe Champs::RegionChamp, type: :model do
|
||||||
|
let(:memory_store) { ActiveSupport::Cache.lookup_store(:memory_store) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(Rails).to receive(:cache).and_return(memory_store)
|
||||||
|
Rails.cache.clear
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:champ) { described_class.new }
|
||||||
|
|
||||||
|
describe 'value', vcr: { cassette_name: 'api_geo_regions' } do
|
||||||
|
it 'with code' do
|
||||||
|
champ.value = '01'
|
||||||
|
expect(champ.external_id).to eq('01')
|
||||||
|
expect(champ.value).to eq('Guadeloupe')
|
||||||
|
expect(champ.selected).to eq('01')
|
||||||
|
expect(champ.to_s).to eq('Guadeloupe')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'with nil' do
|
||||||
|
champ.write_attribute(:value, 'Guadeloupe')
|
||||||
|
champ.write_attribute(:external_id, '01')
|
||||||
|
champ.value = nil
|
||||||
|
expect(champ.external_id).to be_nil
|
||||||
|
expect(champ.value).to be_nil
|
||||||
|
expect(champ.selected).to be_nil
|
||||||
|
expect(champ.to_s).to eq('')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'with blank' do
|
||||||
|
champ.write_attribute(:value, 'Guadeloupe')
|
||||||
|
champ.write_attribute(:external_id, '01')
|
||||||
|
champ.value = ''
|
||||||
|
expect(champ.external_id).to be_nil
|
||||||
|
expect(champ.value).to be_nil
|
||||||
|
expect(champ.selected).to be_nil
|
||||||
|
expect(champ.to_s).to eq('')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'with initial nil' do
|
||||||
|
champ.write_attribute(:value, nil)
|
||||||
|
expect(champ.external_id).to be_nil
|
||||||
|
expect(champ.value).to be_nil
|
||||||
|
expect(champ.selected).to be_nil
|
||||||
|
expect(champ.to_s).to eq('')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'with initial name' do
|
||||||
|
champ.write_attribute(:value, 'Guadeloupe')
|
||||||
|
expect(champ.external_id).to be_nil
|
||||||
|
expect(champ.value).to eq('Guadeloupe')
|
||||||
|
expect(champ.selected).to eq('01')
|
||||||
|
expect(champ.to_s).to eq('Guadeloupe')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue