Compare commits

...

89 commits

Author SHA1 Message Date
mfo
b48475ca23
Merge pull request #9216 from mfo/US/doc-recovery
tech(doc): documente le processus pour re-importer des dossiers perdus
2023-06-20 09:08:31 +00:00
Colin Darie
e61466c3ce
Merge pull request #9213 from colinux/robots-super-admins
Tech (seo): disallow /super_admins/
2023-06-20 09:03:00 +00:00
LeSim
d95dde075c
Merge pull request #9214 from demarches-simplifiees/renew_signed_id_blob_tasks
Outillage: ajout d'une tache qui permet d'invalider des blob signed_ids
2023-06-20 08:49:01 +00:00
Colin Darie
3d4983d8fc feat(seo): disallow /super_admins/ 2023-06-20 10:19:00 +02:00
simon lehericey
6dd6ddd8c6 tools: add task to renew blob signed_ids 2023-06-20 09:39:57 +02:00
Colin Darie
4eaef72a22
Merge pull request #9215 from colinux/fix-flaky-tests
Tests: fix tests instables et colonne manquante dans le schema.rb
2023-06-20 07:05:49 +00:00
Colin Darie
33617a4c44 test: ensure travel_back is automatically called at the right time 2023-06-20 00:04:55 +02:00
Colin Darie
d41d69d167 fix(schema): missing column addition declaration in ce1429b 2023-06-19 23:59:06 +02:00
Colin Darie
acc6456b08
Merge pull request #9201 from demarches-simplifiees/user-dashboard/add-filter-a-corriger
[refonte usager] Tableau de bord - remonter les dossiers à corriger
2023-06-19 19:21:32 +00:00
Lisa Durand
6a92249f0a
Merge pull request #9208 from demarches-simplifiees/remove-iban-from-suspicious-list
ETQ admin, je ne veux plus voir l'IBAN comme un champ "suspect"
2023-06-19 14:45:06 +00:00
Colin Darie
7023284726
Merge pull request #9195 from colinux/job-declarative-dossier-unit
Jobs: traite en isolation les dossiers bloqués de démarches déclaratives
2023-06-19 14:44:59 +00:00
Lisa Durand
52bbd47ebe add constant for 'à_corriger' 2023-06-19 16:16:44 +02:00
Lisa Durand
87f11f06ad remove IBAN from forbidden keywords list 2023-06-19 14:30:29 +02:00
Eric Leroy-Terquem
8f777ef587
Merge pull request #9132 from demarches-simplifiees/migrate-remaining-data-for-routing-with-dropdown-list
fix(routing): migrate remaining data
2023-06-16 12:24:21 +00:00
Eric Leroy-Terquem
be4f8f57ab
Merge pull request #9093 from demarches-simplifiees/rerouter-un-dossier
ETQ instructeur je peux réaffecter un dossier à un autre groupe d'instructeurs
2023-06-16 12:01:10 +00:00
Eric Leroy-Terquem
6f97fc2a68 fix(routing): migrate remaining data 2023-06-16 12:01:07 +02:00
LeSim
a5b99ddfd9
Merge pull request #9202 from tchak/fix-99-communes
fix(commune): a commune can not be located in 99
2023-06-16 07:56:16 +00:00
Paul Chavard
c2ae3426cd fix(commune): a commune can not be located in 99 2023-06-16 08:38:01 +01:00
Lisa Durand
bcc37f4130 change states filter from checkbox to select and add 'a_corriger' 2023-06-15 18:17:36 +02:00
Lisa Durand
f4e33c068b
Merge pull request #9121 from demarches-simplifiees/add-detail-on-PJ-on-description-procedure-page
[Refonte page accueil demarche] Ajouter les infos concernant les PJ
2023-06-15 12:52:50 +00:00
Eric Leroy-Terquem
98cdc63d5c add rerouting feature flag 2023-06-15 14:34:02 +02:00
Eric Leroy-Terquem
35d28610aa move reaffectation view in a dynamic tab item 2023-06-15 14:34:02 +02:00
Eric Leroy-Terquem
3c0df601da feat(routing): add form in dossier page 2023-06-15 14:34:02 +02:00
Eric Leroy-Terquem
a9c6cc322a feat(routing): do not run routing engine if dossier has been re routed 2023-06-15 14:34:02 +02:00
Eric Leroy-Terquem
18054fe346 feat(routing): add view for dossier a reaffecter 2023-06-15 14:34:02 +02:00
Eric Leroy-Terquem
e7e702a574 feat(routing): add reaffecter_un_dossier 2023-06-15 14:34:01 +02:00
Lisa Durand
30cf71b360 change 'unless' for 'if !' 2023-06-15 14:33:13 +02:00
Eric Leroy-Terquem
ce1429b850 migration : add forced_group_instructeur_to_dossier 2023-06-15 14:14:47 +02:00
Eric Leroy-Terquem
e78c22f33c refactor(groupe instructeur): extract method other_groupe_instructeurs 2023-06-15 14:14:47 +02:00
Paul Chavard
908e531057
Merge pull request #9197 from tchak/fix-prefill-annotations
ETQ Administrateur, je voudrais proposer de pré-remplir les annotations privées
2023-06-15 09:18:30 +00:00
Paul Chavard
c1afc985e4 fix(prefill): allow private annotations prefill 2023-06-15 10:07:25 +01:00
Paul Chavard
01653440e7
Merge pull request #9198 from tchak/fix-groupe-instructeur-api-hack
fix(hack): fix and test hack for procedures using groupe instructeur api
2023-06-14 18:35:46 +00:00
Paul Chavard
b551ef2dc3
Merge pull request #9199 from tchak/fix-optional-champs
fix(dossier): only show optional text on public champs
2023-06-14 18:26:03 +00:00
Paul Chavard
10524643fb fix(hack): fix and test hack for procedures using groupe instructeur api 2023-06-14 19:24:58 +01:00
Paul Chavard
a432323843 fix(dossier): only show optional text on public champs 2023-06-14 19:00:06 +01:00
Colin Darie
3939f85860
refactor(job): wrap sentry tags in a single before_perform 2023-06-14 12:06:22 +02:00
Colin Darie
17f5fb4a51
refactor(declarative): process dossier in job isolation 2023-06-14 12:06:22 +02:00
Colin Darie
f675d2d1a7
Merge pull request #9196 from colinux/fix-admin-publication-errors
ETQ admin je veux voir les erreurs lorsque la (re-)publication échoue
2023-06-14 09:56:46 +00:00
Paul Chavard
9383c53df1
Merge pull request #9166 from tchak/fix-prefill-test
ETQ Administrateur, je voudrais pouvoir pré-remplir un dossier sur une démarche en teste
2023-06-14 08:36:12 +00:00
Paul Chavard
b3aeb46c1b fix(prefill): it should be possible to prefill a dossier on a test procedure 2023-06-14 09:14:12 +01:00
Colin Darie
54968daf17
Merge pull request #9192 from demarches-simplifiees/accessibility-statement
Usager: met à jour le taux de conformité d'accessibilité à 80%
2023-06-14 07:51:13 +00:00
Colin Darie
889940af2a fix(administrateur): renders errors when publication fails 2023-06-13 19:11:59 +02:00
Eric Leroy-Terquem
4b1389ac7e
Merge pull request #9188 from demarches-simplifiees/add-confirm-modal-before-reset-draft-revision
ETQ admin je vois une modale pour confirmer la réinitialisation des modifications de la procédure
2023-06-13 15:05:01 +00:00
Eric Leroy-Terquem
92bdab3de4
Merge pull request #9194 from demarches-simplifiees/fix-replay-routing-engine
Correction : rejoue le routing engine apres ajout des règles de routage sur une procédure clonée
2023-06-13 14:08:56 +00:00
Eric Leroy-Terquem
d18ba7fbe6 add routing rules for cloned routed procedure 2023-06-13 15:58:04 +02:00
Colin Darie
5730b9e871
Merge pull request #9190 from demarches-simplifiees/hide_blob_from_search_engine
fix: exclue les chemins /rails/ des moteurs de recherche
2023-06-13 09:17:07 +00:00
Lisa Durand
4b6d18608e split pj in two lists regarding to conditionnal 2023-06-13 11:00:16 +02:00
Lisa Durand
d2f91a6405 add list of PJ in procedure description 2023-06-13 10:58:05 +02:00
Julie Salha
551a065329 update content accessibility statement 2023-06-13 10:52:04 +02:00
simon lehericey
5b02ff8ae2 fix: remove /rails/ path from search engine 2023-06-13 10:36:22 +02:00
LeSim
d22c0f47f3
Merge pull request #9155 from demarches-simplifiees/add_info_on_export
Ajoute un lien dans le menu d'export vers la doc sur les macros
2023-06-13 08:25:49 +00:00
LeSim
898b9db960
Merge pull request #9167 from tchak/use-persisted
refactor: use persisted? instead of created_at.present?
2023-06-13 08:15:58 +00:00
simon lehericey
8c2f838fd1 wording: add doc link concerning excel macros 2023-06-13 10:14:10 +02:00
Eric Leroy-Terquem
5f1709f62d add a flash notice after reset draft 2023-06-13 09:34:48 +02:00
Eric Leroy-Terquem
04e11aa609 add a confirm modal before reset draft 2023-06-13 09:34:48 +02:00
Colin Darie
a9887c0505
Merge pull request #9186 from colinux/fix-dossier-badge-state-icon
Design: corrige badge en_instruction & accepte pour avoir les badges, contrairement aux autres états
2023-06-13 06:12:08 +00:00
Kara Diaby
0649863139
Merge pull request #9050 from demarches-simplifiees/feat/9013
ETQ usager je suis guidé dans le formulaire lorsque les champs sont obligatoires ou facultatifs
2023-06-12 16:25:03 +00:00
Colin Darie
08d13d2798
Merge pull request #9187 from colinux/fix-instructeur-informe-wording
ETQ instructeur: uniformise le wording "informé" sur les actions d'instruction et de correction
2023-06-12 16:03:45 +00:00
Colin Darie
e4e47a4e97 fix(instructeur): corrections notifié => informé 2023-06-12 17:48:03 +02:00
Colin Darie
68f1d10e19 style(dossier-badge): en_instruction & accepte should have badge 2023-06-12 17:46:01 +02:00
Kara Diaby
804f89f444 Changements sur le caractère obligatoire / facultatif et l'asterisque interface usager et page de connexion 2023-06-12 14:43:10 +00:00
Eric Leroy-Terquem
0d1754d715
Merge pull request #9153 from demarches-simplifiees/fix-typos
Correction de coquilles et fautes d'orthographe
2023-06-12 14:10:33 +00:00
Eric Leroy-Terquem
90b11ebe9c
Merge pull request #9146 from demarches-simplifiees/update-ui-when-adding-group
Mise a jour de l'UX de la page groupe d'instructeurs
2023-06-12 13:56:19 +00:00
Paul Chavard
8152382e58
Merge pull request #9171 from tchak/fix-geo-json-with-z
fix(carto): no crash on points with elevation
2023-06-12 13:33:52 +00:00
Eric Leroy-Terquem
68c81c8d23 UI(groupe instructeur): update css to keep content in container 2023-06-12 15:32:02 +02:00
Eric Leroy-Terquem
f2dffc2ba3 UI(groupe instructeur): add a hint for adding routing value 2023-06-12 15:32:02 +02:00
Eric Leroy-Terquem
dd1b67bbc7 UI(groupe instructeur): update heading level and wording 2023-06-12 15:32:02 +02:00
Eric Leroy-Terquem
0164b5f008 fix tests after typos corrections 2023-06-12 15:13:25 +02:00
Eric Leroy-Terquem
ea9213bf90 fix typos in components 2023-06-12 15:13:25 +02:00
Eric Leroy-Terquem
bd846e721d fix typos in views 2023-06-12 15:13:25 +02:00
Eric Leroy-Terquem
cbd1f09e55 fix remaining locales 2023-06-12 15:13:25 +02:00
Eric Leroy-Terquem
ef73d9187d fix typos in view locales 2023-06-12 15:13:25 +02:00
Eric Leroy-Terquem
2cc0baf4db fix typos in model locales 2023-06-12 15:13:25 +02:00
Paul Chavard
6723bdcd9d fix(carto): no crash on points with elevation 2023-06-12 14:56:52 +02:00
Paul Chavard
9551368203 refactor: use persisted? instead of created_at.present? 2023-06-12 14:25:50 +02:00
Colin Darie
9d8ad9b3d8
Merge pull request #9160 from colinux/improve-instructeurs-filter-date
ETQ instructeur je lis la date d'un filtre dans un format "humain"
2023-06-12 12:22:51 +00:00
Colin Darie
be93325111
Merge pull request #9156 from demarches-simplifiees/change-badge-color-for-en-instruction-status
[design] Changement de couleurs pour les bagdes de statuts des dossiers
2023-06-12 12:19:27 +00:00
LeSim
e23f16472c
Merge pull request #9158 from demarches-simplifiees/fix_page_with_deleted_dossier
Corrige le tableau de bord usager lorsqu'il y a un dossier supprimé sur une démarche en cours de suppression
2023-06-12 12:11:37 +00:00
Colin Darie
628026f524
Merge pull request #9154 from colinux/fix-form-owned-button-turbo
ETQ utilisateur je veux que mes PJ soient supprimées en turbo
2023-06-12 11:59:56 +00:00
simon lehericey
44859b8217 fix(user dossiers index): do not crash with a deleted dossier and a discarded procedure 2023-06-12 13:57:28 +02:00
Paul Chavard
e2d7be215e
Merge pull request #9165 from tchak/chore-refactor-geo-areas-to-use-components
refactor(carto): geo area as component
2023-06-12 10:36:05 +00:00
Paul Chavard
f563e210f3 refactor(carto): geo area as component 2023-06-12 10:33:56 +02:00
LeSim
ded0a41975
Merge pull request #9163 from demarches-simplifiees/sentry_proxy
Technique: fait passer explicitement sentry par le proxy s'il existe
2023-06-09 09:13:28 +00:00
simon lehericey
f85fa08415 fix: sentry use http_proxy if available 2023-06-09 11:03:04 +02:00
Colin Darie
75b2685230 fix(instructeurs): human format a filtered date 2023-06-08 19:01:23 +02:00
Lisa Durand
a1ace0f173 fix linter 2023-06-08 14:41:42 +02:00
Lisa Durand
1335a3192c
refacto for better readability
Co-authored-by: Colin Darie <colin@darie.eu>
2023-06-08 14:21:51 +02:00
Lisa Durand
c9bb4dc38e change badge color for dossier status and add icons for succes and instruction 2023-06-08 11:45:13 +02:00
Colin Darie
61bc59109d fix(turbo): PJ deletion: turbo: true must be set on button in addition to form 2023-06-08 11:16:55 +02:00
177 changed files with 1085 additions and 576 deletions

