From 09a3cacd88c886c3b698c6419bc8bb96df49749d Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 14 Jan 2021 23:53:02 +0100 Subject: [PATCH 1/3] Add external_id to champs --- app/models/champ.rb | 1 + app/models/champs/address_champ.rb | 1 + app/models/champs/annuaire_education_champ.rb | 1 + app/models/champs/carte_champ.rb | 1 + app/models/champs/checkbox_champ.rb | 1 + app/models/champs/civilite_champ.rb | 1 + app/models/champs/commune_champ.rb | 1 + app/models/champs/date_champ.rb | 1 + app/models/champs/datetime_champ.rb | 1 + app/models/champs/decimal_number_champ.rb | 1 + app/models/champs/departement_champ.rb | 1 + app/models/champs/dossier_link_champ.rb | 1 + app/models/champs/drop_down_list_champ.rb | 1 + app/models/champs/email_champ.rb | 1 + app/models/champs/engagement_champ.rb | 1 + app/models/champs/explication_champ.rb | 1 + app/models/champs/header_section_champ.rb | 1 + app/models/champs/iban_champ.rb | 1 + app/models/champs/integer_number_champ.rb | 1 + app/models/champs/linked_drop_down_list_champ.rb | 1 + app/models/champs/multiple_drop_down_list_champ.rb | 1 + app/models/champs/number_champ.rb | 1 + app/models/champs/pays_champ.rb | 1 + app/models/champs/phone_champ.rb | 1 + app/models/champs/piece_justificative_champ.rb | 1 + app/models/champs/region_champ.rb | 1 + app/models/champs/repetition_champ.rb | 1 + app/models/champs/siret_champ.rb | 1 + app/models/champs/text_champ.rb | 1 + app/models/champs/textarea_champ.rb | 1 + app/models/champs/titre_identite_champ.rb | 1 + app/models/champs/yes_no_champ.rb | 1 + db/migrate/20210114224721_add_external_id_to_champs.rb | 5 +++++ db/schema.rb | 3 ++- 34 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20210114224721_add_external_id_to_champs.rb diff --git a/app/models/champ.rb b/app/models/champ.rb index 0570ea92f..e41120460 100644 --- a/app/models/champ.rb +++ b/app/models/champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/address_champ.rb b/app/models/champs/address_champ.rb index 2733a6c80..2bb2c83cc 100644 --- a/app/models/champs/address_champ.rb +++ b/app/models/champs/address_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/annuaire_education_champ.rb b/app/models/champs/annuaire_education_champ.rb index 7eb076aed..874d69949 100644 --- a/app/models/champs/annuaire_education_champ.rb +++ b/app/models/champs/annuaire_education_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/carte_champ.rb b/app/models/champs/carte_champ.rb index e491846d0..4833ef8f5 100644 --- a/app/models/champs/carte_champ.rb +++ b/app/models/champs/carte_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/checkbox_champ.rb b/app/models/champs/checkbox_champ.rb index df61e54b8..048480a38 100644 --- a/app/models/champs/checkbox_champ.rb +++ b/app/models/champs/checkbox_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/civilite_champ.rb b/app/models/champs/civilite_champ.rb index 09126ce83..b971e46c9 100644 --- a/app/models/champs/civilite_champ.rb +++ b/app/models/champs/civilite_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/commune_champ.rb b/app/models/champs/commune_champ.rb index 202fc11e6..02b3595e5 100644 --- a/app/models/champs/commune_champ.rb +++ b/app/models/champs/commune_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/date_champ.rb b/app/models/champs/date_champ.rb index c05be547c..3eac8eee8 100644 --- a/app/models/champs/date_champ.rb +++ b/app/models/champs/date_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/datetime_champ.rb b/app/models/champs/datetime_champ.rb index b321b4663..21a905f77 100644 --- a/app/models/champs/datetime_champ.rb +++ b/app/models/champs/datetime_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/decimal_number_champ.rb b/app/models/champs/decimal_number_champ.rb index 315cbdf07..3a11cb9ec 100644 --- a/app/models/champs/decimal_number_champ.rb +++ b/app/models/champs/decimal_number_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/departement_champ.rb b/app/models/champs/departement_champ.rb index a0277da11..ae242484e 100644 --- a/app/models/champs/departement_champ.rb +++ b/app/models/champs/departement_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/dossier_link_champ.rb b/app/models/champs/dossier_link_champ.rb index 492c1b5f5..4812e90cb 100644 --- a/app/models/champs/dossier_link_champ.rb +++ b/app/models/champs/dossier_link_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/drop_down_list_champ.rb b/app/models/champs/drop_down_list_champ.rb index 3ad1f28ee..181696853 100644 --- a/app/models/champs/drop_down_list_champ.rb +++ b/app/models/champs/drop_down_list_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/email_champ.rb b/app/models/champs/email_champ.rb index 434460ea1..147a1a10c 100644 --- a/app/models/champs/email_champ.rb +++ b/app/models/champs/email_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/engagement_champ.rb b/app/models/champs/engagement_champ.rb index 61f8635de..5dd52d37d 100644 --- a/app/models/champs/engagement_champ.rb +++ b/app/models/champs/engagement_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/explication_champ.rb b/app/models/champs/explication_champ.rb index cf9770b32..92db6836a 100644 --- a/app/models/champs/explication_champ.rb +++ b/app/models/champs/explication_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/header_section_champ.rb b/app/models/champs/header_section_champ.rb index f6952e9e6..995326224 100644 --- a/app/models/champs/header_section_champ.rb +++ b/app/models/champs/header_section_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/iban_champ.rb b/app/models/champs/iban_champ.rb index 941c1ff7f..2862642df 100644 --- a/app/models/champs/iban_champ.rb +++ b/app/models/champs/iban_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/integer_number_champ.rb b/app/models/champs/integer_number_champ.rb index d21b3877c..7d1f6a9e5 100644 --- a/app/models/champs/integer_number_champ.rb +++ b/app/models/champs/integer_number_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/linked_drop_down_list_champ.rb b/app/models/champs/linked_drop_down_list_champ.rb index 7310cbaff..4d802bb49 100644 --- a/app/models/champs/linked_drop_down_list_champ.rb +++ b/app/models/champs/linked_drop_down_list_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/multiple_drop_down_list_champ.rb b/app/models/champs/multiple_drop_down_list_champ.rb index 11b0d5a40..2186897bb 100644 --- a/app/models/champs/multiple_drop_down_list_champ.rb +++ b/app/models/champs/multiple_drop_down_list_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/number_champ.rb b/app/models/champs/number_champ.rb index 01bf34146..e08c5f2bf 100644 --- a/app/models/champs/number_champ.rb +++ b/app/models/champs/number_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/pays_champ.rb b/app/models/champs/pays_champ.rb index a1c6e6a45..42bea3386 100644 --- a/app/models/champs/pays_champ.rb +++ b/app/models/champs/pays_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/phone_champ.rb b/app/models/champs/phone_champ.rb index 6503eb1b3..e395f7a21 100644 --- a/app/models/champs/phone_champ.rb +++ b/app/models/champs/phone_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/piece_justificative_champ.rb b/app/models/champs/piece_justificative_champ.rb index 5437a78a8..a5b1eff82 100644 --- a/app/models/champs/piece_justificative_champ.rb +++ b/app/models/champs/piece_justificative_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/region_champ.rb b/app/models/champs/region_champ.rb index 08c1cd9b2..3d15aefc4 100644 --- a/app/models/champs/region_champ.rb +++ b/app/models/champs/region_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/repetition_champ.rb b/app/models/champs/repetition_champ.rb index 6861ffa67..8ab6469d9 100644 --- a/app/models/champs/repetition_champ.rb +++ b/app/models/champs/repetition_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/siret_champ.rb b/app/models/champs/siret_champ.rb index 5e6624feb..e7dabf5a1 100644 --- a/app/models/champs/siret_champ.rb +++ b/app/models/champs/siret_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/text_champ.rb b/app/models/champs/text_champ.rb index e8fd31aa2..4456e4a1d 100644 --- a/app/models/champs/text_champ.rb +++ b/app/models/champs/text_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/textarea_champ.rb b/app/models/champs/textarea_champ.rb index c789bc07d..20d64225d 100644 --- a/app/models/champs/textarea_champ.rb +++ b/app/models/champs/textarea_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/titre_identite_champ.rb b/app/models/champs/titre_identite_champ.rb index c7b3e312e..127711565 100644 --- a/app/models/champs/titre_identite_champ.rb +++ b/app/models/champs/titre_identite_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/app/models/champs/yes_no_champ.rb b/app/models/champs/yes_no_champ.rb index 54596dba9..7a1e7bc5f 100644 --- a/app/models/champs/yes_no_champ.rb +++ b/app/models/champs/yes_no_champ.rb @@ -12,6 +12,7 @@ # updated_at :datetime # dossier_id :integer # etablissement_id :integer +# external_id :string # parent_id :bigint # type_de_champ_id :integer # diff --git a/db/migrate/20210114224721_add_external_id_to_champs.rb b/db/migrate/20210114224721_add_external_id_to_champs.rb new file mode 100644 index 000000000..b8f8ae899 --- /dev/null +++ b/db/migrate/20210114224721_add_external_id_to_champs.rb @@ -0,0 +1,5 @@ +class AddExternalIdToChamps < ActiveRecord::Migration[6.0] + def change + add_column :champs, :external_id, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 947177bbb..d32d42068 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_01_13_150013) do +ActiveRecord::Schema.define(version: 2021_01_14_224721) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -144,6 +144,7 @@ ActiveRecord::Schema.define(version: 2021_01_13_150013) do t.bigint "parent_id" t.integer "row" t.jsonb "data" + t.string "external_id" t.index ["dossier_id"], name: "index_champs_on_dossier_id" t.index ["parent_id"], name: "index_champs_on_parent_id" t.index ["private"], name: "index_champs_on_private" From 9f691dce4c3d6549f8da0cc6ae795d5246116e7b Mon Sep 17 00:00:00 2001 From: Paul Chavard Date: Thu, 14 Jan 2021 23:54:32 +0100 Subject: [PATCH 2/3] Set external_id from combo search inputs --- app/controllers/users/dossiers_controller.rb | 4 +-- app/javascript/components/ComboSearch.js | 33 ++++++++++++++----- .../editable_champs/_address.html.haml | 1 + .../_annuaire_education.html.haml | 1 + .../editable_champs/_communes.html.haml | 1 + .../editable_champs/_departements.html.haml | 1 + .../editable_champs/_regions.html.haml | 1 + 7 files changed, 32 insertions(+), 10 deletions(-) diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 86da6303f..60d549162 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -323,8 +323,8 @@ module Users def champs_params params.permit(dossier: { champs_attributes: [ - :id, :value, :primary_value, :secondary_value, :piece_justificative_file, value: [], - champs_attributes: [:id, :_destroy, :value, :primary_value, :secondary_value, :piece_justificative_file, value: []] + :id, :value, :external_id, :primary_value, :secondary_value, :piece_justificative_file, value: [], + champs_attributes: [:id, :_destroy, :value, :external_id, :primary_value, :secondary_value, :piece_justificative_file, value: []] ] }) end diff --git a/app/javascript/components/ComboSearch.js b/app/javascript/components/ComboSearch.js index cd9a5d1ab..0bd85c99f 100644 --- a/app/javascript/components/ComboSearch.js +++ b/app/javascript/components/ComboSearch.js @@ -28,22 +28,38 @@ function ComboSearch({ transformResults = defaultTransformResults }) { const label = scope; - const hiddenField = useMemo( + const hiddenValueField = useMemo( () => document.querySelector(`input[data-uuid="${hiddenFieldId}"]`), [hiddenFieldId] ); - const initialValue = hiddenField && hiddenField.value; + const hiddenIdField = useMemo( + () => + document.querySelector( + `input[data-uuid="${hiddenFieldId}"] + input[data-reference]` + ), + [hiddenFieldId] + ); + const initialValue = hiddenValueField && hiddenValueField.value; const [searchTerm, setSearchTerm] = useState(''); const [debouncedSearchTerm, setDebouncedSearchTerm] = useState(''); const [value, setValue] = useState(initialValue); const resultsMap = useRef({}); const setExternalValue = useCallback((value) => { - if (hiddenField) { - hiddenField.setAttribute('value', value); - fire(hiddenField, 'autosave:trigger'); + if (hiddenValueField) { + hiddenValueField.setAttribute('value', value); + fire(hiddenValueField, 'autosave:trigger'); } + }); + const setExternalId = useCallback((key) => { + if (hiddenIdField) { + hiddenIdField.setAttribute('value', key); + } + }); + const setExternalValueAndId = useCallback((value) => { + const [key, result] = resultsMap.current[value]; + setExternalId(key); + setExternalValue(value); if (onChange) { - const result = resultsMap.current[value]; onChange(value, result); } }); @@ -62,6 +78,7 @@ function ComboSearch({ if (value.length >= minimumInputLength) { setSearchTerm(value.trim()); if (allowInputValues) { + setExternalId(''); setExternalValue(value); } } @@ -70,7 +87,7 @@ function ComboSearch({ ); const handleOnSelect = useCallback((value) => { - setExternalValue(value); + setExternalValueAndId(value); setValue(value); }); @@ -95,7 +112,7 @@ function ComboSearch({ {results.map((result) => { const [key, str] = transformResult(result); - resultsMap.current[str] = result; + resultsMap.current[str] = [key, result]; return ( Date: Thu, 14 Jan 2021 23:55:34 +0100 Subject: [PATCH 3/3] Use external_id to fetch annuaire_education data --- app/jobs/annuaire_education_update_job.rb | 8 ++++---- app/lib/api_education/annuaire_education_adapter.rb | 6 +++--- app/lib/api_education/api.rb | 4 ++-- app/models/champs/annuaire_education_champ.rb | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/app/jobs/annuaire_education_update_job.rb b/app/jobs/annuaire_education_update_job.rb index b312a0fd7..334b268e9 100644 --- a/app/jobs/annuaire_education_update_job.rb +++ b/app/jobs/annuaire_education_update_job.rb @@ -1,14 +1,14 @@ class AnnuaireEducationUpdateJob < ApplicationJob def perform(champ) - search_term = champ.value + external_id = champ.external_id - if search_term.present? - data = ApiEducation::AnnuaireEducationAdapter.new(search_term).to_params + if external_id.present? + data = ApiEducation::AnnuaireEducationAdapter.new(external_id).to_params if data.present? champ.data = data else - champ.value = nil + champ.external_id = nil end champ.save! end diff --git a/app/lib/api_education/annuaire_education_adapter.rb b/app/lib/api_education/annuaire_education_adapter.rb index 46bf3b977..151120ec1 100644 --- a/app/lib/api_education/annuaire_education_adapter.rb +++ b/app/lib/api_education/annuaire_education_adapter.rb @@ -7,8 +7,8 @@ class ApiEducation::AnnuaireEducationAdapter end end - def initialize(search_term) - @search_term = search_term + def initialize(id) + @id = id end def to_params @@ -27,7 +27,7 @@ class ApiEducation::AnnuaireEducationAdapter private def data_source - @data_source ||= JSON.parse(ApiEducation::API.search_annuaire_education(@search_term), symbolize_names: true) + @data_source ||= JSON.parse(ApiEducation::API.get_annuaire_education(@id), symbolize_names: true) end def schemer diff --git a/app/lib/api_education/api.rb b/app/lib/api_education/api.rb index b113ebce9..368096712 100644 --- a/app/lib/api_education/api.rb +++ b/app/lib/api_education/api.rb @@ -2,8 +2,8 @@ class ApiEducation::API class ResourceNotFound < StandardError end - def self.search_annuaire_education(search_term) - call([API_EDUCATION_URL, 'search'].join('/'), 'fr-en-annuaire-education', { q: search_term }) + def self.get_annuaire_education(id) + call([API_EDUCATION_URL, 'search'].join('/'), 'fr-en-annuaire-education', { 'refine.identifiant_de_l_etablissement': id }) end private diff --git a/app/models/champs/annuaire_education_champ.rb b/app/models/champs/annuaire_education_champ.rb index 874d69949..4463cc622 100644 --- a/app/models/champs/annuaire_education_champ.rb +++ b/app/models/champs/annuaire_education_champ.rb @@ -23,13 +23,13 @@ class Champs::AnnuaireEducationChamp < Champs::TextChamp private def cleanup_if_empty - if value_changed? + if external_id_changed? self.data = nil end end def fetch_data - if value.present? && data.nil? + if external_id.present? && data.nil? AnnuaireEducationUpdateJob.perform_later(self) end end