Merge pull request #646 from sgmap/dossier_instruction_for_gestionnaire_new_design
Dossier instruction for gestionnaire new design
This commit is contained in:
commit
374e284f3c
8 changed files with 214 additions and 1 deletions
1
app/assets/images/icons/bubble.svg
Normal file
1
app/assets/images/icons/bubble.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path fill="none" stroke="#CCC" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6.754 19.498l-.007-.006A9 9 0 1 0 11.73 3c-4.97 0-8.999 4.031-8.999 9a8.964 8.964 0 0 0 1.23 4.535S4.1 19.201 2 20.6c0 0 2.309.796 4.754-1.102z"/></svg>
|
After Width: | Height: | Size: 335 B |
71
app/assets/stylesheets/new_design/dossier_instruction.scss
Normal file
71
app/assets/stylesheets/new_design/dossier_instruction.scss
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
@import "colors";
|
||||||
|
@import "common";
|
||||||
|
@import "constants";
|
||||||
|
|
||||||
|
#dossier-instruction {
|
||||||
|
h1 {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: $default-padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avis-notice {
|
||||||
|
font-size: 12px;
|
||||||
|
color: $grey;
|
||||||
|
margin-bottom: 2 * $default-padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=email] {
|
||||||
|
max-width: 500px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avis {
|
||||||
|
.title {
|
||||||
|
margin-bottom: $default-padding;
|
||||||
|
|
||||||
|
.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;
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: $default-spacer;
|
||||||
|
|
||||||
|
span {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.answer {
|
||||||
|
margin-top: $default-padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
.avis-icon {
|
||||||
|
margin-right: $default-spacer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.date,
|
||||||
|
.waiting {
|
||||||
|
font-size: 12px;
|
||||||
|
color: $grey;
|
||||||
|
}
|
||||||
|
|
||||||
|
.date {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,6 +12,10 @@ module NewGestionnaire
|
||||||
@dossier = dossier
|
@dossier = dossier
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def instruction
|
||||||
|
@dossier = dossier
|
||||||
|
end
|
||||||
|
|
||||||
def follow
|
def follow
|
||||||
current_gestionnaire.follow(dossier)
|
current_gestionnaire.follow(dossier)
|
||||||
dossier.next_step!('gestionnaire', 'follow')
|
dossier.next_step!('gestionnaire', 'follow')
|
||||||
|
@ -57,6 +61,17 @@ module NewGestionnaire
|
||||||
render json: { lon: lon, lat: lat, zoom: zoom, dossier_id: params[:dossier_id] }
|
render json: { lon: lon, lat: lat, zoom: zoom, dossier_id: params[:dossier_id] }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_avis
|
||||||
|
Avis.create(avis_params.merge(claimant: current_gestionnaire, dossier: dossier))
|
||||||
|
redirect_to instruction_dossier_path(dossier.procedure, dossier)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_annotations
|
||||||
|
dossier = current_gestionnaire.dossiers.includes(champs_private: :type_de_champ).find(params[:dossier_id])
|
||||||
|
dossier.update_attributes(champs_private_params)
|
||||||
|
redirect_to instruction_dossier_path(dossier.procedure, dossier)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def dossier
|
def dossier
|
||||||
|
@ -66,5 +81,13 @@ module NewGestionnaire
|
||||||
def commentaire_params
|
def commentaire_params
|
||||||
params.require(:commentaire).permit(:body)
|
params.require(:commentaire).permit(:body)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def avis_params
|
||||||
|
params.require(:avis).permit(:email, :introduction)
|
||||||
|
end
|
||||||
|
|
||||||
|
def champs_private_params
|
||||||
|
params.require(:dossier).permit(champs_private_attributes: [:id, :value, value: []])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -44,6 +44,7 @@ class Dossier < ActiveRecord::Base
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
|
|
||||||
accepts_nested_attributes_for :champs
|
accepts_nested_attributes_for :champs
|
||||||
|
accepts_nested_attributes_for :champs_private
|
||||||
|
|
||||||
default_scope { where(hidden_at: nil) }
|
default_scope { where(hidden_at: nil) }
|
||||||
scope :state_brouillon, -> { where(state: BROUILLON) }
|
scope :state_brouillon, -> { where(state: BROUILLON) }
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
%li
|
%li
|
||||||
= link_to "Demande", dossier_path(dossier.procedure, dossier), class: ("selected" if current_page?(dossier_path(dossier.procedure, dossier)))
|
= link_to "Demande", dossier_path(dossier.procedure, dossier), class: ("selected" if current_page?(dossier_path(dossier.procedure, dossier)))
|
||||||
%li
|
%li
|
||||||
= link_to "Instruction", "#"
|
= link_to "Instruction", instruction_dossier_path(dossier.procedure, dossier), class: current_page?(instruction_dossier_path(dossier.procedure, dossier)) ? 'selected' : nil
|
||||||
%li
|
%li
|
||||||
= link_to "Messagerie", messagerie_dossier_path(dossier.procedure, dossier), class: current_page?(messagerie_dossier_path(dossier.procedure, dossier)) ? 'selected' : nil
|
= link_to "Messagerie", messagerie_dossier_path(dossier.procedure, dossier), class: current_page?(messagerie_dossier_path(dossier.procedure, dossier)) ? 'selected' : nil
|
||||||
%li
|
%li
|
||||||
|
|
50
app/views/new_gestionnaire/dossiers/instruction.html.haml
Normal file
50
app/views/new_gestionnaire/dossiers/instruction.html.haml
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
= render partial: "header", locals: { dossier: @dossier }
|
||||||
|
|
||||||
|
#dossier-instruction.container
|
||||||
|
%section
|
||||||
|
%h1 Inviter une personne à donner son avis
|
||||||
|
%p.avis-notice Elle pourra consulter, donner un avis sur le dossier et contribuer au fil de messagerie, mais elle ne pourra le modifier.
|
||||||
|
|
||||||
|
= form_for Avis.new, url: avis_dossier_path(@dossier.procedure, @dossier), html: { class: 'form' } do |f|
|
||||||
|
= f.email_field :email, placeholder: 'Adresse email', required: true
|
||||||
|
= f.text_area :introduction, rows: 3, value: 'Bonjour, merci de me donner votre avis sur ce dossier.', required: true
|
||||||
|
.send-wrapper
|
||||||
|
= f.submit 'Demander un avis', class: 'button send'
|
||||||
|
|
||||||
|
- if @dossier.avis.present?
|
||||||
|
%section.avis
|
||||||
|
%h1.title
|
||||||
|
Avis des invités
|
||||||
|
%span.count= @dossier.avis.count
|
||||||
|
|
||||||
|
%ul
|
||||||
|
- @dossier.avis.each do |avis|
|
||||||
|
%li.one-avis
|
||||||
|
%h2.claimant
|
||||||
|
= (avis.claimant.email == current_gestionnaire.email) ? 'Vous' : avis.claimant.email
|
||||||
|
%span.date Demande d'avis envoyée le #{I18n.l(avis.created_at.localtime, format: '%d/%m/%y')}
|
||||||
|
%p= avis.introduction
|
||||||
|
|
||||||
|
.answer.flex.align-start
|
||||||
|
= image_tag 'icons/bubble.svg', class: 'avis-icon'
|
||||||
|
.width-100
|
||||||
|
%h2.gestionnaire
|
||||||
|
= avis.gestionnaire.email
|
||||||
|
- if avis.answer.present?
|
||||||
|
%span.date Réponse donnée le #{I18n.l(avis.updated_at.localtime, format: '%d/%m/%y')}
|
||||||
|
- else
|
||||||
|
%span.waiting En attente de réponse
|
||||||
|
%p= avis.answer
|
||||||
|
|
||||||
|
- if @dossier.ordered_champs_private.present?
|
||||||
|
%section
|
||||||
|
%h1.private-annotations Annotations privées
|
||||||
|
.card.featured
|
||||||
|
= form_for @dossier, url: annotations_dossier_path(@dossier.procedure, @dossier), html: { class: 'form' } do |f|
|
||||||
|
= f.fields_for :champs_private, f.object.ordered_champs_private do |champ_form|
|
||||||
|
- champ = champ_form.object
|
||||||
|
= render partial: "new_gestionnaire/dossiers/champs/#{champ.type_champ}",
|
||||||
|
locals: { champ: champ, form: champ_form }
|
||||||
|
|
||||||
|
.send-wrapper
|
||||||
|
= f.submit 'Sauvegarder', class: 'button send'
|
|
@ -243,14 +243,17 @@ Rails.application.routes.draw do
|
||||||
member do
|
member do
|
||||||
get 'attestation'
|
get 'attestation'
|
||||||
get 'messagerie'
|
get 'messagerie'
|
||||||
|
get 'instruction'
|
||||||
patch 'follow'
|
patch 'follow'
|
||||||
patch 'unfollow'
|
patch 'unfollow'
|
||||||
patch 'archive'
|
patch 'archive'
|
||||||
patch 'unarchive'
|
patch 'unarchive'
|
||||||
|
patch 'annotations' => 'dossiers#update_annotations'
|
||||||
post 'commentaire' => 'dossiers#create_commentaire'
|
post 'commentaire' => 'dossiers#create_commentaire'
|
||||||
scope :carte do
|
scope :carte do
|
||||||
get 'position'
|
get 'position'
|
||||||
end
|
end
|
||||||
|
post 'avis' => 'dossiers#create_avis'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -94,4 +94,68 @@ describe NewGestionnaire::DossiersController, type: :controller do
|
||||||
it { expect(saved_commentaire.dossier).to eq(dossier) }
|
it { expect(saved_commentaire.dossier).to eq(dossier) }
|
||||||
it { expect(response).to redirect_to(messagerie_dossier_path(dossier.procedure, dossier)) }
|
it { expect(response).to redirect_to(messagerie_dossier_path(dossier.procedure, dossier)) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#create_avis" do
|
||||||
|
let(:saved_avis) { dossier.avis.first }
|
||||||
|
|
||||||
|
before do
|
||||||
|
post :create_avis, params: {
|
||||||
|
procedure_id: procedure.id,
|
||||||
|
dossier_id: dossier.id,
|
||||||
|
avis: { email: 'email@a.com', introduction: 'intro' }
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(saved_avis.email).to eq('email@a.com') }
|
||||||
|
it { expect(saved_avis.introduction).to eq('intro') }
|
||||||
|
it { expect(saved_avis.dossier).to eq(dossier) }
|
||||||
|
it { expect(saved_avis.claimant).to eq(gestionnaire) }
|
||||||
|
it { expect(response).to redirect_to(instruction_dossier_path(dossier.procedure, dossier)) }
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#update_annotations" do
|
||||||
|
let(:champ_multiple_drop_down_list) do
|
||||||
|
type_de_champ = TypeDeChamp.create(type_champ: 'multiple_drop_down_list', libelle: 'libelle')
|
||||||
|
ChampPrivate.create(type_de_champ: type_de_champ)
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:champ_datetime) do
|
||||||
|
type_de_champ = TypeDeChamp.create(type_champ: 'datetime', libelle: 'libelle')
|
||||||
|
ChampPrivate.create(type_de_champ: type_de_champ)
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:dossier) do
|
||||||
|
create(:dossier, :replied, procedure: procedure, champs_private: [champ_multiple_drop_down_list, champ_datetime])
|
||||||
|
end
|
||||||
|
|
||||||
|
before do
|
||||||
|
patch :update_annotations, params: {
|
||||||
|
procedure_id: procedure.id,
|
||||||
|
dossier_id: dossier.id,
|
||||||
|
dossier: {
|
||||||
|
champs_private_attributes: {
|
||||||
|
'0': {
|
||||||
|
id: champ_multiple_drop_down_list.id,
|
||||||
|
value: ['', 'un', 'deux']
|
||||||
|
},
|
||||||
|
'1': {
|
||||||
|
id: champ_datetime.id,
|
||||||
|
'value(1i)': 2019,
|
||||||
|
'value(2i)': 12,
|
||||||
|
'value(3i)': 21,
|
||||||
|
'value(4i)': 13,
|
||||||
|
'value(5i)': 17
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
champ_multiple_drop_down_list.reload
|
||||||
|
champ_datetime.reload
|
||||||
|
end
|
||||||
|
|
||||||
|
it { expect(champ_multiple_drop_down_list.value).to eq('["un", "deux"]') }
|
||||||
|
it { expect(champ_datetime.value).to eq('21/12/2019 13:17') }
|
||||||
|
it { expect(response).to redirect_to(instruction_dossier_path(dossier.procedure, dossier)) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue