Merge pull request #11062 from tchak/column-better-cast
ETQ dev, je souhaite obtenir la valeur humaine d'une colonne
This commit is contained in:
commit
ee9a493877
7 changed files with 57 additions and 39 deletions
|
@ -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
|
||||
|
|
|
@ -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}"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue