diff --git a/Gemfile.lock b/Gemfile.lock
index 3f1773f27..a8828c385 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -253,7 +253,7 @@ GEM
i18n (>= 0.7)
multi_json
request_store (>= 1.0)
- graphql (1.10.6)
+ graphql (1.10.9)
graphql-batch (0.4.2)
graphql (>= 1.3, < 2)
promise.rb (~> 0.7.2)
diff --git a/app/assets/images/marianne.svg b/app/assets/images/marianne.svg
index 8ed835709..9690583ea 100644
--- a/app/assets/images/marianne.svg
+++ b/app/assets/images/marianne.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/assets/images/republique-francaise-logo.svg b/app/assets/images/republique-francaise-logo.svg
new file mode 100644
index 000000000..0f1cd3d4c
--- /dev/null
+++ b/app/assets/images/republique-francaise-logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/assets/stylesheets/left_panel.scss b/app/assets/stylesheets/left_panel.scss
index e35b6494f..99898800f 100644
--- a/app/assets/stylesheets/left_panel.scss
+++ b/app/assets/stylesheets/left_panel.scss
@@ -81,6 +81,10 @@
margin: 5px auto 0 20px;
width: 150px;
}
+
+ img {
+ background-color: #FFFFFF;
+ }
}
#action-block {
diff --git a/app/assets/stylesheets/new_design/new_footer.scss b/app/assets/stylesheets/new_design/new_footer.scss
index 1c39e723d..c64c24d50 100644
--- a/app/assets/stylesheets/new_design/new_footer.scss
+++ b/app/assets/stylesheets/new_design/new_footer.scss
@@ -84,6 +84,13 @@ footer {
height: 25px;
}
+.footer-logo-france {
+ @include ie-compatible-background-image("republique-francaise-logo.svg");
+
+ width: 105px;
+ height: 90px;
+}
+
.footer-link a,
.footer-text a {
color: $black;
diff --git a/app/helpers/champ_helper.rb b/app/helpers/champ_helper.rb
index 36416f759..da0d45927 100644
--- a/app/helpers/champ_helper.rb
+++ b/app/helpers/champ_helper.rb
@@ -33,7 +33,7 @@ module ChampHelper
end
def auto_attach_url(form, object)
- if feature_enabled?(:autoupload_dossier_attachments) && object.is_a?(Champ) && object.persisted? && object.public?
+ if object.is_a?(Champ) && object.persisted? && object.public?
champs_piece_justificative_url(object.id)
end
end
diff --git a/app/javascript/components/MapEditor/index.js b/app/javascript/components/MapEditor/index.js
index 2f2e0d2b3..aa329b524 100644
--- a/app/javascript/components/MapEditor/index.js
+++ b/app/javascript/components/MapEditor/index.js
@@ -23,7 +23,9 @@ function filterFeatureCollection(featureCollection, source) {
};
}
-const MapEditor = ({ featureCollection, url }) => {
+function noop() {}
+
+function MapEditor({ featureCollection, url, preview }) {
const drawControl = useRef(null);
const [style, setStyle] = useState('ortho');
const [coords, setCoords] = useState([1.7, 46.9]);
@@ -174,9 +176,9 @@ const MapEditor = ({ featureCollection, url }) => {
/>
{
>
);
-};
+}
MapEditor.propTypes = {
featureCollection: PropTypes.shape({
@@ -210,7 +212,8 @@ MapEditor.propTypes = {
features: PropTypes.array,
id: PropTypes.number
}),
- url: PropTypes.string
+ url: PropTypes.string,
+ preview: PropTypes.bool
};
export default MapEditor;
diff --git a/app/models/champ.rb b/app/models/champ.rb
index 7f2974db0..eae3ac82b 100644
--- a/app/models/champ.rb
+++ b/app/models/champ.rb
@@ -44,7 +44,7 @@ class Champ < ApplicationRecord
def blank?
case type_de_champ.type_champ
when TypeDeChamp.type_champs.fetch(:carte)
- value.blank? || value == '[]'
+ geo_areas.blank? || value == '[]'
else
value.blank?
end
diff --git a/app/models/procedure.rb b/app/models/procedure.rb
index e42bb4954..5da6426ad 100644
--- a/app/models/procedure.rb
+++ b/app/models/procedure.rb
@@ -506,7 +506,7 @@ class Procedure < ApplicationRecord
if logo.attached?
Rails.application.routes.url_helpers.url_for(logo)
else
- ActionController::Base.helpers.image_url("marianne.svg")
+ ActionController::Base.helpers.image_url("republique-francaise-logo.svg")
end
end
diff --git a/app/views/layouts/_new_header.haml b/app/views/layouts/_new_header.haml
index aba320f21..7967eca97 100644
--- a/app/views/layouts/_new_header.haml
+++ b/app/views/layouts/_new_header.haml
@@ -14,12 +14,13 @@
%header.new-header{ class: current_page?(root_path) ? nil : "new-header-with-border", role: 'banner' }
.header-inner-content
- .flex.align-center
+ .flex.align-center.justify-center
- if params[:controller] == 'users/commencer'
= link_to 'Revenir en arrière', url_for(:back), class: "button", title: "Revenir sur le site de mon administration"
- else
- = link_to root_path_for_profile(nav_bar_profile), class: 'header-logo', title: "Aller à la page d'accueil de demarches-simplifiees.fr" do
- = image_tag 'marianne.svg', alt: '', width: 65
+ = link_to root_path_for_profile(nav_bar_profile), class: 'header-logo justify-center', title: "Aller à la page d'accueil de demarches-simplifiees.fr" do
+ = image_tag 'marianne.svg', alt: 'Liberté, égalité, fraternité', width: '65px'
+ = link_to root_path_for_profile(nav_bar_profile), class: 'header-logo justify-center', title: "Aller à la page d'accueil de demarches-simplifiees.fr" do
%span.big.site-title> demarches-simplifiees.fr
%span.small.site-title> d-s.fr
diff --git a/app/views/root/_footer.html.haml b/app/views/root/_footer.html.haml
index 038e565a6..6e41eb4aa 100644
--- a/app/views/root/_footer.html.haml
+++ b/app/views/root/_footer.html.haml
@@ -15,6 +15,7 @@
%span.footer-logo.footer-logo-dinum{ role: 'img', 'aria-label': 'DINUM' }
= link_to "https://beta.gouv.fr", title: "le site de Beta.gouv.fr" do
%span.footer-logo.footer-logo-beta-gouv-fr{ role: 'img', 'aria-label': 'beta.gouv.fr' }
+ %span.footer-logo.footer-logo-france{ role: 'img', 'aria-label': 'République Française' }
%li.footer-column
%ul.footer-links
diff --git a/app/views/shared/dossiers/editable_champs/_carte.html.haml b/app/views/shared/dossiers/editable_champs/_carte.html.haml
index 4464306f9..73e511e40 100644
--- a/app/views/shared/dossiers/editable_champs/_carte.html.haml
+++ b/app/views/shared/dossiers/editable_champs/_carte.html.haml
@@ -1,5 +1,6 @@
- if feature_enabled?(:new_map_editor)
- = react_component("MapEditor", { featureCollection: champ.to_feature_collection, url: champs_carte_features_path(champ) }, class: "carte-#{champ.id}")
+ - preview = !champ.persisted?
+ = react_component("MapEditor", { featureCollection: champ.to_feature_collection, url: champs_carte_features_path(preview ? 'preview' : champ), preview: preview }, class: "carte-#{champ.id}")
- else
.toolbar
%button.button.primary.new-area Ajouter une zone
diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb
index 14bb0105a..f7408c231 100644
--- a/config/initializers/flipper.rb
+++ b/config/initializers/flipper.rb
@@ -31,7 +31,6 @@ features = [
:insee_api_v3,
:instructeur_bypass_email_login_token,
:autosave_dossier_draft,
- :autoupload_dossier_attachments,
:new_map_editor,
:maintenance_mode,
:mini_profiler,
diff --git a/spec/features/users/brouillon_spec.rb b/spec/features/users/brouillon_spec.rb
index cd992974f..8b6a02d2d 100644
--- a/spec/features/users/brouillon_spec.rb
+++ b/spec/features/users/brouillon_spec.rb
@@ -165,114 +165,77 @@ feature 'The user' do
create(:procedure, :published, :for_individual, types_de_champ: tdcs)
end
- scenario 'adding, replacing and removing attachments', js: true do
- log_in(user, procedure_with_pj)
+ scenario 'add an attachment', js: true do
+ log_in(user, procedure_with_pjs)
fill_individual
- # Add an attachment
- find_field('Pièce justificative').attach_file(Rails.root + 'spec/fixtures/files/file.pdf')
- click_on 'Enregistrer le brouillon'
- expect(page).to have_content('Votre brouillon a bien été sauvegardé')
+ # Add attachments
+ find_field('Pièce justificative 1').attach_file(Rails.root + 'spec/fixtures/files/file.pdf')
+ find_field('Pièce justificative 2').attach_file(Rails.root + 'spec/fixtures/files/RIB.pdf')
+
+ # Expect the files to be uploaded immediately
+ expect(page).to have_text('analyse antivirus en cours', count: 2)
expect(page).to have_text('file.pdf')
- expect(page).to have_text('analyse antivirus en cours')
-
- # Mark file as scanned and clean
- attachment = ActiveStorage::Attachment.last
- attachment.blob.update(metadata: attachment.blob.metadata.merge(scanned_at: Time.zone.now, virus_scan_result: ActiveStorage::VirusScanner::SAFE))
- within('.attachment') { click_on 'rafraichir' }
- expect(page).to have_link('file.pdf')
- expect(page).to have_no_content('analyse antivirus en cours')
-
- # Replace the attachment
- within('.attachment') { click_on 'Remplacer' }
- find_field('Pièce justificative').attach_file(Rails.root + 'spec/fixtures/files/RIB.pdf')
- click_on 'Enregistrer le brouillon'
- expect(page).to have_no_text('file.pdf')
expect(page).to have_text('RIB.pdf')
- # Remove the attachment
- within('.attachment') { click_on 'Supprimer' }
- expect(page).to have_content('La pièce jointe a bien été supprimée')
- expect(page).to have_no_text('RIB.pdf')
+ # Expect the submit buttons to be enabled
+ expect(page).to have_button('Enregistrer le brouillon', disabled: false)
+ expect(page).to have_button('Déposer le dossier', disabled: false)
+
+ # Reload the current page
+ visit current_path
+
+ # Expect the files to have been saved on the dossier
+ expect(page).to have_text('file.pdf')
+ expect(page).to have_text('RIB.pdf')
end
- context 'when the auto-uploads of attachments is enabled' do
- before do
- Flipper.enable_actor(:autoupload_dossier_attachments, user)
- end
+ # TODO: once we're running on Rails 6, re-enable the validator on PieceJustificativeChamp,
+ # and unmark this spec as pending.
+ #
+ # See piece_justificative_champ.rb
+ # See https://github.com/betagouv/demarches-simplifiees.fr/issues/4926
+ scenario 'add an invalid attachment', js: true, pending: true do
+ log_in(user, procedure_with_pjs)
+ fill_individual
- scenario 'add an attachment', js: true do
- log_in(user, procedure_with_pjs)
- fill_individual
+ # Test invalid file type
+ attach_file('Pièce justificative 1', Rails.root + 'spec/fixtures/files/invalid_file_format.json')
+ expect(page).to have_text('La pièce justificative n’est pas d’un type accepté')
+ expect(page).to have_no_button('Ré-essayer', visible: true)
- # Add attachments
- find_field('Pièce justificative 1').attach_file(Rails.root + 'spec/fixtures/files/file.pdf')
- find_field('Pièce justificative 2').attach_file(Rails.root + 'spec/fixtures/files/RIB.pdf')
+ # Replace the file by another with a valid type
+ attach_file('Pièce justificative 1', Rails.root + 'spec/fixtures/files/piece_justificative_0.pdf')
+ expect(page).to have_no_text('La pièce justificative n’est pas d’un type accepté')
+ expect(page).to have_text('analyse antivirus en cours')
+ expect(page).to have_text('piece_justificative_0.pdf')
+ end
- # Expect the files to be uploaded immediately
- expect(page).to have_text('analyse antivirus en cours', count: 2)
- expect(page).to have_text('file.pdf')
- expect(page).to have_text('RIB.pdf')
+ scenario 'retry on transcient upload error', js: true do
+ log_in(user, procedure_with_pjs)
+ fill_individual
- # Expect the submit buttons to be enabled
- expect(page).to have_button('Enregistrer le brouillon', disabled: false)
- expect(page).to have_button('Déposer le dossier', disabled: false)
+ # Test auto-upload failure
+ logout(:user) # Make the subsequent auto-upload request fail
+ attach_file('Pièce justificative 1', Rails.root + 'spec/fixtures/files/file.pdf')
+ expect(page).to have_text('Une erreur s’est produite pendant l’envoi du fichier')
+ expect(page).to have_button('Ré-essayer', visible: true)
+ expect(page).to have_button('Enregistrer le brouillon', disabled: false)
+ expect(page).to have_button('Déposer le dossier', disabled: false)
- # Reload the current page
- visit current_path
+ # Test that retrying after a failure works
+ login_as(user, scope: :user) # Make the auto-upload request work again
+ click_on('Ré-essayer', visible: true)
+ expect(page).to have_text('analyse antivirus en cours')
+ expect(page).to have_text('file.pdf')
+ expect(page).to have_button('Enregistrer le brouillon', disabled: false)
+ expect(page).to have_button('Déposer le dossier', disabled: false)
- # Expect the files to have been saved on the dossier
- expect(page).to have_text('file.pdf')
- expect(page).to have_text('RIB.pdf')
- end
+ # Reload the current page
+ visit current_path
- # TODO: once we're running on Rails 6, re-enable the validator on PieceJustificativeChamp,
- # and unmark this spec as pending.
- #
- # See piece_justificative_champ.rb
- # See https://github.com/betagouv/demarches-simplifiees.fr/issues/4926
- scenario 'add an invalid attachment', js: true, pending: true do
- log_in(user, procedure_with_pjs)
- fill_individual
-
- # Test invalid file type
- attach_file('Pièce justificative 1', Rails.root + 'spec/fixtures/files/invalid_file_format.json')
- expect(page).to have_text('La pièce justificative n’est pas d’un type accepté')
- expect(page).to have_no_button('Ré-essayer', visible: true)
-
- # Replace the file by another with a valid type
- attach_file('Pièce justificative 1', Rails.root + 'spec/fixtures/files/piece_justificative_0.pdf')
- expect(page).to have_no_text('La pièce justificative n’est pas d’un type accepté')
- expect(page).to have_text('analyse antivirus en cours')
- expect(page).to have_text('piece_justificative_0.pdf')
- end
-
- scenario 'retry on transcient upload error', js: true do
- log_in(user, procedure_with_pjs)
- fill_individual
-
- # Test auto-upload failure
- logout(:user) # Make the subsequent auto-upload request fail
- attach_file('Pièce justificative 1', Rails.root + 'spec/fixtures/files/file.pdf')
- expect(page).to have_text('Une erreur s’est produite pendant l’envoi du fichier')
- expect(page).to have_button('Ré-essayer', visible: true)
- expect(page).to have_button('Enregistrer le brouillon', disabled: false)
- expect(page).to have_button('Déposer le dossier', disabled: false)
-
- # Test that retrying after a failure works
- login_as(user, scope: :user) # Make the auto-upload request work again
- click_on('Ré-essayer', visible: true)
- expect(page).to have_text('analyse antivirus en cours')
- expect(page).to have_text('file.pdf')
- expect(page).to have_button('Enregistrer le brouillon', disabled: false)
- expect(page).to have_button('Déposer le dossier', disabled: false)
-
- # Reload the current page
- visit current_path
-
- # Expect the file to have been saved on the dossier
- expect(page).to have_text('file.pdf')
- end
+ # Expect the file to have been saved on the dossier
+ expect(page).to have_text('file.pdf')
end
context 'when the draft autosave is enabled' do