View file

@ -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'

View file

@ -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

View file

@ -17,6 +17,7 @@
color: $dark-grey;
}
.mandatory {
color: $dark-red;
}

View file

@ -173,4 +173,8 @@
&.move-handle {
background-image: image-url("icons/move-handle.svg");
}
&.mandatory {
width: 10px;
}
}

View file

@ -0,0 +1,10 @@
@import "colors";
.menu-component-header {
color: $dark-grey;
font-size: 12px;
a {
text-decoration: underline;
}
}

View file

@ -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: Laction 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.

View file

@ -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

View file

@ -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"

View file

@ -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"

View file

@ -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|

View file

@ -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

View 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

View file

@ -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:)

View file

@ -0,0 +1,7 @@
class Dossiers::GeoAreasComponent < ApplicationComponent
attr_reader :champ, :editing
def initialize(champ:, editing:)
@champ, @editing = champ, editing
end
end

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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'

View file

@ -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)

View file

@ -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?

View file

@ -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?

View file

@ -0,0 +1,2 @@
class EditableChamp::AsteriskMandatoryComponent < ApplicationComponent
end

View file

@ -0,0 +1,2 @@
en:
required: required

View file

@ -0,0 +1,2 @@
fr:
required: obligatoire

View file

@ -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" }

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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')

View file

@ -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'

View file

@ -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

View file

@ -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)

View file

@ -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")

View file

@ -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.

View file

@ -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')
Lusager sera notifié quil peut modifier son dossier
Lusager sera informé quil 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')
Lusager sera notifié que des modifications sont attendues
Lusager 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:,

View file

@ -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

View file

@ -1,3 +1,3 @@
---
fr:
title: Fin de dépot
title: Fin de dépôt

View file

@ -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 ?

View file

@ -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 dinstructeurs
= 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)

View file

@ -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 na 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 lafficher que lors de sa création.
security_title: "Options de sécurité"

View file

@ -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

View file

@ -11,5 +11,5 @@ fr:
zones_humides: Zones humides dimportance internationale
znieff: ZNIEFF
character_limit:
unlimited: Pas de limite de caractère
unlimited: Pas de limite de caractères
limit: Limité à %{limit} caractères

View file

@ -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 :'

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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])

View file

@ -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: }

View file

@ -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 }

View file

@ -75,11 +75,7 @@ Cela évite laccè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

View file

@ -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 = []

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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]

View 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

View file

@ -59,6 +59,7 @@ class Champ < ApplicationRecord
:region?,
:titre_identite?,
:header_section?,
:checkbox?,
:simple_drop_down_list?,
:linked_drop_down_list?,
:non_fillable?,

