Compare commits
89 commits
main
...
gh-readonl
Author | SHA1 | Date | |
---|---|---|---|
|
b48475ca23 | ||
|
e61466c3ce | ||
|
d95dde075c | ||
|
3d4983d8fc | ||
|
6dd6ddd8c6 | ||
|
4eaef72a22 | ||
|
33617a4c44 | ||
|
d41d69d167 | ||
|
acc6456b08 | ||
|
6a92249f0a | ||
|
7023284726 | ||
|
52bbd47ebe | ||
|
87f11f06ad | ||
|
8f777ef587 | ||
|
be4f8f57ab | ||
|
6f97fc2a68 | ||
|
a5b99ddfd9 | ||
|
c2ae3426cd | ||
|
bcc37f4130 | ||
|
f4e33c068b | ||
|
98cdc63d5c | ||
|
35d28610aa | ||
|
3c0df601da | ||
|
a9c6cc322a | ||
|
18054fe346 | ||
|
e7e702a574 | ||
|
30cf71b360 | ||
|
ce1429b850 | ||
|
e78c22f33c | ||
|
908e531057 | ||
|
c1afc985e4 | ||
|
01653440e7 | ||
|
b551ef2dc3 | ||
|
10524643fb | ||
|
a432323843 | ||
|
3939f85860 | ||
|
17f5fb4a51 | ||
|
f675d2d1a7 | ||
|
9383c53df1 | ||
|
b3aeb46c1b | ||
|
54968daf17 | ||
|
889940af2a | ||
|
4b1389ac7e | ||
|
92bdab3de4 | ||
|
d18ba7fbe6 | ||
|
5730b9e871 | ||
|
4b6d18608e | ||
|
d2f91a6405 | ||
|
551a065329 | ||
|
5b02ff8ae2 | ||
|
d22c0f47f3 | ||
|
898b9db960 | ||
|
8c2f838fd1 | ||
|
5f1709f62d | ||
|
04e11aa609 | ||
|
a9887c0505 | ||
|
0649863139 | ||
|
08d13d2798 | ||
|
e4e47a4e97 | ||
|
68f1d10e19 | ||
|
804f89f444 | ||
|
0d1754d715 | ||
|
90b11ebe9c | ||
|
8152382e58 | ||
|
68c81c8d23 | ||
|
f2dffc2ba3 | ||
|
dd1b67bbc7 | ||
|
0164b5f008 | ||
|
ea9213bf90 | ||
|
bd846e721d | ||
|
cbd1f09e55 | ||
|
ef73d9187d | ||
|
2cc0baf4db | ||
|
6723bdcd9d | ||
|
9551368203 | ||
|
9d8ad9b3d8 | ||
|
be93325111 | ||
|
e23f16472c | ||
|
628026f524 | ||
|
44859b8217 | ||
|
e2d7be215e | ||
|
f563e210f3 | ||
|
ded0a41975 | ||
|
f85fa08415 | ||
|
75b2685230 | ||
|
a1ace0f173 | ||
|
1335a3192c | ||
|
c9bb4dc38e | ||
|
61bc59109d |
177 changed files with 1085 additions and 576 deletions
1
Gemfile
1
Gemfile
|
@ -75,7 +75,6 @@ gem 'redcarpet'
|
|||
gem 'rexml' # add missing gem due to ruby3 (https://github.com/Shopify/bootsnap/issues/325)
|
||||
gem 'rqrcode'
|
||||
gem 'saml_idp'
|
||||
gem 'sanitize-url'
|
||||
gem 'sassc-rails' # Use SCSS for stylesheets
|
||||
gem 'sentry-delayed_job'
|
||||
gem 'sentry-rails'
|
||||
|
|
|
@ -635,7 +635,6 @@ GEM
|
|||
sanitize (6.0.1)
|
||||
crass (~> 1.0.2)
|
||||
nokogiri (>= 1.12.0)
|
||||
sanitize-url (0.1.4)
|
||||
sass (3.7.4)
|
||||
sass-listen (~> 4.0.0)
|
||||
sass-listen (4.0.0)
|
||||
|
@ -895,7 +894,6 @@ DEPENDENCIES
|
|||
rubocop-rails
|
||||
rubocop-rspec
|
||||
saml_idp
|
||||
sanitize-url
|
||||
sassc-rails
|
||||
scss_lint
|
||||
selenium-devtools
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
color: $dark-grey;
|
||||
}
|
||||
|
||||
|
||||
.mandatory {
|
||||
color: $dark-red;
|
||||
}
|
||||
|
|
|
@ -173,4 +173,8 @@
|
|||
&.move-handle {
|
||||
background-image: image-url("icons/move-handle.svg");
|
||||
}
|
||||
|
||||
&.mandatory {
|
||||
width: 10px;
|
||||
}
|
||||
}
|
||||
|
|
10
app/assets/stylesheets/menu_component.scss
Normal file
10
app/assets/stylesheets/menu_component.scss
Normal file
|
@ -0,0 +1,10 @@
|
|||
@import "colors";
|
||||
|
||||
.menu-component-header {
|
||||
color: $dark-grey;
|
||||
font-size: 12px;
|
||||
|
||||
a {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
|
@ -54,7 +54,7 @@ fr:
|
|||
one: 1 dossier sera repassé en construction
|
||||
other: "%{success_count}/%{count} dossiers ont été repassés en construction"
|
||||
title:
|
||||
finish: L'action de masse est terminée
|
||||
finish: L’action de masse est terminée
|
||||
in_progress: Une action de masse est en cours
|
||||
link_text: Recharger la page
|
||||
after_link_text: pour voir si l'opération est finie.
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
class Dossiers::ExportComponent < ApplicationComponent
|
||||
include ApplicationHelper
|
||||
|
||||
def initialize(procedure:, exports:, statut: nil, count: nil, class_btn: nil, export_url: nil)
|
||||
@procedure = procedure
|
||||
@exports = exports
|
||||
|
|
|
@ -12,3 +12,6 @@ en:
|
|||
download:
|
||||
one: Download a file
|
||||
other: Download %{count} files
|
||||
macros_doc:
|
||||
title: "Macros documentation"
|
||||
url: "https://doc.demarches-simplifiees.fr/pour-aller-plus-loin/exports-et-macros"
|
||||
|
|
|
@ -12,3 +12,6 @@ fr:
|
|||
download:
|
||||
one: Télécharger un dossier
|
||||
other: Télécharger %{count} dossiers
|
||||
macros_doc:
|
||||
title: "documentation sur les macros"
|
||||
url: "https://doc.demarches-simplifiees.fr/pour-aller-plus-loin/exports-et-macros"
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
= render Dropdown::MenuComponent.new(wrapper: :span, button_options: { class: ['fr-btn--sm', @class_btn.present? ? @class_btn : 'fr-btn--secondary']}, menu_options: { id: @count.nil? ? "download_menu" : "download_all_menu", class: ['dropdown-export'] }) do |menu|
|
||||
- menu.with_menu_header_html do
|
||||
%p.menu-component-header.fr-px-2w.fr-pt-2w.fr-mb-0
|
||||
%span.fr-icon-info-line{ aria: { hidden: true } }
|
||||
Des macros ? Lisez la
|
||||
= link_to('doc', t('.macros_doc.url'),
|
||||
title: t('.macros_doc.title'),
|
||||
**external_link_attributes)
|
||||
|
||||
- menu.with_button_inner_html do
|
||||
= @count.nil? ? t(".download_all") : t(".download", count: @count)
|
||||
- exports.each do |item|
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
- if editing
|
||||
= link_to '#', data: { action: 'geo-area#onClick' } do
|
||||
= geo_area.label
|
||||
= text_field_tag :description, geo_area.description, data: { action: 'focus->geo-area#onFocus input->geo-area#onInput', geo_area_target: 'description' }, placeholder: 'Description', class: 'no-margin'
|
||||
= text_field_tag :description, geo_area.description, data: { action: 'focus->geo-area#onFocus input->geo-area#onInput', geo_area_target: 'description' }, placeholder: 'Description', class: 'no-margin', id: "geo_area_#{geo_area.id}_description"
|
||||
- else
|
||||
= link_to '#', data: { action: 'geo-area#onClick' } do
|
||||
= geo_area.label
|
7
app/components/dossiers/geo_area_component.rb
Normal file
7
app/components/dossiers/geo_area_component.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class Dossiers::GeoAreaComponent < ApplicationComponent
|
||||
attr_reader :geo_area, :editing
|
||||
|
||||
def initialize(geo_area:, editing:)
|
||||
@geo_area, @editing = geo_area, editing
|
||||
end
|
||||
end
|
|
@ -3,7 +3,7 @@
|
|||
.areas
|
||||
%ul
|
||||
- champ.selections_utilisateur.slice(0, 20).each do |geo_area|
|
||||
= render partial: 'shared/champs/carte/geo_area', locals: { geo_area: geo_area, editing: editing }
|
||||
= render Dossiers::GeoAreaComponent.new(geo_area:, editing:)
|
||||
- if champ.selections_utilisateur.size > 20
|
||||
%li
|
||||
%span
|
||||
|
@ -14,4 +14,4 @@
|
|||
.areas
|
||||
%ul
|
||||
- champ.cadastres.each do |geo_area|
|
||||
= render partial: 'shared/champs/carte/geo_area', locals: { geo_area: geo_area, editing: editing }
|
||||
= render Dossiers::GeoAreaComponent.new(geo_area:, editing:)
|
7
app/components/dossiers/geo_areas_component.rb
Normal file
7
app/components/dossiers/geo_areas_component.rb
Normal file
|
@ -0,0 +1,7 @@
|
|||
class Dossiers::GeoAreasComponent < ApplicationComponent
|
||||
attr_reader :champ, :editing
|
||||
|
||||
def initialize(champ:, editing:)
|
||||
@champ, @editing = champ, editing
|
||||
end
|
||||
end
|
|
@ -63,6 +63,6 @@ class Dossiers::MessageComponent < ApplicationComponent
|
|||
end
|
||||
|
||||
def highlight?
|
||||
commentaire.created_at.present? && @messagerie_seen_at&.<(commentaire.created_at)
|
||||
commentaire.persisted? && @messagerie_seen_at&.<(commentaire.created_at)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -15,9 +15,9 @@ class Dossiers::UserFilterComponent < ApplicationComponent
|
|||
def states_collection(statut)
|
||||
case statut
|
||||
when 'en-cours'
|
||||
Dossier.states.values - Dossier::TERMINE
|
||||
(Dossier.states.values - Dossier::TERMINE) << Dossier::A_CORRIGER
|
||||
when 'traites'
|
||||
Dossier::TERMINE
|
||||
end
|
||||
end.map { |state| [t("activerecord.attributes.dossier/state.#{state}"), state] }
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
en:
|
||||
legend:
|
||||
states: States
|
||||
created_at: Creation date
|
||||
depose_at: Submission date
|
||||
state: States
|
||||
created_at: Creation date since
|
||||
depose_at: Submission date since
|
||||
button:
|
||||
apply_filters: Apply filters
|
||||
reset_filters: Reset filters
|
||||
|
@ -14,3 +14,5 @@ en:
|
|||
active_filters_link_title:
|
||||
one: Remove the active filter
|
||||
other: "Remove the %{count} active filters"
|
||||
states:
|
||||
prompt: Select a state
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
fr:
|
||||
legend:
|
||||
states: États
|
||||
created_at: Date de création
|
||||
depose_at: Date de dépot
|
||||
state: Statut
|
||||
created_at: Date de création depuis le
|
||||
depose_at: Date de dépôt depuis le
|
||||
button:
|
||||
apply_filters: Appliquer les filtres
|
||||
reset_filters: Réinitialiser les filtres
|
||||
|
@ -14,3 +14,5 @@ fr:
|
|||
active_filters_link_title:
|
||||
one: Retirer le filtre actif
|
||||
other: "Retirer les %{count} filtres actifs"
|
||||
states:
|
||||
prompt: Sélectionner un statut
|
||||
|
|
|
@ -9,15 +9,9 @@
|
|||
= form_with(url: dossiers_path(), method: :get ) do |f|
|
||||
= f.hidden_field :statut, value: @statut
|
||||
|
||||
%fieldset#checkboxes.fr-fieldset{ "aria-labelledby" => "checkboxes-legend" }
|
||||
%legend#checkboxes-legend.fr-fieldset__legend--regular.fr-fieldset__legend
|
||||
= t('.legend.states')
|
||||
= f.collection_check_boxes :states, states_collection(@statut), :to_s, :to_s, include_hidden: false do |b|
|
||||
.fr-fieldset__element
|
||||
.fr-checkbox-group.fr-ml-2w.fr-py-1w
|
||||
= b.check_box(checked: filter.states_filtered?(b.value))
|
||||
= b.label(class: 'fr-label') { dossier_display_state(b.text) }
|
||||
|
||||
.fr-input-group
|
||||
= f.label :state, t('.legend.state'), class: 'fr-label'
|
||||
= f.select :state, options_for_select(states_collection(@statut), params[:state]), {prompt: t('.states.prompt')}, {class: 'fr-select'}
|
||||
|
||||
.fr-input-group
|
||||
= f.label 'from_created_at_date', t('.legend.created_at'), class: 'fr-label'
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
class Dropdown::MenuComponent < ApplicationComponent
|
||||
renders_one :button_inner_html
|
||||
renders_one :menu_header_html
|
||||
# beware, items elements like button_to/link_to must include role: 'menuitem' for aria reason
|
||||
renders_many :items, -> (options = {}, &block) do
|
||||
tag.li(**options.merge(role: 'none'), &block)
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
= button_inner_html
|
||||
|
||||
%div{ data: { menu_button_target: 'menu' }, id: menu_id, 'aria-labelledby': button_id, role: menu_role, 'tab-index': -1, class: menu_class_names }
|
||||
= menu_header_html
|
||||
|
||||
-# the dropdown can be a menu with a list of item
|
||||
- if items?
|
||||
|
|
|
@ -2,11 +2,8 @@
|
|||
= @form.label @attribute, label_opts do
|
||||
- capture do
|
||||
= label
|
||||
- if @required
|
||||
%span.mandatory *
|
||||
- if hint?
|
||||
%span.fr-hint-text= hint
|
||||
|
||||
= @form.public_send(@input_type, @attribute, input_opts)
|
||||
|
||||
- if errors_on_attribute?
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
class EditableChamp::AsteriskMandatoryComponent < ApplicationComponent
|
||||
end
|
|
@ -0,0 +1,2 @@
|
|||
en:
|
||||
required: required
|
|
@ -0,0 +1,2 @@
|
|||
fr:
|
||||
required: obligatoire
|
|
@ -0,0 +1,3 @@
|
|||
%svg.icon.mandatory{ xmlns: "http://www.w3.org/2000/svg", role: "img", 'aria-label': t('.required'), width: 10, height: 10, viewBox: "0 0 1200 1200", "xml:space" => "preserve" }
|
||||
%desc= t('.required')
|
||||
%path{ d: "M489.838 29.354v443.603L68.032 335.894 0 545.285l421.829 137.086-260.743 358.876 178.219 129.398L600.048 811.84l260.673 358.806 178.146-129.398-260.766-358.783L1200 545.379l-68.032-209.403-421.899 137.07V29.443H489.84l-.002-.089z" }
|
|
@ -8,4 +8,4 @@
|
|||
autocompleteScreenReaderInstructions: t("combo_search_component.screen_reader_instructions"))
|
||||
|
||||
.geo-areas{ id: dom_id(@champ, :geo_areas) }
|
||||
= render partial: 'shared/champs/carte/geo_areas', locals: { champ: @champ, editing: true }
|
||||
= render Dossiers::GeoAreasComponent.new(champ: @champ, editing: true)
|
||||
|
|
|
@ -3,3 +3,4 @@ en:
|
|||
changes_to_save: "modifications to submit"
|
||||
modified_at: "modified on %{datetime}"
|
||||
check_content_rebased: The type of this field or its description has been modified by the administration. Check its content.
|
||||
optional_champ: (optional)
|
||||
|
|
|
@ -3,3 +3,4 @@ fr:
|
|||
changes_to_save: "modification à déposer"
|
||||
modified_at: "modifié le %{datetime}"
|
||||
check_content_rebased: Le type de ce champ ou sa description ont été modifiés par l'administration. Vérifier son contenu.
|
||||
optional_champ: (facultatif)
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
#{@champ.libelle}
|
||||
- if @champ.mandatory?
|
||||
%span.mandatory *
|
||||
= @champ.libelle
|
||||
- if @champ.public? && !@champ.checkbox?
|
||||
- if @champ.mandatory?
|
||||
= render EditableChamp::AsteriskMandatoryComponent.new
|
||||
- else
|
||||
= "#{t('.optional_champ')}"
|
||||
|
||||
- if @champ.forked_with_changes?
|
||||
%span.updated-at.highlighted
|
||||
|
@ -9,6 +12,7 @@
|
|||
%span.updated-at{ class: highlight_if_unseen_class }
|
||||
= t('.modified_at', datetime: try_format_datetime(@champ.updated_at))
|
||||
|
||||
|
||||
- if @champ.rebased_at.present? && @champ.rebased_at > (@seen_at || @champ.updated_at) && current_user.owns_or_invite?(@champ.dossier)
|
||||
%span.updated-at.highlighted
|
||||
= t('.check_content_rebased')
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
= @form.check_box :value,
|
||||
{ required: @champ.required?, id: @champ.input_id, checked: @champ.true?, aria: { describedby: @champ.describedby_id } },
|
||||
{ required: @champ.required?, id: @champ.input_id, checked: @champ.true?, aria: { describedby: @champ.describedby_id }, class: class_names('required' => @champ.required?)},
|
||||
'true',
|
||||
'false'
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
- else
|
||||
%div{ 'data-turbo-focus-group': true }
|
||||
- if @champ.selected_options.present?
|
||||
.fr-mb-2w{ "data-turbo": "true" }
|
||||
.fr-mb-2w
|
||||
- @champ.selected_options.each do |option|
|
||||
= render NestedForms::OwnedButtonComponent.new(formaction: champs_options_path(@champ.id, option:), http_method: :delete, opt: { class: 'fr-tag fr-tag--dismiss fr-mb-1w fr-mr-1w', id: @champ.checkbox_id(option) }) do
|
||||
= option
|
||||
|
|
|
@ -8,6 +8,6 @@
|
|||
- @champ.rows.each do |champs|
|
||||
= render EditableChamp::RepetitionRowComponent.new(form: @form, champ: @champ, row: champs, seen_at: @seen_at)
|
||||
|
||||
.actions{ 'data-turbo': 'true' }
|
||||
.actions
|
||||
= render NestedForms::OwnedButtonComponent.new(formaction: champs_repetition_path(@champ.id), http_method: :create, opt: { class: "fr-btn fr-btn--secondary fr-btn--icon-left fr-icon-add-circle-line fr-mb-3w", title: t(".add_title", libelle: @champ.libelle), id: dom_id(@champ, :create_repetition)}) do
|
||||
= t(".add", libelle: @champ.libelle)
|
||||
|
|
|
@ -7,6 +7,6 @@
|
|||
- else
|
||||
= render EditableChamp::SectionComponent.new(champs: @row)
|
||||
|
||||
.flex.row-reverse{ 'data-turbo': 'true' }
|
||||
.flex.row-reverse
|
||||
= render NestedForms::OwnedButtonComponent.new(formaction: champs_repetition_path(@champ.id, row_id: @row.first.row_id), http_method: :delete, opt: { class: "fr-btn fr-btn--sm fr-btn--tertiary fr-text-action-high--red-marianne", title: t(".delete_title", row_number: @champ.rows.find_index(@row))}) do
|
||||
= t(".delete")
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
fr:
|
||||
remaining_characters: Il vous reste %{remaining_words} caractères.
|
||||
excess_characters: Vous avez dépassé la taille conseillée de %{excess_words} caractères. Réduire le nombre de caractère.
|
||||
excess_characters: Vous avez dépassé la taille conseillée de %{excess_words} caractères. Réduire le nombre de caractères.
|
||||
recommended_size: La taille maximale conseillée est de %{size} caractères.
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
%span.fr-icon.fr-icon-draft-line.fr-text-default--info.fr-mt-1v{ "aria-hidden": "true" }
|
||||
.dropdown-description
|
||||
%h4= t('.revert_en_construction')
|
||||
L’usager sera notifié qu’il peut modifier son dossier
|
||||
L’usager sera informé qu’il peut modifier son dossier
|
||||
|
||||
- menu.with_item do
|
||||
= link_to('#', onclick: "DS.showMotivation(event, 'pending_correction');", role: 'menuitem') do
|
||||
|
@ -16,7 +16,7 @@
|
|||
|
||||
.dropdown-description
|
||||
%h4= t('.request_correction')
|
||||
L’usager sera notifié que des modifications sont attendues
|
||||
L’usager sera informé que des modifications sont attendues
|
||||
|
||||
- menu.with_item(class: "inactive form-inside fr-pt-1v") do
|
||||
= render partial: 'instructeurs/dossiers/instruction_button_motivation', locals: { dossier:,
|
||||
|
|
|
@ -8,6 +8,6 @@ class NestedForms::OwnedButtonComponent < ApplicationComponent
|
|||
end
|
||||
|
||||
def call
|
||||
button_tag(content, @opt.merge(formaction: @formaction, form: NestedForms::FormOwnerComponent.form_id(@http_method)))
|
||||
button_tag(content, @opt.merge(formaction: @formaction, form: NestedForms::FormOwnerComponent.form_id(@http_method), data: { turbo: 'true' }))
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
---
|
||||
fr:
|
||||
title: Fin de dépot
|
||||
title: Fin de dépôt
|
||||
|
|
|
@ -6,6 +6,6 @@ fr:
|
|||
<p>Pour le configurer, votre formulaire doit comporter
|
||||
au moins un champ « choix simple ».</p>
|
||||
<p>Ajoutez ce champ dans la page <a href="%{path}">« Configuration des champs »</a>.</p>
|
||||
delete_title: Aucun dossier ne sera supprimé. Les groupes d'instructeurs vont être supprimés. Seuls les instructeurs du groupe « %{defaut_label} » resteront affectés à la procédure.
|
||||
delete_title: Aucun dossier ne sera supprimé. Les groupes d'instructeurs vont être supprimés. Seuls les instructeurs du groupe « %{defaut_label} » resteront affectés à la démarche.
|
||||
delete_confirmation: |
|
||||
Attention : tous les dossiers vont être déplacés dans le groupe « %{defaut_label} » et seuls les instructeurs présent dans ce groupe resteront affectés à la procédure. Souhaitez-vous continuer ?
|
||||
Attention : tous les dossiers vont être déplacés dans le groupe « %{defaut_label} » et seuls les instructeurs présent dans ce groupe resteront affectés à la démarche. Souhaitez-vous continuer ?
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
%div{ id: dom_id(@groupe_instructeur, :routing) }
|
||||
%h2 Paramètres principaux
|
||||
%h1 Paramètres du groupe
|
||||
|
||||
= form_for @groupe_instructeur,
|
||||
url: admin_procedure_groupe_instructeur_path(@procedure_id, @groupe_instructeur),
|
||||
|
@ -17,7 +17,7 @@
|
|||
= f.check_box :closed, { id: 'closed', "aria-describedby" => "closed-messages", :name => "closed" }
|
||||
%label.fr-label{ :for => "closed" }
|
||||
Groupe inactif
|
||||
%span.fr-hint-text Si cette option est activée, les usagers ne pourront plus sélectionner ce groupe d'instructeurs
|
||||
%span.fr-hint-text Si cette option est activée, les usagers ne pourront plus sélectionner ce groupe d’instructeurs
|
||||
|
||||
= form_tag admin_procedure_routing_rules_path(@procedure_id),
|
||||
method: :post,
|
||||
|
@ -31,26 +31,29 @@
|
|||
- if @groupe_instructeur.routing_to_configure?
|
||||
%p.fr-mb-1w.fr-badge.fr-badge--warning.fr-badge--sm à configurer
|
||||
|
||||
.flex.align-baseline
|
||||
.flex.align-baseline.fr-mb-1w
|
||||
.fr-mr-2w.no-wrap si le champ
|
||||
.target.fr-mr-2w
|
||||
= targeted_champ_tag
|
||||
.operator.fr-mr-2w.no-wrap est égal à
|
||||
.value
|
||||
= value_tag
|
||||
.fr-hint-text
|
||||
%span Si vous ne trouvez pas l'option correspondant à votre groupe, veuillez l'ajouter dans le champ dédié au
|
||||
%span
|
||||
= link_to 'routage', champs_admin_procedure_path(@procedure_id)
|
||||
|
||||
%ul.fr-btns-group.fr-btns-group--sm.fr-btns-group--inline.fr-btns-group--icon-right
|
||||
%li
|
||||
- if @groupe_instructeur.can_delete?
|
||||
%p= t('.delete')
|
||||
= button_to admin_procedure_groupe_instructeur_path(@procedure_id, @groupe_instructeur),
|
||||
class: 'fr-btn fr-btn--tertiary fr-btn--icon-left fr-icon-delete-line',
|
||||
method: :delete,
|
||||
data: { confirm: t('.delete_confirmation', group_name: @groupe_instructeur.label) } do
|
||||
Supprimer
|
||||
- else
|
||||
= button_to reaffecter_dossiers_admin_procedure_groupe_instructeur_path(@procedure_id, @groupe_instructeur),
|
||||
class: 'fr-btn fr-btn--tertiary fr-icon-folder-2-line',
|
||||
title: t('.move_files_confirmation'),
|
||||
method: :get do
|
||||
= t('.move_files', count: @groupe_instructeur.dossiers.visible_by_administration.size)
|
||||
.flex.fr-btns-group--sm.fr-btns-group--inline.fr-btns-group--icon-right
|
||||
- if @groupe_instructeur.can_delete?
|
||||
%p= t('.delete')
|
||||
= button_to admin_procedure_groupe_instructeur_path(@procedure_id, @groupe_instructeur),
|
||||
class: 'fr-btn fr-btn--tertiary fr-btn--icon-left fr-icon-delete-line',
|
||||
method: :delete,
|
||||
data: { confirm: t('.delete_confirmation', group_name: @groupe_instructeur.label) } do
|
||||
Supprimer
|
||||
- else
|
||||
= button_to reaffecter_dossiers_admin_procedure_groupe_instructeur_path(@procedure_id, @groupe_instructeur),
|
||||
class: 'fr-btn fr-btn--tertiary fr-icon-folder-2-line',
|
||||
title: t('.move_files_confirmation'),
|
||||
method: :get do
|
||||
= t('.move_files', count: @groupe_instructeur.dossiers.visible_by_administration.size)
|
||||
|
|
|
@ -2,8 +2,8 @@ fr:
|
|||
allowed_full_access_html: Ce jeton a accès à <strong>toutes</strong> les démarches attachées à votre compte administrateur
|
||||
allowed_procedures_html:
|
||||
zero: Ce jeton n’a accès à <strong>aucune</strong> démarche
|
||||
one: Ce jeton a accès a une démarche sélectionnée
|
||||
other: Ce jeton a accès a %{count} démarches sélectionnées
|
||||
one: Ce jeton a accès à une démarche sélectionnée
|
||||
other: Ce jeton a accès à %{count} démarches sélectionnées
|
||||
security_one: Pour des raisons de sécurité, il ne sera plus ré-affiché, notez-le bien.
|
||||
security_two: Pour des raisons de sécurité, nous ne pouvons vous l’afficher que lors de sa création.
|
||||
security_title: "Options de sécurité"
|
||||
|
|
|
@ -28,8 +28,8 @@ class SimpleFormatComponent < ApplicationComponent
|
|||
@allow_a = allow_a
|
||||
|
||||
@text = (text || "").gsub(/\R/, "\n\n") # force double \n otherwise a single one won't split paragraph
|
||||
.split("\n\n") #
|
||||
.map(&:lstrip) # this block prevent redcarpet to consider " text" as block code by lstriping
|
||||
.split("\n\n")
|
||||
.map(&:lstrip) # this block prevent redcarpet to consider " text" as block code by lstriping
|
||||
.join("\n\n")
|
||||
.gsub(EMAIL_IN_TEXT_REGEX) { _1.gsub('_', '\\_') } # Workaround for redcarpet bug on autolink email having _. Cf tests
|
||||
|
||||
|
|
|
@ -11,5 +11,5 @@ fr:
|
|||
zones_humides: Zones humides d’importance internationale
|
||||
znieff: ZNIEFF
|
||||
character_limit:
|
||||
unlimited: Pas de limite de caractère
|
||||
unlimited: Pas de limite de caractères
|
||||
limit: Limité à %{limit} caractères
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
fr:
|
||||
fix_conditional:
|
||||
one: 'La logique conditionnelle du champ suivant est invalide, veuillez la corriger :'
|
||||
other: 'La logique conditionnelle des champs suivants sont invalides, veuillez les corriger :'
|
||||
one: 'La logique conditionnelle du champ suivant est invalide, veuillez la corriger :'
|
||||
other: 'La logique conditionnelle des champs suivants sont invalides, veuillez les corriger :'
|
||||
|
||||
fix_header_section:
|
||||
one: 'Le titre de section suivant est invalide, veuillez le corriger :'
|
||||
other: 'Les titres de section suivants sont invalides, veuillez les corriger :'
|
||||
|
||||
one: 'Le titre de section suivant est invalide, veuillez le corriger :'
|
||||
other: 'Les titres de section suivants sont invalides, veuillez les corriger :'
|
||||
|
|
|
@ -116,8 +116,6 @@ module Administrateurs
|
|||
@procedure.validate(:publication)
|
||||
|
||||
@current_administrateur = current_administrateur
|
||||
@procedure_lien = commencer_url(path: @procedure.path)
|
||||
@procedure_lien_test = commencer_test_url(path: @procedure.path)
|
||||
end
|
||||
|
||||
def edit
|
||||
|
@ -267,8 +265,6 @@ module Administrateurs
|
|||
draft_revision: :types_de_champ
|
||||
).find(params[:procedure_id])
|
||||
|
||||
@procedure_lien = commencer_url(path: @procedure.path)
|
||||
@procedure_lien_test = commencer_test_url(path: @procedure.path)
|
||||
@procedure.path = @procedure.suggested_path(current_administrateur)
|
||||
@current_administrateur = current_administrateur
|
||||
@closed_procedures = current_administrateur.procedures.with_discarded.closes.map { |p| ["#{p.libelle} (#{p.id})", p.id] }.to_h
|
||||
|
@ -282,8 +278,6 @@ module Administrateurs
|
|||
if @procedure.publish_or_reopen!(current_administrateur)
|
||||
@procedure.publish_revision!
|
||||
flash.notice = "Démarche publiée"
|
||||
else
|
||||
flash.alert = @procedure.errors.full_messages
|
||||
end
|
||||
else
|
||||
@procedure.publish_revision!
|
||||
|
@ -291,8 +285,6 @@ module Administrateurs
|
|||
end
|
||||
elsif @procedure.publish_or_reopen!(current_administrateur)
|
||||
flash.notice = "Démarche publiée"
|
||||
else
|
||||
flash.alert = @procedure.errors.full_messages
|
||||
end
|
||||
|
||||
if params[:old_procedure].present? && @procedure.errors.empty?
|
||||
|
@ -305,10 +297,14 @@ module Administrateurs
|
|||
end
|
||||
|
||||
redirect_to admin_procedure_path(@procedure)
|
||||
rescue ActiveRecord::RecordInvalid
|
||||
flash.alert = @procedure.errors.full_messages
|
||||
redirect_to admin_procedure_publication_path(@procedure)
|
||||
end
|
||||
|
||||
def reset_draft
|
||||
@procedure.reset_draft_revision!
|
||||
flash.notice = 'Les modifications ont été annulées'
|
||||
redirect_to admin_procedure_path(@procedure)
|
||||
end
|
||||
|
||||
|
|
|
@ -26,13 +26,7 @@ module ProcedureContextConcern
|
|||
uri = URI(get_stored_location_for(:user))
|
||||
path_components = uri.path.split('/')
|
||||
|
||||
if uri.path.start_with?('/commencer/test/')
|
||||
Procedure.brouillon.find_by(path: path_components[3])
|
||||
elsif uri.path.start_with?('/commencer/')
|
||||
Procedure.publiee.find_by(path: path_components[2])
|
||||
else
|
||||
nil
|
||||
end
|
||||
Procedure.publiees_ou_brouillons.find_by(path: path_components[2])
|
||||
end
|
||||
|
||||
def find_prefill_token_in_context
|
||||
|
|
|
@ -331,6 +331,31 @@ module Instructeurs
|
|||
end
|
||||
end
|
||||
|
||||
def reaffectation
|
||||
@dossier = current_instructeur.dossiers.find(params[:dossier_id])
|
||||
|
||||
@groupe_instructeur = @dossier.groupe_instructeur
|
||||
|
||||
@groupes_instructeurs = Kaminari.paginate_array(@groupe_instructeur.other_groupe_instructeurs)
|
||||
.page(params[:page])
|
||||
.per(ITEMS_PER_PAGE)
|
||||
end
|
||||
|
||||
def reaffecter
|
||||
dossier = current_instructeur.dossiers.find(params[:dossier_id])
|
||||
|
||||
new_group = dossier
|
||||
.procedure
|
||||
.groupe_instructeurs.find(params[:groupe_instructeur_id])
|
||||
|
||||
dossier.assign_to_groupe_instructeur(new_group)
|
||||
|
||||
dossier.update!(forced_groupe_instructeur: true)
|
||||
|
||||
flash.notice = t('instructeurs.dossiers.reaffectation', dossier_id: dossier.id, label: new_group.label)
|
||||
redirect_to instructeur_procedure_path(procedure)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def dossier_scope
|
||||
|
|
|
@ -4,8 +4,10 @@ module Users
|
|||
|
||||
def commencer
|
||||
@procedure = retrieve_procedure
|
||||
return procedure_not_found if @procedure.blank? || @procedure.brouillon?
|
||||
@revision = @procedure.published_revision
|
||||
|
||||
return procedure_not_found if @procedure.blank?
|
||||
|
||||
@revision = params[:test] ? @procedure.draft_revision : @procedure.active_revision
|
||||
|
||||
if params[:prefill_token].present? || commencer_page_is_reloaded?
|
||||
retrieve_prefilled_dossier(params[:prefill_token] || session[:prefill_token])
|
||||
|
@ -22,11 +24,7 @@ module Users
|
|||
end
|
||||
|
||||
def commencer_test
|
||||
@procedure = retrieve_procedure
|
||||
return procedure_not_found if @procedure.blank? || (@procedure.publiee? && !@procedure.draft_changed?)
|
||||
@revision = @procedure.draft_revision
|
||||
|
||||
render 'commencer/show'
|
||||
redirect_to commencer_path(params[:path], **extra_query_params)
|
||||
end
|
||||
|
||||
def dossier_vide_pdf
|
||||
|
@ -73,8 +71,12 @@ module Users
|
|||
|
||||
private
|
||||
|
||||
def extra_query_params
|
||||
params.slice(:prefill_token, :test).to_unsafe_h.compact
|
||||
end
|
||||
|
||||
def commencer_page_is_reloaded?
|
||||
session[:prefill_token].present? && session[:prefill_params] == params.to_unsafe_h
|
||||
session[:prefill_token].present? && session[:prefill_params_digest] == PrefillParams.digest(params)
|
||||
end
|
||||
|
||||
def prefill_params_present?
|
||||
|
@ -101,7 +103,7 @@ module Users
|
|||
@prefilled_dossier.prefill!(PrefillParams.new(@prefilled_dossier, params.to_unsafe_h).to_a)
|
||||
end
|
||||
session[:prefill_token] = @prefilled_dossier.prefill_token
|
||||
session[:prefill_params] = params.to_unsafe_h
|
||||
session[:prefill_params_digest] = PrefillParams.digest(params)
|
||||
end
|
||||
|
||||
def retrieve_prefilled_dossier(prefill_token)
|
||||
|
@ -123,7 +125,7 @@ module Users
|
|||
procedure = Procedure.find_by(path: params[:path])
|
||||
|
||||
if procedure&.replaced_by_procedure
|
||||
redirect_to commencer_path(path: procedure.replaced_by_procedure.path)
|
||||
redirect_to commencer_path(procedure.replaced_by_procedure.path, **extra_query_params)
|
||||
return
|
||||
elsif procedure&.close?
|
||||
flash.alert = procedure.service.presence ?
|
||||
|
@ -137,7 +139,7 @@ module Users
|
|||
end
|
||||
|
||||
def store_user_location!(procedure)
|
||||
store_location_for(:user, helpers.procedure_lien(procedure, prefill_token: params[:prefill_token]))
|
||||
store_location_for(:user, commencer_path(procedure.path, **extra_query_params))
|
||||
end
|
||||
|
||||
def generate_empty_pdf(revision)
|
||||
|
|
|
@ -27,7 +27,7 @@ module Users
|
|||
@dossiers_traites = current_user.dossiers.state_termine.merge(dossiers_visibles)
|
||||
@dossiers_invites = current_user.dossiers_invites.merge(dossiers_visibles)
|
||||
@dossiers_supprimes_recemment = current_user.dossiers.hidden_by_user.merge(dossiers)
|
||||
@dossiers_supprimes_definitivement = current_user.deleted_dossiers.order_by_updated_at
|
||||
@dossiers_supprimes_definitivement = current_user.deleted_dossiers.includes(:procedure).order_by_updated_at
|
||||
@dossier_transfers = DossierTransfer.for_email(current_user.email)
|
||||
@dossiers_close_to_expiration = current_user.dossiers.close_to_expiration.merge(dossiers_visibles)
|
||||
@statut = statut(@user_dossiers, @dossiers_traites, @dossiers_invites, @dossiers_supprimes_recemment, @dossiers_supprimes_definitivement, @dossier_transfers, @dossiers_close_to_expiration, params[:statut])
|
||||
|
|
|
@ -29,12 +29,7 @@ module Mutations
|
|||
|
||||
# ugly hack to keep retro compatibility
|
||||
# do not judge
|
||||
if !ENV['OLD_GROUPE_INSTRUCTEURS_CREATE_API_PROCEDURE_ID'].nil? && demarche_number.in?(ENV['OLD_GROUPE_INSTRUCTEURS_CREATE_API_PROCEDURE_ID']&.split(',')&.map(&:to_i))
|
||||
stable_id = procedure.groupe_instructeurs.first.routing_rule.left.stable_id
|
||||
tdc = procedure.published_revision.types_de_champ.find_by(stable_id: stable_ids)
|
||||
tdc.update(options: tdc.options['drop_down_options'].push(groupe_instructeur.label))
|
||||
groupe_instructeur.update(routing_rule: ds_eq(champ_value(stable_id), constant(groupe_instruteur.label)))
|
||||
end
|
||||
groupe_instructeur.procedure.update_groupe_instructeur_routing_roules!
|
||||
|
||||
result = { groupe_instructeur: }
|
||||
|
||||
|
|
|
@ -11,6 +11,11 @@ module Mutations
|
|||
|
||||
def resolve(groupe_instructeur:, label: nil, closed: nil)
|
||||
if groupe_instructeur.update({ label:, closed: }.compact)
|
||||
|
||||
# ugly hack to keep retro compatibility
|
||||
# do not judge
|
||||
groupe_instructeur.procedure.update_groupe_instructeur_routing_roules!
|
||||
|
||||
{ groupe_instructeur: }
|
||||
else
|
||||
{ errors: groupe_instructeur.errors.full_messages }
|
||||
|
|
|
@ -75,11 +75,7 @@ Cela évite l’accès récursif aux dossiers."
|
|||
delegate :description, :opendata, :tags, to: :procedure
|
||||
|
||||
def demarche_url
|
||||
if procedure.brouillon?
|
||||
Rails.application.routes.url_helpers.commencer_test_url(path: procedure.path)
|
||||
else
|
||||
Rails.application.routes.url_helpers.commencer_url(path: procedure.path)
|
||||
end
|
||||
Rails.application.routes.url_helpers.commencer_url(path: procedure.path)
|
||||
end
|
||||
|
||||
def dpo_url
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
module ApplicationHelper
|
||||
include SanitizeUrl
|
||||
|
||||
def html_lang
|
||||
I18n.locale.to_s
|
||||
end
|
||||
|
@ -17,12 +15,6 @@ module ApplicationHelper
|
|||
end
|
||||
end
|
||||
|
||||
def sanitize_url(url)
|
||||
if !url.nil?
|
||||
super(url, schemes: ['http', 'https'], replace_evil_with: root_url)
|
||||
end
|
||||
end
|
||||
|
||||
def flash_class(level, sticky: false, fixed: false)
|
||||
class_names = []
|
||||
|
||||
|
|
|
@ -62,14 +62,14 @@ module DossierHelper
|
|||
|
||||
def class_badge_state(state)
|
||||
case state
|
||||
when Dossier.states.fetch(:en_construction), Dossier.states.fetch(:en_instruction)
|
||||
'fr-badge--info'
|
||||
when Dossier.states.fetch(:en_construction)
|
||||
'fr-badge--purple-glycine'
|
||||
when Dossier.states.fetch(:en_instruction)
|
||||
'fr-badge--new'
|
||||
when Dossier.states.fetch(:accepte)
|
||||
'fr-badge--success'
|
||||
when Dossier.states.fetch(:refuse)
|
||||
when Dossier.states.fetch(:refuse), Dossier.states.fetch(:sans_suite)
|
||||
'fr-badge--warning'
|
||||
when Dossier.states.fetch(:sans_suite)
|
||||
'fr-badge--new'
|
||||
when Dossier.states.fetch(:brouillon)
|
||||
''
|
||||
else
|
||||
|
@ -79,7 +79,12 @@ module DossierHelper
|
|||
|
||||
def status_badge(state, alignment_class = '')
|
||||
status_text = dossier_display_state(state, lower: true)
|
||||
tag.span(status_text, class: "fr-badge fr-badge--sm #{class_badge_state(state)} fr-badge--no-icon #{alignment_class}", role: 'status')
|
||||
tag.span status_text, role: 'status', class: class_names(
|
||||
'fr-badge fr-badge--sm' => true,
|
||||
'fr-badge--no-icon' => [Dossier.states.fetch(:en_instruction), Dossier.states.fetch(:accepte)].exclude?(state),
|
||||
class_badge_state(state) => true,
|
||||
alignment_class => true
|
||||
)
|
||||
end
|
||||
|
||||
def deletion_reason_badge(reason)
|
||||
|
|
|
@ -1,12 +1,4 @@
|
|||
module ProcedureHelper
|
||||
def procedure_lien(procedure, prefill_token: nil)
|
||||
if procedure.brouillon?
|
||||
commencer_test_url(path: procedure.path, prefill_token: prefill_token)
|
||||
else
|
||||
commencer_url(path: procedure.path, prefill_token: prefill_token)
|
||||
end
|
||||
end
|
||||
|
||||
def procedure_libelle(procedure)
|
||||
parts = procedure.brouillon? ? [procedure_badge(procedure)] : []
|
||||
parts << procedure.libelle
|
||||
|
|
|
@ -5,6 +5,17 @@ class ApplicationJob < ActiveJob::Base
|
|||
|
||||
attr_writer :request_id
|
||||
|
||||
before_perform do |job|
|
||||
arg = job.arguments.first
|
||||
|
||||
case arg
|
||||
when Dossier
|
||||
Sentry.set_tags(dossier: arg.id, procedure: arg.procedure.id)
|
||||
when Procedure
|
||||
Sentry.set_tags(procedure: arg.id)
|
||||
end
|
||||
end
|
||||
|
||||
around_perform do |job, block|
|
||||
Rails.logger.info("#{job.class.name} started at #{Time.zone.now}")
|
||||
Current.set(request_id: job.request_id) do
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
class ArchiveCreationJob < ApplicationJob
|
||||
queue_as :archives
|
||||
|
||||
before_perform do |job|
|
||||
Sentry.set_tags(procedure: job.arguments.first.id)
|
||||
end
|
||||
|
||||
def max_run_time
|
||||
Archive::MAX_DUREE_GENERATION
|
||||
end
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
class Cron::StalledDeclarativeProceduresJob < Cron::CronJob
|
||||
self.schedule_expression = "every 10 minute"
|
||||
self.schedule_expression = "every 10 minutes"
|
||||
|
||||
def perform(*args)
|
||||
def perform
|
||||
Procedure.declarative.find_each do |procedure|
|
||||
begin
|
||||
procedure.process_stalled_dossiers!
|
||||
rescue => e
|
||||
Sentry.set_tags(procedure: procedure.id)
|
||||
Sentry.capture_exception(e)
|
||||
procedure.dossiers.state_en_construction.where(declarative_triggered_at: nil).find_each do |dossier|
|
||||
ProcessStalledDeclarativeDossierJob.perform_later(dossier)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,10 +3,6 @@ class ExportJob < ApplicationJob
|
|||
|
||||
discard_on ActiveRecord::RecordNotFound
|
||||
|
||||
before_perform do |job|
|
||||
Sentry.set_tags(procedure: job.arguments.first.procedure.id)
|
||||
end
|
||||
|
||||
def max_run_time
|
||||
Export::MAX_DUREE_GENERATION
|
||||
end
|
||||
|
|
|
@ -5,7 +5,7 @@ class Migrations::NormalizeCommunesJob < ApplicationJob
|
|||
|
||||
value_json = champ.value_json || {}
|
||||
|
||||
if !champ.departement? || champ.code_departement == 'undefined'
|
||||
if !champ.departement? || champ.code_departement == 'undefined' || champ.code_departement == '99'
|
||||
metro_code = champ.external_id[0..1]
|
||||
drom_com_code = champ.external_id[0..2]
|
||||
|
||||
|
|
20
app/jobs/process_stalled_declarative_dossier_job.rb
Normal file
20
app/jobs/process_stalled_declarative_dossier_job.rb
Normal file
|
@ -0,0 +1,20 @@
|
|||
class ProcessStalledDeclarativeDossierJob < ApplicationJob
|
||||
def perform(dossier)
|
||||
return if dossier.declarative_triggered_at.present?
|
||||
|
||||
case dossier.procedure.declarative_with_state
|
||||
when Procedure.declarative_with_states.fetch(:en_instruction)
|
||||
if !dossier.en_instruction?
|
||||
dossier.passer_automatiquement_en_instruction!
|
||||
end
|
||||
when Procedure.declarative_with_states.fetch(:accepte)
|
||||
if dossier.may_accepter_automatiquement?
|
||||
dossier.accepter_automatiquement!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def max_attempts
|
||||
3 # this job is enqueued by a cron, so it's better to not retry too much
|
||||
end
|
||||
end
|
|
@ -59,6 +59,7 @@ class Champ < ApplicationRecord
|
|||
:region?,
|
||||
:titre_identite?,
|
||||
:header_section?,
|
||||
:checkbox?,
|
||||
:simple_drop_down_list?,
|
||||
:linked_drop_down_list?,
|
||||
:non_fillable?,
|
||||
|
|
|
@ -2,8 +2,11 @@ module DossierCorrectableConcern
|
|||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
A_CORRIGER = 'a_corriger'
|
||||
has_many :corrections, class_name: 'DossierCorrection', dependent: :destroy
|
||||
|
||||
scope :with_pending_corrections, -> { joins(:corrections).where(corrections: { resolved_at: nil }) }
|
||||
|
||||
def flag_as_pending_correction!(commentaire)
|
||||
return unless may_flag_as_pending_correction?
|
||||
|
||||
|
|
|
@ -3,13 +3,17 @@
|
|||
module DossierPrefillableConcern
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
def prefill!(champs_public_attributes)
|
||||
return unless champs_public_attributes.any?
|
||||
def prefill!(champs_attributes)
|
||||
return unless champs_attributes.any?
|
||||
|
||||
attr = { prefilled: true }
|
||||
attr[:champs_public_all_attributes] = champs_public_attributes.map { |h| h.merge(prefilled: true) }
|
||||
attributes = { prefilled: true }
|
||||
attributes[:champs_attributes] = champs_attributes.map { |h| h.merge(prefilled: true) }
|
||||
|
||||
assign_attributes(attr)
|
||||
assign_attributes(attributes)
|
||||
save(validate: false)
|
||||
end
|
||||
|
||||
def find_champs_by_stable_ids(stable_ids)
|
||||
champs.joins(:type_de_champ).where(types_de_champ: { stable_id: stable_ids.compact.uniq })
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
module ProcedureGroupeInstructeurAPIHackConcern
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
include Logic
|
||||
|
||||
# ugly hack to keep retro compatibility
|
||||
# do not judge
|
||||
def update_groupe_instructeur_routing_roules!
|
||||
if feature_enabled?(:groupe_instructeur_api_hack)
|
||||
stable_id = groupe_instructeurs.first.routing_rule.left.stable_id
|
||||
tdc = published_revision.types_de_champ.find_by(stable_id:)
|
||||
|
||||
drop_down_options = groupe_instructeurs.active.map do |groupe_instructeur|
|
||||
groupe_instructeur.update!(routing_rule: ds_eq(champ_value(stable_id), constant(groupe_instructeur.label)))
|
||||
groupe_instructeur.label
|
||||
end
|
||||
|
||||
tdc.update!(drop_down_options:)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -17,6 +17,7 @@
|
|||
# en_construction_close_to_expiration_notice_sent_at :datetime
|
||||
# en_instruction_at :datetime
|
||||
# for_procedure_preview :boolean default(FALSE)
|
||||
# forced_groupe_instructeur :boolean
|
||||
# groupe_instructeur_updated_at :datetime
|
||||
# hidden_at :datetime
|
||||
# hidden_by_administration_at :datetime
|
||||
|
@ -1229,12 +1230,6 @@ class Dossier < ApplicationRecord
|
|||
termine_expired_to_delete.find_each(&:purge_discarded)
|
||||
end
|
||||
|
||||
def find_champs_by_stable_ids(stable_ids)
|
||||
return [] if stable_ids.compact.empty?
|
||||
|
||||
champs.joins(:type_de_champ).where(types_de_champ: { stable_id: stable_ids })
|
||||
end
|
||||
|
||||
def skip_user_notification_email?
|
||||
return true if brouillon? && procedure.declarative?
|
||||
return true if for_procedure_preview?
|
||||
|
|
|
@ -3,36 +3,33 @@ class DossiersFilter
|
|||
|
||||
def initialize(user, params)
|
||||
@user = user
|
||||
@params = params.permit(:page, :from_created_at_date, :from_depose_at_date, states: [])
|
||||
@params = params.permit(:page, :from_created_at_date, :from_depose_at_date, :state)
|
||||
end
|
||||
|
||||
def filter_params
|
||||
params[:from_created_at_date].presence || params[:from_depose_at_date].presence || params[:states].presence
|
||||
params[:from_created_at_date].presence || params[:from_depose_at_date].presence || params[:state].presence
|
||||
end
|
||||
|
||||
def filter_params_count
|
||||
count = 0
|
||||
count += 1 if params[:from_created_at_date].presence
|
||||
count += 1 if params[:from_depose_at_date].presence
|
||||
count += params[:states].count if params[:states].presence
|
||||
count += 1 if params[:state].presence
|
||||
count
|
||||
end
|
||||
|
||||
def filter_procedures(dossiers)
|
||||
return dossiers if filter_params.blank?
|
||||
dossiers_result = dossiers
|
||||
dossiers_result = dossiers_result.where(state: states) if states.present?
|
||||
dossiers_result = dossiers_result.where('created_at >= ?', from_created_at_date) if from_created_at_date.present?
|
||||
dossiers_result = dossiers_result.where('depose_at >= ?', from_depose_at_date) if from_depose_at_date.present?
|
||||
dossiers_result = dossiers_result.where(state: state) if state.present? && state != Dossier::A_CORRIGER
|
||||
dossiers_result = dossiers_result.with_pending_corrections if state.present? && state == Dossier::A_CORRIGER
|
||||
dossiers_result = dossiers_result.where('dossiers.created_at >= ?', from_created_at_date) if from_created_at_date.present?
|
||||
dossiers_result = dossiers_result.where('dossiers.depose_at >= ?', from_depose_at_date) if from_depose_at_date.present?
|
||||
dossiers_result
|
||||
end
|
||||
|
||||
def states
|
||||
params[:states].compact_blank if params[:states].present?
|
||||
end
|
||||
|
||||
def states_filtered?(state)
|
||||
states&.include?(state)
|
||||
def state
|
||||
params[:state]
|
||||
end
|
||||
|
||||
def from_created_at_date
|
||||
|
|
|
@ -5,7 +5,7 @@ class DubiousProcedure
|
|||
attr_accessor :id, :libelle, :dubious_champs, :aasm_state
|
||||
|
||||
FORBIDDEN_KEYWORDS = [
|
||||
'NIR', 'RNIPP', 'race', 'religion', 'RIB', 'IBAN',
|
||||
'NIR', 'RNIPP', 'race', 'religion', 'RIB',
|
||||
'carte bancaire', 'carte bleue', 'sécurité sociale',
|
||||
'agdref', 'syndicat', 'syndical',
|
||||
'parti politique', 'opinion politique', 'bord politique', 'courant politique',
|
||||
|
|
|
@ -110,7 +110,7 @@ class GeoArea < ApplicationRecord
|
|||
|
||||
def location
|
||||
if point?
|
||||
Geo::Coord.new(*geometry['coordinates'].reverse).to_s
|
||||
Geo::Coord.new(*geometry['coordinates'][0..1].reverse).to_s
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -27,9 +27,7 @@ class GroupeInstructeur < ApplicationRecord
|
|||
validates :label, uniqueness: { scope: :procedure }
|
||||
validates :closed, acceptance: { accept: [false] }, if: -> do
|
||||
if closed
|
||||
other_groupes = procedure.groupe_instructeurs - [self]
|
||||
|
||||
(other_groupes.map(&:closed) + [closed]).all?
|
||||
(other_groupe_instructeurs.map(&:closed) + [closed]).all?
|
||||
else
|
||||
false
|
||||
end
|
||||
|
@ -92,6 +90,10 @@ class GroupeInstructeur < ApplicationRecord
|
|||
!routing_rule_matches_tdc?
|
||||
end
|
||||
|
||||
def other_groupe_instructeurs
|
||||
procedure.groupe_instructeurs - [self]
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def routing_rule_matches_tdc?
|
||||
|
|
|
@ -10,6 +10,10 @@ class PrefillParams
|
|||
build_prefill_values.filter(&:prefillable?).map(&:champ_attributes).flatten
|
||||
end
|
||||
|
||||
def self.digest(params)
|
||||
Digest::SHA256.hexdigest(params.reject { |(key, _)| key.split('_').first != "champ" }.to_json)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def build_prefill_values
|
||||
|
|
|
@ -64,6 +64,7 @@ class Procedure < ApplicationRecord
|
|||
include ProcedureStatsConcern
|
||||
include EncryptableConcern
|
||||
include InitiationProcedureConcern
|
||||
include ProcedureGroupeInstructeurAPIHackConcern
|
||||
|
||||
include Discard::Model
|
||||
self.discard_column = :hidden_at
|
||||
|
@ -490,23 +491,6 @@ class Procedure < ApplicationRecord
|
|||
end
|
||||
end
|
||||
|
||||
def process_stalled_dossiers!
|
||||
case declarative_with_state
|
||||
when Procedure.declarative_with_states.fetch(:en_instruction)
|
||||
dossiers
|
||||
.state_en_construction
|
||||
.where(declarative_triggered_at: nil)
|
||||
.find_each(&:passer_automatiquement_en_instruction!)
|
||||
when Procedure.declarative_with_states.fetch(:accepte)
|
||||
dossiers
|
||||
.state_en_construction
|
||||
.where(declarative_triggered_at: nil)
|
||||
.find_each do |dossier|
|
||||
dossier.accepter_automatiquement! if dossier.can_accepter_automatiquement?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def feature_enabled?(feature)
|
||||
Flipper.enabled?(feature, self)
|
||||
end
|
||||
|
@ -965,6 +949,18 @@ class Procedure < ApplicationRecord
|
|||
end
|
||||
end
|
||||
|
||||
def pieces_jointes_list?
|
||||
pieces_jointes_list_without_conditionnal.present? || pieces_jointes_list_with_conditionnal.present?
|
||||
end
|
||||
|
||||
def pieces_jointes_list_without_conditionnal
|
||||
active_revision.types_de_champ_public.not_condition.filter(&:piece_justificative?)
|
||||
end
|
||||
|
||||
def pieces_jointes_list_with_conditionnal
|
||||
active_revision.types_de_champ_public.where.not(condition: nil).filter(&:piece_justificative?)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def validate_auto_archive_on_in_the_future
|
||||
|
|
|
@ -261,10 +261,24 @@ class ProcedurePresentation < ApplicationRecord
|
|||
instructeur.groupe_instructeurs
|
||||
.find { _1.id == filter['value'].to_i }&.label || filter['value']
|
||||
else
|
||||
field = find_field(filter[TABLE], filter[COLUMN])
|
||||
|
||||
if field["type"] == :date
|
||||
parsed_date = safe_parse_date(filter['value'])
|
||||
|
||||
return parsed_date.present? ? I18n.l(parsed_date) : nil
|
||||
end
|
||||
|
||||
filter['value']
|
||||
end
|
||||
end
|
||||
|
||||
def safe_parse_date(string)
|
||||
Date.parse(string)
|
||||
rescue Date::Error
|
||||
nil
|
||||
end
|
||||
|
||||
def add_filter(statut, field, value)
|
||||
if value.present?
|
||||
table, column = field.split(SLASH)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
module RoutingEngine
|
||||
def self.compute(dossier)
|
||||
return if !dossier.procedure.feature_enabled?(:routing_rules)
|
||||
return if dossier.forced_groupe_instructeur
|
||||
|
||||
matching_groupe = dossier.procedure.groupe_instructeurs.active.reject(&:routing_to_configure?).find do |gi|
|
||||
gi.routing_rule&.compute(dossier.champs)
|
||||
|
|
|
@ -396,6 +396,10 @@ class TypeDeChamp < ApplicationRecord
|
|||
type_champ == TypeDeChamp.type_champs.fetch(:datetime)
|
||||
end
|
||||
|
||||
def checkbox?
|
||||
type_champ == TypeDeChamp.type_champs.fetch(:checkbox)
|
||||
end
|
||||
|
||||
def public?
|
||||
!private?
|
||||
end
|
||||
|
|
|
@ -28,11 +28,7 @@ class ProcedureSerializer < ActiveModel::Serializer
|
|||
end
|
||||
|
||||
def link
|
||||
if object.brouillon?
|
||||
commencer_test_url(path: object.path)
|
||||
else
|
||||
commencer_url(path: object.path)
|
||||
end
|
||||
commencer_url(path: object.path)
|
||||
end
|
||||
|
||||
def state
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
Dans le cadre du respect du RGPD, nous (la plateforme #{APPLICATION_NAME}) venons d'activer la suppression automatique des dossiers sur la démarche : "#{@procedure.libelle}".
|
||||
|
||||
%p
|
||||
Vous pouvez d'ores et déjà archiver ces données en accédant à
|
||||
Vous pouvez d’ores et déjà archiver ces données en accédant à
|
||||
= link_to("notre systeme d'archivage pour les admnistrateurs de démarche",admin_procedures_archived_url(@procedure) )
|
||||
\.
|
||||
|
||||
|
|
|
@ -28,6 +28,6 @@
|
|||
%p
|
||||
- if @procedure.locked?
|
||||
= t('published', scope: [:layouts, :breadcrumb])
|
||||
= link_to procedure_lien(@procedure), procedure_lien(@procedure)
|
||||
= link_to commencer_url(@procedure.path), commencer_url(@procedure.path)
|
||||
- else
|
||||
= t('draft', scope: [:layouts, :breadcrumb])
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
= f.label :message_on_submit_by_usager do
|
||||
Message affiché après l'envoi du dossier
|
||||
= f.text_area :message_on_submit_by_usager, placeholder: "Merci, votre dossier sera traité dans les plus bref delais"
|
||||
= f.text_area :message_on_submit_by_usager, placeholder: "Merci, votre dossier sera traité dans les plus brefs délais"
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
.card
|
||||
.card-title Réaffectation des dossiers du groupe « #{@groupe_instructeur.label} »
|
||||
%p
|
||||
Le groupe « #{@groupe_instructeur.label} » contient des dossiers. Afin de procéder à sa suppression, vous devez réaffecter ses dossiers à un autre groupe instructeur.
|
||||
Le groupe « #{@groupe_instructeur.label} » contient des dossiers. Afin de procéder à sa suppression, vous devez réaffecter ses dossiers à un autre groupe d’instructeurs.
|
||||
%table.table.mt-2
|
||||
%thead
|
||||
%tr
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
%div{ data: { 'action': "click->radio-enabled-submit#click" } }
|
||||
.notice
|
||||
Sélectionner le champ à partir duquel créer des groupes d'instructeurs
|
||||
Sélectionner le champ à partir duquel créer des groupes d’instructeurs
|
||||
- buttons_content = @procedure.active_revision.routable_types_de_champ.map { |tdc| { label: tdc.libelle, value: tdc.stable_id } }
|
||||
= render Dsfr::RadioButtonListComponent.new(form: f,
|
||||
target: :stable_id,
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
= f.number_field :duree_conservation_dossiers_dans_ds, { class: 'fr-input', placeholder: '6', required: true, max: f.object.max_duree_conservation_dossiers_dans_ds }
|
||||
|
||||
- if @procedure.created_at.present?
|
||||
- if @procedure.persisted?
|
||||
= render Dsfr::InputComponent.new(form: f, attribute: :lien_site_web, input_type: :text_field, opts: {}, required: false)
|
||||
|
||||
= render Dsfr::CalloutComponent.new(title: "Cadre juridique") do |c|
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
.flex.column.ml-1
|
||||
.card-title
|
||||
= link_to procedure.libelle, admin_procedure_path(procedure), style: 'color: black;'
|
||||
= link_to(procedure_lien(procedure), procedure_lien(procedure), class: 'fr-link fr-mb-1w')
|
||||
= link_to commencer_url(procedure.path), commencer_url(procedure.path), class: 'fr-link fr-mb-1w'
|
||||
|
||||
.admin-procedures-list-timestamps
|
||||
%p.notice N° #{procedure.id}
|
||||
|
@ -48,7 +48,7 @@
|
|||
|
||||
- if !procedure.close? && !procedure.discarded?
|
||||
- menu.with_item do
|
||||
= link_to(sanitize_url(procedure.brouillon? ? commencer_test_url(path: procedure.path) : commencer_url(path: procedure.path)), target: :blank, rel: :noopener, role: 'menuitem') do
|
||||
= link_to commencer_url(path: procedure.path), target: :blank, rel: :noopener, role: 'menuitem' do
|
||||
%span.icon.in-progress
|
||||
.dropdown-description
|
||||
%h4= t('administrateurs.dropdown_actions.to_test')
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
= render Procedure::PublicationWarningComponent.new(procedure: procedure)
|
||||
.mt-2
|
||||
- if procedure.draft_changed?
|
||||
%p.mb-2 Publiez une nouvelle version de votre démarche. Les modifications suivantes seront appliquées :
|
||||
%p.mb-2 Publiez une nouvelle version de votre démarche. Les modifications suivantes seront appliquées :
|
||||
= render Procedure::RevisionChangesComponent.new changes: procedure.revision_changes, previous_revision: procedure.published_revision
|
||||
- if procedure.close?
|
||||
= render partial: 'publication_form_inputs', locals: { procedure: procedure, closed_procedures: @closed_procedures }
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
.container
|
||||
- if @procedure.draft_revision.types_de_champ_public.dubious.present?
|
||||
.card.warning.mb-3
|
||||
.card-title Attention, certains champs ne peuvent être demandé par l'administration. Voici les champs qui nous semblent suspect :
|
||||
.card-title Attention, certains champs ne peuvent être demandés par l’administration. Voici les champs qui nous semblent suspects :
|
||||
%ul
|
||||
- @procedure.draft_revision.types_de_champ_public.dubious.each do |dubious_champs|
|
||||
%li.dubious-champs= "#{dubious_champs.libelle} (#{dubious_champs.description})"
|
||||
|
@ -26,7 +26,7 @@
|
|||
- elsif @procedure.publiee?
|
||||
%p Cette démarche est <strong>publiée</strong>, certains éléments ne peuvent plus être modifiés.
|
||||
Pour y accéder vous pouvez utiliser le lien :
|
||||
= link_to @procedure_lien, sanitize_url(@procedure_lien), target: :blank, rel: :noopener, class: "mb-4"
|
||||
= link_to commencer_url(@procedure.path), commencer_url(@procedure.path), target: :blank, rel: :noopener, class: "mb-4"
|
||||
|
||||
%p.mb-4 Attention, diffusez toujours le <strong>lien complet</strong> affiché ci-dessus, et non pas un lien générique vers #{APPLICATION_NAME}. Ne dites pas non plus aux usagers de se rendre sur le site générique #{APPLICATION_NAME}, donnez-leur toujours le lien complet.
|
||||
- elsif @procedure.brouillon?
|
||||
|
@ -34,7 +34,7 @@
|
|||
%p
|
||||
Cette démarche est actuellement <strong>en test</strong>,
|
||||
pour y accéder vous pouvez utiliser le lien :
|
||||
= link_to @procedure_lien_test, sanitize_url(@procedure_lien_test), target: :blank, rel: :noopener
|
||||
= link_to commencer_url(@procedure.path), commencer_url(@procedure.path), target: :blank, rel: :noopener
|
||||
%p.mb-4
|
||||
Toute personne ayant la connaissance de ce lien pourra ainsi remplir des dossiers de test sur votre démarche.
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
= link_to 'PDF', commencer_dossier_vide_for_revision_path(@procedure.active_revision), target: "_blank", rel: "noopener", class: 'fr-btn fr-btn--tertiary fr-btn--icon-left fr-icon-printer-line', id: "pdf-procedure"
|
||||
|
||||
- if @procedure.brouillon? || @procedure.draft_changed?
|
||||
= link_to 'Tester la démarche', sanitize_url(@procedure_lien_test), target: :blank, rel: :noopener, class: 'fr-btn fr-btn--tertiary fr-btn--icon-left fr-icon-edit-line'
|
||||
= link_to 'Tester la démarche', commencer_url(@procedure.path, test: true), target: :blank, rel: :noopener, class: 'fr-btn fr-btn--tertiary fr-btn--icon-left fr-icon-edit-line'
|
||||
|
||||
- if @procedure.publiee? || @procedure.brouillon?
|
||||
= link_to 'Envoyer une copie', admin_procedure_transfert_path(@procedure), class: 'fr-btn fr-btn--tertiary fr-btn--icon-left fr-icon-arrow-right-up-line'
|
||||
|
@ -37,7 +37,7 @@
|
|||
= t(:has_changes, scope: [:administrateurs, :revision_changes])
|
||||
= render Procedure::RevisionChangesComponent.new changes: @procedure.revision_changes, previous_revision: @procedure.published_revision
|
||||
.flex.mt-2.justify-end
|
||||
= button_to "Réinitialiser les modifications", admin_procedure_reset_draft_path(@procedure), class: 'fr-btn fr-btn--secondary fr-mr-2w', method: :put
|
||||
= button_to "Réinitialiser les modifications", admin_procedure_reset_draft_path(@procedure), class: 'fr-btn fr-btn--secondary fr-mr-2w', data: { confirm: 'Êtes-vous sûr de vouloir réinitialiser les modifications ?' }, method: :put
|
||||
= button_to 'Publier les modifications', admin_procedure_publication_path(@procedure), class: 'fr-btn', id: 'publish-procedure-link', data: { disable_with: "Publication..." }, disabled: !@procedure.draft_revision.valid?, method: :get
|
||||
|
||||
- if !@procedure.procedure_expires_when_termine_enabled?
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
= f.label :organisme do
|
||||
Organisme/s
|
||||
%span.mandatory *
|
||||
%p.notice Indiquez les organismes depuis l’échelon territoriale jusqu’au ministère séparés par une virgule
|
||||
%p.notice Indiquez les organismes depuis l’échelon territorial jusqu’au ministère séparés par une virgule
|
||||
= f.text_field :organisme, placeholder: "mairie de Mours, préfecture de l'Oise, ministère de la Culture", required: true
|
||||
|
||||
= f.label :type_organisme do
|
||||
|
@ -25,7 +25,7 @@
|
|||
%span.mandatory *
|
||||
|
||||
%p.notice
|
||||
Veuillez saisir le numéro de SIRET de l'organisme dont ce service dépend.
|
||||
Veuillez saisir le numéro de SIRET de l’organisme dont ce service dépend.
|
||||
%br
|
||||
= link_to "➡ Rechercher le numéro SIRET sur « annuaire-entreprises.data.gouv.fr »", annuaire_link, target: "_blank"
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
|
||||
%p
|
||||
Pour les usagers ou les administrations publiques (collectivités, etc.) qui souhaitent remplir une démarche ou un déposer un dossier en ligne, l’entrée dans #{APPLICATION_NAME} se fait via un lien fourni par l’administration responsable, sur son propre site web. Ce lien vous permettra de créer un compte et de remplir le formulaire dans la foulée.
|
||||
Pour les usagers ou les administrations publiques (collectivités, etc.) qui souhaitent remplir une démarche ou déposer un dossier en ligne, l’entrée dans #{APPLICATION_NAME} se fait via un lien fourni par l’administration responsable, sur son propre site web. Ce lien vous permettra de créer un compte et de remplir le formulaire dans la foulée.
|
||||
|
||||
%p
|
||||
Si par contre vous rencontrez des problèmes lors de l'utilisation de #{APPLICATION_NAME} en tant qu'usager, merci d’expliciter le problème rencontré sur notre
|
||||
|
@ -16,7 +16,7 @@
|
|||
\.
|
||||
|
||||
%p
|
||||
Si vous avez fait une demande de compte administrateur légitime avec une adresse email grand public (Orange, Wanadoo etc), merci de nous contacter sur notre
|
||||
Si vous avez fait une demande de compte administrateur légitime avec une adresse email grand public (Orange, Wanadoo, etc.), merci de nous contacter sur notre
|
||||
= link_to("formulaire de contact administrateur", contact_admin_url)
|
||||
\.
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
= turbo_stream.update dom_id(@champ, :geo_areas), partial: 'shared/champs/carte/geo_areas', locals: { champ: @champ, editing: true }
|
||||
= turbo_stream.update dom_id(@champ, :geo_areas) do
|
||||
= render Dossiers::GeoAreasComponent.new(champ: @champ, editing: true)
|
||||
|
||||
- if @focus
|
||||
= turbo_stream.dispatch 'map:feature:focus', bbox: @champ.bounding_box
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
- if field.data.present?
|
||||
= link_to Addressable::URI.parse(procedure_lien(field.resource)).path, procedure_lien(field.resource), target: '_blank', rel: 'noopener'
|
||||
= link_to commencer_path(field.resource.path), commencer_path(field.resource.path), target: '_blank', rel: 'noopener'
|
||||
- else
|
||||
Plus en ligne
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Bonjour,
|
||||
|
||||
%p
|
||||
Voici le résumé de votre activité hebdomadaire :
|
||||
Voici le résumé de votre activité hebdomadaire :
|
||||
|
||||
- @overview[:procedure_overviews].each_with_index do |procedure_overview, index|
|
||||
|
||||
|
|
|
@ -22,3 +22,7 @@
|
|||
|
||||
= dynamic_tab_item(t('views.instructeurs.dossiers.tab_steps.involved_persons'),
|
||||
personnes_impliquees_instructeur_dossier_path(dossier.procedure, dossier))
|
||||
|
||||
- if dossier.procedure.routing_enabled? && dossier.procedure.feature_enabled?(:rerouting)
|
||||
= dynamic_tab_item(t('views.instructeurs.dossiers.tab_steps.reaffectation'),
|
||||
reaffectation_instructeur_dossier_path(dossier.procedure, dossier))
|
||||
|
|
24
app/views/instructeurs/dossiers/reaffectation.html.haml
Normal file
24
app/views/instructeurs/dossiers/reaffectation.html.haml
Normal file
|
@ -0,0 +1,24 @@
|
|||
- content_for(:title, "Réaffectation · Dossier nº #{@dossier.id} (#{@dossier.owner_name})")
|
||||
|
||||
= render partial: "header", locals: { dossier: @dossier }
|
||||
|
||||
.container.groupe-instructeur
|
||||
|
||||
.card
|
||||
.card-title Réaffectation du dossier nº #{@dossier.id} du groupe « #{@groupe_instructeur.label} »
|
||||
%p
|
||||
Vous pouvez réaffecter le dossier nº #{@dossier.id} à l'un des groupes d'instructeurs suivants.
|
||||
%table.table.mt-2
|
||||
%thead
|
||||
%tr
|
||||
%th{ colspan: 2 }= t("instructeurs.dossiers.existing_groupe", count: @groupes_instructeurs.total_count)
|
||||
%tbody
|
||||
- @groupes_instructeurs.each do |group|
|
||||
%tr
|
||||
%td= group.label
|
||||
%td.actions= button_to 'Réaffecter le dossier à ce groupe',
|
||||
reaffecter_instructeur_dossier_path(procedure_id: @dossier.procedure.id, dossier_id: @dossier.id, groupe_instructeur_id: group.id),
|
||||
{ class: 'button',
|
||||
data: { confirm: "Êtes-vous sûr de vouloir réaffecter le dossier nº #{@dossier.id} du groupe « #{@groupe_instructeur.label} » vers le groupe « #{group.label} » ?" } }
|
||||
|
||||
= paginate @groupes_instructeurs, views_prefix: 'shared'
|
|
@ -2,7 +2,7 @@
|
|||
.flex.clipboard-container
|
||||
%h1
|
||||
= "#{procedure_libelle procedure} - n°#{procedure.id}"
|
||||
= render Dsfr::CopyButtonComponent.new(title: t('instructeurs.procedures.index.copy_link_button'), text: procedure_lien(procedure))
|
||||
= render Dsfr::CopyButtonComponent.new(title: t('instructeurs.procedures.index.copy_link_button'), text: commencer_url(procedure.path))
|
||||
= link_to t('instructeurs.dossiers.header.banner.notification_management'), email_notifications_instructeur_procedure_path(procedure), class: 'header-link'
|
||||
|
|
||||
= link_to t('instructeurs.dossiers.header.banner.statistics'), stats_instructeur_procedure_path(procedure), class: 'header-link'
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
%p.fr-mb-2w
|
||||
= procedure_badge(p)
|
||||
= link_to("#{p.libelle} - n°#{p.id}", instructeur_procedure_path(p), class: "fr-link fr-ml-1w")
|
||||
= render Dsfr::CopyButtonComponent.new(title: t('instructeurs.procedures.index.copy_link_button'), text: procedure_lien(p))
|
||||
= render Dsfr::CopyButtonComponent.new(title: t('instructeurs.procedures.index.copy_link_button'), text: commencer_url(p.path))
|
||||
|
||||
%ul.procedure-stats.flex
|
||||
%li
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
- if @bulk_messages.present?
|
||||
%section.list-avis.mt-8
|
||||
%h1.tab-title
|
||||
Messages envoyés précedemment
|
||||
Messages envoyés précédemment
|
||||
%span.fr-badge= @bulk_messages.count
|
||||
|
||||
%ul
|
||||
|
@ -29,4 +29,4 @@
|
|||
= render Attachment::ShowComponent.new(attachment: message.piece_jointe.attachment)
|
||||
- else
|
||||
.page-title.center
|
||||
%h2 Il n'y a aucun dossier en brouillon dans vos groupes instructeurs
|
||||
%h2 Il n’y a aucun dossier en brouillon dans vos groupes d’instructeurs
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
%p
|
||||
L’utilisateur
|
||||
= @invite.email_sender
|
||||
souhaite que vous participiez à l'élaboration d’un dossier pour la démarche
|
||||
souhaite que vous participiez à l’élaboration d’un dossier pour la démarche
|
||||
%strong= @invite.dossier.procedure.libelle
|
||||
sur #{APPLICATION_NAME}.
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
%h2.fr-accordion__title
|
||||
%button.fr-accordion__btn{ "aria-controls" => "accordion-114", "aria-expanded" => "true" }
|
||||
= t('activerecord.attributes.procedure.description')
|
||||
#accordion-114.fr-collapse.js_description
|
||||
#accordion-114.fr-collapse
|
||||
= h render SimpleFormatComponent.new(procedure.description, allow_a: true)
|
||||
|
||||
- if procedure.description_target_audience.present?
|
||||
|
@ -36,15 +36,37 @@
|
|||
%h2.fr-accordion__title
|
||||
%button.fr-accordion__btn{ "aria-controls" => "accordion-115", "aria-expanded" => "false" }
|
||||
= t('activerecord.attributes.procedure.description_target_audience')
|
||||
#accordion-115.fr-collapse.js_description_target_audience
|
||||
#accordion-115.fr-collapse
|
||||
= h render SimpleFormatComponent.new(procedure.description_target_audience, allow_a: true)
|
||||
|
||||
- if procedure.pieces_jointes_list?
|
||||
%section.fr-accordion.pieces_jointes
|
||||
%h2.fr-accordion__title
|
||||
%button.fr-accordion__btn{ "aria-controls" => "accordion-116", "aria-expanded" => "false" }
|
||||
= t('shared.procedure_description.pieces_jointes')
|
||||
#accordion-116.fr-collapse
|
||||
- if procedure.pieces_jointes_list_without_conditionnal.present?
|
||||
%ul
|
||||
- procedure.pieces_jointes_list_without_conditionnal.each do |pj|
|
||||
%li
|
||||
= pj.libelle
|
||||
= t('utils.no_mandatory') if !pj.mandatory?
|
||||
|
||||
- if procedure.pieces_jointes_list_with_conditionnal.present?
|
||||
%h3.fr-text--sm.fr-mb-0.fr-mt-2w
|
||||
= t('shared.procedure_description.pieces_jointes_conditionnal_list_title')
|
||||
%ul
|
||||
- procedure.pieces_jointes_list_with_conditionnal.each do |pj|
|
||||
%li
|
||||
= pj.libelle
|
||||
= t('utils.no_mandatory') if !pj.mandatory?
|
||||
|
||||
- if procedure.persisted? && procedure.estimated_duration_visible?
|
||||
%section.fr-accordion
|
||||
%h2.fr-accordion__title
|
||||
%button.fr-accordion__btn{ "aria-controls" => "accordion-116", "aria-expanded" => "false" }
|
||||
%button.fr-accordion__btn{ "aria-controls" => "accordion-117", "aria-expanded" => "false" }
|
||||
= t('shared.procedure_description.estimated_fill_duration_title')
|
||||
#accordion-116.fr-collapse.js_description_target_audience
|
||||
#accordion-117.fr-collapse
|
||||
= t('shared.procedure_description.estimated_fill_duration_detail', estimated_minutes: estimated_fill_duration_minutes(procedure))
|
||||
|
||||
- if procedure.notice.attached?
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
- if champ.geometry?
|
||||
= react_component("MapReader", { featureCollection: champ.to_feature_collection, options: champ.render_options } )
|
||||
.geo-areas
|
||||
= render partial: 'shared/champs/carte/geo_areas', locals: { champ: champ, editing: false }
|
||||
= render Dossiers::GeoAreasComponent.new(champ:, editing: false)
|
||||
|
|
|
@ -37,3 +37,19 @@
|
|||
- if champs.any? || dossier.procedure.routing_enabled?
|
||||
.card
|
||||
= render partial: "shared/dossiers/champs", locals: { champs: champs, dossier: dossier, demande_seen_at: demande_seen_at, profile: profile }
|
||||
|
||||
- if dossier.procedure.routing_enabled?
|
||||
%h2.fr-h6
|
||||
Réaffectation
|
||||
.card
|
||||
En cas d'erreur de l'usager, vous pouvez réaffecter le dossier vers l'un des groupes d'instructeurs suivants
|
||||
= form_tag reaffecter_instructeur_dossier_path(procedure_id: @dossier.procedure.id, dossier_id: @dossier.id),
|
||||
method: :post,
|
||||
class: 'fr-mb-3w mt-2' do
|
||||
.flex
|
||||
= select_tag(:groupe_instructeur_id,
|
||||
options_for_select(@dossier.groupe_instructeur.other_groupe_instructeurs.pluck(:label, :id)),
|
||||
include_blank: true,
|
||||
class: 'fr-select flex auto fr-mr-2w')
|
||||
|
||||
= button_tag 'Réaffecter', class: 'fr-btn fr-btn--secondary'
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue