commit
ee6ec9a4f5
14 changed files with 90 additions and 110 deletions
|
@ -253,7 +253,7 @@ GEM
|
||||||
i18n (>= 0.7)
|
i18n (>= 0.7)
|
||||||
multi_json
|
multi_json
|
||||||
request_store (>= 1.0)
|
request_store (>= 1.0)
|
||||||
graphql (1.10.6)
|
graphql (1.10.9)
|
||||||
graphql-batch (0.4.2)
|
graphql-batch (0.4.2)
|
||||||
graphql (>= 1.3, < 2)
|
graphql (>= 1.3, < 2)
|
||||||
promise.rb (~> 0.7.2)
|
promise.rb (~> 0.7.2)
|
||||||
|
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 5.6 KiB |
1
app/assets/images/republique-francaise-logo.svg
Normal file
1
app/assets/images/republique-francaise-logo.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 14 KiB |
|
@ -81,6 +81,10 @@
|
||||||
margin: 5px auto 0 20px;
|
margin: 5px auto 0 20px;
|
||||||
width: 150px;
|
width: 150px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
background-color: #FFFFFF;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#action-block {
|
#action-block {
|
||||||
|
|
|
@ -84,6 +84,13 @@ footer {
|
||||||
height: 25px;
|
height: 25px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.footer-logo-france {
|
||||||
|
@include ie-compatible-background-image("republique-francaise-logo.svg");
|
||||||
|
|
||||||
|
width: 105px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
.footer-link a,
|
.footer-link a,
|
||||||
.footer-text a {
|
.footer-text a {
|
||||||
color: $black;
|
color: $black;
|
||||||
|
|
|
@ -33,7 +33,7 @@ module ChampHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def auto_attach_url(form, object)
|
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)
|
champs_piece_justificative_url(object.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,7 +23,9 @@ function filterFeatureCollection(featureCollection, source) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const MapEditor = ({ featureCollection, url }) => {
|
function noop() {}
|
||||||
|
|
||||||
|
function MapEditor({ featureCollection, url, preview }) {
|
||||||
const drawControl = useRef(null);
|
const drawControl = useRef(null);
|
||||||
const [style, setStyle] = useState('ortho');
|
const [style, setStyle] = useState('ortho');
|
||||||
const [coords, setCoords] = useState([1.7, 46.9]);
|
const [coords, setCoords] = useState([1.7, 46.9]);
|
||||||
|
@ -174,9 +176,9 @@ const MapEditor = ({ featureCollection, url }) => {
|
||||||
/>
|
/>
|
||||||
<DrawControl
|
<DrawControl
|
||||||
ref={drawControl}
|
ref={drawControl}
|
||||||
onDrawCreate={onDrawCreate}
|
onDrawCreate={preview ? noop : onDrawCreate}
|
||||||
onDrawUpdate={onDrawUpdate}
|
onDrawUpdate={preview ? noop : onDrawUpdate}
|
||||||
onDrawDelete={onDrawDelete}
|
onDrawDelete={preview ? noop : onDrawDelete}
|
||||||
displayControlsDefault={false}
|
displayControlsDefault={false}
|
||||||
controls={{
|
controls={{
|
||||||
point: true,
|
point: true,
|
||||||
|
@ -202,7 +204,7 @@ const MapEditor = ({ featureCollection, url }) => {
|
||||||
</Map>
|
</Map>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
}
|
||||||
|
|
||||||
MapEditor.propTypes = {
|
MapEditor.propTypes = {
|
||||||
featureCollection: PropTypes.shape({
|
featureCollection: PropTypes.shape({
|
||||||
|
@ -210,7 +212,8 @@ MapEditor.propTypes = {
|
||||||
features: PropTypes.array,
|
features: PropTypes.array,
|
||||||
id: PropTypes.number
|
id: PropTypes.number
|
||||||
}),
|
}),
|
||||||
url: PropTypes.string
|
url: PropTypes.string,
|
||||||
|
preview: PropTypes.bool
|
||||||
};
|
};
|
||||||
|
|
||||||
export default MapEditor;
|
export default MapEditor;
|
||||||
|
|
|
@ -44,7 +44,7 @@ class Champ < ApplicationRecord
|
||||||
def blank?
|
def blank?
|
||||||
case type_de_champ.type_champ
|
case type_de_champ.type_champ
|
||||||
when TypeDeChamp.type_champs.fetch(:carte)
|
when TypeDeChamp.type_champs.fetch(:carte)
|
||||||
value.blank? || value == '[]'
|
geo_areas.blank? || value == '[]'
|
||||||
else
|
else
|
||||||
value.blank?
|
value.blank?
|
||||||
end
|
end
|
||||||
|
|
|
@ -506,7 +506,7 @@ class Procedure < ApplicationRecord
|
||||||
if logo.attached?
|
if logo.attached?
|
||||||
Rails.application.routes.url_helpers.url_for(logo)
|
Rails.application.routes.url_helpers.url_for(logo)
|
||||||
else
|
else
|
||||||
ActionController::Base.helpers.image_url("marianne.svg")
|
ActionController::Base.helpers.image_url("republique-francaise-logo.svg")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -14,12 +14,13 @@
|
||||||
%header.new-header{ class: current_page?(root_path) ? nil : "new-header-with-border", role: 'banner' }
|
%header.new-header{ class: current_page?(root_path) ? nil : "new-header-with-border", role: 'banner' }
|
||||||
.header-inner-content
|
.header-inner-content
|
||||||
|
|
||||||
.flex.align-center
|
.flex.align-center.justify-center
|
||||||
- if params[:controller] == 'users/commencer'
|
- if params[:controller] == 'users/commencer'
|
||||||
= link_to 'Revenir en arrière', url_for(:back), class: "button", title: "Revenir sur le site de mon administration"
|
= link_to 'Revenir en arrière', url_for(:back), class: "button", title: "Revenir sur le site de mon administration"
|
||||||
- else
|
- else
|
||||||
= link_to root_path_for_profile(nav_bar_profile), class: 'header-logo', title: "Aller à la page d'accueil de demarches-simplifiees.fr" do
|
= 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: '', width: 65
|
= 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.big.site-title> demarches-simplifiees.fr
|
||||||
%span.small.site-title> d-s.fr
|
%span.small.site-title> d-s.fr
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
%span.footer-logo.footer-logo-dinum{ role: 'img', 'aria-label': 'DINUM' }
|
%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
|
= 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-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
|
%li.footer-column
|
||||||
%ul.footer-links
|
%ul.footer-links
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
- if feature_enabled?(:new_map_editor)
|
- 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
|
- else
|
||||||
.toolbar
|
.toolbar
|
||||||
%button.button.primary.new-area Ajouter une zone
|
%button.button.primary.new-area Ajouter une zone
|
||||||
|
|
|
@ -31,7 +31,6 @@ features = [
|
||||||
:insee_api_v3,
|
:insee_api_v3,
|
||||||
:instructeur_bypass_email_login_token,
|
:instructeur_bypass_email_login_token,
|
||||||
:autosave_dossier_draft,
|
:autosave_dossier_draft,
|
||||||
:autoupload_dossier_attachments,
|
|
||||||
:new_map_editor,
|
:new_map_editor,
|
||||||
:maintenance_mode,
|
:maintenance_mode,
|
||||||
:mini_profiler,
|
:mini_profiler,
|
||||||
|
|
|
@ -165,114 +165,77 @@ feature 'The user' do
|
||||||
create(:procedure, :published, :for_individual, types_de_champ: tdcs)
|
create(:procedure, :published, :for_individual, types_de_champ: tdcs)
|
||||||
end
|
end
|
||||||
|
|
||||||
scenario 'adding, replacing and removing attachments', js: true do
|
scenario 'add an attachment', js: true do
|
||||||
log_in(user, procedure_with_pj)
|
log_in(user, procedure_with_pjs)
|
||||||
fill_individual
|
fill_individual
|
||||||
|
|
||||||
# Add an attachment
|
# Add attachments
|
||||||
find_field('Pièce justificative').attach_file(Rails.root + 'spec/fixtures/files/file.pdf')
|
find_field('Pièce justificative 1').attach_file(Rails.root + 'spec/fixtures/files/file.pdf')
|
||||||
click_on 'Enregistrer le brouillon'
|
find_field('Pièce justificative 2').attach_file(Rails.root + 'spec/fixtures/files/RIB.pdf')
|
||||||
expect(page).to have_content('Votre brouillon a bien été sauvegardé')
|
|
||||||
|
# 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('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')
|
expect(page).to have_text('RIB.pdf')
|
||||||
|
|
||||||
# Remove the attachment
|
# Expect the submit buttons to be enabled
|
||||||
within('.attachment') { click_on 'Supprimer' }
|
expect(page).to have_button('Enregistrer le brouillon', disabled: false)
|
||||||
expect(page).to have_content('La pièce jointe a bien été supprimée')
|
expect(page).to have_button('Déposer le dossier', disabled: false)
|
||||||
expect(page).to have_no_text('RIB.pdf')
|
|
||||||
|
# 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
|
end
|
||||||
|
|
||||||
context 'when the auto-uploads of attachments is enabled' do
|
# TODO: once we're running on Rails 6, re-enable the validator on PieceJustificativeChamp,
|
||||||
before do
|
# and unmark this spec as pending.
|
||||||
Flipper.enable_actor(:autoupload_dossier_attachments, user)
|
#
|
||||||
end
|
# 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
|
# Test invalid file type
|
||||||
log_in(user, procedure_with_pjs)
|
attach_file('Pièce justificative 1', Rails.root + 'spec/fixtures/files/invalid_file_format.json')
|
||||||
fill_individual
|
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
|
# Replace the file by another with a valid type
|
||||||
find_field('Pièce justificative 1').attach_file(Rails.root + 'spec/fixtures/files/file.pdf')
|
attach_file('Pièce justificative 1', Rails.root + 'spec/fixtures/files/piece_justificative_0.pdf')
|
||||||
find_field('Pièce justificative 2').attach_file(Rails.root + 'spec/fixtures/files/RIB.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
|
scenario 'retry on transcient upload error', js: true do
|
||||||
expect(page).to have_text('analyse antivirus en cours', count: 2)
|
log_in(user, procedure_with_pjs)
|
||||||
expect(page).to have_text('file.pdf')
|
fill_individual
|
||||||
expect(page).to have_text('RIB.pdf')
|
|
||||||
|
|
||||||
# Expect the submit buttons to be enabled
|
# Test auto-upload failure
|
||||||
expect(page).to have_button('Enregistrer le brouillon', disabled: false)
|
logout(:user) # Make the subsequent auto-upload request fail
|
||||||
expect(page).to have_button('Déposer le dossier', disabled: false)
|
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
|
# Test that retrying after a failure works
|
||||||
visit current_path
|
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
|
# Reload the current page
|
||||||
expect(page).to have_text('file.pdf')
|
visit current_path
|
||||||
expect(page).to have_text('RIB.pdf')
|
|
||||||
end
|
|
||||||
|
|
||||||
# TODO: once we're running on Rails 6, re-enable the validator on PieceJustificativeChamp,
|
# Expect the file to have been saved on the dossier
|
||||||
# and unmark this spec as pending.
|
expect(page).to have_text('file.pdf')
|
||||||
#
|
|
||||||
# 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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the draft autosave is enabled' do
|
context 'when the draft autosave is enabled' do
|
||||||
|
|
Loading…
Reference in a new issue