View file

@ -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?

View file

@ -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

View file

@ -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

View file

@ -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?

View file

@ -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

View file

@ -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',

View file

@ -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

View file

@ -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?

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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 dores 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) )
\.

View file

@ -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])

View file

@ -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"

View file

@ -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 dinstructeurs.
%table.table.mt-2
%thead
%tr

View file

@ -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 dinstructeurs
- 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,

View file

@ -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|

View file

@ -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')

View file

@ -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 }

View file

@ -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 ladministration. 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.

View file

@ -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?

View file

@ -11,7 +11,7 @@
= f.label :organisme do
Organisme/s
%span.mandatory *
%p.notice Indiquez les organismes depuis léchelon territoriale jusquau ministère séparés par une virgule
%p.notice Indiquez les organismes depuis léchelon territorial jusquau 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 lorganisme dont ce service dépend.
%br
= link_to "➡ Rechercher le numéro SIRET sur « annuaire-entreprises.data.gouv.fr »", annuaire_link, target: "_blank"

View file

@ -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, lentrée dans #{APPLICATION_NAME} se fait via un lien fourni par ladministration 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, lentrée dans #{APPLICATION_NAME} se fait via un lien fourni par ladministration 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 dexpliciter 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)
\.

View file

@ -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

View file

@ -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

View file

@ -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|

View file

@ -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))

View 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'

View file

@ -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'

View file

@ -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

View file

@ -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 ny a aucun dossier en brouillon dans vos groupes dinstructeurs

View file

@ -4,7 +4,7 @@
%p
Lutilisateur
= @invite.email_sender
souhaite que vous participiez à l'élaboration dun dossier pour la démarche
souhaite que vous participiez à lélaboration dun dossier pour la démarche
%strong= @invite.dossier.procedure.libelle
sur #{APPLICATION_NAME}.

View file

@ -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?

View file

@ -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)

View file

@ -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