diff --git a/app/assets/stylesheets/01_common.scss b/app/assets/stylesheets/01_common.scss
new file mode 100644
index 000000000..7ed530f6c
--- /dev/null
+++ b/app/assets/stylesheets/01_common.scss
@@ -0,0 +1,28 @@
+@import "placeholders";
+
+turbo-events {
+ display: none;
+}
+
+.page-wrapper {
+ position: relative;
+ min-height: 100%;
+}
+
+// Mobile Safari doesn't bubble mouse events by default, unless:
+//
+// - the target element of the event is a link or a form field.
+// - the target element, or any of its ancestors up to but not including the
, has an explicit event handler set for any of the mouse events. This event handler may be an empty function.
+// - the target element, or any of its ancestors up to and including the document has a cursor: pointer CSS declarations.
+//
+// (See https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html)
+//
+// This is a problem for us, because we bind a lot of click events as
+// `document.on('click', '.my-element', …)` – which requires proper bubbling.
+.ios .page-wrapper {
+ cursor: pointer;
+}
+
+.container {
+ @extend %container;
+}
diff --git a/app/assets/stylesheets/utils.scss b/app/assets/stylesheets/02_utils.scss
similarity index 100%
rename from app/assets/stylesheets/utils.scss
rename to app/assets/stylesheets/02_utils.scss
diff --git a/app/assets/stylesheets/_mixins.scss b/app/assets/stylesheets/_mixins.scss
index 52d5594a6..f561d6d63 100644
--- a/app/assets/stylesheets/_mixins.scss
+++ b/app/assets/stylesheets/_mixins.scss
@@ -1,3 +1,5 @@
+@import "constants";
+
@mixin horizontal-padding($value) {
padding-left: $value;
padding-right: $value;
@@ -20,3 +22,4 @@
background-image: image-url($image-url);
}
}
+
diff --git a/app/assets/stylesheets/_placeholders.scss b/app/assets/stylesheets/_placeholders.scss
index b30eb5a17..5488879d0 100644
--- a/app/assets/stylesheets/_placeholders.scss
+++ b/app/assets/stylesheets/_placeholders.scss
@@ -1,4 +1,5 @@
@import "colors";
+@import "mixins";
@import "constants";
%horizontal-list {
@@ -25,3 +26,10 @@
outline: 3px solid $blue-france-500;
}
}
+
+%container { // TODO: switch to new design with preview in two view not in two column https://github.com/betagouv/demarches-simplifiees.fr/issues/7882
+ @include horizontal-padding($default-padding);
+ max-width: $page-width + 2 * $default-padding;
+ margin-left: auto;
+ margin-right: auto;
+}
diff --git a/app/assets/stylesheets/_typography.scss b/app/assets/stylesheets/_typography.scss
deleted file mode 100644
index 14b206e2b..000000000
--- a/app/assets/stylesheets/_typography.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-@import "colors";
-
-%new-type {
- font-family: "Marianne", system-ui, -apple-system, sans-serif;
- color: $black;
-}
-
-ol {
- line-height: 28px;
- list-style-type: decimal;
- list-style-position: inside;
-}
diff --git a/app/assets/stylesheets/admin-procedures-list.scss b/app/assets/stylesheets/admin-procedures-list.scss
index 16b41aff6..8369465a0 100644
--- a/app/assets/stylesheets/admin-procedures-list.scss
+++ b/app/assets/stylesheets/admin-procedures-list.scss
@@ -11,7 +11,7 @@
.admin-procedures-list-row.infos {
align-items: flex-start;
- a {
- color: $blue-france-500;
+ a:not(:hover) {
+ background-image: none; // remove DSFR underline
}
}
diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
index 82fb5fc2a..e6aa30c35 100644
--- a/app/assets/stylesheets/application.scss
+++ b/app/assets/stylesheets/application.scss
@@ -1,6 +1 @@
-// = require ./reset
-// = require ./custom_reset
-// = require ./common
-// = require ./utils
-// = require ./fonts
// = require_tree .
diff --git a/app/assets/stylesheets/archive.scss b/app/assets/stylesheets/archive.scss
index 676c6cbe9..91da1e4ca 100644
--- a/app/assets/stylesheets/archive.scss
+++ b/app/assets/stylesheets/archive.scss
@@ -12,4 +12,8 @@ table.archive-table {
td {
padding: 3 * $default-spacer $default-spacer;
}
+
+ a.button {
+ background-image: none; // remove DSFR underline
+ }
}
diff --git a/app/assets/stylesheets/attachment.scss b/app/assets/stylesheets/attachment.scss
index 20d21a2fc..d29e6667e 100644
--- a/app/assets/stylesheets/attachment.scss
+++ b/app/assets/stylesheets/attachment.scss
@@ -11,6 +11,14 @@
.button {
text-transform: lowercase;
+ background-image: none; // remove DSFR underline, TODO: switch to DSFR download links https://github.com/betagouv/demarches-simplifiees.fr/issues/7883
+ }
+
+}
+
+.attachment-link {
+ a:not(:hover) {
+ background-image: none; // remove DSFR underline
}
}
diff --git a/app/assets/stylesheets/avis.scss b/app/assets/stylesheets/avis.scss
index 642d11537..1c93b064c 100644
--- a/app/assets/stylesheets/avis.scss
+++ b/app/assets/stylesheets/avis.scss
@@ -1,5 +1,4 @@
@import "colors";
-@import "common";
@import "constants";
.give-avis {
@@ -75,18 +74,6 @@
}
.list-avis {
- .count {
- display: inline-block;
- width: 20px;
- height: 20px;
- border-radius: 10px;
- border: 1px solid $grey;
- text-align: center;
- font-size: 12px;
- font-weight: normal;
- margin-left: 8px;
- }
-
.one-avis {
border-top: 1px solid $grey;
padding: $default-padding 0;
@@ -128,12 +115,6 @@
}
}
- .date,
- .waiting {
- font-size: 12px;
- color: $dark-grey;
- }
-
.date {
float: right;
}
diff --git a/app/assets/stylesheets/avis_sign_up.scss b/app/assets/stylesheets/avis_sign_up.scss
index f202205c9..f998f836e 100644
--- a/app/assets/stylesheets/avis_sign_up.scss
+++ b/app/assets/stylesheets/avis_sign_up.scss
@@ -1,6 +1,3 @@
-@import "typography";
-@import "colors";
-
.avis-sign-up {
.left {
p {
diff --git a/app/assets/stylesheets/buttons.scss b/app/assets/stylesheets/buttons.scss
index 11a331fe5..b777f0b67 100644
--- a/app/assets/stylesheets/buttons.scss
+++ b/app/assets/stylesheets/buttons.scss
@@ -183,6 +183,11 @@
top: 5 * $default-spacer;
cursor: default;
z-index: 10;
+ list-style: none;
+
+ a {
+ background-image: none; // remove DSFR underline
+ }
&.left-aligned {
left: 0;
@@ -256,6 +261,7 @@
a {
color: $dark-grey;
+ background-image: none; // remove DSFR underline
}
// Make child links fill the whole clickable area
@@ -311,6 +317,10 @@
[disabled] {
display: none;
}
+
+ ul {
+ list-style: none;
+ }
}
.link {
diff --git a/app/assets/stylesheets/card_admin.scss b/app/assets/stylesheets/card_admin.scss
index 6ca1e9431..5d09b7cbb 100644
--- a/app/assets/stylesheets/card_admin.scss
+++ b/app/assets/stylesheets/card_admin.scss
@@ -2,7 +2,6 @@
@import "constants";
.card-admin {
- color: $black;
padding-top: 10px;
padding-bottom: 10px;
width: 236px;
@@ -45,6 +44,10 @@
margin: auto auto 0 auto;
}
+ p {
+ margin-bottom: 0;
+ }
+
&:hover {
color: $blue-france-500;
diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss
deleted file mode 100644
index d3c4c3131..000000000
--- a/app/assets/stylesheets/common.scss
+++ /dev/null
@@ -1,86 +0,0 @@
-@import "colors";
-@import "constants";
-@import "mixins";
-@import "placeholders";
-@import "typography";
-
-body,
-input,
-textarea,
-select {
- @extend %new-type;
- font-size: 16px;
- line-height: 1.42857143;
-}
-
-dt {
- margin-bottom: 0.5em;
-}
-
-.page-wrapper {
- position: relative;
- min-height: 100%;
-}
-
-// Mobile Safari doesn't bubble mouse events by default, unless:
-//
-// - the target element of the event is a link or a form field.
-// - the target element, or any of its ancestors up to but not including the , has an explicit event handler set for any of the mouse events. This event handler may be an empty function.
-// - the target element, or any of its ancestors up to and including the document has a cursor: pointer CSS declarations.
-//
-// (See https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html)
-//
-// This is a problem for us, because we bind a lot of click events as
-// `document.on('click', '.my-element', …)` – which requires proper bubbling.
-.ios .page-wrapper {
- cursor: pointer;
-}
-
-h1 {
- font-size: 36px;
- font-weight: bold;
-}
-
-strong {
- font-weight: bold;
-}
-
-a[target="_blank"]::after {
- content: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAQElEQVR42qXKwQkAIAxDUUdxtO6/RBQkQZvSi8I/pL4BoGw/XPkh4XigPmsUgh0626AjRsgxHTkUThsG2T/sIlzdTsp52kSS1wAAAABJRU5ErkJggg==);
- margin: 0 3px 0 5px;
-}
-
-a {
- color: $blue-france-500;
-}
-
-em {
- font-style: italic;
-}
-
-strong {
- font-weight: bold;
-}
-
-sup {
- vertical-align: super;
- font-size: 0.83em;
-}
-
-small {
- font-size: small;
-}
-
-.container {
- @include horizontal-padding($default-padding);
- max-width: $page-width + 2 * $default-padding;
- margin-left: auto;
- margin-right: auto;
-}
-
-.small-container {
- @include horizontal-padding($default-padding);
- max-width: $small-page-width + 2 * $default-padding;
- margin-left: auto;
- margin-right: auto;
-}
diff --git a/app/assets/stylesheets/custom_reset.scss b/app/assets/stylesheets/custom_reset.scss
deleted file mode 100644
index e3486d5c1..000000000
--- a/app/assets/stylesheets/custom_reset.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-@import "colors";
-@import "placeholders";
-
-html,
-body {
- height: 100%;
- background-color: $white;
-}
-
-html {
- box-sizing: border-box;
-}
-
-*,
-*::before,
-*::after {
- box-sizing: inherit;
-}
-
-a {
- @extend %outline;
-
- text-decoration: none;
-}
-
-turbo-events {
- display: none;
-}
diff --git a/app/assets/stylesheets/dossier_annotations_privees.scss b/app/assets/stylesheets/dossier_annotations_privees.scss
index f92b704a0..84273ddf5 100644
--- a/app/assets/stylesheets/dossier_annotations_privees.scss
+++ b/app/assets/stylesheets/dossier_annotations_privees.scss
@@ -1,5 +1,4 @@
@import "colors";
-@import "common";
@import "constants";
#dossier-annotations-privees {
diff --git a/app/assets/stylesheets/dossiers_table.scss b/app/assets/stylesheets/dossiers_table.scss
index 7d836033c..9e879c381 100644
--- a/app/assets/stylesheets/dossiers_table.scss
+++ b/app/assets/stylesheets/dossiers_table.scss
@@ -17,6 +17,10 @@
color: #000000;
}
+ a {
+ background-image: none; // remove DSFR underline
+ }
+
.caret-icon {
vertical-align: top;
margin-top: 9px;
@@ -81,6 +85,10 @@
.follow-col {
width: 200px;
+
+ .fr-btn {
+ margin-bottom: 0;
+ }
}
}
diff --git a/app/assets/stylesheets/dsfr.scss b/app/assets/stylesheets/dsfr.scss
index 00e2f52c2..b96a48cac 100644
--- a/app/assets/stylesheets/dsfr.scss
+++ b/app/assets/stylesheets/dsfr.scss
@@ -1,23 +1,13 @@
@import "colors";
-// Hacky override default text underline of DSFR because we don't want to underline links in our legacy UI.
-// We don't match links having a dsfr class (prefixed by fr-).
-// However DSFR components may contain links without fr- class on them,
-// so these links can be artificially matched by adding any fr-class on them, (like fr-underlined)
-body [href]:not([class^="fr-"]) {
- background-image: none;
-}
-
-// override default transparent background on inputs
+// override default transparent background on inputs & font-size to 16px by default
input,
textarea,
select {
background: $white;
+ font-size: 1em;
}
-#footer a {
- color: #333333;
-}
// with Marianne font, weight of font is less bolder, so bold it up
.button.primary {
font-weight: bold;
@@ -40,3 +30,9 @@ input[type="radio"] {
textarea {
cursor: auto;
}
+
+fieldset {
+ border: none;
+ padding-left: 0;
+ padding-bottom: 0;
+}
diff --git a/app/assets/stylesheets/fonts.scss b/app/assets/stylesheets/fonts.scss
deleted file mode 100644
index 1abf116a6..000000000
--- a/app/assets/stylesheets/fonts.scss
+++ /dev/null
@@ -1,14 +0,0 @@
-@font-face {
- font-family: "Marianne";
- src: asset-url("Marianne-Regular.woff2") format("woff2"),
- asset-url("Marianne-Regular.woff") format("woff");
- font-weight: normal;
- font-style: normal;
-}
-
-@font-face {
- font-family: "Spectrale";
- src: asset-url("Spectral-Regular.ttf") format("ttf");
- font-weight: bold;
- font-style: normal;
-}
diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss
index 47f17d410..fbc28a028 100644
--- a/app/assets/stylesheets/landing.scss
+++ b/app/assets/stylesheets/landing.scss
@@ -3,10 +3,6 @@
@import "mixins";
@import "placeholders";
-.landing {
- background-color: #FFFFFF;
-}
-
.landing-panel {
@include vertical-padding(60px);
}
@@ -32,13 +28,11 @@ $landing-breakpoint: 1040px;
}
.hero-tagline {
- font-size: 40px;
margin-bottom: 0px;
}
.hero-tagline-em {
color: $blue-france-500;
- font-size: 40px;
font-style: normal;
font-weight: bold;
}
@@ -55,24 +49,10 @@ $landing-breakpoint: 1040px;
}
}
-.landing-panel-title {
- width: 100%;
- font-size: 30px;
- font-weight: normal;
- text-align: center;
- margin-bottom: 40px;
- margin-top: 0;
- color: $g700;
-}
-
.features-panel {
background-color: $blue-france-500;
}
-.features-panel-title {
- color: #FFFFFF;
-}
-
.features {
@extend %horizontal-list;
width: 100%;
@@ -186,15 +166,17 @@ $landing-breakpoint: 1040px;
}
.number-value {
- color: $blue-france-500;
- font-weight: bold;
- font-size: 36px;
+ color: var(--text-action-high-blue-france);
+ font-size: 2rem;
+ line-height: 2rem;
+ font-weight: 600;
}
.number-label {
- font-weight: bold;
- font-size: 20px;
- color: $g700;
+ font-weight: 600;
+ font-size: 1.25rem;
+ line-height: 1.5rem;
+ color: var(--text-label-grey);
}
$users-breakpoint: 950px;
@@ -238,17 +220,6 @@ $users-breakpoint: 950px;
height: 180px;
}
-.cta-role-title {
- font-size: 30px;
- font-weight: bold;
- margin-top: 13px;
-}
-
-.cta-role-explanation {
- font-size: 30px;
- margin-bottom: 10px;
-}
-
.cta-panel {
background-color: $blue-france-500;
color: #FFFFFF;
@@ -258,8 +229,7 @@ $users-breakpoint: 950px;
}
}
-.role-panel-wrapper,
-.cta-panel-wrapper {
+.role-panel-wrapper {
width: 100%;
display: flex;
flex-wrap: wrap;
@@ -315,24 +285,6 @@ $users-breakpoint: 950px;
}
}
-.half .cta-panel-title,
-.half .cta-panel-explanation {
- text-align: center;
-}
-
-.role-panel-title {
- font-size: 30px;
- font-weight: bold;
- line-height: 36px;
- margin-bottom: 15px;
- color: $g700;
-}
-
-.role-panel-explanation {
- font-size: 24px;
- margin-bottom: 10px;
-}
-
.role-administrations-image {
text-align: right;
@@ -392,84 +344,3 @@ $cta-panel-button-border-size: 2px;
outline: 3px solid #FFFFFF;
}
}
-
-.cta-panel-button-blue {
- @include cta-panel-button;
- border: $cta-panel-button-border-size solid $blue-france-700;
- color: $blue-france-700;
-
- &:hover {
- color: #FFFFFF;
- background-color: $blue-france-500;
- text-decoration: none;
-
- &:focus {
- color: #FFFFFF;
- }
- }
-
- &:focus {
- color: $blue-france-500;
- text-decoration: none;
- }
-}
-
-@mixin role-button {
- @include horizontal-padding(30px);
- display: inline-block;
- border-radius: 100px;
- font-size: 20px;
- text-align: center;
- cursor: pointer;
- margin-top: 20px;
- line-height: 50px;
-}
-
-.role-panel-button-primary {
- @include role-button;
- background-color: $blue-france-700;
- color: #FFFFFF;
-
- &:hover {
- color: #FFFFFF;
- text-decoration: none;
- background-color: $blue-france-500;
- }
-
- &:focus {
- color: #FFFFFF;
- text-decoration: none;
- }
-}
-
-.role-panel-button-secondary {
- @include role-button;
- border: $cta-panel-button-border-size solid $blue-france-700;
- line-height: 50px - 2 * $cta-panel-button-border-size;
- color: $blue-france-700;
- margin-left: 10px;
-
- @media (max-width: $users-breakpoint) {
- margin-left: 0px;
- }
-
- &:hover {
- color: $blue-france-500;
- border: $cta-panel-button-border-size solid $blue-france-500;
- text-decoration: none;
- }
-
- &:focus {
- color: $light-blue;
- text-decoration: none;
- }
-}
-
-.half {
- width: 45%;
- float: left;
-}
-
-.first-half {
- margin-right: 10%;
-}
diff --git a/app/assets/stylesheets/layouts.scss b/app/assets/stylesheets/layouts.scss
index c214c1cc2..dee448660 100644
--- a/app/assets/stylesheets/layouts.scss
+++ b/app/assets/stylesheets/layouts.scss
@@ -1,6 +1,6 @@
@import "colors";
-@import "common";
@import "constants";
+@import "placeholders";
.two-columns {
background-color: $white;
@@ -9,8 +9,8 @@
background: linear-gradient(to right, #FFFFFF 0%, #FFFFFF 50%, $light-grey 50%, $light-grey 100%);
}
- .columns-container {
- @extend .container;
+ .columns-container { // TODO: https://github.com/betagouv/demarches-simplifiees.fr/issues/7882, once implemented, we won't need container anymore
+ @extend %container;
display: flex;
flex-direction: column;
justify-content: center;
diff --git a/app/assets/stylesheets/merci.scss b/app/assets/stylesheets/merci.scss
index b40f676a2..b73c2d8e6 100644
--- a/app/assets/stylesheets/merci.scss
+++ b/app/assets/stylesheets/merci.scss
@@ -1,5 +1,3 @@
-@import "colors";
-@import "common";
@import "constants";
.merci .monavis {
diff --git a/app/assets/stylesheets/message.scss b/app/assets/stylesheets/message.scss
index a11507ede..488e3f516 100644
--- a/app/assets/stylesheets/message.scss
+++ b/app/assets/stylesheets/message.scss
@@ -25,12 +25,6 @@
font-weight: bold;
}
- .guest,
- .date {
- font-size: 12px;
- color: $dark-grey;
- }
-
.date {
float: right;
}
diff --git a/app/assets/stylesheets/new_footer.scss b/app/assets/stylesheets/new_footer.scss
index 8a036f332..0754ac125 100644
--- a/app/assets/stylesheets/new_footer.scss
+++ b/app/assets/stylesheets/new_footer.scss
@@ -1,7 +1,4 @@
-@import "colors";
-@import "constants";
@import "mixins";
-@import "placeholders";
.landing-footer {
@include vertical-padding(72px);
@@ -12,50 +9,6 @@
line-height: 24px;
}
-.footer-columns {
- @extend %horizontal-list;
- justify-content: flex-start;
- margin: 0 -15px;
-}
-
-.footer-column {
- @extend %horizontal-list-item;
- font-size: 14px;
- vertical-align: top;
- flex: 0 0 33.333333%;
- min-width: 280px;
- margin-bottom: 30px;
-
- @media (max-width: 550px) {
- width: 100%;
- }
-}
-
-.footer-logos,
-.footer-links {
- list-style-type: none;
- padding: 0;
- margin: 0;
-}
-
-.footer-header {
- font-size: 14px;
- font-weight: bold;
- margin-bottom: 10px;
-}
-
-.footer-link {
- margin-bottom: 14px;
-
- &:last-of-type {
- margin-bottom: 0;
- }
-}
-
-.footer-text {
- margin-bottom: 14px;
-}
-
.footer-logo:hover {
opacity: 0.8;
}
@@ -67,56 +20,3 @@
height: 25px;
margin-top: 14px;
}
-
-.footer-logo-france {
- @include ie-compatible-background-image("republique-francaise-logo.svg");
-
- width: 105px;
- height: 90px;
-}
-
-.footer-link a,
-.footer-text a {
- color: $black;
- text-decoration: none;
-
- &:hover,
- &:focus {
- color: $blue-france-700;
- text-decoration: none;
- }
-}
-
-.footer-bottom-line {
- text-align: center;
- font-size: small;
-
- @media (max-width: 550px) {
- text-align: left;
- }
-}
-
-.footer-row {
- margin-bottom: 30px;
-
- // In this case, the bottom margin is defined directly on each individual column
- &.footer-columns {
- margin-bottom: 0;
- }
-}
-
-.footer-site-links {
- li {
- display: inline;
-
-
- &::before {
- content: "-";
- margin: $default-spacer;
- }
-
- &:first-child::before {
- content: none;
- }
- }
-}
diff --git a/app/assets/stylesheets/new_header.scss b/app/assets/stylesheets/new_header.scss
index d8ce97ae2..176b1432e 100644
--- a/app/assets/stylesheets/new_header.scss
+++ b/app/assets/stylesheets/new_header.scss
@@ -1,17 +1,3 @@
-@import "colors";
-@import "common";
-@import "constants";
-@import "mixins";
-@import "utils";
-
-$header-landing-breakpoint: 1040px;
-$header-mobile-breakpoint: 550px;
-
-// FIXME: Rename when the header is generalized
-.new-header {
- background-color: #FFFFFF;
-}
-
// No drop shadow when a notice is shown.
.fr-header.fr-header__with-notice-info {
&,
@@ -19,233 +5,3 @@ $header-mobile-breakpoint: 550px;
filter: none;
}
}
-
-.header-inner-content {
- @extend .container;
- display: flex;
- justify-content: space-between;
- min-height: 72px;
-}
-
-.header-logo {
- display: flex;
- flex-wrap: wrap;
- align-items: center;
- color: $blue-france-500;
-
- img {
- margin-right: 10px;
- }
-
- .site-title {
- font-size: 24px;
- font-weight: bold;
-
- &.small {
- @media (min-width: $header-mobile-breakpoint) {
- display: none;
- }
- }
-
- &.big {
- @media (max-width: $header-mobile-breakpoint) {
- display: none;
- }
- }
- }
-}
-
-.header-tabs {
- li {
- @include horizontal-padding($default-padding);
- display: inline-block;
- }
-
- .tab-link {
- display: inline-block;
- height: 72px;
- line-height: 72px;
- font-size: 18px;
- color: $black;
-
- &.active,
- &:hover {
- color: $blue-france-500;
- border-bottom: 2px solid $blue-france-500;
-
- &.contact-link {
- position: relative;
- border-bottom: none;
-
- .contact-details {
- display: block;
- }
- }
- }
- }
-}
-
-.contact-details {
- display: none;
- position: absolute;
- left: -165px;
- background: #FFFFFF;
- border: 2px solid $blue-france-500;
- border-radius: 5px;
- padding: 15px;
- width: 400px;
- color: $black;
- z-index: 100;
- font-size: initial;
- line-height: 1.6;
-
- &::after,
- &::before {
- bottom: 100%;
- left: 50%;
- border: solid transparent;
- content: " ";
- height: 0;
- width: 0;
- position: absolute;
- pointer-events: none;
- }
-
- &::after {
- border-color: rgba(255, 255, 255, 0);
- border-bottom-color: #FFFFFF;
- border-width: 15px;
- margin-left: -15px;
- }
-
- &::before {
- border-color: rgba(255, 255, 255, 0);
- border-bottom-color: $blue-france-500;
- border-width: 18px;
- margin-left: -18px;
- }
-
- ul {
- list-style-type: disc;
- }
-}
-
-.header-right-content {
- display: flex;
- align-items: center;
-
- > li {
- @include horizontal-padding(8px);
-
- &:last-child {
- padding-right: 0;
- }
- }
-}
-
-.header-search {
- position: relative;
-
- .form input[type=text] {
- padding: 9px;
- padding-right: 42px;
- float: right;
- max-width: 300px;
- min-width: 90px;
- margin: 0;
- }
-
- label.hidden {
- @extend .hidden;
- }
-
- button {
- @extend %outline;
-
- padding: 9px;
- border: none;
- background: none;
- cursor: pointer;
- position: absolute;
- right: 0;
-
- &:hover {
- opacity: 0.8;
- }
- }
-}
-
-.header-menu-opener {
- position: relative;
-
- img {
- cursor: pointer;
-
- &:hover {
- opacity: 0.8;
- }
- }
-}
-
-.header-menu-button {
- border: none;
- padding: 0;
- line-height: 14px;
- vertical-align: middle;
-
- &:hover {
- background: none;
- }
-
-}
-
-.header-menu {
- display: none;
- position: absolute;
- right: 0;
- top: 34px;
- font-size: 14px;
- background: #FFFFFF;
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
- border: 1px solid $border-grey;
- min-width: 270px;
- max-width: 340px;
- z-index: 20;
-
- &.open {
- display: block;
- }
-
- li {
- border-bottom: 1px solid $border-grey;
-
- &:last-child {
- border-bottom: none;
- }
-
- .menu-item {
- align-items: center;
- padding: 14px;
- color: $dark-grey;
- overflow: hidden;
- text-overflow: ellipsis;
-
- img {
- margin-right: 14px;
- }
- }
-
- .menu-link {
- display: flex;
- color: $black;
-
- &.active {
- font-weight: bold;
- }
-
- &:hover {
- background: $light-grey;
- }
- }
- }
-}
diff --git a/app/assets/stylesheets/print.scss b/app/assets/stylesheets/print.scss
index b52db86d1..4c3901bdb 100644
--- a/app/assets/stylesheets/print.scss
+++ b/app/assets/stylesheets/print.scss
@@ -1,5 +1,4 @@
@import "colors";
-@import "fonts";
@media print {
.new-header,
diff --git a/app/assets/stylesheets/procedure_admin.scss b/app/assets/stylesheets/procedure_admin.scss
index 0ca1fb781..40f6ea0dc 100644
--- a/app/assets/stylesheets/procedure_admin.scss
+++ b/app/assets/stylesheets/procedure_admin.scss
@@ -1,7 +1,10 @@
-
.procedure-grid {
display: flex;
flex-wrap: wrap;
+
+ > a { // TODO, re-use DSFR https://github.com/betagouv/demarches-simplifiees.fr/issues/7884
+ background-image: none; // remove DSFR underline
+ }
}
.procedure-admin-container {
@@ -12,6 +15,10 @@
.button {
margin-right: 10px;
}
+
+ a {
+ background-image: none; // remove DSFR underline
+ }
}
.procedure-admin-listing-container {
diff --git a/app/assets/stylesheets/procedure_champs_editor.scss b/app/assets/stylesheets/procedure_champs_editor.scss
index 8c26e2c40..b8d524eff 100644
--- a/app/assets/stylesheets/procedure_champs_editor.scss
+++ b/app/assets/stylesheets/procedure_champs_editor.scss
@@ -158,9 +158,6 @@
font-size: 14px;
a {
- text-decoration: underline;
- text-decoration-style: dotted;
-
// Remove the icon indicating an external link (for less visual noise)
&[target="_blank"]::after {
display: none;
diff --git a/app/assets/stylesheets/procedure_list.scss b/app/assets/stylesheets/procedure_list.scss
index cc7f09898..fc7a50e93 100644
--- a/app/assets/stylesheets/procedure_list.scss
+++ b/app/assets/stylesheets/procedure_list.scss
@@ -4,25 +4,11 @@
.procedure-list {
.procedure-item {
- border-bottom: 1px solid $border-grey;
+ background-color: rgba(0, 0, 0, 0.02);
+ }
- &:last-child {
- border-bottom: none;
- }
-
- a {
- @include vertical-padding(24px);
- color: $black;
- width: 100%;
-
- &:hover {
- background-color: $light-grey;
-
- .procedure-title {
- text-decoration: underline;
- }
- }
- }
+ .procedure-logo-link {
+ background-image: none;
}
.procedure-logo {
@@ -34,30 +20,29 @@
background-position: 95% 50%;
}
- .procedure-title {
- min-height: 40px;
- font-size: 20px;
- margin-bottom: 16px;
- }
-
.procedure-status {
margin-left: auto;
}
.procedure-stats {
+ list-style-type: none;
+ padding-inline-start: 0;
+
li {
min-height: 36px;
- border-left: 1px solid $border-grey;
width: 90px;
position: relative;
+ border-left: 1px solid $border-grey;
+
+ &:first-child {
+ border-left: none;
+ }
+
&:hover {
background-color: rgba(0, 0, 0, 0.05);
}
- &:last-child {
- border-right: 1px solid $border-grey;
- }
.stats-number,
.stats-legend {
diff --git a/app/assets/stylesheets/procedure_show.scss b/app/assets/stylesheets/procedure_show.scss
index 660a77d14..dda16de7e 100644
--- a/app/assets/stylesheets/procedure_show.scss
+++ b/app/assets/stylesheets/procedure_show.scss
@@ -1,5 +1,4 @@
@import "colors";
-@import "common";
@import "constants";
.procedure-header {
diff --git a/app/assets/stylesheets/reset.scss b/app/assets/stylesheets/reset.scss
deleted file mode 100644
index 02fb6ffef..000000000
--- a/app/assets/stylesheets/reset.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- http://meyerweb.com/eric/tools/css/reset/
- v2.0 | 20110126
- License: none (public domain)
-*/
-
-html, body, div, span, applet, object, iframe,
-h1, h2, h3, h4, h5, h6, p, blockquote, pre,
-a, abbr, acronym, address, big, cite, code,
-del, dfn, em, img, ins, kbd, q, s, samp,
-small, strike, strong, sub, sup, tt, var,
-b, u, i, center,
-dl, dt, dd, ol, ul, li,
-fieldset, form, label, legend,
-table, caption, tbody, tfoot, thead, tr, th, td,
-article, aside, canvas, details, embed,
-figure, figcaption, footer, header, hgroup,
-menu, nav, output, ruby, section, summary,
-time, mark, audio, video {
- margin: 0;
- padding: 0;
- border: 0;
- font-size: 100%;
- font: inherit;
- vertical-align: baseline;
-}
-/* HTML5 display-role reset for older browsers */
-article, aside, details, figcaption, figure,
-footer, header, hgroup, menu, nav, section {
- display: block;
-}
-body {
- line-height: 1;
-}
-ol, ul {
- list-style: none;
-}
-blockquote, q {
- quotes: none;
-}
-blockquote:before, blockquote:after,
-q:before, q:after {
- content: '';
- content: none;
-}
-table {
- border-spacing: 0;
-}
diff --git a/app/assets/stylesheets/sub_header.scss b/app/assets/stylesheets/sub_header.scss
index a6602dc45..2bc9abb9d 100644
--- a/app/assets/stylesheets/sub_header.scss
+++ b/app/assets/stylesheets/sub_header.scss
@@ -10,4 +10,13 @@
.container {
margin-bottom: -1px;
}
+
+ .breadcrumbs {
+ list-style: none;
+ padding-inline-start: 0;
+
+ a:not(:hover) {
+ background-image: none; // remove DSFR underline
+ }
+ }
}
diff --git a/app/assets/stylesheets/_tabs.scss b/app/assets/stylesheets/tabs.scss
similarity index 92%
rename from app/assets/stylesheets/_tabs.scss
rename to app/assets/stylesheets/tabs.scss
index 37dd207ff..e47b90680 100644
--- a/app/assets/stylesheets/_tabs.scss
+++ b/app/assets/stylesheets/tabs.scss
@@ -2,6 +2,10 @@
@import "mixins";
.tabs {
+ ul {
+ margin-bottom: 0;
+ }
+
li {
display: inline-block;
line-height: 36px;
@@ -16,6 +20,7 @@
padding-left: 20px;
padding-right: 20px;
color: $black;
+ background-image: none;
}
&.active {
diff --git a/app/components/attachment/edit_component/edit_component.html.haml b/app/components/attachment/edit_component/edit_component.html.haml
index 9ef7028db..42520586d 100644
--- a/app/components/attachment/edit_component/edit_component.html.haml
+++ b/app/components/attachment/edit_component/edit_component.html.haml
@@ -2,10 +2,12 @@
- if template&.attached?
%p.mb-1
Veuillez télécharger, remplir et joindre
- = link_to('le modèle suivant', url_for(template), target: '_blank', rel: 'noopener')
+ = link_to(url_for(template), download: "", class: "fr-link fr-link--icon-right fr-icon-download-line") do
+ le modèle suivant
- if helpers.administrateur_signed_in?
- %em.fr-text-mention--grey.fr-text--xs.visible-on-previous-hover
+ %span.ml-2.fr-text--xs.fr-text-mention--grey.visible-on-previous-hover
+ %span.fr-text-action-high--blue-france.fr-icon-questionnaire-line{ "aria-hidden": "true" }
= t('shared.ephemeral_link')
- if persisted?
diff --git a/app/components/dossiers/message_component/message_component.html.haml b/app/components/dossiers/message_component/message_component.html.haml
index 1e75d85b4..980ef7398 100644
--- a/app/components/dossiers/message_component/message_component.html.haml
+++ b/app/components/dossiers/message_component/message_component.html.haml
@@ -1,12 +1,12 @@
= image_tag(icon_path, class: 'person-icon', alt: '')
.width-100
- %h2
+ %h2.fr-h6
%span.mail
= commentaire_issuer
- if commentaire_from_guest?
- %span.guest= t('.guest')
- %span.date{ class: highlight_if_unseen_class, data: scroll_to_target }
+ %span.fr-text--xs.fr-text-mention--grey.font-weight-normal= t('.guest')
+ %span.date{ class: ["fr-text--xs", "fr-text-mention--grey", "font-weight-normal", highlight_if_unseen_class], data: scroll_to_target }
= commentaire_date
.rich-text= commentaire_body
diff --git a/app/components/procedure/search_component/search_component.html.haml b/app/components/procedure/search_component/search_component.html.haml
index fde14bd1a..323a7665f 100644
--- a/app/components/procedure/search_component/search_component.html.haml
+++ b/app/components/procedure/search_component/search_component.html.haml
@@ -7,6 +7,6 @@
= text_field_tag :query, params[:query], required: true, placeholder: 'politique de la ville', minlength: "3"
- = submit_tag 'Rechercher', class: 'button primary'
+ = submit_tag 'Rechercher', class: 'fr-btn'
= render Procedure::ResultsComponent.new(grouped_procedures: @grouped_procedures)
diff --git a/app/controllers/administrateurs/groupe_instructeurs_controller.rb b/app/controllers/administrateurs/groupe_instructeurs_controller.rb
index e6a36d2c8..4cb339df8 100644
--- a/app/controllers/administrateurs/groupe_instructeurs_controller.rb
+++ b/app/controllers/administrateurs/groupe_instructeurs_controller.rb
@@ -191,10 +191,12 @@ module Administrateurs
end
def update_routing_criteria_name
- procedure.update!(routing_criteria_name: routing_criteria_name)
-
- redirect_to admin_procedure_groupe_instructeurs_path(procedure),
- notice: "Le libellé est maintenant « #{procedure.routing_criteria_name} »."
+ if procedure.update(routing_criteria_name: routing_criteria_name)
+ flash[:notice] = "Le libellé est maintenant « #{procedure.routing_criteria_name} »."
+ else
+ flash[:alert] = "Le libellé du routage doit être rempli."
+ end
+ redirect_to admin_procedure_groupe_instructeurs_path(procedure)
end
def update_routing_enabled
diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb
index d260b1deb..854a72233 100644
--- a/app/controllers/users/dossiers_controller.rb
+++ b/app/controllers/users/dossiers_controller.rb
@@ -181,7 +181,14 @@ module Users
respond_to do |format|
format.html { render :brouillon }
- format.turbo_stream { render layout: false }
+ format.turbo_stream do
+ @to_shows, @to_hides = @dossier.champs
+ .filter(&:conditional?)
+ .partition(&:visible?)
+ .map { |champs| champs_to_one_selector(champs) }
+
+ render(:update, layout: false)
+ end
end
end
@@ -205,7 +212,14 @@ module Users
respond_to do |format|
format.html { render :modifier }
- format.turbo_stream { render layout: false }
+ format.turbo_stream do
+ @to_shows, @to_hides = @dossier.champs
+ .filter(&:conditional?)
+ .partition(&:visible?)
+ .map { |champs| champs_to_one_selector(champs) }
+
+ render layout: false
+ end
end
end
@@ -392,7 +406,7 @@ module Users
end
def dossier_with_champs
- dossier_scope.with_champs.find(params[:id])
+ DossierPreloader.load_one(dossier)
end
def should_change_groupe_instructeur?
@@ -521,5 +535,12 @@ module Users
# rubocop:enable Lint/BooleanSymbol
end
end
+
+ def champs_to_one_selector(champs)
+ champs
+ .map(&:input_group_id)
+ .map { |id| "##{id}" }
+ .join(',')
+ end
end
end
diff --git a/app/dashboards/procedure_dashboard.rb b/app/dashboards/procedure_dashboard.rb
index 544fbe054..79a3451d6 100644
--- a/app/dashboards/procedure_dashboard.rb
+++ b/app/dashboards/procedure_dashboard.rb
@@ -19,7 +19,6 @@ class ProcedureDashboard < Administrate::BaseDashboard
zone: Field::BelongsTo,
lien_site_web: Field::String, # TODO: use Field::Url when administrate-v0.12 will be released
organisation: Field::String,
- direction: Field::String,
created_at: Field::DateTime,
updated_at: Field::DateTime,
for_individual: Field::Boolean,
@@ -67,7 +66,6 @@ class ProcedureDashboard < Administrate::BaseDashboard
:description,
:lien_site_web,
:organisation,
- :direction,
:zone,
:service,
:created_at,
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index c45b81052..4d0b807f1 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -128,4 +128,8 @@ module ApplicationHelper
def external_link_attributes
{ target: "_blank", rel: "noopener noreferrer" }
end
+
+ def download_details(attachment)
+ "#{attachment.filename.extension.upcase} – #{number_to_human_size(attachment.byte_size)}"
+ end
end
diff --git a/app/helpers/procedure_helper.rb b/app/helpers/procedure_helper.rb
index 2fc0a781e..7184f39e6 100644
--- a/app/helpers/procedure_helper.rb
+++ b/app/helpers/procedure_helper.rb
@@ -8,11 +8,17 @@ module ProcedureHelper
end
def procedure_libelle(procedure)
- parts = procedure.brouillon? ? [tag.span(t('helpers.procedure.testing_procedure'), class: 'badge')] : []
+ parts = procedure.brouillon? ? [procedure_badge(procedure)] : []
parts << procedure.libelle
safe_join(parts, ' ')
end
+ def procedure_badge(procedure)
+ return nil unless procedure.brouillon?
+
+ tag.span(t('helpers.procedure.testing_procedure'), class: 'fr-badge')
+ end
+
def procedure_publish_label(procedure, key)
# i18n-tasks-use t('modal.publish.body.publish')
# i18n-tasks-use t('modal.publish.body.reopen')
diff --git a/app/javascript/components/ComboAdresseSearch.tsx b/app/javascript/components/ComboAdresseSearch.tsx
index b9c91afc3..f6a34a322 100644
--- a/app/javascript/components/ComboAdresseSearch.tsx
+++ b/app/javascript/components/ComboAdresseSearch.tsx
@@ -25,6 +25,7 @@ export default function ComboAdresseSearch({
minimumInputLength={2}
transformResult={({ properties: { label } }) => [label, label, label]}
transformResults={(_, result) => (result as RawResult).features}
+ debounceDelay={300}
/>
);
diff --git a/app/javascript/components/ComboSearch.tsx b/app/javascript/components/ComboSearch.tsx
index 72c5816b4..fe4687da1 100644
--- a/app/javascript/components/ComboSearch.tsx
+++ b/app/javascript/components/ComboSearch.tsx
@@ -1,9 +1,5 @@
-import React, {
- useState,
- useRef,
- useDeferredValue,
- ChangeEventHandler
-} from 'react';
+import React, { useState, useRef, ChangeEventHandler } from 'react';
+import { useDebounce } from 'use-debounce';
import { useQuery } from 'react-query';
import {
Combobox,
@@ -35,6 +31,7 @@ export type ComboSearchProps = {
describedby?: string;
className?: string;
placeholder?: string;
+ debounceDelay?: number;
};
type QueryKey = readonly [
@@ -54,6 +51,7 @@ function ComboSearch({
transformResults = (_, results) => results as Result[],
id,
describedby,
+ debounceDelay = 0,
...props
}: ComboSearchProps) {
invariant(id || onChange, 'ComboSearch: `id` or `onChange` are required');
@@ -63,7 +61,7 @@ function ComboSearch({
const [, setExternalId] = useHiddenField(group, 'external_id');
const initialValue = externalValue ? externalValue : controlledValue;
const [searchTerm, setSearchTerm] = useState('');
- const debouncedSearchTerm = useDeferredValue(searchTerm);
+ const [debouncedSearchTerm] = useDebounce(searchTerm, debounceDelay);
const [value, setValue] = useState(initialValue);
const resultsMap = useRef<
Record
diff --git a/app/javascript/entrypoints/main.css b/app/javascript/entrypoints/main.css
index d9bd726bf..94e208363 100644
--- a/app/javascript/entrypoints/main.css
+++ b/app/javascript/entrypoints/main.css
@@ -12,6 +12,7 @@
@import '@gouvfr/dsfr/dist/component/breadcrumb/breadcrumb.css';
@import '@gouvfr/dsfr/dist/component/callout/callout.css';
@import '@gouvfr/dsfr/dist/component/connect/connect.css';
+@import '@gouvfr/dsfr/dist/component/download/download.css';
@import '@gouvfr/dsfr/dist/component/highlight/highlight.css';
@import '@gouvfr/dsfr/dist/component/input/input.css';
@import '@gouvfr/dsfr/dist/component/checkbox/checkbox.css';
diff --git a/app/models/champs/iban_champ.rb b/app/models/champs/iban_champ.rb
index df94eac66..79fb21905 100644
--- a/app/models/champs/iban_champ.rb
+++ b/app/models/champs/iban_champ.rb
@@ -20,5 +20,20 @@
# type_de_champ_id :integer
#
class Champs::IbanChamp < Champ
- validates_with IbanValidator
+ validates_with IbanValidator, if: -> { validation_context != :brouillon }
+ after_validation :format_iban
+
+ def for_api
+ to_s.gsub(/\s+/, '')
+ end
+
+ def for_api_v2
+ for_api
+ end
+
+ private
+
+ def format_iban
+ self.value = value&.gsub(/\s+/, '')&.gsub(/(.{4})/, '\0 ')
+ end
end
diff --git a/app/models/dossier.rb b/app/models/dossier.rb
index 55c3574a0..348e0cd6c 100644
--- a/app/models/dossier.rb
+++ b/app/models/dossier.rb
@@ -241,19 +241,8 @@ class Dossier < ApplicationRecord
.joins(:traitements)
.where(traitements: { processed_at: date.beginning_of_month..date.end_of_month })
end
- scope :downloadable_sorted, -> {
- state_not_brouillon
- .visible_by_administration
- .includes(
- :user,
- :individual,
- :followers_instructeurs,
- :traitement,
- :groupe_instructeur,
- :etablissement,
- procedure: [:groupe_instructeurs],
- avis: [:claimant, :expert]
- ).order(depose_at: 'asc')
+ scope :ordered_for_export, -> {
+ order(depose_at: 'asc')
}
scope :en_cours, -> { not_archived.state_en_construction_ou_instruction }
scope :without_followers, -> { left_outer_joins(:follows).where(follows: { id: nil }) }
@@ -434,7 +423,16 @@ class Dossier < ApplicationRecord
end
def self.downloadable_sorted_batch
- DossierPreloader.new(downloadable_sorted).in_batches
+ DossierPreloader.new(includes(
+ :user,
+ :individual,
+ :followers_instructeurs,
+ :traitement,
+ :groupe_instructeur,
+ :etablissement,
+ procedure: [:groupe_instructeurs],
+ avis: [:claimant, :expert]
+ ).ordered_for_export).in_batches
end
def user_deleted?
diff --git a/app/models/dossier_preloader.rb b/app/models/dossier_preloader.rb
index e643db873..8e1d0f113 100644
--- a/app/models/dossier_preloader.rb
+++ b/app/models/dossier_preloader.rb
@@ -11,12 +11,16 @@ class DossierPreloader
dossiers
end
- def all
+ def all(pj_template: false)
dossiers = @dossiers.to_a
- load_dossiers(dossiers)
+ load_dossiers(dossiers, pj_template:)
dossiers
end
+ def self.load_one(dossier)
+ DossierPreloader.new([dossier]).all(pj_template: true).first
+ end
+
private
# returns: { revision_id : { type_de_champ_id : position } }
@@ -30,9 +34,17 @@ class DossierPreloader
end
end
- def load_dossiers(dossiers)
+ def load_dossiers(dossiers, pj_template: false)
+ to_include = [piece_justificative_file_attachment: :blob]
+
+ if pj_template
+ to_include << { type_de_champ: { piece_justificative_template_attachment: :blob } }
+ else
+ to_include << :type_de_champ
+ end
+
all_champs = Champ
- .includes(:type_de_champ, piece_justificative_file_attachment: :blob)
+ .includes(to_include)
.where(dossier_id: dossiers)
.to_a
@@ -80,6 +92,10 @@ class DossierPreloader
def load_champs(parent, name, champs, dossier, children_by_parent)
champs.each do |champ|
champ.association(:dossier).target = dossier
+
+ if parent.is_a?(Champ)
+ champ.association(:parent).target = parent
+ end
end
parent.association(name).target = champs.sort_by do |champ|
@@ -92,7 +108,6 @@ class DossierPreloader
parent_champ.association(:dossier).target = dossier
load_champs(parent_champ, :champs, champs, dossier, children_by_parent)
- parent_champ.association(:champs).set_inverse_instance(parent_champ)
end
end
end
diff --git a/app/models/procedure.rb b/app/models/procedure.rb
index c75d225ee..98d47d10b 100644
--- a/app/models/procedure.rb
+++ b/app/models/procedure.rb
@@ -62,7 +62,7 @@ class Procedure < ApplicationRecord
include Discard::Model
self.discard_column = :hidden_at
- self.ignored_columns = [:durees_conservation_required, :cerfa_flag, :test_started_at]
+ self.ignored_columns = [:direction, :durees_conservation_required, :cerfa_flag, :test_started_at]
default_scope -> { kept }
@@ -323,6 +323,7 @@ class Procedure < ApplicationRecord
validates :api_entreprise_token, jwt_token: true, allow_blank: true
validates :api_particulier_token, format: { with: /\A[A-Za-z0-9\-_=.]{15,}\z/ }, allow_blank: true
+ validates :routing_criteria_name, presence: true, allow_blank: false
before_save :update_juridique_required
after_initialize :ensure_path_exists
@@ -803,6 +804,7 @@ class Procedure < ApplicationRecord
if published_revision.present? && draft_changed?
transaction do
reset!
+ draft_revision.types_de_champ.filter(&:only_present_on_draft?).each(&:destroy)
draft_revision.update(attestation_template: nil, dossier_submitted_message: nil)
draft_revision.destroy
update!(draft_revision: create_new_revision(published_revision))
diff --git a/app/serializers/procedure_serializer.rb b/app/serializers/procedure_serializer.rb
index 915dd0d23..3ec46cb0d 100644
--- a/app/serializers/procedure_serializer.rb
+++ b/app/serializers/procedure_serializer.rb
@@ -6,12 +6,12 @@ class ProcedureSerializer < ActiveModel::Serializer
attributes :id,
:description,
:organisation,
- :direction,
:archived_at,
:geographic_information,
:total_dossier,
:link,
- :state
+ :state,
+ :direction
has_one :geographic_information, serializer: ModuleAPICartoSerializer
has_many :types_de_champ, serializer: TypeDeChampSerializer
@@ -19,6 +19,10 @@ class ProcedureSerializer < ActiveModel::Serializer
has_many :types_de_piece_justificative
belongs_to :service, serializer: ServiceSerializer
+ def direction
+ ""
+ end
+
def archived_at
object.closed_at&.in_time_zone('UTC')
end
diff --git a/app/views/administrateurs/_breadcrumbs.html.haml b/app/views/administrateurs/_breadcrumbs.html.haml
index a31bbd9dc..80c59b2c5 100644
--- a/app/views/administrateurs/_breadcrumbs.html.haml
+++ b/app/views/administrateurs/_breadcrumbs.html.haml
@@ -17,8 +17,8 @@
- if defined?(preview) && preview
.mb-2
- = link_to t('preview', scope: [:layouts, :breadcrumb]), apercu_admin_procedure_path(@procedure), target: "_blank", rel: "noopener", class: 'button'
- = link_to t('continue', scope: [:layouts, :breadcrumb]), admin_procedure_path(@procedure), title: t('continue_title', scope: [:layouts, :breadcrumb]), class: 'button accepted'
+ = link_to t('preview', scope: [:layouts, :breadcrumb]), apercu_admin_procedure_path(@procedure), target: "_blank", rel: "noopener", class: 'fr-btn fr-btn--secondary'
+ = link_to t('continue', scope: [:layouts, :breadcrumb]), admin_procedure_path(@procedure), title: t('continue_title', scope: [:layouts, :breadcrumb]), class: 'fr-btn fr-ml-2w fr-btn--icon-right fr-icon-arrow-right-fill'
- if defined?(metadatas)
.metadatas.pb-3
diff --git a/app/views/administrateurs/attestation_templates/edit.html.haml b/app/views/administrateurs/attestation_templates/edit.html.haml
index 51369375e..e70e0168a 100644
--- a/app/views/administrateurs/attestation_templates/edit.html.haml
+++ b/app/views/administrateurs/attestation_templates/edit.html.haml
@@ -36,8 +36,8 @@
%span.toggle-switch-label.off Attestation désactivée
.actions-right
- = link_to 'Annuler', edit_admin_procedure_attestation_template_path(id: @procedure), class: 'button', data: { confirm: 'Êtes-vous sûr de vouloir annuler les modifications effectuées ?'}
- = f.button 'Enregistrer', class: 'button primary send'
+ = link_to 'Annuler', edit_admin_procedure_attestation_template_path(id: @procedure), class: 'fr-btn fr-btn--secondary fr-mr-2w', data: { confirm: 'Êtes-vous sûr de vouloir annuler les modifications effectuées ?'}
+ = f.button 'Enregistrer', class: 'fr-btn'
.procedure-form__column--preview
.procedure-form__preview.sticky--top
diff --git a/app/views/administrateurs/groupe_instructeurs/_instructeurs.html.haml b/app/views/administrateurs/groupe_instructeurs/_instructeurs.html.haml
index ccd414e93..c9a42f9ef 100644
--- a/app/views/administrateurs/groupe_instructeurs/_instructeurs.html.haml
+++ b/app/views/administrateurs/groupe_instructeurs/_instructeurs.html.haml
@@ -18,7 +18,7 @@
label: 'Emails',
acceptNewValues: true)
- = f.submit 'Affecter', class: 'button primary send', disabled: disabled_as_super_admin
+ = f.submit 'Affecter', class: 'fr-btn', disabled: disabled_as_super_admin
%table.table.mt-2
%thead
@@ -32,11 +32,11 @@
#{instructeur.email}
- confirmation_message = procedure.routee? ? "Êtes-vous sûr de vouloir retirer l’instructeur « #{instructeur.email} » du groupe « #{groupe_instructeur.label} » ?" : "Êtes-vous sûr de vouloir retirer l’instructeur « #{instructeur.email} » de la démarche ?"
- %td.actions= button_to 'retirer',
+ %td.actions= button_to 'Retirer',
{ action: :remove_instructeur, id: groupe_instructeur.id },
{ method: :delete,
data: { confirm: confirmation_message },
params: { instructeur: { id: instructeur.id }},
- class: 'button' }
+ class: 'fr-btn fr-btn--secondary' }
= paginate instructeurs
diff --git a/app/views/administrateurs/groupe_instructeurs/_routing.html.haml b/app/views/administrateurs/groupe_instructeurs/_routing.html.haml
index 75128b56c..471f580d0 100644
--- a/app/views/administrateurs/groupe_instructeurs/_routing.html.haml
+++ b/app/views/administrateurs/groupe_instructeurs/_routing.html.haml
@@ -6,9 +6,9 @@
- if procedure.routee?
- if procedure.routing_enabled? && procedure.groupe_instructeurs.size == 1
- = link_to t('.button.routing_disable'), update_routing_enabled_admin_procedure_groupe_instructeurs_path(procedure, routing: :disable), class: 'button primary mt-1', method: 'patch'
+ = link_to t('.button.routing_disable'), update_routing_enabled_admin_procedure_groupe_instructeurs_path(procedure, routing: :disable), class: 'fr-btn', method: 'patch'
- else
- = link_to t('.button.routing_enable'), update_routing_enabled_admin_procedure_groupe_instructeurs_path(procedure, routing: :enable), class: 'button primary mt-1', method: 'patch'
+ = link_to t('.button.routing_enable'), update_routing_enabled_admin_procedure_groupe_instructeurs_path(procedure, routing: :enable), class: 'fr-btn', method: 'patch'
.card
%h2.card-title L‘autogestion des instructeurs
%p.notice= t('.self_managment_notice_html')
diff --git a/app/views/administrateurs/mail_templates/index.html.haml b/app/views/administrateurs/mail_templates/index.html.haml
index fa3095faf..88412f14d 100644
--- a/app/views/administrateurs/mail_templates/index.html.haml
+++ b/app/views/administrateurs/mail_templates/index.html.haml
@@ -15,4 +15,4 @@
%span.badge.baseline modifié le #{mail_template.updated_at.strftime('%d-%m-%Y')}
%div
- = link_to 'Modifier', edit_admin_procedure_mail_template_path(@procedure, mail_template.class.const_get(:SLUG)), class: 'button'
+ = link_to 'Modifier', edit_admin_procedure_mail_template_path(@procedure, mail_template.class.const_get(:SLUG)), class: 'fr-btn'
diff --git a/app/views/administrateurs/procedures/_procedures_list.html.haml b/app/views/administrateurs/procedures/_procedures_list.html.haml
index 1b360814d..7c0d12d9b 100644
--- a/app/views/administrateurs/procedures/_procedures_list.html.haml
+++ b/app/views/administrateurs/procedures/_procedures_list.html.haml
@@ -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: 'mb-1')
+ = link_to(procedure_lien(procedure), procedure_lien(procedure), class: 'fr-link fr-mb-1w')
.admin-procedures-list-timestamps
%p.notice N° #{procedure.id}
@@ -36,13 +36,13 @@
%span.icon.folder
%span.badge.baseline= procedure.dossiers.state_not_brouillon.visible_by_administration.count
- %div
+ %ul.fr-btns-group.fr-btns-group--sm.fr-btns-group--inline.fr-btns-group--icon-right
- unless procedure.discarded?
- = link_to admin_procedure_path(procedure), class: 'button mr-1 edit-procedure' do
- %span.icon.edit
- Modifier
- .dropdown{ data: { controller: 'menu-button' } }
- %button.button.dropdown-button.procedures-actions-btn{ data: { menu_button_target: 'button' } }
+ %li
+ = link_to admin_procedure_path(procedure), class: 'fr-btn fr-icon-draft-line fr-btn--tertiary' do
+ Modifier
+ %li.dropdown{ data: { controller: 'menu-button' } }
+ %button.fr-btn.fr-btn--tertiary.dropdown-button.procedures-actions-btn{ data: { menu_button_target: 'button' } }
Actions
.dropdown-content.fade-in-down{ data: { menu_button_target: 'menu' }, id: dom_id(procedure, :actions_menu) }
%ul.dropdown-items.pl-0
diff --git a/app/views/administrateurs/procedures/edit.html.haml b/app/views/administrateurs/procedures/edit.html.haml
index b39d688e4..81d97a080 100644
--- a/app/views/administrateurs/procedures/edit.html.haml
+++ b/app/views/administrateurs/procedures/edit.html.haml
@@ -17,8 +17,8 @@
.procedure-form__actions.sticky--bottom
.actions-right
- = link_to 'Annuler', admin_procedure_path(id: @procedure), class: 'button', data: { confirm: 'Êtes-vous sûr de vouloir annuler les modifications effectuées ?'}
- = f.button 'Enregistrer', class: 'button primary send'
+ = link_to 'Annuler', admin_procedure_path(id: @procedure), class: 'fr-btn fr-btn--secondary fr-mr-2w', data: { confirm: 'Êtes-vous sûr de vouloir annuler les modifications effectuées ?'}
+ = f.button 'Enregistrer', class: 'fr-btn'
.procedure-form__column--preview
.procedure-form__preview.sticky--top
diff --git a/app/views/administrateurs/procedures/index.html.haml b/app/views/administrateurs/procedures/index.html.haml
index 447624c63..bb261a189 100644
--- a/app/views/administrateurs/procedures/index.html.haml
+++ b/app/views/administrateurs/procedures/index.html.haml
@@ -1,6 +1,6 @@
.sub-header
.procedure-admin-listing-container
- = link_to "Nouvelle Démarche", new_from_existing_admin_procedures_path, id: 'new-procedure', class: 'button primary'
+ = link_to "Nouvelle Démarche", new_from_existing_admin_procedures_path, id: 'new-procedure', class: 'fr-btn'
.container
%nav.tabs
diff --git a/app/views/administrateurs/procedures/new.html.haml b/app/views/administrateurs/procedures/new.html.haml
index e5c57ad64..ba0586866 100644
--- a/app/views/administrateurs/procedures/new.html.haml
+++ b/app/views/administrateurs/procedures/new.html.haml
@@ -17,8 +17,8 @@
.procedure-form__actions.sticky--bottom
.actions-right
- = link_to 'Annuler', admin_procedures_path, class: 'button', data: { confirm: 'Êtes-vous sûr de vouloir annuler la création de cette démarche ?'}
- = f.button 'Créer la démarche', class: 'button primary send'
+ = link_to 'Annuler', admin_procedures_path, class: 'fr-btn fr-btn--secondary fr-mr-2w', data: { confirm: 'Êtes-vous sûr de vouloir annuler la création de cette démarche ?'}
+ = f.button 'Créer la démarche', class: 'fr-btn'
.procedure-form__column--preview
.procedure-form__preview.sticky--top
diff --git a/app/views/administrateurs/procedures/new_from_existing.html.haml b/app/views/administrateurs/procedures/new_from_existing.html.haml
index 6f20bd594..76ccd4178 100644
--- a/app/views/administrateurs/procedures/new_from_existing.html.haml
+++ b/app/views/administrateurs/procedures/new_from_existing.html.haml
@@ -34,11 +34,11 @@
.form
.send-wrapper
- %a#from-scratch.button.primary{ href: new_admin_procedure_path }
+ %a#from-scratch.fr-btn.fr-btn--lg{ href: new_admin_procedure_path }
Créer une nouvelle démarche de zéro
.card
- %h2.header-section
+ %h2.fr-h4.header-section
Créer une nouvelle démarche à partir d’une démarche existante
= render Procedure::SearchComponent.new(grouped_procedures: @grouped_procedures)
diff --git a/app/views/administrateurs/procedures/show.html.haml b/app/views/administrateurs/procedures/show.html.haml
index f742ce1ab..5df800982 100644
--- a/app/views/administrateurs/procedures/show.html.haml
+++ b/app/views/administrateurs/procedures/show.html.haml
@@ -49,8 +49,8 @@
= t(:has_changes, scope: [:administrateurs, :revision_changes])
= render partial: 'revision_changes', locals: { changes: @procedure.revision_changes }
.flex.mt-2.justify-end
- = button_to "Réinitialiser les modifications", admin_procedure_reset_draft_path(@procedure), class: 'button mr-1', method: :put
- = link_to 'Publier les modifications', admin_procedure_publication_path(@procedure), class: 'button primary', id: 'publish-procedure-link', data: { disable_with: "Publication..." }
+ = button_to "Réinitialiser les modifications", admin_procedure_reset_draft_path(@procedure), class: 'fr-btn fr-btn--secondary fr-mr-2w', method: :put
+ = link_to 'Publier les modifications', admin_procedure_publication_path(@procedure), class: 'fr-btn', id: 'publish-procedure-link', data: { disable_with: "Publication..." }
- if !@procedure.procedure_expires_when_termine_enabled?
= render partial: 'administrateurs/procedures/suggest_expires_when_termine', locals: { procedure: @procedure }
diff --git a/app/views/agent_connect/agent/index.html.haml b/app/views/agent_connect/agent/index.html.haml
index 8cb2229e5..bc412fe15 100644
--- a/app/views/agent_connect/agent/index.html.haml
+++ b/app/views/agent_connect/agent/index.html.haml
@@ -11,7 +11,7 @@
%span.citizen= t('.you_are_a_citizen')
%br
%br
- = link_to t('.citizen_page'), new_user_session_path, class: "button expend secondary"
+ = link_to t('.citizen_page'), new_user_session_path, class: "fr-btn fr-btn--secondary"
.column
%h1.fr-my-2
@@ -23,7 +23,7 @@
= t('.signin_with')
%span.fr-connect__brand AgentConnect
%p
- = link_to t('.whats_agentconnect'), 'https://agentconnect.gouv.fr/', target: '_blank', rel: "noopener", class: "fr-underlined"
+ = link_to t('.whats_agentconnect'), 'https://agentconnect.gouv.fr/', target: '_blank', rel: "noopener"
.france-connect-login-separator
@@ -45,7 +45,7 @@
.text-right
= link_to t('views.users.sessions.new.reset_password'), new_user_password_path, class: "link"
- = f.submit t('views.users.sessions.new.connection'), class: "button large primary expand"
+ = f.submit t('views.users.sessions.new.connection'), class: "fr-btn fr-btn--lg"
- content_for :footer do
= render partial: 'users/dossiers/index_footer'
diff --git a/app/views/commencer/show.html.haml b/app/views/commencer/show.html.haml
index 7bf4f027f..53f6628c7 100644
--- a/app/views/commencer/show.html.haml
+++ b/app/views/commencer/show.html.haml
@@ -4,11 +4,11 @@
- if !user_signed_in?
%h2.huge-title= t('views.commencer.show.start_procedure')
= render partial: 'shared/france_connect_login', locals: { url: commencer_france_connect_path(path: @procedure.path) }
- = link_to commencer_sign_up_path(path: @procedure.path), class: ['button large expand primary'] do
+ = link_to commencer_sign_up_path(path: @procedure.path), class: 'fr-btn fr-btn--lg fr-my-2w' do
= t('views.shared.account.create')
- %span.optional-on-small-screens
+ %span.optional-on-small-screens.fr-ml-1v
#{APPLICATION_NAME}
- = link_to t('views.shared.account.already_user'), commencer_sign_in_path(path: @procedure.path), class: ['button large expand']
+ = link_to t('views.shared.account.already_user'), commencer_sign_in_path(path: @procedure.path), class: 'fr-btn fr-btn--secondary fr-btn--lg fr-my-2w'
- else
- revision = @revision.draft? ? @revision : @procedure.revisions.where.not(id: @procedure.draft_revision_id)
@@ -17,28 +17,28 @@
- not_drafts = dossiers.merge(Dossier.state_not_brouillon)
- if dossiers.empty?
- = link_to t('views.commencer.show.start_procedure'), url_for_new_dossier(@revision), class: ['button large expand primary']
+ = link_to t('views.commencer.show.start_procedure'), url_for_new_dossier(@revision), class: 'fr-btn fr-btn--lg fr-my-2w'
- elsif drafts.size == 1 && not_drafts.empty?
- dossier = drafts.first
%h2.huge-title= t('views.commencer.show.already_draft')
%p
= t('views.commencer.show.already_draft_detail_html', time_ago: time_ago_in_words(dossier.created_at), procedure: dossier.procedure.libelle)
- = link_to t('views.commencer.show.continue_file'), brouillon_dossier_path(dossier), class: ['button large expand primary']
- = link_to t('views.commencer.show.start_new_file'), url_for_new_dossier(@revision), class: ['button large expand']
+ = link_to t('views.commencer.show.continue_file'), brouillon_dossier_path(dossier), class: 'fr-btn fr-btn--lg fr-my-2w'
+ = link_to t('views.commencer.show.start_new_file'), url_for_new_dossier(@revision), class: 'fr-btn fr-btn--lg fr-btn--secondary fr-my-2w'
- elsif not_drafts.size == 1
- dossier = not_drafts.first
%h2.huge-title= t('views.commencer.show.already_not_draft')
%p
= t('views.commencer.show.already_not_draft_detail_html', time_ago: time_ago_in_words(dossier.depose_at), procedure: dossier.procedure.libelle)
- = link_to t('views.commencer.show.show_my_submitted_file'), dossier_path(dossier), class: ['button large expand primary']
- = link_to t('views.commencer.show.start_new_file'), url_for_new_dossier(@revision), class: ['button large expand']
+ = link_to t('views.commencer.show.show_my_submitted_file'), dossier_path(dossier), class: 'fr-btn fr-btn--lg fr-my-2w'
+ = link_to t('views.commencer.show.start_new_file'), url_for_new_dossier(@revision), class: 'fr-btn fr-btn--lg fr-btn--secondary fr-my-2w'
- else
%h2.huge-title= t('views.commencer.show.existing_dossiers')
- = link_to t('views.commencer.show.show_dossiers'), dossiers_path, class: ['button large expand primary']
- = link_to t('views.commencer.show.start_new_file'), url_for_new_dossier(@revision), class: ['button large expand']
+ = link_to t('views.commencer.show.show_dossiers'), dossiers_path, class: "fr-btn fr-btn--lg fr-my-2w"
+ = link_to t('views.commencer.show.start_new_file'), url_for_new_dossier(@revision), class: "fr-btn fr-btn--lg fr-btn--secondary fr-my-2w"
- if @procedure.feature_enabled?(:dossier_pdf_vide)
- pdf_link = @revision.draft? ? commencer_dossier_vide_test_path(path: @procedure.path) : commencer_dossier_vide_path(path: @procedure.path)
@@ -46,4 +46,4 @@
%p= t('views.commencer.show.want_empty_pdf', service: @procedure&.service&.nom, adresse: @procedure&.service&.adresse)
%br
- = link_to t('views.commencer.show.download_empty_pdf'), pdf_link, class: ['button large expand']
+ = link_to t('views.commencer.show.download_empty_pdf'), pdf_link, class: "fr-btn fr-btn--lg fr-btn--secondary fr-my-2w"
diff --git a/app/views/devise/passwords/new.html.haml b/app/views/devise/passwords/new.html.haml
index ec02b04e2..dac711443 100644
--- a/app/views/devise/passwords/new.html.haml
+++ b/app/views/devise/passwords/new.html.haml
@@ -16,4 +16,4 @@
= f.label :email, 'Email'
= f.email_field :email, autofocus: true
- = f.submit t('devise.passwords.new.request_new_password'), class: 'button expand primary'
+ = f.submit t('devise.passwords.new.request_new_password'), class: 'fr-btn fr-btn--lg'
diff --git a/app/views/experts/avis/_header.html.haml b/app/views/experts/avis/_header.html.haml
index 0b4e448f0..1fe7ea5e0 100644
--- a/app/views/experts/avis/_header.html.haml
+++ b/app/views/experts/avis/_header.html.haml
@@ -3,7 +3,9 @@
.flex.justify-between
%ul.breadcrumbs
%li= link_to('Avis', expert_all_avis_path)
- %li= link_to(dossier.procedure.libelle.truncate_words(10), procedure_expert_avis_index_path(avis.procedure))
+ %li
+ = link_to(dossier.procedure.libelle.truncate_words(10), procedure_expert_avis_index_path(avis.procedure), class: "fr-link")
+ = procedure_badge(dossier.procedure)
%li= link_to("Dossier nº #{dossier.id}", expert_avis_path(avis.procedure, avis))
.header-actions
diff --git a/app/views/experts/avis/index.html.haml b/app/views/experts/avis/index.html.haml
index 75c482834..b3d2dd845 100644
--- a/app/views/experts/avis/index.html.haml
+++ b/app/views/experts/avis/index.html.haml
@@ -5,39 +5,40 @@
%ul.procedure-list
- @avis_by_procedure.each do |p, procedure_avis|
- %li.procedure-item.flex.align-start
- = link_to(procedure_instructeur_avis_index_path(p)) do
- .flex
-
+ %li.procedure-item.flex.align-start.fr-my-3w.fr-p-2w
+ .flex
+ = link_to instructeur_procedure_path(p), class: 'procedure-logo-link' do
.procedure-logo{ style: "background-image: url(#{p.logo_url})" }
- .procedure-details
- %p.procedure-title
- = procedure_libelle p
- %ul.procedure-stats.flex
- %li
- %object
- = link_to(procedure_instructeur_avis_index_path(p, statut: Instructeurs::AvisController::A_DONNER_STATUS)) do
- - without_answer_count = procedure_avis.select { |a| a.answer.nil? }.size
- - if without_answer_count > 0
- %span.notifications{ 'aria-label': "notifications" }
- .stats-number
- = without_answer_count
- .stats-legend
- avis à donner
- %li
- %object
- = link_to(procedure_instructeur_avis_index_path(p, statut: Instructeurs::AvisController::DONNES_STATUS)) do
- - with_answer_count = procedure_avis.select { |a| a.answer.present? }.size
- .stats-number= with_answer_count
- .stats-legend
- = pluralize(with_answer_count, "avis donné")
+ .procedure-details
+ %p.fr-mb-2w
+ = procedure_badge(p)
+ = link_to(p.libelle, procedure_instructeur_avis_index_path(p), class: "fr-link fr-ml-1w")
- - if p.close?
- .procedure-status
- %span.label
- = t('helpers.procedure.close')
- - elsif p.depubliee?
- .procedure-status
- %span.label
- = t('helpers.procedure.unpublished')
+ %ul.procedure-stats.flex
+ %li
+ %object
+ = link_to(procedure_instructeur_avis_index_path(p, statut: Instructeurs::AvisController::A_DONNER_STATUS)) do
+ - without_answer_count = procedure_avis.select { |a| a.answer.nil? }.size
+ - if without_answer_count > 0
+ %span.notifications{ 'aria-label': "notifications" }
+ .stats-number
+ = without_answer_count
+ .stats-legend
+ avis à donner
+ %li
+ %object
+ = link_to(procedure_instructeur_avis_index_path(p, statut: Instructeurs::AvisController::DONNES_STATUS)) do
+ - with_answer_count = procedure_avis.select { |a| a.answer.present? }.size
+ .stats-number= with_answer_count
+ .stats-legend
+ = pluralize(with_answer_count, "avis donné")
+
+ - if p.close?
+ .procedure-status
+ %span.label
+ = t('helpers.procedure.close')
+ - elsif p.depubliee?
+ .procedure-status
+ %span.label
+ = t('helpers.procedure.unpublished')
diff --git a/app/views/experts/avis/instruction.html.haml b/app/views/experts/avis/instruction.html.haml
index e5eeb8800..b566e9c2c 100644
--- a/app/views/experts/avis/instruction.html.haml
+++ b/app/views/experts/avis/instruction.html.haml
@@ -7,8 +7,8 @@
%h1.tab-title Donner votre avis
%h2.claimant
Demandeur :
- %span.email= safe_claimant_email(@avis.claimant)
- %span.date Demande d’avis envoyée le #{l(@avis.created_at, format: '%d/%m/%y')}
+ %span.email.font-weight-normal= safe_claimant_email(@avis.claimant)
+ %span.date.font-weight-normal Demande d’avis envoyée le #{l(@avis.created_at, format: '%d/%m/%y')}
%p.introduction= @avis.introduction
- if @avis.introduction_file.attached?
@@ -29,7 +29,7 @@
%span
Cet avis est partagé avec les autres experts
.send-wrapper
- = f.submit 'Envoyer votre avis', class: 'button send'
+ = f.submit 'Envoyer votre avis', class: 'fr-btn'
- if !@dossier.termine? && !@avis.procedure.feature_enabled?(:expert_not_allowed_to_invite)
= render partial: "experts/shared/avis/form", locals: { url: avis_expert_avis_path(@avis.procedure, @avis), linked_dossiers: @dossier.linked_dossiers_for(current_expert), must_be_confidentiel: @avis.confidentiel?, avis: @new_avis }
diff --git a/app/views/experts/shared/avis/_list.html.haml b/app/views/experts/shared/avis/_list.html.haml
index 34c5d7ad6..5a6e5d53f 100644
--- a/app/views/experts/shared/avis/_list.html.haml
+++ b/app/views/experts/shared/avis/_list.html.haml
@@ -1,36 +1,36 @@
%section.list-avis
%h1.tab-title
Avis des invités
- %span.count= avis.count
+ %span.fr-badge= avis.count
%ul
- avis.each do |avis|
%li.one-avis.flex.align-start
.width-100
- %h2.claimant
+ %h2.claimant.fr-h6
= "#{t('claimant', scope: 'activerecord.attributes.avis')} :"
- %span.email= (safe_claimant_email(avis.claimant) == current_expert.email) ? 'Vous' : safe_claimant_email(avis.claimant)
+ %span.fr-text--xs.fr-text-mention--grey.font-weight-normal= (safe_claimant_email(avis.claimant) == current_expert.email) ? 'Vous' : safe_claimant_email(avis.claimant)
- if avis.confidentiel?
- %span.confidentiel
+ %span.confidentiel.font-weight-normal
= t('confidentiel', scope: 'activerecord.attributes.avis')
%span.icon.lock{ title: t('confidentiel', scope: 'helpers.hint') }
- %span.date{ class: highlight_if_unseen_class(avis_seen_at, avis.created_at) }
+ %span.date.fr-text--xs.fr-text-mention--grey.font-weight-normal{ class: highlight_if_unseen_class(avis_seen_at, avis.created_at) }
= t('demande_envoyee_le', scope: 'views.shared.avis', date: l(avis.created_at, format: '%d/%m/%y à %H:%M'))
%p= avis.introduction
.answer.flex.align-start
%span.icon.bubble.avis-icon
.width-100
- %h2.instructeur
+ %h2.instructeur.fr-h6
= (avis.expert.email == current_expert.email) ? 'Vous' : avis.expert.email
- if avis.answer.present?
- if avis.revoked?
- %span.waiting{ class: highlight_if_unseen_class(avis_seen_at, avis.revoked_at) }
+ %span.waiting.font-weight-normal{ class: highlight_if_unseen_class(avis_seen_at, avis.revoked_at) }
= t('demande_revoquee_le', scope: 'views.shared.avis', date: l(avis.revoked_at, format: '%d/%m/%y à %H:%M'))
- %span.date{ class: highlight_if_unseen_class(avis_seen_at, avis.updated_at) }
+ %span.date.fr-text--xs.fr-text-mention--grey.font-weight-normal{ class: highlight_if_unseen_class(avis_seen_at, avis.updated_at) }
= t('reponse_donnee_le', scope: 'views.shared.avis', date: l(avis.updated_at, format: '%d/%m/%y à %H:%M'))
- else
- %span.waiting
+ %span.waiting.font-weight-normal
= t('en_attente', scope: 'views.shared.avis')
- if avis.piece_justificative_file.attached?
= render Attachment::ShowComponent.new(attachment: avis.piece_justificative_file.attachment)
diff --git a/app/views/instructeurs/avis/_header.html.haml b/app/views/instructeurs/avis/_header.html.haml
index 4135c8d58..5e5adba89 100644
--- a/app/views/instructeurs/avis/_header.html.haml
+++ b/app/views/instructeurs/avis/_header.html.haml
@@ -2,7 +2,9 @@
.container
%ul.breadcrumbs
%li= link_to('Avis', instructeur_all_avis_path)
- %li= link_to(dossier.procedure.libelle, procedure_instructeur_avis_index_path(avis.procedure))
+ %li
+ = link_to(procedure.libelle, procedure_instructeur_avis_index_path(avis.procedure), class: "fr-link")
+ = procedure_badge(dossier.procedure)
%li= link_to("Dossier nº #{dossier.id}", instructeur_avis_path(avis.procedure, avis))
%nav.tabs
diff --git a/app/views/instructeurs/dossiers/_header.html.haml b/app/views/instructeurs/dossiers/_header.html.haml
index ce3536509..023676a0b 100644
--- a/app/views/instructeurs/dossiers/_header.html.haml
+++ b/app/views/instructeurs/dossiers/_header.html.haml
@@ -3,10 +3,8 @@
.flex.justify-between
%ul.breadcrumbs
%li
- = link_to instructeur_procedure_path(dossier.procedure), title: dossier.procedure.libelle do
- - if dossier.procedure.brouillon?
- %span.badge démarche en test
- = dossier.procedure.libelle.truncate_words(10)
+ = link_to dossier.procedure.libelle.truncate_words(10), instructeur_procedure_path(dossier.procedure), title: dossier.procedure.libelle, class: "fr-link"
+ = procedure_badge(dossier.procedure)
%li
= "Dossier nº #{dossier.id}"
diff --git a/app/views/instructeurs/dossiers/_header_actions.html.haml b/app/views/instructeurs/dossiers/_header_actions.html.haml
index a2c0b7704..9a03b37ce 100644
--- a/app/views/instructeurs/dossiers/_header_actions.html.haml
+++ b/app/views/instructeurs/dossiers/_header_actions.html.haml
@@ -1,32 +1,31 @@
-%span.dropdown.print-menu-opener{ data: { controller: 'menu-button' } }
- %button.button.dropdown-button.icon-only{ title: 'imprimer', 'aria-label': 'imprimer', data: { menu_button_target: 'button' } }
- %span.icon.printer
- %ul#print-menu.print-menu.dropdown-content{ data: { menu_button_target: 'menu' } }
- %li
- = link_to "Tout le dossier", print_instructeur_dossier_path(dossier.procedure, dossier), target: "_blank", rel: "noopener", class: "menu-item menu-link"
- %li
- = link_to "Uniquement cet onglet", "#", onclick: "window.print()", class: "menu-item menu-link"
- %li
- = link_to "Export PDF", instructeur_dossier_path(dossier.procedure, dossier, format: :pdf), target: "_blank", rel: "noopener", class: "menu-item menu-link"
- - if dossier.geo_data?
+%ul.fr-btns-group.fr-btns-group--sm.fr-btns-group--inline-md.fr-btns-group--icon-right
+ %li.dropdown.print-menu-opener{ data: { controller: 'menu-button' } }
+ %button.fr-btn.fr-btn--tertiary.fr-icon-printer-line.dropdown-button{ title: 'imprimer', 'aria-label': 'Imprimer', data: { menu_button_target: 'button' } } Imprimer
+ %ul#print-menu.print-menu.dropdown-content{ data: { menu_button_target: 'menu' } }
%li
- = link_to "Export GeoJSON", geo_data_instructeur_dossier_path(dossier.procedure, dossier), target: "_blank", rel: "noopener", class: "menu-item menu-link"
+ = link_to "Tout le dossier", print_instructeur_dossier_path(dossier.procedure, dossier), target: "_blank", rel: "noopener", class: "menu-item menu-link"
+ %li
+ = link_to "Uniquement cet onglet", "#", onclick: "window.print()", class: "menu-item menu-link"
+ %li
+ = link_to "Export PDF", instructeur_dossier_path(dossier.procedure, dossier, format: :pdf), target: "_blank", rel: "noopener", class: "menu-item menu-link"
+ - if dossier.geo_data?
+ %li
+ = link_to "Export GeoJSON", geo_data_instructeur_dossier_path(dossier.procedure, dossier), target: "_blank", rel: "noopener", class: "menu-item menu-link"
-%span.dropdown.print-menu-opener{ data: { controller: 'menu-button' } }
- %button.button.dropdown-button.icon-only{ data: { menu_button_target: 'button' } }
- %span.icon.attached
- %ul#print-pj-menu.print-menu.dropdown-content{ data: { menu_button_target: 'menu' } }
- %li= link_to "Télécharger le dossier et toutes ses pièces jointes", telecharger_pjs_instructeur_dossier_path(dossier.procedure, dossier), target: "_blank", rel: "noopener", class: "menu-item menu-link"
+ %li.dropdown.print-menu-opener{ data: { controller: 'menu-button' } }
+ %button.fr-btn.fr-btn--tertiary.fr-icon-download-line.dropdown-button{ data: { menu_button_target: 'button', 'aria-label': 'Télécharger' } } Télécharger
+ %ul#print-pj-menu.print-menu.dropdown-content{ data: { menu_button_target: 'menu' } }
+ %li= link_to "Télécharger le dossier et toutes ses pièces jointes", telecharger_pjs_instructeur_dossier_path(dossier.procedure, dossier), target: "_blank", rel: "noopener", class: "menu-item menu-link"
-= render partial: "instructeurs/procedures/dossier_actions",
- locals: { procedure_id: dossier.procedure.id,
- dossier_id: dossier.id,
- state: dossier.state,
- archived: dossier.archived,
- dossier_is_followed: current_instructeur&.follow?(dossier),
- close_to_expiration: dossier.close_to_expiration?,
- hidden_by_administration: dossier.hidden_by_administration? }
+ %li
+ = render partial: "instructeurs/procedures/dossier_actions",
+ locals: { procedure_id: dossier.procedure.id,
+ dossier_id: dossier.id,
+ state: dossier.state,
+ archived: dossier.archived,
+ dossier_is_followed: current_instructeur&.follow?(dossier),
+ close_to_expiration: dossier.close_to_expiration?,
+ hidden_by_administration: dossier.hidden_by_administration? }
-
-.state-button
- = render partial: "state_button", locals: { dossier: dossier }
+ %li.state-button
+ = render partial: "state_button", locals: { dossier: dossier }
diff --git a/app/views/instructeurs/dossiers/_state_button.html.haml b/app/views/instructeurs/dossiers/_state_button.html.haml
index f1b9580f6..875af4cc8 100644
--- a/app/views/instructeurs/dossiers/_state_button.html.haml
+++ b/app/views/instructeurs/dossiers/_state_button.html.haml
@@ -1,6 +1,6 @@
.dropdown{ data: { controller: 'menu-button', popover: 'true' } }
-# Dropdown button title
- %button.button.primary.dropdown-button{ class: button_or_label_class(dossier), data: { menu_button_target: 'button' } }
+ %button.fr-btn.dropdown-button{ class: button_or_label_class(dossier), data: { menu_button_target: 'button' } }
= dossier_display_state dossier
-# Dropdown content
diff --git a/app/views/instructeurs/dossiers/_state_button_motivation.html.haml b/app/views/instructeurs/dossiers/_state_button_motivation.html.haml
index 46b55477d..4805192c5 100644
--- a/app/views/instructeurs/dossiers/_state_button_motivation.html.haml
+++ b/app/views/instructeurs/dossiers/_state_button_motivation.html.haml
@@ -1,5 +1,5 @@
.motivation.hidden{ class: popup_class }
- %h3
+ %h3.fr-h5
%span.icon{ class: popup_class }
#{popup_title}
diff --git a/app/views/instructeurs/procedures/_dossier_actions.html.haml b/app/views/instructeurs/procedures/_dossier_actions.html.haml
index 7c4cc08c8..68765a6e6 100644
--- a/app/views/instructeurs/procedures/_dossier_actions.html.haml
+++ b/app/views/instructeurs/procedures/_dossier_actions.html.haml
@@ -1,9 +1,9 @@
- if hidden_by_administration
- = link_to restore_instructeur_dossier_path(procedure_id, dossier_id), method: :patch, class: "button" do
+ = link_to restore_instructeur_dossier_path(procedure_id, dossier_id), method: :patch, class: "fr-btn fr-btn--secondary" do
= t('views.instructeurs.dossiers.restore')
- elsif close_to_expiration || Dossier::TERMINE.include?(state)
.dropdown.user-dossier-actions{ data: { controller: 'menu-button' } }
- %button.button.dropdown-button{ data: { menu_button_target: 'button' } }
+ %button.fr-btn.dropdown-button{ data: { menu_button_target: 'button' } }
Actions
.dropdown-content.fade-in-down{ data: { menu_button_target: 'menu' }, id: "dossier_#{dossier_id}_actions_menu" }
%ul.dropdown-items
@@ -33,10 +33,8 @@
- elsif Dossier::EN_CONSTRUCTION_OU_INSTRUCTION.include?(state)
- if dossier_is_followed
- = link_to unfollow_instructeur_dossier_path(procedure_id, dossier_id), method: :patch, class: 'button' do
- %span.icon.unfollow>
+ = link_to unfollow_instructeur_dossier_path(procedure_id, dossier_id), method: :patch, class: 'fr-btn fr-btn--secondary fr-icon-star-fill' do
= t('views.instructeurs.dossiers.stop_follow')
- else
- = link_to follow_instructeur_dossier_path(procedure_id, dossier_id), method: :patch, class: 'button' do
- %span.icon.follow>
+ = link_to follow_instructeur_dossier_path(procedure_id, dossier_id), method: :patch, class: 'fr-btn fr-btn--secondary fr-icon-star-line' do
= t('views.instructeurs.dossiers.follow_file')
diff --git a/app/views/instructeurs/procedures/_list.html.haml b/app/views/instructeurs/procedures/_list.html.haml
index 863894e90..9d7b57431 100644
--- a/app/views/instructeurs/procedures/_list.html.haml
+++ b/app/views/instructeurs/procedures/_list.html.haml
@@ -1,81 +1,81 @@
-%li.procedure-item.flex.align-start
- = link_to(instructeur_procedure_path(p)) do
- .flex
-
+%li.procedure-item.flex.align-start.fr-my-3w.fr-p-2w
+ .flex
+ = link_to instructeur_procedure_path(p), class: 'procedure-logo-link' do
.procedure-logo{ style: "background-image: url(#{p.logo_url})" }
- .procedure-details
- %p.procedure-title
- = procedure_libelle p
- %ul.procedure-stats.flex
- %li
- %object
- = link_to(instructeur_procedure_path(p, statut: 'a-suivre')) do
- - a_suivre_count = dossiers_a_suivre_count_per_procedure[p.id] || 0
- .stats-number
- = number_with_html_delimiter(a_suivre_count)
- .stats-legend
- = t('instructeurs.dossiers.labels.to_follow')
- %li
- %object
- = link_to(instructeur_procedure_path(p, statut: 'suivis')) do
- - if procedure_ids_en_cours_with_notifications.include?(p.id)
- %span.notifications{ 'aria-label': "notifications" }
- - followed_count = followed_dossiers_count_per_procedure[p.id] || 0
- .stats-number
- = number_with_html_delimiter(followed_count)
- .stats-legend
- = t('pluralize.followed', count: followed_count)
- %li
- %object
- = link_to(instructeur_procedure_path(p, statut: 'traites')) do
- - if procedure_ids_termines_with_notifications.include?(p.id)
- %span.notifications{ 'aria-label': "notifications" }
- - termines_count = dossiers_termines_count_per_procedure[p.id] || 0
- .stats-number
- = number_with_html_delimiter(termines_count)
- .stats-legend
- = t('pluralize.processed', count: termines_count)
- %li
- %object
- = link_to(instructeur_procedure_path(p, statut: 'tous')) do
- - dossier_count = dossiers_count_per_procedure[p.id] || 0
- .stats-number
- = number_with_html_delimiter(dossier_count)
- .stats-legend
- = t('pluralize.case', count: dossier_count)
+ .procedure-details
+ %p.fr-mb-2w
+ = procedure_badge(p)
+ = link_to(p.libelle, instructeur_procedure_path(p), class: "fr-link fr-ml-1w")
+ %ul.procedure-stats.flex
+ %li
+ %object
+ = link_to(instructeur_procedure_path(p, statut: 'a-suivre')) do
+ - a_suivre_count = dossiers_a_suivre_count_per_procedure[p.id] || 0
+ .stats-number
+ = number_with_html_delimiter(a_suivre_count)
+ .stats-legend
+ = t('instructeurs.dossiers.labels.to_follow')
+ %li
+ %object
+ = link_to(instructeur_procedure_path(p, statut: 'suivis')) do
+ - if procedure_ids_en_cours_with_notifications.include?(p.id)
+ %span.notifications{ 'aria-label': "notifications" }
+ - followed_count = followed_dossiers_count_per_procedure[p.id] || 0
+ .stats-number
+ = number_with_html_delimiter(followed_count)
+ .stats-legend
+ = t('pluralize.followed', count: followed_count)
+ %li
+ %object
+ = link_to(instructeur_procedure_path(p, statut: 'traites')) do
+ - if procedure_ids_termines_with_notifications.include?(p.id)
+ %span.notifications{ 'aria-label': "notifications" }
+ - termines_count = dossiers_termines_count_per_procedure[p.id] || 0
+ .stats-number
+ = number_with_html_delimiter(termines_count)
+ .stats-legend
+ = t('pluralize.processed', count: termines_count)
+ %li
+ %object
+ = link_to(instructeur_procedure_path(p, statut: 'tous')) do
+ - dossier_count = dossiers_count_per_procedure[p.id] || 0
+ .stats-number
+ = number_with_html_delimiter(dossier_count)
+ .stats-legend
+ = t('pluralize.case', count: dossier_count)
+ %li
+ %object
+ = link_to(instructeur_procedure_path(p, statut: 'supprimes_recemment')) do
+ - dossier_count = dossiers_supprimes_recemment_count_per_procedure[p.id] || 0
+ .stats-number
+ = number_with_html_delimiter(dossier_count)
+ .stats-legend
+ = t('pluralize.dossiers_supprimes_recemment', count: dossier_count)
+
+ - if p.procedure_expires_when_termine_enabled
%li
%object
- = link_to(instructeur_procedure_path(p, statut: 'supprimes_recemment')) do
- - dossier_count = dossiers_supprimes_recemment_count_per_procedure[p.id] || 0
+ = link_to(instructeur_procedure_path(p, statut: 'expirant')) do
+ - expirant_count = dossiers_expirant_count_per_procedure[p.id] || 0
.stats-number
- = number_with_html_delimiter(dossier_count)
+ = number_with_html_delimiter(expirant_count)
.stats-legend
- = t('pluralize.dossiers_supprimes_recemment', count: dossier_count)
+ = t('pluralize.dossiers_close_to_expiration', count: expirant_count)
- - if p.procedure_expires_when_termine_enabled
- %li
- %object
- = link_to(instructeur_procedure_path(p, statut: 'expirant')) do
- - expirant_count = dossiers_expirant_count_per_procedure[p.id] || 0
- .stats-number
- = number_with_html_delimiter(expirant_count)
- .stats-legend
- = t('pluralize.dossiers_close_to_expiration', count: expirant_count)
+ %li
+ %object
+ = link_to(instructeur_procedure_path(p, statut: 'archives')) do
+ - archived_count = dossiers_archived_count_per_procedure[p.id] || 0
+ .stats-number
+ = number_with_html_delimiter(archived_count)
+ .stats-legend
+ = t('pluralize.archived', count: archived_count)
- %li
- %object
- = link_to(instructeur_procedure_path(p, statut: 'archives')) do
- - archived_count = dossiers_archived_count_per_procedure[p.id] || 0
- .stats-number
- = number_with_html_delimiter(archived_count)
- .stats-legend
- = t('pluralize.archived', count: archived_count)
-
- - if p.close?
- .procedure-status
- %span.label Close
- - elsif p.depubliee?
- .procedure-status
- %span.label Dépubliée
+ - if p.close?
+ .procedure-status
+ %span.label Close
+ - elsif p.depubliee?
+ .procedure-status
+ %span.label Dépubliée
diff --git a/app/views/instructeurs/procedures/email_notifications.html.haml b/app/views/instructeurs/procedures/email_notifications.html.haml
index 2a1f9fa39..7642f6041 100644
--- a/app/views/instructeurs/procedures/email_notifications.html.haml
+++ b/app/views/instructeurs/procedures/email_notifications.html.haml
@@ -89,5 +89,5 @@
= t('.utils.negative')
.send-wrapper
- = link_to t('.buttons.back_to_procedure'), instructeur_procedure_path(@procedure), class: 'button mr-1'
- = form.submit t('.buttons.save'), class: "button primary"
+ = link_to t('.buttons.back_to_procedure'), instructeur_procedure_path(@procedure), class: 'fr-btn fr-btn--secondary fr-mr-2w'
+ = form.submit t('.buttons.save'), class: "fr-btn"
diff --git a/app/views/instructeurs/procedures/email_usagers.html.haml b/app/views/instructeurs/procedures/email_usagers.html.haml
index e1c965045..84e8f78b6 100644
--- a/app/views/instructeurs/procedures/email_usagers.html.haml
+++ b/app/views/instructeurs/procedures/email_usagers.html.haml
@@ -14,7 +14,7 @@
%section.list-avis.mt-8
%h1.tab-title
Messages envoyés précedemment
- %span.count= @bulk_messages.count
+ %span.fr-badge= @bulk_messages.count
%ul
- @bulk_messages.each do |message|
diff --git a/app/views/instructeurs/procedures/show.html.haml b/app/views/instructeurs/procedures/show.html.haml
index 1ea7b6df5..0a226c1a8 100644
--- a/app/views/instructeurs/procedures/show.html.haml
+++ b/app/views/instructeurs/procedures/show.html.haml
@@ -134,14 +134,15 @@
- else
%a.cell-link{ href: path }= status_badge(p.state)
- %td.action-col.follow-col= render partial: 'dossier_actions',
- locals: { procedure_id: @procedure.id,
- dossier_id: p.dossier_id,
- state: p.state,
- archived: p.archived,
- dossier_is_followed: @followed_dossiers_id.include?(p.dossier_id),
- close_to_expiration: @statut == 'expirant',
- hidden_by_administration: @statut == 'supprimes_recemment' }
+ %td.action-col.follow-col
+ %ul.inline.fr-btns-group.fr-btns-group--sm.fr-btns-group--inline.fr-btns-group--icon-right
+ = render partial: 'dossier_actions', locals: { procedure_id: @procedure.id,
+ dossier_id: p.dossier_id,
+ state: p.state,
+ archived: p.archived,
+ dossier_is_followed: @followed_dossiers_id.include?(p.dossier_id),
+ close_to_expiration: @statut == 'expirant',
+ hidden_by_administration: @statut == 'supprimes_recemment' }
= pagination
- else
diff --git a/app/views/instructeurs/shared/avis/_list.html.haml b/app/views/instructeurs/shared/avis/_list.html.haml
index 8c1693569..eece13e45 100644
--- a/app/views/instructeurs/shared/avis/_list.html.haml
+++ b/app/views/instructeurs/shared/avis/_list.html.haml
@@ -1,7 +1,7 @@
%section.list-avis
%h1.tab-title
Avis des invités
- %span.count= avis.count
+ %span.fr-badge= avis.count
%ul
- avis.each do |avis|
diff --git a/app/views/invites/_form.html.haml b/app/views/invites/_form.html.haml
index 4101971f9..8743ca2fb 100644
--- a/app/views/invites/_form.html.haml
+++ b/app/views/invites/_form.html.haml
@@ -26,4 +26,4 @@
= label_tag :invite_message, t('views.invites.form.invite_message')
= text_area_tag :invite_message, '', class: 'small', placeholder: t('views.invites.form.invite_message')
.col
- = submit_tag t('views.invites.form.send_invitation'), class: 'button accepted'
+ = submit_tag t('views.invites.form.send_invitation'), class: 'fr-btn fr-btn--secondary'
diff --git a/app/views/layouts/_header.haml b/app/views/layouts/_header.haml
index a452923d1..6793235b8 100644
--- a/app/views/layouts/_header.haml
+++ b/app/views/layouts/_header.haml
@@ -38,7 +38,7 @@
- if request.path == new_user_registration_path
%li
.fr-hidden-sm.fr-unhidden-lg.fr-link--sm= t('views.shared.account.already_user_question')
- %li= link_to t('views.shared.account.signin'), new_user_session_path, class: "fr-btn"
+ %li= link_to t('views.shared.account.signin'), new_user_session_path, class: "fr-btn fr-btn--tertiary fr-icon-account-circle-fill fr-btn--icon-left"
%li
- if dossier.present? && nav_bar_profile == :user
diff --git a/app/views/layouts/commencer/_no_procedure.html.haml b/app/views/layouts/commencer/_no_procedure.html.haml
index 6c064c5ee..51da3ccf6 100644
--- a/app/views/layouts/commencer/_no_procedure.html.haml
+++ b/app/views/layouts/commencer/_no_procedure.html.haml
@@ -12,4 +12,4 @@
%span.small-simple= t('.are_you_new', app_name: APPLICATION_NAME.gsub("-","‑")).html_safe
%br
%br
- = link_to t('views.users.sessions.new.find_procedure'), COMMENT_TROUVER_MA_DEMARCHE_URL, target: "_blank", class: "button expend secondary"
+ = link_to t('views.users.sessions.new.find_procedure'), COMMENT_TROUVER_MA_DEMARCHE_URL, target: "_blank", class: "fr-btn fr-btn--secondary"
diff --git a/app/views/root/_footer.html.haml b/app/views/root/_footer.html.haml
index 753d76d00..7233d5599 100644
--- a/app/views/root/_footer.html.haml
+++ b/app/views/root/_footer.html.haml
@@ -50,9 +50,9 @@
.fr-footer__content
%p.fr-footer__content-desc
= t('links.footer.description_1')
- = link_to t('links.footer.link_1_label'), t('links.footer.link_1_url'), target: '_blank', class: "fr-underlined"
+ = link_to t('links.footer.link_1_label'), t('links.footer.link_1_url'), target: '_blank'
%p.fr-footer__content-desc
- = link_to t('links.footer.link_2_label'), t("links.footer.code.url"), target: '_blank', class: "fr-underlined"
+ = link_to t('links.footer.link_2_label'), t("links.footer.code.url"), target: '_blank'
= t('links.footer.description_2')
%ul.fr-footer__content-list
%li.fr-footer__content-item
@@ -66,8 +66,4 @@
.fr-footer__bottom
= render partial: 'users/general_footer_row'
- .fr-footer__bottom-copy
- %p
- Sauf mention contraire, tous les contenus de ce site sont sous
- %a{ href: "https://github.com/etalab/licence-ouverte/blob/master/LO.md", target:"_blank" } licence etalab-2.0
- %br
+ = render partial: 'shared/footer_copy'
diff --git a/app/views/root/_testimonials.html.haml b/app/views/root/_testimonials.html.haml
index ea3cfe634..5a9916320 100644
--- a/app/views/root/_testimonials.html.haml
+++ b/app/views/root/_testimonials.html.haml
@@ -1,6 +1,6 @@
.landing-panel
.container
- %h2.landing-panel-title Ce que les utilisateurs pensent du service
+ %h2.center.fr-mb-4w Ce que les utilisateurs pensent du service
%ul.quotes
%li.quote
diff --git a/app/views/root/_users.html.haml b/app/views/root/_users.html.haml
index f02bee547..7ffed0f57 100644
--- a/app/views/root/_users.html.haml
+++ b/app/views/root/_users.html.haml
@@ -1,6 +1,6 @@
.landing-panel.users-panel
.container
- %h2.landing-panel-title Ils utilisent déjà #{APPLICATION_NAME}
+ %h2.center.fr-mb-4w Ils utilisent déjà #{APPLICATION_NAME}
%ul.users
%li.user
diff --git a/app/views/root/administration.html.haml b/app/views/root/administration.html.haml
index 83cc9690e..45edecb1f 100644
--- a/app/views/root/administration.html.haml
+++ b/app/views/root/administration.html.haml
@@ -6,7 +6,7 @@
.container
.hero-wrapper
.hero-text
- %p.hero-tagline
+ %h1.hero-tagline
%em.hero-tagline-em Dématérialisez et simplifiez
vos démarches administratives
@@ -17,8 +17,8 @@
.container
.role-panel-wrapper.role-administrations-panel
.role-panel-70
- %h1.role-panel-title Est-ce fait pour mon administration ?
- %p.role-panel-explanation Découvrez notre outil et posez nous vos questions lors de notre démonstration en ligne ou lisez notre documentation
+ %h2 Est-ce fait pour mon administration ?
+ %p.fr-h5 Découvrez notre outil et posez nous vos questions lors de notre démonstration en ligne ou lisez notre documentation
= link_to "Participer à notre démonstration en ligne", INSCRIPTION_WEBINAIRE_URL, class: "fr-btn fr-btn--lg fr-mr-1w fr-mb-2w", **external_link_attributes
= link_to "Documentation", DOC_URL, class: "fr-btn fr-btn--secondary fr-btn--lg", **external_link_attributes
@@ -33,8 +33,8 @@
%img.role-image{ :src => image_url("landing/roles/administrations.svg"), alt: "" }
.role-panel-70
- %h1.role-panel-title Votre administration est prête pour dématérialiser
- %p.role-panel-explanation Créez un premier formulaire de test en quelques minutes
+ %h2 Votre administration est prête pour dématérialiser
+ %p.fr-h5 Créez un premier formulaire de test en quelques minutes
= link_to "Créer votre compte administrateur", DEMANDE_INSCRIPTION_ADMIN_PAGE_URL, class: "fr-btn fr-btn--lg"
@@ -75,7 +75,7 @@
- cache "numbers-panel", :expires_in => 3.hours do
.landing-panel.numbers-panel
.container
- %h2.landing-panel-title #{APPLICATION_NAME} en chiffres
+ %h2.center.fr-mb-4w #{APPLICATION_NAME} en chiffres
%ul.numbers
%li.number
.number-value
diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml
index f5da25a61..60b03d244 100644
--- a/app/views/root/landing.html.haml
+++ b/app/views/root/landing.html.haml
@@ -23,8 +23,8 @@
%img.role-image{ :src => image_url("landing/roles/usagers.svg"), alt: '', width: 176, height: 180, loading: 'lazy' }
.role-panel-70
- %h2.role-panel-title Vous souhaitez effectuer une demande auprès d’une administration ?
- %p.role-panel-explanation Réalisez vos demandes en toute simplicité et retrouvez vos dossiers en ligne
+ %h2 Vous souhaitez effectuer une demande auprès d’une administration ?
+ %p.fr-h5 Réalisez vos demandes en toute simplicité et retrouvez vos dossiers en ligne
= link_to "Comment trouver ma démarche ?", COMMENT_TROUVER_MA_DEMARCHE_URL, class: "fr-btn fr-btn--lg fr-mr-1w fr-mb-2w", **external_link_attributes
= link_to "Se connecter", new_user_session_path, class: "fr-btn fr-btn--secondary fr-btn--lg"
@@ -32,7 +32,7 @@
- cache "numbers-panel", :expires_in => 3.hours do
.landing-panel
.container
- %h2.landing-panel-title #{APPLICATION_NAME} en chiffres
+ %h2.center.fr-mb-4w #{APPLICATION_NAME} en chiffres
%ul.numbers
%li.number
.number-value
@@ -77,7 +77,7 @@
.container
.cta-panel-wrapper
%div
- %h2.cta-panel-title.grey Administration : vous voulez dématerialiser ?
+ %h2.fr-h4 Administration : vous voulez dématerialiser ?
%p.cta-panel-explanation.grey Proposez à vos usagers de remplir leurs dossiers en ligne
%div
= link_to "Découvrez notre outil", administration_path, class: "fr-btn fr-btn--lg"
diff --git a/app/views/root/patron.html.haml b/app/views/root/patron.html.haml
index 57364e78f..57575c311 100644
--- a/app/views/root/patron.html.haml
+++ b/app/views/root/patron.html.haml
@@ -282,7 +282,7 @@
%section.list-avis
%h1.title
Avis des invités
- %span.count 1
+ %span.fr-badge 1
%ul
%li.one-avis
diff --git a/app/views/shared/_footer_copy.html.haml b/app/views/shared/_footer_copy.html.haml
new file mode 100644
index 000000000..4f75e273a
--- /dev/null
+++ b/app/views/shared/_footer_copy.html.haml
@@ -0,0 +1,4 @@
+.fr-footer__bottom-copy
+ %p
+ Sauf mention contraire, tous les contenus de ce site sont sous
+ %a{ href: "https://github.com/etalab/licence-ouverte/blob/master/LO.md", target:"_blank", rel: "noopener", title: "licence etalab-2.0 - nouvelle fenêtre" } licence etalab-2.0
diff --git a/app/views/shared/_france_connect_login.html.haml b/app/views/shared/_france_connect_login.html.haml
index 6d9d18de5..897ba2010 100644
--- a/app/views/shared/_france_connect_login.html.haml
+++ b/app/views/shared/_france_connect_login.html.haml
@@ -11,7 +11,7 @@
= t('views.shared.france_connect_login.login_button')
%span.fr-connect__brand FranceConnect
%p
- = link_to t('views.shared.france_connect_login.help_link'), "https://franceconnect.gouv.fr/", target: "_blank", rel: "noopener", class: "fr-underlined"
+ = link_to t('views.shared.france_connect_login.help_link'), "https://franceconnect.gouv.fr/", target: "_blank", rel: "noopener"
.france-connect-login-separator
= t('views.shared.france_connect_login.separator')
diff --git a/app/views/shared/dossiers/_autosave.html.haml b/app/views/shared/dossiers/_autosave.html.haml
index 583f4ee52..74193a643 100644
--- a/app/views/shared/dossiers/_autosave.html.haml
+++ b/app/views/shared/dossiers/_autosave.html.haml
@@ -1,11 +1,11 @@
.autosave.autosave-state-idle{ data: { controller: 'autosave-status' } }
- %p.autosave-explanation
+ %p.autosave-explanation.fr-text--sm
%span.autosave-explanation-text
- if dossier.brouillon?
= t('views.users.dossiers.autosave.draft_explanation')
- else
= t('views.users.dossiers.autosave.explanation')
- = link_to t('views.users.dossiers.autosave.more_information'), FAQ_AUTOSAVE_URL, target: '_blank', rel: 'noopener', class: 'autosave-more-infos'
+ = link_to t('views.users.dossiers.autosave.more_information'), FAQ_AUTOSAVE_URL, target: '_blank', rel: 'noopener', class: 'autosave-more-infos fr-link fr-link--sm'
%p.autosave-status.succeeded
%span.autosave-icon.icon.accept
@@ -14,7 +14,7 @@
= t('views.users.dossiers.autosave.draft_confirmation')
- else
= t('views.users.dossiers.autosave.confirmation')
- = link_to t('views.users.dossiers.autosave.more_information'), FAQ_AUTOSAVE_URL, target: '_blank', rel: 'noopener', class: 'autosave-more-infos'
+ = link_to t('views.users.dossiers.autosave.more_information'), FAQ_AUTOSAVE_URL, target: '_blank', rel: 'noopener', class: 'autosave-more-infos fr-link fr-link--sm'
%p.autosave-status.failed
%span.autosave-icon ⚠️
diff --git a/app/views/shared/dossiers/_edit.html.haml b/app/views/shared/dossiers/_edit.html.haml
index 0af6c75d1..1575b43b3 100644
--- a/app/views/shared/dossiers/_edit.html.haml
+++ b/app/views/shared/dossiers/_edit.html.haml
@@ -21,15 +21,18 @@
= t('views.shared.dossiers.edit.autosave')
- if notice_url(dossier.procedure).present?
- %br
- = link_to t("views.shared.dossiers.edit.notice"), notice_url(dossier.procedure),
- class: "fr-btn fr-btn--secondary mt-2",
- title: t("views.shared.dossiers.edit.notice_title"), **external_link_attributes
+ .fr-download
+ %p
+ = link_to notice_url(dossier.procedure), download: "", class: "fr-download__link mr-2", title: t("views.shared.dossiers.edit.notice_title") do
+ = t("views.shared.dossiers.edit.notice")
+ - if dossier.procedure.notice.attached?
+ %span.fr-download__detail
+ = download_details(dossier.procedure.notice)
- - if administrateur_signed_in?
- %em.ml-1.fr-text-mention--grey.visible-on-previous-hover
- %span.fr-icon-feedback-line{ "aria-hidden": "true" }
- = t('shared.ephemeral_link')
+ - if administrateur_signed_in?
+ %span.fr-text--xs.fr-text-mention--grey.visible-on-previous-hover
+ %span.fr-text-action-high--blue-france.fr-icon-questionnaire-line{ "aria-hidden": "true" }
+ = t('shared.ephemeral_link')
- if dossier.show_groupe_instructeur_selector?
%span{ data: { controller: 'autosave' } }
@@ -53,7 +56,7 @@
= f.button t('views.shared.dossiers.edit.submit_dossier'),
name: :submit_draft,
value: true,
- class: 'button send primary',
+ class: 'fr-btn fr-btn--sm',
disabled: !current_user.owns?(dossier),
data: { 'disable-with': "Envoi en cours…" }
diff --git a/app/views/stats/index.html.haml b/app/views/stats/index.html.haml
index 20893ac4c..e3f54b980 100644
--- a/app/views/stats/index.html.haml
+++ b/app/views/stats/index.html.haml
@@ -65,4 +65,4 @@
- if super_admin_signed_in?
%h2.new-h2 Téléchargement
- = link_to "Télécharger les statistiques (CSV)", stats_download_path(format: :csv), class: 'button secondary'
+ = link_to "Télécharger les statistiques (CSV)", stats_download_path(format: :csv), class: 'fr-btn fr-btn-primary mb-4'
diff --git a/app/views/users/_procedure_footer.html.haml b/app/views/users/_procedure_footer.html.haml
index a1d8b1153..3046ececa 100644
--- a/app/views/users/_procedure_footer.html.haml
+++ b/app/views/users/_procedure_footer.html.haml
@@ -81,8 +81,4 @@
.fr-footer__bottom
= render partial: 'users/general_footer_row', locals: { dossier: dossier }
- .fr-footer__bottom-copy
- %p
- Sauf mention contraire, tous les contenus de ce site sont sous
- %a.fr-underlined{ href: "https://github.com/etalab/licence-ouverte/blob/master/LO.md", target:"_blank" } licence etalab-2.0
- %br
+ = render partial: 'shared/footer_copy'
diff --git a/app/views/users/dossiers/_identity_dropdown.html.haml b/app/views/users/dossiers/_identity_dropdown.html.haml
index d814fd0e4..3da4cd863 100644
--- a/app/views/users/dossiers/_identity_dropdown.html.haml
+++ b/app/views/users/dossiers/_identity_dropdown.html.haml
@@ -7,7 +7,7 @@
= render partial: "shared/dossiers/identite_individual", locals: { individual: dossier.individual }
.center
- = link_to t('views.shared.dossiers.demande.edit_identity'), identite_dossier_path(dossier), class: 'button'
+ = link_to t('views.shared.dossiers.demande.edit_identity'), identite_dossier_path(dossier), class: 'fr-btn fr-btn--secondary'
- elsif dossier.etablissement
= render partial: "shared/dossiers/identite_entreprise", locals: { etablissement: dossier.etablissement, short_identity: true, profile: "usager" }
diff --git a/app/views/users/dossiers/_merci.html.haml b/app/views/users/dossiers/_merci.html.haml
index cf978b6db..1b1d9c8de 100644
--- a/app/views/users/dossiers/_merci.html.haml
+++ b/app/views/users/dossiers/_merci.html.haml
@@ -19,8 +19,8 @@
%p.m-2= procedure.active_dossier_submitted_message.message_on_submit_by_usager
.flex.column.align-center
- = link_to t('views.users.dossiers.merci.acces_dossier'), dossier ? dossier_path(dossier) : "#dossier" , class: 'button large primary mt-4'
- = link_to t('views.users.dossiers.merci.submit_dossier'), procedure_lien(procedure), class: 'mt-4'
+ = link_to t('views.users.dossiers.merci.acces_dossier'), dossier ? dossier_path(dossier) : "#dossier" , class: 'fr-btn fr-btn--xl fr-mt-5w'
+ = link_to t('views.users.dossiers.merci.submit_dossier'), procedure_lien(procedure), class: 'fr-btn fr-btn--secondary fr-mt-3w'
.monavis
!= procedure.monavis_embed
diff --git a/app/views/users/dossiers/etablissement.html.haml b/app/views/users/dossiers/etablissement.html.haml
index bbedeb3d2..1245da6dd 100644
--- a/app/views/users/dossiers/etablissement.html.haml
+++ b/app/views/users/dossiers/etablissement.html.haml
@@ -41,5 +41,5 @@
= render partial: 'users/dossiers/etablissement/infos_entreprise', locals: { etablissement: etablissement }
.actions
- = link_to 'Utiliser un autre numéro SIRET', siret_dossier_path(@dossier), class: 'button'
- = link_to 'Continuer avec ces informations', brouillon_dossier_path(@dossier), class: 'button primary'
+ = link_to 'Utiliser un autre numéro SIRET', siret_dossier_path(@dossier), class: 'fr-btn fr-btn--secondary'
+ = link_to 'Continuer avec ces informations', brouillon_dossier_path(@dossier), class: 'fr-btn'
diff --git a/app/views/users/dossiers/identite.html.haml b/app/views/users/dossiers/identite.html.haml
index a88f947ef..977c0bd31 100644
--- a/app/views/users/dossiers/identite.html.haml
+++ b/app/views/users/dossiers/identite.html.haml
@@ -32,4 +32,4 @@
= f.label :birthdate
= f.date_field :birthdate, value: @dossier.individual.birthdate, placeholder: 'format : AAAA-MM-JJ', required: true, class: "small"
- = f.submit t('views.users.dossiers.identite.continue'), class: "button large primary expand"
+ = f.submit t('views.users.dossiers.identite.continue'), class: "fr-btn fr-btn--lg"
diff --git a/app/views/users/dossiers/show/_latest_message.html.haml b/app/views/users/dossiers/show/_latest_message.html.haml
index 6fc81ff8e..278249d3c 100644
--- a/app/views/users/dossiers/show/_latest_message.html.haml
+++ b/app/views/users/dossiers/show/_latest_message.html.haml
@@ -6,6 +6,5 @@
.message.inverted-background
= render Dossiers::MessageComponent.new(commentaire: latest_message, connected_user: current_user)
- = link_to messagerie_dossier_url(dossier, anchor: 'new_commentaire'), class: 'button send' do
- %span.icon.reply
+ = link_to messagerie_dossier_url(dossier, anchor: 'new_commentaire'), class: 'fr-btn fr-btn--icon-left fr-icon-discuss-line' do
= commentaire_answer_action(latest_message, current_user)
diff --git a/app/views/users/dossiers/show/_papertrail.html.haml b/app/views/users/dossiers/show/_papertrail.html.haml
index 9146f6e89..191f8c34b 100644
--- a/app/views/users/dossiers/show/_papertrail.html.haml
+++ b/app/views/users/dossiers/show/_papertrail.html.haml
@@ -1,4 +1,3 @@
-.papertrail.mb-2
- = link_to papertrail_dossier_url(dossier, format: :pdf), class: "button", download: t('.filename'), target: "_blank" do
- %span.icon.justificatif
+.papertrail.center.fr-my-5w
+ = link_to papertrail_dossier_url(dossier, format: :pdf), class: "fr-link", download: t('.filename'), target: "_blank" do
= t('.get_papertrail')
diff --git a/app/views/users/dossiers/update.turbo_stream.haml b/app/views/users/dossiers/update.turbo_stream.haml
index 59eb62452..96f5c3b06 100644
--- a/app/views/users/dossiers/update.turbo_stream.haml
+++ b/app/views/users/dossiers/update.turbo_stream.haml
@@ -1,5 +1,4 @@
-- @dossier.champs.filter(&:conditional?).each do |champ|
- - if champ.visible?
- = turbo_stream.show champ.input_group_id
- - else
- = turbo_stream.hide champ.input_group_id
+- if @to_shows.present?
+ = turbo_stream.show_all(@to_shows)
+- if @to_hides.present?
+ = turbo_stream.hide_all(@to_hides)
diff --git a/app/views/users/dossiers/update_brouillon.turbo_stream.haml b/app/views/users/dossiers/update_brouillon.turbo_stream.haml
deleted file mode 100644
index 59eb62452..000000000
--- a/app/views/users/dossiers/update_brouillon.turbo_stream.haml
+++ /dev/null
@@ -1,5 +0,0 @@
-- @dossier.champs.filter(&:conditional?).each do |champ|
- - if champ.visible?
- = turbo_stream.show champ.input_group_id
- - else
- = turbo_stream.hide champ.input_group_id
diff --git a/app/views/users/sessions/new.html.haml b/app/views/users/sessions/new.html.haml
index f184c9cba..790e1d95a 100644
--- a/app/views/users/sessions/new.html.haml
+++ b/app/views/users/sessions/new.html.haml
@@ -22,11 +22,11 @@
.text-right
= link_to t('views.users.sessions.new.reset_password'), new_user_password_path, class: "link"
- = f.submit t('views.users.sessions.new.connection'), class: "button large primary expand"
+ = f.submit t('views.users.sessions.new.connection'), class: "fr-btn fr-btn--lg"
- if AgentConnectService.enabled?
.france-connect-login-separator
= t('views.shared.france_connect_login.separator')
.center
%h2.important-header.mb-1= t('views.users.sessions.new.state_civil_servant')
- = link_to t('views.users.sessions.new.connect_with_agent_connect'), agent_connect_path, class: "button expend secondary"
+ = link_to t('views.users.sessions.new.connect_with_agent_connect'), agent_connect_path, class: "fr-btn fr-btn--secondary"
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 0f41daaff..1752bd3d3 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -136,7 +136,7 @@ en:
dossiers:
edit:
autosave: Your file is automatically saved after each modification. You can close the window at any time and pick up where you left off later.
- notice: "Notice to the procedure"
+ notice: "Download the notice of the procedure"
notice_title: "To help you complete your file, you can consult the notice to this procedure."
submit_dossier: Submit the file
messages:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index dcdbe74ee..290848b7c 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -47,7 +47,7 @@ fr:
unpublished: Dépubliée
commentaire:
send_message_to_instructeur: "Envoyer un message à l’instructeur"
- reply_in_mailbox: "Répondre dans la messagerie."
+ reply_in_mailbox: "Répondre dans la messagerie"
layouts:
commencer:
no_procedure:
@@ -131,7 +131,7 @@ fr:
dossiers:
edit:
autosave: Votre dossier est enregistré automatiquement après chaque modification. Vous pouvez à tout moment fermer la fenêtre et reprendre plus tard là où vous en étiez.
- notice: Guide de la démarche
+ notice: Télécharger le guide de la démarche
notice_title: "Pour vous aider à remplir votre dossier, vous pouvez consulter le guide de cette démarche."
submit_dossier: Déposer le dossier
messages:
diff --git a/config/locales/models/procedure/en.yml b/config/locales/models/procedure/en.yml
new file mode 100644
index 000000000..faabb27b6
--- /dev/null
+++ b/config/locales/models/procedure/en.yml
@@ -0,0 +1,33 @@
+en:
+ activerecord:
+ models:
+ procedure:
+ one: Procedure
+ other: Procedure
+ attributes:
+ procedure:
+ path: Public link
+ organisation: Service
+ duree_conservation_dossiers_dans_ds: Duration files will be kept
+ max_duree_conservation_dossiers_dans_ds: Max duration allowed to keep files
+ aasm_state/brouillon: Draft
+ aasm_state/publiee: Published
+ aasm_state/close: Close
+ aasm_state/hidden: Destroyed
+ declarative_with_state/en_instruction: Instruction
+ declarative_with_state/accepte: Accepted
+ api_particulier_token: Token API Particulier
+ lien_dpo: DPO contact
+ routing_criteria_name: Routee criteria name
+ errors:
+ models:
+ procedure:
+ attributes:
+ api_particulier_token:
+ invalid: 'invalid format'
+ draft_types_de_champ:
+ format: 'Public field %{message}'
+ draft_types_de_champ_private:
+ format: 'Private field %{message}'
+ lien_dpo:
+ invalid_uri_or_email: "Fill in with an email or a link"
diff --git a/config/locales/models/procedure/fr.yml b/config/locales/models/procedure/fr.yml
index 4ce24f240..83afb7d17 100644
--- a/config/locales/models/procedure/fr.yml
+++ b/config/locales/models/procedure/fr.yml
@@ -18,6 +18,7 @@ fr:
declarative_with_state/accepte: Accepté
api_particulier_token: Jeton API Particulier
lien_dpo: Contact du DPO
+ routing_criteria_name: Nomination du routage
errors:
models:
procedure:
diff --git a/config/locales/views/layouts/_breadcrumb.en.yml b/config/locales/views/layouts/_breadcrumb.en.yml
index fb74a8b05..dfd8fdf86 100644
--- a/config/locales/views/layouts/_breadcrumb.en.yml
+++ b/config/locales/views/layouts/_breadcrumb.en.yml
@@ -5,7 +5,7 @@ en:
you_are_here: "You are here"
show: Show breadcrumb
preview: "Preview the form"
- continue: "Continue >"
+ continue: "Continue"
continue_title: "You can comeback using this link"
created_at: "Created at %{date} - n° %{number}"
closed_at: "Closed at %{date}"
diff --git a/config/locales/views/layouts/_breadcrumb.fr.yml b/config/locales/views/layouts/_breadcrumb.fr.yml
index ca496ba6c..9febfe3fc 100644
--- a/config/locales/views/layouts/_breadcrumb.fr.yml
+++ b/config/locales/views/layouts/_breadcrumb.fr.yml
@@ -5,7 +5,7 @@ fr:
you_are_here: "Vous êtes ici"
show: "Voir le fil d’Ariane"
preview: "Prévisualiser le formulaire"
- continue: "Continuer >"
+ continue: "Continuer"
continue_title: "Vous pourrez revenir ici par la suite"
created_at: "Créée le %{date} - n° %{number}"
closed_at: "Close le %{date}"
diff --git a/config/locales/views/shared/fr.yml b/config/locales/views/shared/fr.yml
index 43f9d124b..4bf06d14c 100644
--- a/config/locales/views/shared/fr.yml
+++ b/config/locales/views/shared/fr.yml
@@ -19,4 +19,4 @@ fr:
already_user_question: 'Vous avez déjà un compte ?'
already_user: 'J’ai déjà un compte'
create: 'Créer un compte'
- signin: 'Connexion'
+ signin: 'Se connecter'
diff --git a/db/migrate/20221006134215_add_index_on_type_to_champs.rb b/db/migrate/20221006134215_add_index_on_type_to_champs.rb
new file mode 100644
index 000000000..f3a2240b8
--- /dev/null
+++ b/db/migrate/20221006134215_add_index_on_type_to_champs.rb
@@ -0,0 +1,7 @@
+class AddIndexOnTypeToChamps < ActiveRecord::Migration[6.1]
+ include Database::MigrationHelpers
+ disable_ddl_transaction!
+ def up
+ add_concurrent_index :champs, [:type]
+ end
+end
diff --git a/db/migrate/20221007134731_fix_clean_migrate_type_de_champs_engagement.rb b/db/migrate/20221007134731_fix_clean_migrate_type_de_champs_engagement.rb
new file mode 100644
index 000000000..010015d93
--- /dev/null
+++ b/db/migrate/20221007134731_fix_clean_migrate_type_de_champs_engagement.rb
@@ -0,0 +1,7 @@
+class FixCleanMigrateTypeDeChampsEngagement < ActiveRecord::Migration[6.1]
+ def change
+ Champ.where(type: "Champs::EngagementChamp").in_batches do |batch|
+ batch.update_all(type: 'Champs::CheckboxChamp')
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 1374cdb79..b99bfb8eb 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 2022_10_06_193737) do
+ActiveRecord::Schema.define(version: 2022_10_07_113737) do
# These are extensions that must be enabled in order to support this database
enable_extension "pgcrypto"
@@ -203,6 +203,7 @@ ActiveRecord::Schema.define(version: 2022_10_06_193737) do
t.index ["parent_id"], name: "index_champs_on_parent_id"
t.index ["private"], name: "index_champs_on_private"
t.index ["row"], name: "index_champs_on_row"
+ t.index ["type"], name: "index_champs_on_type"
t.index ["type_de_champ_id", "dossier_id", "row"], name: "index_champs_on_type_de_champ_id_and_dossier_id_and_row", unique: true
t.index ["type_de_champ_id"], name: "index_champs_on_type_de_champ_id"
end
diff --git a/lib/tasks/deployment/20221006135016_format_iban_champ_values.rake b/lib/tasks/deployment/20221006135016_format_iban_champ_values.rake
new file mode 100644
index 000000000..8e59e83f8
--- /dev/null
+++ b/lib/tasks/deployment/20221006135016_format_iban_champ_values.rake
@@ -0,0 +1,21 @@
+namespace :after_party do
+ desc 'Deployment task: format_iban_champ_values'
+ task format_iban_champ_values: :environment do
+ puts "Running deploy task 'format_iban_champ_values'"
+
+ champs = Champs::IbanChamp.where.not(value: nil)
+ progress = ProgressReport.new(champs.count)
+ champs.find_each do |champ|
+ # format IBAN value
+ champ.validate
+ champ.update_column(:value, champ.value)
+ progress.inc
+ end
+ progress.finish
+
+ # Update task as completed. If you remove the line below, the task will
+ # run with every deploy (or every time you call after_party:run).
+ AfterParty::TaskRecord
+ .create version: AfterParty::TaskRecorder.new(__FILE__).timestamp
+ end
+end
diff --git a/lib/tasks/deployment/20221011071912_backfill_procedure_routing_criteria_name.rake b/lib/tasks/deployment/20221011071912_backfill_procedure_routing_criteria_name.rake
new file mode 100644
index 000000000..31d6ffed2
--- /dev/null
+++ b/lib/tasks/deployment/20221011071912_backfill_procedure_routing_criteria_name.rake
@@ -0,0 +1,20 @@
+namespace :after_party do
+ desc 'Deployment task: backfill_procedure_routing_criteria_name'
+ task backfill_procedure_routing_criteria_name: :environment do
+ puts "Running deploy task 'backfill_procedure_routing_criteria_name'"
+
+ # Put your task implementation HERE.
+ procedure_without_routing_criteria_name = Procedure.where(routing_criteria_name: nil)
+ progress = ProgressReport.new(procedure_without_routing_criteria_name.count)
+ procedure_without_routing_criteria_name.in_batches do |relation|
+ count = relation.count
+ relation.update_all(routing_criteria_name: 'Votre ville')
+ progress.inc(count)
+ end
+ progress.finish
+ # Update task as completed. If you remove the line below, the task will
+ # run with every deploy (or every time you call after_party:run).
+ AfterParty::TaskRecord
+ .create version: AfterParty::TaskRecorder.new(__FILE__).timestamp
+ end
+end
diff --git a/lib/tasks/deployment/20221011075758_backfill_procedure_routing_criteria_name_blank.rake b/lib/tasks/deployment/20221011075758_backfill_procedure_routing_criteria_name_blank.rake
new file mode 100644
index 000000000..9be562868
--- /dev/null
+++ b/lib/tasks/deployment/20221011075758_backfill_procedure_routing_criteria_name_blank.rake
@@ -0,0 +1,16 @@
+namespace :after_party do
+ desc 'Deployment task: backfill_procedure_routing_criteria_name_blank'
+ task backfill_procedure_routing_criteria_name_blank: :environment do
+ puts "Running deploy task 'backfill_procedure_routing_criteria_name_blank'"
+
+ # Put your task implementation HERE.
+ Procedure.pluck(:id, :routing_criteria_name)
+ .filter { |_id, r| r.blank? }
+ .map { |id, _r| Procedure.find(id).update(routing_criteria_name: 'Votre ville') }
+
+ # Update task as completed. If you remove the line below, the task will
+ # run with every deploy (or every time you call after_party:run).
+ AfterParty::TaskRecord
+ .create version: AfterParty::TaskRecorder.new(__FILE__).timestamp
+ end
+end
diff --git a/package.json b/package.json
index 5174f0989..e27f0e6f6 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
"tiny-invariant": "^1.2.0",
"trix": "^1.2.3",
"turbo-polyfills": "^0.3.0",
+ "use-debounce": "^8.0.4",
"whatwg-fetch": "^3.0.0",
"yet-another-abortcontroller-polyfill": "^0.0.4",
"zod": "^3.17.10"
diff --git a/spec/controllers/administrateurs/procedures_controller_spec.rb b/spec/controllers/administrateurs/procedures_controller_spec.rb
index 7530ea0d0..f5a03b132 100644
--- a/spec/controllers/administrateurs/procedures_controller_spec.rb
+++ b/spec/controllers/administrateurs/procedures_controller_spec.rb
@@ -6,7 +6,6 @@ describe Administrateurs::ProceduresController, type: :controller do
let(:libelle) { 'Démarche de test' }
let(:description) { 'Description de test' }
let(:organisation) { 'Organisation de test' }
- let(:direction) { 'Direction de test' }
let(:ministere) { create(:zone) }
let(:cadre_juridique) { 'cadre juridique' }
let(:duree_conservation_dossiers_dans_ds) { 3 }
@@ -52,7 +51,6 @@ describe Administrateurs::ProceduresController, type: :controller do
libelle: libelle,
description: description,
organisation: organisation,
- direction: direction,
ministere: ministere,
cadre_juridique: cadre_juridique,
duree_conservation_dossiers_dans_ds: duree_conservation_dossiers_dans_ds,
@@ -206,7 +204,6 @@ describe Administrateurs::ProceduresController, type: :controller do
it { expect(subject.libelle).to eq(libelle) }
it { expect(subject.description).to eq(description) }
it { expect(subject.organisation).to eq(organisation) }
- it { expect(subject.direction).to eq(direction) }
it { expect(subject.administrateurs).to eq([admin]) }
it { expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) }
end
@@ -276,7 +273,6 @@ describe Administrateurs::ProceduresController, type: :controller do
let(:libelle) { 'Blable' }
let(:description) { 'blabla' }
let(:organisation) { 'plop' }
- let(:direction) { 'plap' }
let(:duree_conservation_dossiers_dans_ds) { 7 }
let(:procedure_expires_when_termine_enabled) { true }
@@ -288,7 +284,6 @@ describe Administrateurs::ProceduresController, type: :controller do
it { expect(subject.libelle).to eq(libelle) }
it { expect(subject.description).to eq(description) }
it { expect(subject.organisation).to eq(organisation) }
- it { expect(subject.direction).to eq(direction) }
it { expect(subject.duree_conservation_dossiers_dans_ds).to eq(duree_conservation_dossiers_dans_ds) }
it { expect(subject.procedure_expires_when_termine_enabled).to eq(true) }
end
@@ -330,8 +325,6 @@ describe Administrateurs::ProceduresController, type: :controller do
it { expect(subject.libelle).to eq procedure_params[:libelle] }
it { expect(subject.description).to eq procedure_params[:description] }
it { expect(subject.organisation).to eq procedure_params[:organisation] }
- it { expect(subject.direction).to eq procedure_params[:direction] }
-
it { expect(subject.for_individual).not_to eq procedure_params[:for_individual] }
end
end
diff --git a/spec/controllers/api/v1/procedures_controller_spec.rb b/spec/controllers/api/v1/procedures_controller_spec.rb
index 9410920ed..ab48cf54c 100644
--- a/spec/controllers/api/v1/procedures_controller_spec.rb
+++ b/spec/controllers/api/v1/procedures_controller_spec.rb
@@ -34,8 +34,8 @@ describe API::V1::ProceduresController, type: :controller do
it { expect(subject[:label]).to eq(procedure.libelle) }
it { expect(subject[:description]).to eq(procedure.description) }
it { expect(subject[:organisation]).to eq(procedure.organisation) }
- it { expect(subject[:direction]).to eq(procedure.direction) }
it { expect(subject[:archived_at]).to eq(procedure.closed_at) }
+ it { expect(subject[:direction]).to eq("") }
it { expect(subject[:total_dossier]).to eq(procedure.total_dossier) }
it { is_expected.to have_key(:types_de_champ) }
it { expect(subject[:types_de_champ]).to be_an(Array) }
diff --git a/spec/factories/procedure.rb b/spec/factories/procedure.rb
index 04acc4316..84984ac04 100644
--- a/spec/factories/procedure.rb
+++ b/spec/factories/procedure.rb
@@ -5,7 +5,6 @@ FactoryBot.define do
sequence(:libelle) { |n| "Procedure #{n}" }
description { "Demande de subvention à l'intention des associations" }
organisation { "Orga DINUM" }
- direction { "direction DINUM" }
cadre_juridique { "un cadre juridique important" }
published_at { nil }
duree_conservation_dossiers_dans_ds { 3 }
diff --git a/spec/models/champs/iban_champ_spec.rb b/spec/models/champs/iban_champ_spec.rb
index ed7619e34..971c27526 100644
--- a/spec/models/champs/iban_champ_spec.rb
+++ b/spec/models/champs/iban_champ_spec.rb
@@ -6,6 +6,13 @@ describe Champs::IbanChamp do
expect(build(:champ_iban, value: "FR7630006000011234567890189")).to be_valid
expect(build(:champ_iban, value: "FR76 3000 6000 0112 3456 7890 189")).to be_valid
expect(build(:champ_iban, value: "FR76 3000 6000 0112 3456 7890 189DSF")).to_not be_valid
+ expect(build(:champ_iban, value: "FR76 3000 6000 0112 3456 7890 189")).to be_valid
+ end
+
+ it 'format value after validation' do
+ champ = build(:champ_iban, value: "FR76 3000 6000 0112 3456 7890 189")
+ champ.valid?
+ expect(champ.value).to eq("FR76 3000 6000 0112 3456 7890 189")
end
end
end
diff --git a/spec/models/dossier_preloader_spec.rb b/spec/models/dossier_preloader_spec.rb
new file mode 100644
index 000000000..f1de07b97
--- /dev/null
+++ b/spec/models/dossier_preloader_spec.rb
@@ -0,0 +1,37 @@
+describe DossierPreloader do
+ let(:types_de_champ) do
+ [
+ { type: :text },
+ { type: :repetition, children: [{ type: :text }] }
+ ]
+ end
+ let(:procedure) { create(:procedure, types_de_champ_public: types_de_champ) }
+ let(:dossier) { create(:dossier, procedure: procedure) }
+ let(:repetition) { subject.champs.second }
+ let(:first_child) { subject.champs.second.champs.first }
+
+ describe 'all' do
+ subject { DossierPreloader.load_one(dossier) }
+
+ before { subject }
+
+ it do
+ count = 0
+
+ callback = lambda { |*_args| count += 1 }
+ ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
+ expect(subject.id).to eq(dossier.id)
+ expect(subject.champs.size).to eq(types_de_champ.size)
+ expect(subject.changed?).to be false
+
+ expect(first_child.type).to eq('Champs::TextChamp')
+ expect(repetition.id).not_to eq(first_child.id)
+ expect(subject.champs.first.dossier).to eq(subject)
+ expect(subject.champs.first.type_de_champ.piece_justificative_template.attached?).to eq(false)
+ expect(first_child.parent).to eq(repetition)
+ end
+
+ expect(count).to eq(0)
+ end
+ end
+end
diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb
index 06a48df62..6e8ec901b 100644
--- a/spec/models/dossier_spec.rb
+++ b/spec/models/dossier_spec.rb
@@ -597,14 +597,13 @@ describe Dossier do
end
end
- describe '.downloadable_sorted' do
+ describe '.ordered_for_export' do
let(:procedure) { create(:procedure) }
- let!(:dossier) { create(:dossier, :with_entreprise, procedure: procedure, state: Dossier.states.fetch(:brouillon)) }
let!(:dossier2) { create(:dossier, :with_entreprise, procedure: procedure, state: Dossier.states.fetch(:en_construction), depose_at: Time.zone.parse('03/01/2010')) }
let!(:dossier3) { create(:dossier, :with_entreprise, procedure: procedure, state: Dossier.states.fetch(:en_instruction), depose_at: Time.zone.parse('01/01/2010')) }
let!(:dossier4) { create(:dossier, :with_entreprise, procedure: procedure, state: Dossier.states.fetch(:en_instruction), archived: true, depose_at: Time.zone.parse('02/01/2010')) }
- subject { procedure.dossiers.downloadable_sorted }
+ subject { procedure.dossiers.ordered_for_export }
it { is_expected.to match([dossier3, dossier4, dossier2]) }
end
diff --git a/spec/models/dubious_procedure_spec.rb b/spec/models/dubious_procedure_spec.rb
index a9bd58880..994c397a4 100644
--- a/spec/models/dubious_procedure_spec.rb
+++ b/spec/models/dubious_procedure_spec.rb
@@ -17,7 +17,8 @@ describe DubiousProcedure, type: :model do
it 'returns dubious procedures' do
expect(subject.first.id).to eq(procedure.id)
expect(subject.first.libelle).to eq(procedure.libelle)
- expect(subject.first.dubious_champs).to eq("num de securite sociale, stp - t'aurais une carte bancaire ?")
+ expect(subject.first.dubious_champs).to include("num de securite sociale, stp")
+ expect(subject.first.dubious_champs).to include("t'aurais une carte bancaire ?")
end
context 'and a whitelisted procedure' do
diff --git a/spec/models/export_spec.rb b/spec/models/export_spec.rb
index d06371042..f902cd25e 100644
--- a/spec/models/export_spec.rb
+++ b/spec/models/export_spec.rb
@@ -67,16 +67,23 @@ RSpec.describe Export, type: :model do
end
describe '.dossiers_for_export' do
- let!(:procedure) { create(:procedure, :published) }
+ let!(:procedure) { create(:procedure, :published, :with_instructeur) }
let!(:dossier_brouillon) { create(:dossier, :brouillon, procedure: procedure) }
let!(:dossier_en_construction) { create(:dossier, :en_construction, procedure: procedure) }
let!(:dossier_en_instruction) { create(:dossier, :en_instruction, procedure: procedure) }
let!(:dossier_accepte) { create(:dossier, :accepte, procedure: procedure) }
- let(:export) { create(:export, groupe_instructeurs: [procedure.groupe_instructeurs.first]) }
+ let(:export) do
+ create(:export,
+ groupe_instructeurs: [procedure.groupe_instructeurs.first],
+ procedure_presentation: procedure_presentation,
+ statut: statut)
+ end
context 'without procedure_presentation or since' do
+ let(:procedure_presentation) { nil }
+ let(:statut) { nil }
it 'does not includes brouillons' do
expect(export.send(:dossiers_for_export)).to include(dossier_en_construction)
expect(export.send(:dossiers_for_export)).to include(dossier_en_instruction)
@@ -84,5 +91,19 @@ RSpec.describe Export, type: :model do
expect(export.send(:dossiers_for_export)).not_to include(dossier_brouillon)
end
end
+
+ context 'with procedure_presentation and statut supprimes_recemment' do
+ let(:statut) { 'supprimes_recemment' }
+ let(:procedure_presentation) do
+ create(:procedure_presentation,
+ procedure: procedure,
+ assign_to: procedure.groupe_instructeurs.first.assign_tos.first)
+ end
+ let!(:dossier_recemment_supprime) { create(:dossier, :accepte, procedure: procedure, hidden_by_administration_at: 2.days.ago) }
+
+ it 'includes supprimes_recemment' do
+ expect(export.send(:dossiers_for_export)).to include(dossier_recemment_supprime)
+ end
+ end
end
end
diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb
index 69063f825..8080cec63 100644
--- a/spec/models/procedure_spec.rb
+++ b/spec/models/procedure_spec.rb
@@ -908,7 +908,15 @@ describe Procedure do
end
context "published procedure" do
- let(:procedure) { create(:procedure, :published, attestation_template: create(:attestation_template), dossier_submitted_message: create(:dossier_submitted_message)) }
+ let(:procedure) do
+ create(
+ :procedure,
+ :published,
+ attestation_template: create(:attestation_template),
+ dossier_submitted_message: create(:dossier_submitted_message),
+ types_de_champ_public: [{ type: :text, libelle: 'published tdc' }]
+ )
+ end
it "should reset draft revision" do
procedure.draft_revision.add_type_de_champ(tdc_attributes)
@@ -924,6 +932,16 @@ describe Procedure do
expect(procedure.draft_revision.attestation_template).to eq(previous_attestation_template)
expect(procedure.draft_revision.dossier_submitted_message).to eq(previous_dossier_submitted_message)
end
+
+ it "should erase orphan tdc" do
+ published_tdc = procedure.published_revision.types_de_champ.first
+ draft_tdc = procedure.draft_revision.add_type_de_champ(tdc_attributes)
+
+ procedure.reset_draft_revision!
+
+ expect { published_tdc.reload }.not_to raise_error(ActiveRecord::RecordNotFound)
+ expect { draft_tdc.reload }.to raise_error(ActiveRecord::RecordNotFound)
+ end
end
end
diff --git a/spec/system/sessions/sign_in_spec.rb b/spec/system/sessions/sign_in_spec.rb
index bc68e01f6..85eade136 100644
--- a/spec/system/sessions/sign_in_spec.rb
+++ b/spec/system/sessions/sign_in_spec.rb
@@ -4,7 +4,7 @@ describe 'Signin in:' do
scenario 'an existing user can sign-in' do
visit root_path
- click_on 'Connexion'
+ click_on 'Se connecter', match: :first
sign_in_with user.email, 'invalid-password'
expect(page).to have_content 'Courriel ou mot de passe incorrect.'
@@ -16,7 +16,7 @@ describe 'Signin in:' do
scenario 'an existing user can lock its account' do
visit root_path
- click_on 'Connexion'
+ click_on 'Se connecter', match: :first
5.times { sign_in_with user.email, 'bad password' }
expect(user.reload.access_locked?).to be false
@@ -60,7 +60,7 @@ describe 'Signin in:' do
# For now only test the default behavior (an error message is displayed).
scenario 'they get an error message' do
visit root_path
- click_on 'Connexion'
+ click_on 'Se connecter', match: :first
sign_in_with user.email, password
expect(page).to have_content('Vous devez confirmer votre compte par courriel.')
diff --git a/spec/system/users/managing_password_spec.rb b/spec/system/users/managing_password_spec.rb
index e7dc21e8b..bb77ddd6f 100644
--- a/spec/system/users/managing_password_spec.rb
+++ b/spec/system/users/managing_password_spec.rb
@@ -6,7 +6,7 @@ describe 'Managing password:', js: true do
scenario 'a simple user can reset their password' do
visit root_path
within('.fr-header .fr-container .fr-header__tools .fr-btns-group') do
- click_on 'Connexion'
+ click_on 'Se connecter'
end
click_on 'Mot de passe oublié ?'
expect(page).to have_current_path(new_user_password_path)
@@ -37,7 +37,7 @@ describe 'Managing password:', js: true do
scenario 'an admin can reset their password', js: true do
visit root_path
within('.fr-header .fr-container .fr-header__tools .fr-btns-group') do
- click_on 'Connexion'
+ click_on 'Se connecter'
end
click_on 'Mot de passe oublié ?'
expect(page).to have_current_path(new_user_password_path)
diff --git a/spec/views/users/dossiers/brouillon.html.haml_spec.rb b/spec/views/users/dossiers/brouillon.html.haml_spec.rb
index 95d85a035..87b0c048b 100644
--- a/spec/views/users/dossiers/brouillon.html.haml_spec.rb
+++ b/spec/views/users/dossiers/brouillon.html.haml_spec.rb
@@ -19,8 +19,9 @@ describe 'users/dossiers/brouillon.html.haml', type: :view do
end
it 'affiche un lien vers la notice' do
- expect(response).to have_css("a[href*='/rails/active_storage/blobs/']", text: "Guide de la démarche")
+ expect(response).to have_css("a[href*='/rails/active_storage/blobs/']", text: "Télécharger le guide de la démarche")
expect(rendered).not_to have_text("Ce lien est éphémère")
+ expect(rendered).to have_text("TXT – 11 octets")
end
it 'affiche les boutons de validation' do
@@ -33,7 +34,7 @@ describe 'users/dossiers/brouillon.html.haml', type: :view do
context 'quand la démarche ne comporte pas de notice' do
let(:procedure) { create(:procedure) }
- it { is_expected.not_to have_link("Guide de la démarche") }
+ it { is_expected.not_to have_link("Télécharger le guide de la démarche") }
end
end
diff --git a/yarn.lock b/yarn.lock
index 2faa026cb..17f92bac1 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4238,6 +4238,11 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
+use-debounce@^8.0.4:
+ version "8.0.4"
+ resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-8.0.4.tgz#27e93b2f010bd0b8ad06e9fc7de891d9ee5d6b8e"
+ integrity sha512-fGqsYQzl8kLHF2QpQSgIwgOgJmnh6j5L6SIzQiHdLfwp3q1egUL3btq5Bg2SJysH6A0ILLgT2IqXZKoNJr0nFw==
+
uuid@^3.3.2:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"