feat(dossier): implement champ polling
This commit is contained in:
parent
52545dc86c
commit
a9f431caa5
5 changed files with 64 additions and 4 deletions
|
@ -25,15 +25,35 @@ class EditableChamp::EditableChampComponent < ApplicationComponent
|
||||||
"hidden": !@champ.visible?
|
"hidden": !@champ.visible?
|
||||||
),
|
),
|
||||||
id: @champ.input_group_id,
|
id: @champ.input_group_id,
|
||||||
data: { controller: stimulus_controller, **data_dependent_conditions }
|
data: { controller: stimulus_controller, **data_dependent_conditions, **stimulus_values }
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def stimulus_values
|
||||||
|
if @champ.fetch_external_data_pending?
|
||||||
|
{ turbo_poll_url_value: }
|
||||||
|
else
|
||||||
|
{}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def turbo_poll_url_value
|
||||||
|
if @champ.private?
|
||||||
|
annotation_instructeur_dossier_path(@champ.dossier.procedure, @champ.dossier, @champ)
|
||||||
|
else
|
||||||
|
champ_dossier_path(@champ.dossier, @champ)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def stimulus_controller
|
def stimulus_controller
|
||||||
if autosave_enabled?
|
if autosave_enabled?
|
||||||
# This is an editable champ. Lets find what controllers it might need.
|
# This is an editable champ. Lets find what controllers it might need.
|
||||||
controllers = ['autosave']
|
controllers = ['autosave']
|
||||||
|
|
||||||
|
if @champ.fetch_external_data_pending?
|
||||||
|
controllers << 'turbo-poll'
|
||||||
|
end
|
||||||
|
|
||||||
controllers.join(' ')
|
controllers.join(' ')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -302,6 +302,20 @@ module Instructeurs
|
||||||
render layout: "print"
|
render layout: "print"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def annotation
|
||||||
|
@dossier = dossier_with_champs(pj_template: false)
|
||||||
|
annotation = @dossier.champs_private_all.find(params[:annotation_id])
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.turbo_stream do
|
||||||
|
@to_show, @to_hide = []
|
||||||
|
@to_update = [annotation]
|
||||||
|
|
||||||
|
render :update_annotations
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def telecharger_pjs
|
def telecharger_pjs
|
||||||
files = ActiveStorage::DownloadableFile.create_list_from_dossiers(Dossier.where(id: dossier.id), with_champs_private: true, include_infos_administration: true)
|
files = ActiveStorage::DownloadableFile.create_list_from_dossiers(Dossier.where(id: dossier.id), with_champs_private: true, include_infos_administration: true)
|
||||||
cleaned_files = ActiveStorage::DownloadableFile.cleanup_list_from_dossier(files)
|
cleaned_files = ActiveStorage::DownloadableFile.cleanup_list_from_dossier(files)
|
||||||
|
|
|
@ -6,11 +6,11 @@ module Users
|
||||||
layout 'procedure_context', only: [:identite, :update_identite, :siret, :update_siret]
|
layout 'procedure_context', only: [:identite, :update_identite, :siret, :update_siret]
|
||||||
|
|
||||||
ACTIONS_ALLOWED_TO_ANY_USER = [:index, :recherche, :new, :transferer_all]
|
ACTIONS_ALLOWED_TO_ANY_USER = [:index, :recherche, :new, :transferer_all]
|
||||||
ACTIONS_ALLOWED_TO_OWNER_OR_INVITE = [:show, :destroy, :demande, :messagerie, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :modifier_legacy, :update, :create_commentaire, :papertrail, :restore]
|
ACTIONS_ALLOWED_TO_OWNER_OR_INVITE = [:show, :destroy, :demande, :messagerie, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :modifier_legacy, :update, :create_commentaire, :papertrail, :restore, :champ]
|
||||||
|
|
||||||
before_action :ensure_ownership!, except: ACTIONS_ALLOWED_TO_ANY_USER + ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
before_action :ensure_ownership!, except: ACTIONS_ALLOWED_TO_ANY_USER + ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
||||||
before_action :ensure_ownership_or_invitation!, only: ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
before_action :ensure_ownership_or_invitation!, only: ACTIONS_ALLOWED_TO_OWNER_OR_INVITE
|
||||||
before_action :ensure_dossier_can_be_updated, only: [:update_identite, :update_siret, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :modifier_legacy, :update]
|
before_action :ensure_dossier_can_be_updated, only: [:update_identite, :update_siret, :brouillon, :submit_brouillon, :submit_en_construction, :modifier, :modifier_legacy, :update, :champ]
|
||||||
before_action :ensure_dossier_can_be_filled, only: [:brouillon, :modifier, :submit_brouillon, :submit_en_construction, :update]
|
before_action :ensure_dossier_can_be_filled, only: [:brouillon, :modifier, :submit_brouillon, :submit_en_construction, :update]
|
||||||
before_action :ensure_dossier_can_be_viewed, only: [:show]
|
before_action :ensure_dossier_can_be_viewed, only: [:show]
|
||||||
before_action :forbid_invite_submission!, only: [:submit_brouillon]
|
before_action :forbid_invite_submission!, only: [:submit_brouillon]
|
||||||
|
@ -274,6 +274,20 @@ module Users
|
||||||
@dossier = current_user.dossiers.includes(:procedure).find(params[:id])
|
@dossier = current_user.dossiers.includes(:procedure).find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def champ
|
||||||
|
@dossier = dossier_with_champs(pj_template: false)
|
||||||
|
champ = @dossier.champs_public_all.find(params[:champ_id])
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.turbo_stream do
|
||||||
|
@to_show, @to_hide = []
|
||||||
|
@to_update = [champ]
|
||||||
|
|
||||||
|
render :update, layout: false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def create_commentaire
|
def create_commentaire
|
||||||
@commentaire = CommentaireService.create(current_user, dossier, commentaire_params)
|
@commentaire = CommentaireService.create(current_user, dossier, commentaire_params)
|
||||||
|
|
||||||
|
@ -465,7 +479,7 @@ module Users
|
||||||
end
|
end
|
||||||
|
|
||||||
def dossier_scope
|
def dossier_scope
|
||||||
if action_name == 'update'
|
if action_name == 'update' || action_name == 'champ'
|
||||||
Dossier.visible_by_user.or(Dossier.for_procedure_preview).or(Dossier.for_editing_fork)
|
Dossier.visible_by_user.or(Dossier.for_procedure_preview).or(Dossier.for_editing_fork)
|
||||||
elsif action_name == 'restore'
|
elsif action_name == 'restore'
|
||||||
Dossier.hidden_by_user
|
Dossier.hidden_by_user
|
||||||
|
|
|
@ -223,6 +223,16 @@ class Champ < ApplicationRecord
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def poll_external_data?
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def fetch_external_data_pending?
|
||||||
|
# We don't have a good mechanism right now to know if the last fetch has errored. So, in order
|
||||||
|
# to ensure we don't poll to infinity, we stop after 5 minutes no matter what.
|
||||||
|
fetch_external_data? && poll_external_data? && external_id.present? && data.nil? && updated_at > 5.minutes.ago
|
||||||
|
end
|
||||||
|
|
||||||
def fetch_external_data
|
def fetch_external_data
|
||||||
raise NotImplemented.new(:fetch_external_data)
|
raise NotImplemented.new(:fetch_external_data)
|
||||||
end
|
end
|
||||||
|
|
|
@ -322,6 +322,7 @@ Rails.application.routes.draw do
|
||||||
get 'modifier', to: 'dossiers#modifier'
|
get 'modifier', to: 'dossiers#modifier'
|
||||||
post 'modifier', to: 'dossiers#submit_en_construction'
|
post 'modifier', to: 'dossiers#submit_en_construction'
|
||||||
patch 'modifier', to: 'dossiers#modifier_legacy'
|
patch 'modifier', to: 'dossiers#modifier_legacy'
|
||||||
|
get 'champs/:champ_id', to: 'dossiers#champ', as: :champ
|
||||||
get 'merci'
|
get 'merci'
|
||||||
get 'demande'
|
get 'demande'
|
||||||
get 'messagerie'
|
get 'messagerie'
|
||||||
|
@ -434,6 +435,7 @@ Rails.application.routes.draw do
|
||||||
get 'avis'
|
get 'avis'
|
||||||
get 'avis_new'
|
get 'avis_new'
|
||||||
get 'personnes-impliquees' => 'dossiers#personnes_impliquees'
|
get 'personnes-impliquees' => 'dossiers#personnes_impliquees'
|
||||||
|
get 'annotations/:annotation_id', to: 'dossiers#annotation', as: :annotation
|
||||||
patch 'follow'
|
patch 'follow'
|
||||||
patch 'unfollow'
|
patch 'unfollow'
|
||||||
patch 'archive'
|
patch 'archive'
|
||||||
|
|
Loading…
Add table
Reference in a new issue