Merge pull request #10971 from tchak/refactor-champ-value-blank
refactor(champ): move champ.blank? implementation to type_de_champ
This commit is contained in:
commit
ef8f74c708
37 changed files with 185 additions and 142 deletions
|
@ -99,11 +99,11 @@ class Champ < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def mandatory_blank?
|
def mandatory_blank?
|
||||||
mandatory? && blank?
|
type_de_champ.mandatory_blank?(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
def blank?
|
||||||
value.blank?
|
type_de_champ.champ_blank?(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def search_terms
|
def search_terms
|
||||||
|
|
|
@ -85,10 +85,6 @@ class Champs::CarteChamp < Champ
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
|
||||||
geo_areas.blank?
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def selection_utilisateur_legacy_geometry
|
def selection_utilisateur_legacy_geometry
|
||||||
|
|
|
@ -1,10 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class Champs::CheckboxChamp < Champs::BooleanChamp
|
class Champs::CheckboxChamp < Champs::BooleanChamp
|
||||||
def mandatory_blank?
|
|
||||||
mandatory? && (blank? || !true?)
|
|
||||||
end
|
|
||||||
|
|
||||||
def legend_label?
|
def legend_label?
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
@ -13,11 +9,6 @@ class Champs::CheckboxChamp < Champs::BooleanChamp
|
||||||
[[I18n.t('activerecord.attributes.type_de_champ.type_champs.checkbox_true'), true], [I18n.t('activerecord.attributes.type_de_champ.type_champs.checkbox_false'), false]]
|
[[I18n.t('activerecord.attributes.type_de_champ.type_champs.checkbox_true'), true], [I18n.t('activerecord.attributes.type_de_champ.type_champs.checkbox_false'), false]]
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO remove when normalize_checkbox_values is over
|
|
||||||
def true?
|
|
||||||
value_with_legacy == TRUE_VALUE
|
|
||||||
end
|
|
||||||
|
|
||||||
def html_label?
|
def html_label?
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
@ -25,11 +16,4 @@ class Champs::CheckboxChamp < Champs::BooleanChamp
|
||||||
def single_checkbox?
|
def single_checkbox?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
# TODO remove when normalize_checkbox_values is over
|
|
||||||
def value_with_legacy
|
|
||||||
value == 'on' ? TRUE_VALUE : value
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,10 +8,6 @@ class Champs::CnafChamp < Champs::TextChamp
|
||||||
|
|
||||||
store_accessor :value_json, :numero_allocataire, :code_postal
|
store_accessor :value_json, :numero_allocataire, :code_postal
|
||||||
|
|
||||||
def blank?
|
|
||||||
external_id.nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_external_data?
|
def fetch_external_data?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
|
@ -20,10 +20,6 @@ class Champs::COJOChamp < Champ
|
||||||
accreditation_success == false
|
accreditation_success == false
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
|
||||||
accreditation_success != true
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_external_data?
|
def fetch_external_data?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,10 +7,6 @@ class Champs::DgfipChamp < Champs::TextChamp
|
||||||
|
|
||||||
store_accessor :value_json, :numero_fiscal, :reference_avis
|
store_accessor :value_json, :numero_fiscal, :reference_avis
|
||||||
|
|
||||||
def blank?
|
|
||||||
external_id.nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_external_data?
|
def fetch_external_data?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
|
@ -35,11 +35,6 @@ class Champs::LinkedDropDownListChamp < Champ
|
||||||
:primary_value
|
:primary_value
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
|
||||||
primary_value.blank? ||
|
|
||||||
(has_secondary_options_for_primary? && secondary_value.blank?)
|
|
||||||
end
|
|
||||||
|
|
||||||
def search_terms
|
def search_terms
|
||||||
[primary_value, secondary_value]
|
[primary_value, secondary_value]
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,10 +4,6 @@ class Champs::MesriChamp < Champs::TextChamp
|
||||||
# see https://github.com/betagouv/api-particulier/blob/master/src/presentation/middlewares/mesri-input-validation.middleware.ts
|
# see https://github.com/betagouv/api-particulier/blob/master/src/presentation/middlewares/mesri-input-validation.middleware.ts
|
||||||
store_accessor :value_json, :ine
|
store_accessor :value_json, :ine
|
||||||
|
|
||||||
def blank?
|
|
||||||
external_id.nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_external_data?
|
def fetch_external_data?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
|
@ -29,10 +29,6 @@ class Champs::MultipleDropDownListChamp < Champ
|
||||||
render_as_checkboxes?
|
render_as_checkboxes?
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
|
||||||
selected_options.blank?
|
|
||||||
end
|
|
||||||
|
|
||||||
def in?(options)
|
def in?(options)
|
||||||
(selected_options - options).size != selected_options.size
|
(selected_options - options).size != selected_options.size
|
||||||
end
|
end
|
||||||
|
|
|
@ -35,10 +35,6 @@ class Champs::PaysChamp < Champs::TextChamp
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
|
||||||
value.blank? && external_id.blank?
|
|
||||||
end
|
|
||||||
|
|
||||||
def code
|
def code
|
||||||
external_id || APIGeoService.country_code(value)
|
external_id || APIGeoService.country_code(value)
|
||||||
end
|
end
|
||||||
|
|
|
@ -21,12 +21,4 @@ class Champs::PieceJustificativeChamp < Champ
|
||||||
def search_terms
|
def search_terms
|
||||||
# We don’t know how to search inside documents yet
|
# We don’t know how to search inside documents yet
|
||||||
end
|
end
|
||||||
|
|
||||||
def mandatory_blank?
|
|
||||||
mandatory? && !piece_justificative_file.attached?
|
|
||||||
end
|
|
||||||
|
|
||||||
def blank?
|
|
||||||
piece_justificative_file.blank?
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,10 +4,6 @@ class Champs::PoleEmploiChamp < Champs::TextChamp
|
||||||
# see https://github.com/betagouv/api-particulier/blob/master/src/presentation/middlewares/pole-emploi-input-validation.middleware.ts
|
# see https://github.com/betagouv/api-particulier/blob/master/src/presentation/middlewares/pole-emploi-input-validation.middleware.ts
|
||||||
store_accessor :value_json, :identifiant
|
store_accessor :value_json, :identifiant
|
||||||
|
|
||||||
def blank?
|
|
||||||
external_id.nil?
|
|
||||||
end
|
|
||||||
|
|
||||||
def fetch_external_data?
|
def fetch_external_data?
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,10 +23,6 @@ class Champs::RepetitionChamp < Champ
|
||||||
rows.last&.first&.focusable_input_id
|
rows.last&.first&.focusable_input_id
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
|
||||||
row_ids.empty?
|
|
||||||
end
|
|
||||||
|
|
||||||
def search_terms
|
def search_terms
|
||||||
# The user cannot enter any information here so it doesn’t make much sense to search
|
# The user cannot enter any information here so it doesn’t make much sense to search
|
||||||
end
|
end
|
||||||
|
|
|
@ -27,10 +27,6 @@ class Champs::RNFChamp < Champ
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def blank?
|
|
||||||
rnf_id.blank?
|
|
||||||
end
|
|
||||||
|
|
||||||
def code_departement
|
def code_departement
|
||||||
address.present? && address['departmentCode']
|
address.present? && address['departmentCode']
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,8 +6,4 @@ class Champs::SiretChamp < Champ
|
||||||
def search_terms
|
def search_terms
|
||||||
etablissement.present? ? etablissement.search_terms : [value]
|
etablissement.present? ? etablissement.search_terms : [value]
|
||||||
end
|
end
|
||||||
|
|
||||||
def mandatory_blank?
|
|
||||||
mandatory? && Siret.new(siret: value).invalid?
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,12 +16,4 @@ class Champs::TitreIdentiteChamp < Champ
|
||||||
def search_terms
|
def search_terms
|
||||||
# We don’t know how to search inside documents yet
|
# We don’t know how to search inside documents yet
|
||||||
end
|
end
|
||||||
|
|
||||||
def mandatory_blank?
|
|
||||||
mandatory? && !piece_justificative_file.attached?
|
|
||||||
end
|
|
||||||
|
|
||||||
def blank?
|
|
||||||
piece_justificative_file.blank?
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -709,7 +709,7 @@ class TypeDeChamp < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value(champ)
|
def champ_value(champ)
|
||||||
if use_default_value?(champ)
|
if champ_blank?(champ)
|
||||||
dynamic_type.champ_default_value
|
dynamic_type.champ_default_value
|
||||||
else
|
else
|
||||||
dynamic_type.champ_value(champ)
|
dynamic_type.champ_value(champ)
|
||||||
|
@ -717,7 +717,7 @@ class TypeDeChamp < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_api(champ, version: 2)
|
def champ_value_for_api(champ, version: 2)
|
||||||
if use_default_value?(champ)
|
if champ_blank?(champ)
|
||||||
dynamic_type.champ_default_api_value(version)
|
dynamic_type.champ_default_api_value(version)
|
||||||
else
|
else
|
||||||
dynamic_type.champ_value_for_api(champ, version:)
|
dynamic_type.champ_value_for_api(champ, version:)
|
||||||
|
@ -725,7 +725,7 @@ class TypeDeChamp < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_export(champ, path = :value)
|
def champ_value_for_export(champ, path = :value)
|
||||||
if use_default_value?(champ)
|
if champ_blank?(champ)
|
||||||
dynamic_type.champ_default_export_value(path)
|
dynamic_type.champ_default_export_value(path)
|
||||||
else
|
else
|
||||||
dynamic_type.champ_value_for_export(champ, path)
|
dynamic_type.champ_value_for_export(champ, path)
|
||||||
|
@ -733,13 +733,35 @@ class TypeDeChamp < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_tag(champ, path = :value)
|
def champ_value_for_tag(champ, path = :value)
|
||||||
if use_default_value?(champ)
|
if champ_blank?(champ)
|
||||||
''
|
''
|
||||||
else
|
else
|
||||||
dynamic_type.champ_value_for_tag(champ, path)
|
dynamic_type.champ_value_for_tag(champ, path)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ)
|
||||||
|
# no champ
|
||||||
|
return true if champ.nil?
|
||||||
|
# type de champ on the revision changed
|
||||||
|
if champ.last_write_type_champ == type_champ || castable_on_change?(champ.last_write_type_champ, type_champ)
|
||||||
|
dynamic_type.champ_blank?(champ)
|
||||||
|
else
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def mandatory_blank?(champ)
|
||||||
|
# no champ
|
||||||
|
return true if champ.nil?
|
||||||
|
# type de champ on the revision changed
|
||||||
|
if champ.last_write_type_champ == type_champ || castable_on_change?(champ.last_write_type_champ, type_champ)
|
||||||
|
mandatory? && dynamic_type.champ_blank_or_invalid?(champ)
|
||||||
|
else
|
||||||
|
true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def html_id(row_id = nil)
|
def html_id(row_id = nil)
|
||||||
"champ-#{public_id(row_id)}"
|
"champ-#{public_id(row_id)}"
|
||||||
end
|
end
|
||||||
|
@ -758,24 +780,12 @@ class TypeDeChamp < ApplicationRecord
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def use_default_value?(champ)
|
|
||||||
# no champ
|
|
||||||
return true if champ.nil?
|
|
||||||
# type de champ on the revision changed
|
|
||||||
if champ.last_write_type_champ != type_champ
|
|
||||||
return !castable_on_change?(champ.last_write_type_champ, type_champ)
|
|
||||||
end
|
|
||||||
# special case for linked drop down champ – it's blank implementation is not what you think
|
|
||||||
return champ.value.blank? if type_champ == TypeDeChamp.type_champs.fetch(:linked_drop_down_list)
|
|
||||||
champ.blank?
|
|
||||||
end
|
|
||||||
|
|
||||||
def castable_on_change?(from_type, to_type)
|
def castable_on_change?(from_type, to_type)
|
||||||
case [from_type, to_type]
|
case [from_type, to_type]
|
||||||
when ['integer_number', 'decimal_number'], # recast numbers automatically
|
when ['integer_number', 'decimal_number'], # recast numbers automatically
|
||||||
['decimal_number', 'integer_number'], # may lose some data, but who cares ?
|
['decimal_number', 'integer_number'], # may lose some data, but who cares ?
|
||||||
['text', 'textarea'], # allow short text to long text
|
['text', 'textarea'], # allow short text to long text
|
||||||
# ['drop_down_list', 'multiple_drop_down_list'], # single list can become multi
|
['drop_down_list', 'multiple_drop_down_list'], # single list can become multi
|
||||||
['date', 'datetime'], # date <=> datetime
|
['date', 'datetime'], # date <=> datetime
|
||||||
['datetime', 'date'] # may lose some data, but who cares ?
|
['datetime', 'date'] # may lose some data, but who cares ?
|
||||||
true
|
true
|
||||||
|
|
|
@ -28,6 +28,8 @@ class TypesDeChamp::CarteTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
champ.geo_areas.map(&:label).join("\n")
|
champ.geo_areas.map(&:label).join("\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.geo_areas.blank?
|
||||||
|
|
||||||
def columns(procedure_id:, displayable: true, prefix: nil)
|
def columns(procedure_id:, displayable: true, prefix: nil)
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,21 +12,17 @@ class TypesDeChamp::CheckboxTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value(champ)
|
def champ_value(champ)
|
||||||
champ.true? ? 'Oui' : 'Non'
|
champ_value_true?(champ) ? 'Oui' : 'Non'
|
||||||
end
|
|
||||||
|
|
||||||
def champ_value_for_tag(champ, path = :value)
|
|
||||||
champ_value(champ)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_export(champ, path = :value)
|
def champ_value_for_export(champ, path = :value)
|
||||||
champ.true? ? 'on' : 'off'
|
champ_value_true?(champ) ? 'on' : 'off'
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_api(champ, version: 2)
|
def champ_value_for_api(champ, version: 2)
|
||||||
case version
|
case version
|
||||||
when 2
|
when 2
|
||||||
champ.true? ? 'true' : 'false'
|
champ_value_true?(champ).to_s
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
@ -48,4 +44,10 @@ class TypesDeChamp::CheckboxTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank_or_invalid?(champ) = !champ_value_true?(champ)
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def champ_value_true?(champ) = champ.value == 'true'
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,4 +4,6 @@ class TypesDeChamp::CnafTypeDeChamp < TypesDeChamp::TextTypeDeChamp
|
||||||
def estimated_fill_duration(revision)
|
def estimated_fill_duration(revision)
|
||||||
FILL_DURATION_MEDIUM
|
FILL_DURATION_MEDIUM
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.external_id.blank?
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,4 +4,6 @@ class TypesDeChamp::COJOTypeDeChamp < TypesDeChamp::TextTypeDeChamp
|
||||||
def champ_value(champ)
|
def champ_value(champ)
|
||||||
"#{champ.accreditation_number} – #{champ.accreditation_birthdate}"
|
"#{champ.accreditation_number} – #{champ.accreditation_birthdate}"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.accreditation_success != true
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,4 +4,6 @@ class TypesDeChamp::DgfipTypeDeChamp < TypesDeChamp::TextTypeDeChamp
|
||||||
def estimated_fill_duration(revision)
|
def estimated_fill_duration(revision)
|
||||||
FILL_DURATION_MEDIUM
|
FILL_DURATION_MEDIUM
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.external_id.blank?
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,11 +11,6 @@ class TypesDeChamp::LinkedDropDownListTypeDeChamp < TypesDeChamp::TypeDeChampBas
|
||||||
[[path[:libelle], path[:path]]]
|
[[path[:libelle], path[:path]]]
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_blank_option_when_not_mandatory(options)
|
|
||||||
return options if mandatory
|
|
||||||
options.unshift('')
|
|
||||||
end
|
|
||||||
|
|
||||||
def primary_options
|
def primary_options
|
||||||
primary_options = unpack_options.map(&:first)
|
primary_options = unpack_options.map(&:first)
|
||||||
if primary_options.present?
|
if primary_options.present?
|
||||||
|
@ -33,15 +28,15 @@ class TypesDeChamp::LinkedDropDownListTypeDeChamp < TypesDeChamp::TypeDeChampBas
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value(champ)
|
def champ_value(champ)
|
||||||
[champ.primary_value, champ.secondary_value].filter(&:present?).join(' / ')
|
[primary_value(champ), secondary_value(champ)].filter(&:present?).join(' / ')
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_tag(champ, path = :value)
|
def champ_value_for_tag(champ, path = :value)
|
||||||
case path
|
case path
|
||||||
when :primary
|
when :primary
|
||||||
champ.primary_value
|
primary_value(champ)
|
||||||
when :secondary
|
when :secondary
|
||||||
champ.secondary_value
|
secondary_value(champ)
|
||||||
when :value
|
when :value
|
||||||
champ_value(champ)
|
champ_value(champ)
|
||||||
end
|
end
|
||||||
|
@ -50,23 +45,32 @@ class TypesDeChamp::LinkedDropDownListTypeDeChamp < TypesDeChamp::TypeDeChampBas
|
||||||
def champ_value_for_export(champ, path = :value)
|
def champ_value_for_export(champ, path = :value)
|
||||||
case path
|
case path
|
||||||
when :primary
|
when :primary
|
||||||
champ.primary_value
|
primary_value(champ)
|
||||||
when :secondary
|
when :secondary
|
||||||
champ.secondary_value
|
secondary_value(champ)
|
||||||
when :value
|
when :value
|
||||||
"#{champ.primary_value || ''};#{champ.secondary_value || ''}"
|
"#{primary_value(champ) || ''};#{secondary_value(champ) || ''}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_api(champ, version: 2)
|
def champ_value_for_api(champ, version: 2)
|
||||||
case version
|
case version
|
||||||
when 1
|
when 1
|
||||||
{ primary: champ.primary_value, secondary: champ.secondary_value }
|
{ primary: primary_value(champ), secondary: secondary_value(champ) }
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ)
|
||||||
|
primary_value(champ).blank? && secondary_value(champ).blank?
|
||||||
|
end
|
||||||
|
|
||||||
|
def champ_blank_or_invalid?(champ)
|
||||||
|
primary_value(champ).blank? ||
|
||||||
|
(has_secondary_options_for_primary?(champ) && secondary_value(champ).blank?)
|
||||||
|
end
|
||||||
|
|
||||||
def columns(procedure_id:, displayable: true, prefix: nil)
|
def columns(procedure_id:, displayable: true, prefix: nil)
|
||||||
[
|
[
|
||||||
Columns::LinkedDropDownColumn.new(
|
Columns::LinkedDropDownColumn.new(
|
||||||
|
@ -101,6 +105,19 @@ class TypesDeChamp::LinkedDropDownListTypeDeChamp < TypesDeChamp::TypeDeChampBas
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def add_blank_option_when_not_mandatory(options)
|
||||||
|
return options if mandatory
|
||||||
|
options.unshift('')
|
||||||
|
end
|
||||||
|
|
||||||
|
def primary_value(champ) = unpack_value(champ.value, 0)
|
||||||
|
def secondary_value(champ) = unpack_value(champ.value, 1)
|
||||||
|
def unpack_value(value, index) = value&.then { JSON.parse(_1)[index] rescue nil }
|
||||||
|
|
||||||
|
def has_secondary_options_for_primary?(champ)
|
||||||
|
primary_value(champ).present? && secondary_options[primary_value(champ)]&.any?(&:present?)
|
||||||
|
end
|
||||||
|
|
||||||
def paths
|
def paths
|
||||||
paths = super
|
paths = super
|
||||||
paths.push({
|
paths.push({
|
||||||
|
|
|
@ -4,4 +4,6 @@ class TypesDeChamp::MesriTypeDeChamp < TypesDeChamp::TextTypeDeChamp
|
||||||
def estimated_fill_duration(revision)
|
def estimated_fill_duration(revision)
|
||||||
FILL_DURATION_MEDIUM
|
FILL_DURATION_MEDIUM
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.external_id.blank?
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,14 +2,30 @@
|
||||||
|
|
||||||
class TypesDeChamp::MultipleDropDownListTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
class TypesDeChamp::MultipleDropDownListTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
def champ_value(champ)
|
def champ_value(champ)
|
||||||
champ.selected_options.join(', ')
|
selected_options(champ).join(', ')
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_tag(champ, path = :value)
|
def champ_value_for_tag(champ, path = :value)
|
||||||
ChampPresentations::MultipleDropDownListPresentation.new(champ.selected_options)
|
ChampPresentations::MultipleDropDownListPresentation.new(selected_options(champ))
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_export(champ, path = :value)
|
def champ_value_for_export(champ, path = :value)
|
||||||
champ.selected_options.join(', ')
|
champ_value(champ)
|
||||||
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = selected_options(champ).blank?
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def selected_options(champ)
|
||||||
|
return [] if champ.value.blank?
|
||||||
|
|
||||||
|
if champ.last_write_type_champ == TypeDeChamp.type_champs.fetch(:drop_down_list)
|
||||||
|
[champ.value]
|
||||||
|
else
|
||||||
|
JSON.parse(champ.value)
|
||||||
|
end
|
||||||
|
rescue JSON::ParserError
|
||||||
|
[]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,6 +23,10 @@ class TypesDeChamp::PaysTypeDeChamp < TypesDeChamp::TextTypeDeChamp
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ)
|
||||||
|
champ.value.blank? && champ.external_id.blank?
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def paths
|
def paths
|
||||||
|
|
|
@ -23,6 +23,8 @@ class TypesDeChamp::PieceJustificativeTypeDeChamp < TypesDeChamp::TypeDeChampBas
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.piece_justificative_file.blank?
|
||||||
|
|
||||||
def columns(procedure_id:, displayable: true, prefix: nil)
|
def columns(procedure_id:, displayable: true, prefix: nil)
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,4 +4,6 @@ class TypesDeChamp::PoleEmploiTypeDeChamp < TypesDeChamp::TextTypeDeChamp
|
||||||
def estimated_fill_duration(revision)
|
def estimated_fill_duration(revision)
|
||||||
FILL_DURATION_MEDIUM
|
FILL_DURATION_MEDIUM
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.external_id.blank?
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,9 +3,7 @@
|
||||||
class TypesDeChamp::RepetitionTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
class TypesDeChamp::RepetitionTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
def champ_value_for_tag(champ, path = :value)
|
def champ_value_for_tag(champ, path = :value)
|
||||||
return nil if path != :value
|
return nil if path != :value
|
||||||
return champ_default_value if champ.rows.blank?
|
ChampPresentations::RepetitionPresentation.new(libelle, champ.dossier.project_rows_for(@type_de_champ))
|
||||||
|
|
||||||
ChampPresentations::RepetitionPresentation.new(champ.libelle, champ.rows)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def estimated_fill_duration(revision)
|
def estimated_fill_duration(revision)
|
||||||
|
@ -32,4 +30,6 @@ class TypesDeChamp::RepetitionTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
.all_revisions_types_de_champ(parent: @type_de_champ)
|
.all_revisions_types_de_champ(parent: @type_de_champ)
|
||||||
.flat_map { _1.columns(procedure_id:, displayable: false, prefix: libelle) }
|
.flat_map { _1.columns(procedure_id:, displayable: false, prefix: libelle) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.dossier.repetition_row_ids(@type_de_champ).blank?
|
||||||
end
|
end
|
||||||
|
|
|
@ -33,6 +33,8 @@ class TypesDeChamp::RNFTypeDeChamp < TypesDeChamp::TextTypeDeChamp
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.external_id.blank?
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def paths
|
def paths
|
||||||
|
|
|
@ -6,4 +6,6 @@ class TypesDeChamp::SiretTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
def estimated_fill_duration(revision)
|
def estimated_fill_duration(revision)
|
||||||
FILL_DURATION_MEDIUM
|
FILL_DURATION_MEDIUM
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank_or_invalid?(champ) = Siret.new(siret: champ.value).invalid?
|
||||||
end
|
end
|
||||||
|
|
|
@ -22,6 +22,8 @@ class TypesDeChamp::TitreIdentiteTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
"absent"
|
"absent"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.piece_justificative_file.blank?
|
||||||
|
|
||||||
def columns(procedure_id:, displayable: nil, prefix: nil)
|
def columns(procedure_id:, displayable: nil, prefix: nil)
|
||||||
[
|
[
|
||||||
Columns::TitreIdentiteColumn.new(
|
Columns::TitreIdentiteColumn.new(
|
||||||
|
|
|
@ -92,6 +92,9 @@ class TypesDeChamp::TypeDeChampBase
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ_blank?(champ) = champ.value.blank?
|
||||||
|
def champ_blank_or_invalid?(champ) = champ_blank?(champ)
|
||||||
|
|
||||||
def columns(procedure_id:, displayable: true, prefix: nil)
|
def columns(procedure_id:, displayable: true, prefix: nil)
|
||||||
if fillable?
|
if fillable?
|
||||||
[
|
[
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class TypesDeChamp::YesNoTypeDeChamp < TypesDeChamp::CheckboxTypeDeChamp
|
class TypesDeChamp::YesNoTypeDeChamp < TypesDeChamp::TypeDeChampBase
|
||||||
def filter_to_human(filter_value)
|
def filter_to_human(filter_value)
|
||||||
if filter_value == "true"
|
if filter_value == "true"
|
||||||
I18n.t('activerecord.attributes.type_de_champ.type_champs.yes_no_true')
|
I18n.t('activerecord.attributes.type_de_champ.type_champs.yes_no_true')
|
||||||
|
@ -12,21 +12,17 @@ class TypesDeChamp::YesNoTypeDeChamp < TypesDeChamp::CheckboxTypeDeChamp
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value(champ)
|
def champ_value(champ)
|
||||||
champ_formatted_value(champ)
|
champ_value_true?(champ) ? 'Oui' : 'Non'
|
||||||
end
|
|
||||||
|
|
||||||
def champ_value_for_tag(champ, path = :value)
|
|
||||||
champ_formatted_value(champ)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_export(champ, path = :value)
|
def champ_value_for_export(champ, path = :value)
|
||||||
champ_formatted_value(champ)
|
champ_value_true?(champ) ? 'Oui' : 'Non'
|
||||||
end
|
end
|
||||||
|
|
||||||
def champ_value_for_api(champ, version: 2)
|
def champ_value_for_api(champ, version: 2)
|
||||||
case version
|
case version
|
||||||
when 2
|
when 2
|
||||||
champ.true? ? 'true' : 'false'
|
champ_value_true?(champ).to_s
|
||||||
else
|
else
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
@ -42,7 +38,7 @@ class TypesDeChamp::YesNoTypeDeChamp < TypesDeChamp::CheckboxTypeDeChamp
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def champ_formatted_value(champ)
|
def champ_value_true?(champ)
|
||||||
champ.true? ? 'Oui' : 'Non'
|
champ.value == 'true'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@ describe Champ do
|
||||||
|
|
||||||
describe 'mandatory_blank?' do
|
describe 'mandatory_blank?' do
|
||||||
let(:type_de_champ) { build(:type_de_champ, mandatory: mandatory) }
|
let(:type_de_champ) { build(:type_de_champ, mandatory: mandatory) }
|
||||||
let(:champ) { Champ.new(value: value) }
|
let(:champ) { Champs::TextChamp.new(value: value) }
|
||||||
let(:value) { '' }
|
let(:value) { '' }
|
||||||
let(:mandatory) { true }
|
let(:mandatory) { true }
|
||||||
|
|
||||||
|
|
|
@ -9,12 +9,6 @@ describe Champs::CheckboxChamp do
|
||||||
describe '#true?' do
|
describe '#true?' do
|
||||||
subject { boolean_champ.true? }
|
subject { boolean_champ.true? }
|
||||||
|
|
||||||
context "when the checkbox value is 'on'" do
|
|
||||||
let(:value) { 'on' }
|
|
||||||
|
|
||||||
it { is_expected.to eq(true) }
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when the checkbox value is 'off'" do
|
context "when the checkbox value is 'off'" do
|
||||||
let(:value) { 'off' }
|
let(:value) { 'off' }
|
||||||
|
|
||||||
|
|
|
@ -413,4 +413,66 @@ describe TypeDeChamp do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'champ_value with cast' do
|
||||||
|
let(:procedure) { create(:procedure, types_de_champ_public: [{ type: type_champ }]) }
|
||||||
|
let(:dossier) { create(:dossier, procedure:) }
|
||||||
|
let(:type_champ) { :text }
|
||||||
|
let(:last_write_type_champ) { :text }
|
||||||
|
let(:champ_value) { 'hello' }
|
||||||
|
let(:champ_type) { TypeDeChamp.type_champ_to_champ_class_name(last_write_type_champ.to_s) }
|
||||||
|
let(:type_de_champ) { procedure.active_revision.types_de_champ.first }
|
||||||
|
let(:champ) { dossier.champs.first }
|
||||||
|
|
||||||
|
subject { champ.update_columns(type: champ_type, value: champ_value); type_de_champ.champ_value(champ) }
|
||||||
|
|
||||||
|
it { expect(subject).to eq('hello') }
|
||||||
|
|
||||||
|
context 'text -> integer_number' do
|
||||||
|
let(:last_write_type_champ) { :text }
|
||||||
|
let(:type_champ) { :integer_number }
|
||||||
|
|
||||||
|
it { expect(subject).to eq('') }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'integer_number -> text' do
|
||||||
|
let(:last_write_type_champ) { :integer_number }
|
||||||
|
let(:type_champ) { :text }
|
||||||
|
let(:champ_value) { '42' }
|
||||||
|
|
||||||
|
it { expect(subject).to eq('') }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'integer_number -> decimal_number' do
|
||||||
|
let(:last_write_type_champ) { :integer_number }
|
||||||
|
let(:type_champ) { :decimal_number }
|
||||||
|
let(:champ_value) { '42' }
|
||||||
|
|
||||||
|
it { expect(subject).to eq('42') }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'decimal_number -> integer_number' do
|
||||||
|
let(:last_write_type_champ) { :decimal_number }
|
||||||
|
let(:type_champ) { :integer_number }
|
||||||
|
let(:champ_value) { '42.1' }
|
||||||
|
|
||||||
|
it { expect(subject).to eq('42.1') }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'drop_down_list -> multiple_drop_down_list' do
|
||||||
|
let(:last_write_type_champ) { :drop_down_list }
|
||||||
|
let(:type_champ) { :multiple_drop_down_list }
|
||||||
|
let(:champ_value) { type_de_champ.drop_down_options.first }
|
||||||
|
|
||||||
|
it { expect(subject).to eq(champ_value) }
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'multiple_drop_down_list -> drop_down_list' do
|
||||||
|
let(:last_write_type_champ) { :multiple_drop_down_list }
|
||||||
|
let(:type_champ) { :drop_down_list }
|
||||||
|
let(:champ_value) { "[\"#{type_de_champ.drop_down_options.first}\"]" }
|
||||||
|
|
||||||
|
it { expect(subject).to eq('') }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue