Merge branch 'develop' into staging

This commit is contained in:
Xavier J 2016-06-06 18:28:21 +02:00
commit dbbb2ef6aa
28 changed files with 437 additions and 135 deletions

View file

@ -0,0 +1,37 @@
$(document).on('page:load', action_type_de_champs);
$(document).ready(action_type_de_champs);
function action_type_de_champs() {
$("input[type='email']").on('change', function () {
toggleErrorClass(this, validateEmail($(this).val()));
});
$("input[type='phone']").on('change', function () {
val = $(this).val();
val = val.replace(/[ ]/g, '');
toggleErrorClass(this, validatePhone(val));
});
}
function toggleErrorClass(node, boolean) {
if (boolean)
$(node).removeClass('input-error');
else
$(node).addClass('input-error');
}
function validatePhone(phone) {
var re = /^(0|(\+[1-9]{2})|(00[1-9]{2}))[1-9][0-9]{8}$/;
return validateInput(phone, re)
}
function validateEmail(email) {
var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return validateInput(email, re)
}
function validateInput(input, regex) {
return regex.test(input);
}

View file

@ -1,12 +1,17 @@
@import "bootstrap"; @import "bootstrap";
@import "bootstrap-datepicker3"; @import "bootstrap-datepicker3";
#description_page #liste_champs{ #description_page #liste_champs {
h4{ h4 {
margin-top: 35px; margin-top: 35px;
} }
} }
.input-error {
color: darkred !important;
border-color: darkred !important
}
.type_champ-text { .type_champ-text {
@extend .col-md-6; @extend .col-md-6;
@extend .col-lg-6; @extend .col-lg-6;
@ -16,12 +21,40 @@
} }
} }
.type_champ-email {
@extend .col-md-4;
@extend .col-lg-4;
input[type='email'] {
width: 100%;
}
}
.type_champ-civilite {
@extend .col-md-3;
@extend .col-lg-3;
}
.type_champ-phone {
@extend .col-md-2;
@extend .col-lg-2;
input[type='phone'] {
width: 100%;
}
}
.datepicker-switch {
color: #0086b3;
text-decoration: underline;
}
.type_champ-textarea { .type_champ-textarea {
@extend .col-md-8; @extend .col-md-8;
@extend .col-lg-8; @extend .col-lg-8;
textarea.form-control { textarea.form-control {
width:100%; width: 100%;
height: 133px; height: 133px;
} }
} }
@ -30,7 +63,7 @@
@extend .col-md-3; @extend .col-md-3;
@extend .col-lg-3; @extend .col-lg-3;
input[type='number']{ input[type='number'] {
width: 100%; width: 100%;
} }
} }
@ -39,7 +72,7 @@
@extend .col-md-2; @extend .col-md-2;
@extend .col-lg-2; @extend .col-lg-2;
input[type='number']{ input[type='number'] {
width: 100%; width: 100%;
} }
} }

View file

@ -0,0 +1,13 @@
class Admin::PrevisualisationsController < AdminController
before_action :retrieve_procedure
def show
@procedure
@dossier = Dossier.new(id: 0, procedure: @procedure)
Champ.where(dossier_id: @dossier.id).destroy_all
@dossier.build_default_champs
@champs = @dossier.ordered_champs
end
end

View file

@ -60,7 +60,7 @@ class Admin::ProceduresController < AdminController
end end
flash.notice = 'Préocédure modifiée' flash.notice = 'Préocédure modifiée'
redirect_to admin_procedures_path redirect_to edit_admin_procedure_path(id: @procedure.id)
end end
def archive def archive

View file

@ -38,7 +38,9 @@ class PieceJustificative < ActiveRecord::Base
application/vnd.openxmlformats-officedocument.presentationml.presentation, application/vnd.openxmlformats-officedocument.presentationml.presentation,
application/vnd.oasis.opendocument.text, application/vnd.oasis.opendocument.text,
application/vnd.oasis.opendocument.presentation, application/vnd.oasis.opendocument.presentation,
application/vnd.oasis.opendocument.spreadsheet application/vnd.oasis.opendocument.spreadsheet,
image/png,
image/jpeg
" "
end end
end end

View file

@ -1,5 +1,8 @@
class TypeDeChamp < ActiveRecord::Base class TypeDeChamp < ActiveRecord::Base
enum type_champs: {text: 'text', enum type_champs: {text: 'text',
email: 'email',
phone: 'phone',
civilite: 'civilite',
textarea: 'textarea', textarea: 'textarea',
datetime: 'datetime', datetime: 'datetime',
number: 'number', number: 'number',

View file

@ -25,7 +25,7 @@ class CerfaUploader < CarrierWave::Uploader::Base
# Add a white list of extensions which are allowed to be uploaded. # Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this: # For images you might use something like this:
def extension_white_list def extension_white_list
%w(pdf doc docx xls xlsx ppt pptx odt ods odp) %w(pdf doc docx xls xlsx ppt pptx odt ods odp jpg jpeg png)
end end
def filename def filename

View file

@ -25,7 +25,7 @@ class PieceJustificativeUploader < CarrierWave::Uploader::Base
# Add a white list of extensions which are allowed to be uploaded. # Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this: # For images you might use something like this:
def extension_white_list def extension_white_list
%w(pdf doc docx xls xlsx ppt pptx odt ods odp) %w(pdf doc docx xls xlsx ppt pptx odt ods odp jpg jpeg png)
end end
def filename def filename

View file

@ -36,7 +36,7 @@ class ProcedureLogoUploader < CarrierWave::Uploader::Base
if Features.remote_storage if Features.remote_storage
filename = "#{model.class.to_s.underscore}-#{secure_token}.#{file.extension.downcase}" filename = "#{model.class.to_s.underscore}-#{secure_token}.#{file.extension.downcase}"
else else
filename = "logo.#{file.extension.downcase}" filename = "logo-#{secure_token}.#{file.extension.downcase}"
end end
end end
filename filename

View file

@ -1,9 +1,4 @@
%h2.text-info =render partial: 'admin/procedures/head', locals: {active: 'Accompagnateurs'}
=@procedure.libelle
%br
%ul.nav.nav-tabs
= render partial: 'admin/procedures/navbar', locals: {active: 'Accompagnateurs'}
#accompagnateur_form #accompagnateur_form
.row .row

View file

@ -1,9 +1,4 @@
%h2.text-info =render partial: 'admin/procedures/head', locals: {active: 'Pieces'}
=@procedure.libelle
%br
%ul.nav.nav-tabs
= render partial: 'admin/procedures/navbar', locals: {active: 'Pieces'}
#piece_justificative_form #piece_justificative_form
= render 'form' = render 'form'

View file

@ -0,0 +1,4 @@
=render partial: 'admin/procedures/head', locals: {active: 'Prévisualisation'}
#previsualisation
=render 'users/description/show'

View file

@ -0,0 +1,8 @@
%h2.text-info
-unless @procedure.logo.blank?
= image_tag @procedure.logo, style: 'width: 30px'
=@procedure.libelle
%br
%ul.nav.nav-tabs
= render partial: 'admin/procedures/navbar', locals: {active: active}

View file

@ -14,7 +14,9 @@
.row .row
.col-md-6.col-lg-6 .col-md-6.col-lg-6
%h4 Logo de la procédure %h4 Logo de la procédure
= f.file_field(:logo, accept: 'image/png, image/jpg,image/jpeg') - unless @procedure.logo.blank?
= image_tag @procedure.logo, {style: 'height: 40px; display: inline; margin-right: 6px', id: 'preview_procedure_logo'}
= f.file_field(:logo, accept: 'image/png, image/jpg, image/jpeg', style: 'display:inline')
%div{style:'margin-top:5px'} %div{style:'margin-top:5px'}
%i %i

View file

@ -15,3 +15,6 @@
%li{ class: ('disabled' if @procedure.locked?) || ('active' if active == 'Pieces') } %li{ class: ('disabled' if @procedure.locked?) || ('active' if active == 'Pieces') }
= link_to_unless(@procedure.locked?, 'Pièces justificatives', admin_procedure_pieces_justificatives_path(@procedure)) do = link_to_unless(@procedure.locked?, 'Pièces justificatives', admin_procedure_pieces_justificatives_path(@procedure)) do
= link_to('Pièces justificatives', '#') = link_to('Pièces justificatives', '#')
%li{ class: ('active' if active == 'Prévisualisation'), style: 'float:right' }
= link_to('Prévisualisation', admin_procedure_previsualisation_path(@procedure), {style: 'font-style: italic;'})

View file

@ -1,9 +1,4 @@
%h2.text-info = render partial: 'head', locals: {active: 'Description'}
=@procedure.libelle
%br
%ul.nav.nav-tabs
= render partial: 'navbar', locals: {active: 'Description'}
#procedure_new.section.section-label #procedure_new.section.section-label
= form_for @procedure, url: url_for({controller: 'admin/procedures', action: :update, id: @procedure.id}), multipart: true do |f| = form_for @procedure, url: url_for({controller: 'admin/procedures', action: :update, id: @procedure.id}), multipart: true do |f|

View file

@ -4,3 +4,6 @@
= form_for @procedure, url: {controller: 'admin/procedures', action: :create}, multipart: true do |f| = form_for @procedure, url: {controller: 'admin/procedures', action: :create}, multipart: true do |f|
=render partial: 'informations', locals: {f: f} =render partial: 'informations', locals: {f: f}
=f.submit 'Valider', class: 'btn btn-info', style: 'float:right' =f.submit 'Valider', class: 'btn btn-info', style: 'float:right'
%br
%br
%br

View file

@ -1,24 +1,18 @@
#procedure_show #procedure_show
%h2.text-info =render partial: 'head', locals: {active: 'Informations'}
=@facade.procedure.libelle
%br
%ul.nav.nav-tabs = form_tag admin_procedure_archive_path(procedure_id: @facade.procedure.id, archive: !@facade.procedure.archived?), method: :put, style:'float: right; margin-top: 10px' do
= render partial: 'navbar', locals: {active: 'Informations'} %button#archive.btn.btn-small.btn-default.text-info{type: :button}
%li{style:'float:right'}
= form_tag admin_procedure_archive_path(procedure_id: @facade.procedure.id, archive: !@facade.procedure.archived?), method: :put do
%button#archive.btn.btn-nav.text-info{type: :button}
%i.fa.fa-eraser %i.fa.fa-eraser
- if @facade.procedure.archived - if @facade.procedure.archived
= 'Réactiver' = 'Réactiver'
- else - else
= 'Archiver' = 'Archiver'
#confirm #confirm
%button#valid.btn.btn-nav.text-success{type: :submit} %button#valid.btn.btn-small.btn-success{type: :submit}
%i.fa.fa-check %i.fa.fa-check
Valider Valider
%button#cancel.btn.btn-nav.text-danger{type: :button} %button#cancel.btn.btn-small.btn-danger{type: :button}
%i.fa.fa-remove %i.fa.fa-remove
Annuler Annuler

View file

@ -1,9 +1,4 @@
%h2.text-info =render partial: 'admin/procedures/head', locals: {active: 'Champs'}
=@procedure.libelle
%br
%ul.nav.nav-tabs
= render partial: 'admin/procedures/navbar', locals: {active: 'Champs'}
#liste_champ #liste_champ
= render partial: 'form' = render partial: 'form'

View file

@ -0,0 +1,38 @@
-@champs.each do |champ|
.row
%div{class: "type_champ-#{champ.type_champ}"}
-if champ.type_champ == 'checkbox'
%h4{style:'margin-left:15px;'}
= champ.libelle
- if champ.mandatory?
= '*'
%input{type: 'hidden', name:"champs['#{champ.id}']", id: "champs_#{champ.id}", value: ''}
%input{type: 'checkbox', style:'margin-left: 15px;', name:"champs['#{champ.id}']", id: "champs_#{champ.id}", checked: ('checked' if champ.value == 'on')}
-else
%h4
= champ.libelle
- if champ.mandatory?
= '*'
-if champ.type_champ == 'textarea'
%textarea.form-control{name:"champs['#{champ.id}']",
placeholder: champ.libelle,
id: "champs_#{champ.id}"}
=champ.value
-elsif champ.type_champ == 'civilite'
%label.radio-inline
= radio_button_tag "champs['#{champ.id}']", "M.", champ.value == 'Mme' ? false : true
Monsieur
%label.radio-inline
= radio_button_tag "champs['#{champ.id}']", "Mme", champ.value == 'Mme'
Madame
-else
%input.form-control{name:"champs['#{champ.id}']",
placeholder: champ.libelle,
id: "champs_#{champ.id}",
value: champ.value,
type: champ.type_champ,
'data-provide' => ('datepicker' if champ.type_champ == 'datetime'),
'data-date-format' => ('dd/mm/yyyy' if champ.type_champ == 'datetime')}

View file

@ -0,0 +1,50 @@
.container#description_page
%h2
= @dossier.procedure.libelle
%h3 Votre dossier
%br
-#TODO use form_for
= form_tag(url_for({controller: 'users/description', action: :create, dossier_id: @dossier.id}), class: 'form-inline', method: 'POST', multipart: true) do
%div
.row
.col-md-12
%h4 Libellé pour votre dossier *
= text_field_tag :nom_projet, @dossier.nom_projet, placeholder: 'Nom du projet', class: 'form-control'
%br
.row
.col-md-12
%h4 Description *
= text_area_tag :description, @dossier.description, rows: '6', placeholder: 'Description du projet', class: 'form-control wysihtml5'
#liste_champs
-unless @champs.nil?
=render partial: 'users/description/champs'
-if !@procedure.lien_demarche.blank? || @procedure.cerfa_flag || @dossier.types_de_piece_justificative.size > 0
%br
%h3 Documents administratifs
-unless @procedure.lien_demarche.blank?
%p
Formulaire / documentation de la démarche :
%a{style:'font-size:0.9em; padding-left:3px', id: 'lien_cerfa' ,href: "#{@procedure.lien_demarche}", :target => '_blank'} Accéder
%br
//TODO a refactorer
= render partial: 'users/description/pieces_justificatives'
- if user_signed_in?
%div{style: 'text-align:right'}
%h6 Tous les champs portant un * sont obligatoires.
-if !@dossier.draft?
=render partial: '/layouts/modifications_terminees'
-else
= submit_tag 'Soumettre mon dossier', id: 'suivant', class: %w(btn btn btn-success), style: 'float:right', data: { disable_with: 'Soumettre votre dossier', submit: true}
%br
%br

View file

@ -1,76 +1 @@
.container#description_page = render partial: 'show'
%h2
= @dossier.procedure.libelle
%h3 Votre dossier
%br
-#TODO use form_for
= form_tag(url_for({controller: :description, action: :create, dossier_id: @dossier.id}), class: 'form-inline', method: 'POST', multipart: true) do
%div
.row
.col-md-12
%h4 Libellé pour votre dossier *
= text_field_tag :nom_projet, @dossier.nom_projet, placeholder: 'Nom du projet', class: 'form-control'
%br
.row
.col-md-12
%h4 Description *
= text_area_tag :description, @dossier.description, rows: '6', placeholder: 'Description du projet', class: 'form-control wysihtml5'
#liste_champs
-unless @champs.nil?
-@champs.each do |champ|
.row
%div{class: "type_champ-#{champ.type_champ}"}
-if champ.type_champ == 'checkbox'
%h4{style:'margin-left:15px;'}
= champ.libelle
- if champ.mandatory?
= '*'
%input{type: 'hidden', name:"champs['#{champ.id}']", id: "champs_#{champ.id}", value: ''}
%input{type: 'checkbox', style:'margin-left: 15px;', name:"champs['#{champ.id}']", id: "champs_#{champ.id}", checked: ('checked' if champ.value == 'on')}
-else
%h4
= champ.libelle
- if champ.mandatory?
= '*'
-if champ.type_champ == 'textarea'
%textarea.form-control{name:"champs['#{champ.id}']",
placeholder: champ.libelle,
id: "champs_#{champ.id}"}
=champ.value
-else
%input.form-control{name:"champs['#{champ.id}']",
placeholder: champ.libelle,
id: "champs_#{champ.id}",
value: champ.value,
type:"#{champ.type_champ}",
'data-provide' => ('datepicker' if champ.type_champ == 'datetime'),
'data-date-format' => ('dd/mm/yyyy' if champ.type_champ == 'datetime')}
-if !@procedure.lien_demarche.blank? || @procedure.cerfa_flag || @dossier.pieces_justificatives.size > 1
%br
%h3 Documents administratifs
-unless @procedure.lien_demarche.blank?
%p
Formulaire / documentation de la démarche :
%a{style:'font-size:0.9em; padding-left:3px', id: 'lien_cerfa' ,href: "#{@procedure.lien_demarche}", :target => '_blank'} Accéder
%br
//TODO a refactorer
= render partial: 'pieces_justificatives'
%div{style: 'text-align:right'}
%h6 Tous les champs portant un * sont obligatoires.
-if !@dossier.draft?
=render partial: '/layouts/modifications_terminees'
-else
= submit_tag 'Soumettre mon dossier', id: 'suivant', class: %w(btn btn btn-success), style: 'float:right', data: { disable_with: 'Soumettre votre dossier', submit: true}
%br
%br

View file

@ -94,6 +94,7 @@ Rails.application.routes.draw do
resource :accompagnateurs, only: [:show, :update] resource :accompagnateurs, only: [:show, :update]
resource :previsualisation, only: [:show]
resources :types_de_champ, only: [:destroy] resources :types_de_champ, only: [:destroy]
resource :pieces_justificatives, only: [:show, :update] resource :pieces_justificatives, only: [:show, :update]

View file

@ -0,0 +1,16 @@
require 'spec_helper'
describe Admin::PrevisualisationsController, type: :controller do
let(:admin) { create(:administrateur) }
let(:procedure) { create :procedure, administrateur: admin }
before do
sign_in admin
end
describe 'GET #show' do
subject { get :show, procedure_id: procedure.id }
it { expect(subject.status).to eq(200) }
end
end

View file

@ -192,7 +192,7 @@ describe Admin::ProceduresController, type: :controller do
it { expect(subject.cadastre).to be_truthy } it { expect(subject.cadastre).to be_truthy }
end end
it { expect(subject).to redirect_to(admin_procedures_path) } it { expect(subject).to redirect_to(edit_admin_procedure_path id: procedure.id) }
it { expect(flash[:notice]).to be_present } it { expect(flash[:notice]).to be_present }
end end

View file

@ -0,0 +1,172 @@
require 'spec_helper'
describe 'admin/previsualisations/show.html.haml', type: :view do
let(:user) { create(:user) }
let(:cerfa_flag) { true }
let(:procedure) { create(:procedure, :with_two_type_de_piece_justificative, :with_type_de_champ, cerfa_flag: cerfa_flag) }
let(:dossier) { create(:dossier, procedure: procedure, user: user) }
let(:dossier_id) { dossier.id }
before do
assign(:dossier, dossier)
assign(:procedure, dossier.procedure)
assign(:champs, dossier.ordered_champs)
end
context 'tous les attributs sont présents sur la page' do
before do
render
end
it 'Le formulaire envoie vers /users/dossiers/:dossier_id/description en #POST' do
expect(rendered).to have_selector("form[action='/users/dossiers/#{dossier_id}/description'][method=post]")
end
it 'Nom du projet' do
expect(rendered).to have_selector('input[id=nom_projet][name=nom_projet]')
end
it 'Description du projet' do
expect(rendered).to have_selector('textarea[id=description][name=description]')
end
it 'Charger votre CERFA (PDF)' do
expect(rendered).to have_selector('input[type=file][name=cerfa_pdf][id=cerfa_pdf]')
end
it 'Lien CERFA' do
expect(rendered).to have_selector('#lien_cerfa')
end
end
context 'si la page précédente n\'est pas recapitulatif' do
before do
render
end
it 'le bouton "Terminer" n\'est pas présent' do
expect(rendered).not_to have_selector('#suivant')
end
end
context 'si la page précédente est recapitularif' do
before do
dossier.initiated!
dossier.reload
render
end
it 'le bouton "Terminer" n\'est pas présent' do
expect(rendered).to_not have_selector('#suivant')
end
it 'le bouton "Modification terminé" n\'est pas présent' do
expect(rendered).not_to have_selector('#modification_terminee')
end
it 'le lien de retour au récapitulatif n\'est pas présent' do
expect(rendered).not_to have_selector("a[href='/users/dossiers/#{dossier_id}/recapitulatif']")
end
end
context 'les valeurs sont réaffichées si elles sont présentes dans la BDD' do
let!(:dossier) do
create(:dossier,
nom_projet: 'Projet de test',
description: 'Description de test',
user: user)
end
before do
render
end
it 'Nom du projet' do
expect(rendered).to have_selector("input[id=nom_projet][value='#{dossier.nom_projet}']")
end
it 'Description du projet' do
expect(rendered).to have_content("#{dossier.description}")
end
end
context 'Champs' do
let(:champs) { dossier.champs }
before do
render
end
describe 'first champs' do
subject { dossier.champs.first }
it { expect(rendered).to have_css(".type_champ-#{subject.type_champ}") }
it { expect(rendered).to have_css("#champs_#{subject.id}") }
end
describe 'last champs' do
subject { dossier.champs.last }
it { expect(rendered).to have_css(".type_champ-#{subject.type_champ}") }
it { expect(rendered).to have_css("#champs_#{subject.id}") }
end
end
context 'Pièces justificatives' do
let(:all_type_pj_procedure_id) { dossier.procedure.type_de_piece_justificative_ids }
before do
render
end
context 'la liste des pièces justificatives a envoyé est affichée' do
it 'RIB' do
expect(rendered).to have_css("#piece_justificative_#{all_type_pj_procedure_id[0]}")
end
end
context 'la liste des pièces récupérées automatiquement est signaliée' do
it 'Attestation MSA' do
expect(rendered).to have_selector("#piece_justificative_#{all_type_pj_procedure_id[1]}", "Nous l'avons récupéré pour vous.")
end
end
end
context 'Envoi des CERFA désactivé' do
let!(:cerfa_flag) { false }
before do
render
end
it { expect(rendered).to_not have_css("#cerfa_flag") }
it { expect(rendered).to_not have_selector('input[type=file][name=cerfa_pdf][id=cerfa_pdf]') }
end
describe 'display title Documents administratifs' do
before do
render
end
let(:procedure) { create :procedure, lien_demarche: '' }
let(:dossier) { create(:dossier, procedure: procedure) }
context 'when dossier not have cerfa, piece justificative and demarche link' do
it { expect(rendered).not_to have_content 'Documents administratifs' }
end
context 'when dossier have pj' do
let(:dossier) { create(:dossier) }
it { expect(rendered).to have_content 'Documents administratifs' }
end
context 'when procedure have demarche link' do
let(:procedure) { create :procedure }
it { expect(rendered).to have_content 'Documents administratifs' }
end
context 'when procedure have cerfa flag true' do
let(:procedure) {create(:procedure, cerfa_flag: true)}
it { expect(rendered).to have_content 'Documents administratifs' }
end
end
end

View file

@ -0,0 +1,17 @@
require 'spec_helper'
describe 'admin/procedures/edit.html.haml', type: :view do
let(:logo) { Rack::Test::UploadedFile.new("./spec/support/files/logo_test_procedure.png", 'image/png') }
let(:procedure) { create(:procedure, logo: logo) }
before do
assign(:procedure, procedure)
render
end
context 'when procedure logo is present' do
it 'display on the page' do
expect(rendered).to have_selector('#preview_procedure_logo')
end
end
end

View file

@ -8,6 +8,7 @@ describe 'users/description/show.html.haml', type: :view do
let(:dossier_id) { dossier.id } let(:dossier_id) { dossier.id }
before do before do
sign_in user
assign(:dossier, dossier) assign(:dossier, dossier)
assign(:procedure, dossier.procedure) assign(:procedure, dossier.procedure)
assign(:champs, dossier.ordered_champs) assign(:champs, dossier.ordered_champs)