demarches-normaliennes/app/components/editable_champ/editable_champ_component.rb

96 lines
2.5 KiB
Ruby
Raw Normal View History

2022-08-12 10:45:04 +02:00
class EditableChamp::EditableChampComponent < ApplicationComponent
def initialize(form:, champ:, seen_at: nil)
@form, @champ, @seen_at = form, champ, seen_at
2023-05-05 09:13:05 +02:00
@attribute = :value
end
def champ_component
@champ_component ||= component_class.new(form: @form, champ: @champ, seen_at: @seen_at)
end
private
def has_label?(champ)
types_without_label = [
TypeDeChamp.type_champs.fetch(:header_section),
TypeDeChamp.type_champs.fetch(:explication),
TypeDeChamp.type_champs.fetch(:repetition),
TypeDeChamp.type_champs.fetch(:linked_drop_down_list)
]
!types_without_label.include?(@champ.type_champ)
end
def component_class
"EditableChamp::#{@champ.type_champ.camelcase}Component".constantize
end
def html_options
{
class: class_names(
2023-05-05 09:13:05 +02:00
{
'editable-champ': true,
"editable-champ-#{@champ.type_champ}": true,
champ_component.dsfr_group_classname => true
}.merge(champ_component.input_group_error_class_names)
),
2023-05-30 11:39:53 +02:00
data: { controller: stimulus_controller, **data_dependent_conditions, **stimulus_values }
}.deep_merge(champ_component.fieldset_error_opts)
end
def fieldset_element_attributes
{
id: @champ.input_group_id,
"hidden": !@champ.visible?
}
end
2023-05-30 11:39:53 +02:00
def stimulus_values
if @champ.fetch_external_data_pending?
{ turbo_poll_url_value: }
else
{}
end
end
def turbo_poll_url_value
if @champ.private?
if Champ.update_by_stable_id?
annotation_instructeur_dossier_path(@champ.dossier.procedure, @champ.dossier, @champ.stable_id, row_id: @champ.row_id, with_public_id: true)
else
annotation_instructeur_dossier_path(@champ.dossier.procedure, @champ.dossier, @champ)
end
2023-05-30 11:39:53 +02:00
else
if Champ.update_by_stable_id?
champ_dossier_path(@champ.dossier, @champ.stable_id, row_id: @champ.row_id, with_public_id: true)
else
champ_dossier_path(@champ.dossier, @champ)
end
2023-05-30 11:39:53 +02:00
end
end
def stimulus_controller
2023-06-06 15:54:03 +02:00
if autosave_enabled?
# This is an editable champ. Lets find what controllers it might need.
2023-03-01 18:30:10 +01:00
controllers = ['autosave']
2023-05-30 11:39:53 +02:00
if @champ.fetch_external_data_pending?
controllers << 'turbo-poll'
end
controllers.join(' ')
end
2022-08-12 10:45:04 +02:00
end
def data_dependent_conditions
if @champ.dependent_conditions?
{ "dependent-conditions": "true" }
else
{}
end
end
2023-06-06 15:54:03 +02:00
def autosave_enabled?
!@champ.carte? && !@champ.block? && @champ.fillable?
end
2022-08-12 10:45:04 +02:00
end