Merge branch 'dev'

This commit is contained in:
gregoirenovel 2018-02-07 16:21:17 +01:00
commit a1015517cf
25 changed files with 231 additions and 187 deletions

View file

@ -1,8 +0,0 @@
.types-de-champs-table {
table-layout: fixed;
td {
white-space: normal;
vertical-align: top;
}
}

View file

@ -254,7 +254,7 @@ class Admin::ProceduresController < AdminController
if @procedure.try(:locked?)
params.require(:procedure).permit(*editable_params)
else
params.require(:procedure).permit(*editable_params, :lien_demarche, :cerfa_flag, :for_individual, :individual_with_siret, module_api_carto_attributes: [:id, :use_api_carto, :quartiers_prioritaires, :cadastre]).merge(administrateur_id: current_administrateur.id)
params.require(:procedure).permit(*editable_params, :lien_demarche, :cerfa_flag, :for_individual, :individual_with_siret, :ask_birthday, module_api_carto_attributes: [:id, :use_api_carto, :quartiers_prioritaires, :cadastre]).merge(administrateur_id: current_administrateur.id)
end
end

View file

@ -4,10 +4,9 @@ module NewGestionnaire
@search_terms = params[:q]
# exact id match?
if @search_terms.to_i != 0
@dossiers = current_gestionnaire.dossiers.where(id: @search_terms.to_i) +
current_gestionnaire.dossiers_from_avis.where(id: @search_terms.to_i)
@dossiers.uniq!
id = @search_terms.to_i
if id != 0 && id_compatible?(id) # Sometimes gestionnaire is searching dossiers with a big number (ex: SIRET), ActiveRecord can't deal with them and throws ActiveModel::RangeError. id_compatible? prevents this.
@dossiers = dossiers_by_id(id)
end
if @dossiers.nil?
@ -23,5 +22,22 @@ module NewGestionnaire
).results
end
end
private
def dossiers_by_id(id)
dossiers = current_gestionnaire.dossiers.where(id: id) +
current_gestionnaire.dossiers_from_avis.where(id: id)
dossiers.uniq
end
def id_compatible?(number)
begin
ActiveRecord::Type::Integer.new.serialize(number)
true
rescue ActiveModel::RangeError
false
end
end
end
end

View file

@ -220,6 +220,7 @@ class Users::DossiersController < UsersController
end
if update_params[:individual_attributes].present? &&
update_params[:individual_attributes][:birthdate] &&
!/^\d{4}\-\d{2}\-\d{2}$/.match(update_params[:individual_attributes][:birthdate]) &&
!/^\d{2}\/\d{2}\/\d{4}$/.match(update_params[:individual_attributes][:birthdate])
errors << "Le format de la date de naissance doit être JJ/MM/AAAA"

View file

@ -9,8 +9,4 @@ class UserDecorator < Draper::Decorator
'Mme'
end
end
def birthdate_fr
birthdate.strftime('%d/%m/%Y')
end
end

View file

@ -79,6 +79,11 @@
%label
= f.check_box :individual_with_siret
Donner la possibilité de renseigner un SIRET au cours de la construction du dossier.
%li
.checkbox
%label
= f.check_box :ask_birthday
Demander la date de naissance.
.row
.col-md-6
%h4 Options avancées

View file

@ -27,11 +27,13 @@
%h4
Prénom *
= ff.text_field :prenom, { class: 'form-control', required: true }
.form-group
%label
%h4
Date de naissance *
= ff.date_field :birthdate, { value: @facade.individual.birthdate, class: 'form-control', placeholder: 'jj/mm/aaaa', required: true }
- if @facade.procedure.ask_birthday?
.form-group
%label
%h4
Date de naissance *
= ff.date_field :birthdate, { value: @facade.individual.birthdate, class: 'form-control', placeholder: 'jj/mm/aaaa', required: true }
%p
%label{ style: 'font-weight: normal;' }

View file

@ -1,5 +1,5 @@
- if field.data.any?
%table.collection-data.types-de-champs-table{ "aria-labelledby": "page-title" }
%table.collection-data{ "aria-labelledby": "page-title" }
%thead
%tr
%td.cell-label Libelle

View file

@ -1,33 +0,0 @@
-# # Application Layout
-#
-# This view template is used as the layout
-# for every page that Administrate generates.
-#
-# By default, it renders:
-# - Sidebar for navigation
-# - Content for a search bar
-# (if provided by a `content_for` block in a nested page)
-# - Flashes
-# - Links to stylesheets and Javascripts
!!!
%html{ lang: I18n.locale }
%head
%meta{ charset: "utf-8" }
%meta{ content: "NOODP", :name => "ROBOTS" }
%meta{ content: "initial-scale=1", :name => "viewport" }
%title
= content_for(:title)
| #{Rails.application.class.parent_name.titlecase}
= render "stylesheet"
= stylesheet_link_tag "new_design/manager", media: "all", "data-turbolinks-track": true
= csrf_meta_tags
%body
.app-container
.sidebar
= render "sidebar"
%main.main-content{ role: "main" }
= content_for(:search)
= render "flashes"
= yield
= render "javascript"

View file

@ -1,16 +0,0 @@
- content_for(:title) do
= display_resource_name(page.resource_name)
- content_for(:search) do
- if show_search_bar
= render "search", search_term: search_term
%header.header
%h1.header__heading#page-title
= content_for(:title)
.header__actions
= link_to 'nouveau', new_manager_administrateur_path, class: 'button'
= render "collection", collection_presenter: page, resources: resources
= paginate resources

View file

@ -0,0 +1,57 @@
<%#
# Show
This view is the template for the show page.
It renders the attributes of a resource,
as well as a link to its edit page.
## Local variables:
- `page`:
An instance of [Administrate::Page::Show][1].
Contains methods for accessing the resource to be displayed on the page,
as well as helpers for describing how each attribute of the resource
should be displayed.
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show
%>
<% content_for(:title) { "#{t("administrate.actions.show")} #{page.page_title}" } %>
<% procedure = page.resource %>
<header class="main-content__header" role="banner">
<h1 class="main-content__page-title">
<%= content_for(:title) %>
</h1>
<div>
<%= link_to(
"#{t("administrate.actions.edit")} #{page.page_title}",
[:edit, namespace, page.resource],
class: "button",
) if valid_action? :edit %>
</div>
<div>
<% if page.resource.invitation_expired? %>
<%= link_to "renvoyer l'invitation", reinvite_manager_administrateur_path(page.resource), method: :post, class: "button" %>
<% end %>
<div>
</header>
<section class="main-content__body">
<dl>
<% page.attributes.each do |attribute| %>
<dt class="attribute-label" id="<%= attribute.name %>">
<%= t(
"helpers.label.#{resource_name}.#{attribute.name}",
default: attribute.name.titleize,
) %>
</dt>
<dd class="attribute-data attribute-data--<%=attribute.html_class%>"
><%= render_field attribute %></dd>
<% end %>
</dl>
</section>

View file

@ -1,20 +0,0 @@
%table.collection-data{ "aria-labelledby": "page-title" }
%thead
%tr
- collection_presenter.attribute_types.each do |attr_name, attr_type|
%th.cell-label{ class: "cell-label--#{attr_type.html_class} cell-label--#{collection_presenter.ordered_html_class(attr_name)}", scope: "col" }
= link_to(sanitized_order_params.merge(collection_presenter.order_params_for(attr_name))) do
= t("helpers.label.#{resource_name}.#{attr_name}", default: attr_name.to_s).titleize
- if collection_presenter.ordered_by?(attr_name)
%span.cell-label__sort-indicator{ class: "cell-label__sort-indicator--#{collection_presenter.ordered_html_class(attr_name)}" }
= svg_tag("administrate/sort_arrow.svg", "sort_arrow", width: "13", height: "13")
%th{ colspan: "2", scope: "col" }
%tbody
- resources.each do |resource|
%tr.table__row{ role: "link", tabindex: "0", "data-url": polymorphic_path([namespace, resource]) }
- collection_presenter.attributes_for(resource).each do |attribute|
%td.cell-data{ class: "cell-data--#{attribute.html_class}" }
= link_to polymorphic_path([namespace, resource]), class: "action-show table__link-plain" do
= render_field attribute

View file

@ -1,5 +0,0 @@
- if flash.any?
.flashes
- flash.each do |key, value|
.flash{ class: "flash--#{key}" }
= value

View file

@ -1,9 +0,0 @@
- Administrate::Engine.javascripts.each do |js_path|
= javascript_include_tag js_path
= yield :javascript
- if Rails.env.test?
= javascript_tag do
$.fx.off = true;
$.ajaxSetup({ async: false });

View file

@ -0,0 +1,26 @@
<%#
# Navigation
This partial is used to display the navigation in Administrate.
By default, the navigation contains navigation links
for all resources in the admin dashboard,
as defined by the routes in the `admin/` namespace
%>
<nav class="navigation" role="navigation">
<%= link_to "Se déconnecter", manager_sign_out_path, method: :delete, class: "navigation__link" %>
<hr />
<% Administrate::Namespace.new(namespace).resources.each do |resource| %>
<%= link_to(
display_resource_name(resource),
[namespace, resource.path],
class: "navigation__link navigation__link--#{nav_link_state(resource)}"
) %>
<% end %>
<hr />
<%= link_to "Delayed Job", manager_delayed_job_path, class: "navigation__link" %>
</nav>

View file

@ -1,16 +0,0 @@
%ul.sidebar__list
%li
= link_to "Se déconnecter", manager_sign_out_path, method: :delete, class: "sidebar__link"
%hr{ style: "margin-bottom: 0;" }
%ul.sidebar__list
- Administrate::Namespace.new(namespace).resources.each do |resource|
%li
= link_to(display_resource_name(resource), [namespace, resource], class: "sidebar__link sidebar__link--#{nav_link_state(resource)}")
%hr{ style: "margin-bottom: 0;" }
%ul.sidebar__list
%li
= link_to "Delayed Job", manager_delayed_job_path, class: "sidebar__link"

View file

@ -1,15 +0,0 @@
- content_for(:title) do
= display_resource_name(page.resource_name)
- content_for(:search) do
- if show_search_bar
= render "search", search_term: search_term
%header.header
%h1.header__heading#page-title
= content_for(:title)
.header__actions
= render "collection", collection_presenter: page, resources: resources
= paginate resources

View file

@ -1,13 +0,0 @@
- content_for(:title) { page.page_title }
%header.header
%h1.header__heading= content_for(:title)
.header__actions
%dl
- page.attributes.each do |attribute|
%dt.attribute-label
= t("helpers.label.#{resource_name}.#{attribute.name}", default: attribute.name.titleize)
%dd.attribute-data{ class: "attribute-data--#{attribute.html_class}" }
= render_field attribute

View file

@ -0,0 +1,57 @@
<%#
# Show
This view is the template for the show page.
It renders the attributes of a resource,
as well as a link to its edit page.
## Local variables:
- `page`:
An instance of [Administrate::Page::Show][1].
Contains methods for accessing the resource to be displayed on the page,
as well as helpers for describing how each attribute of the resource
should be displayed.
[1]: http://www.rubydoc.info/gems/administrate/Administrate/Page/Show
%>
<% content_for(:title) { "#{t("administrate.actions.show")} #{page.page_title}" } %>
<% procedure = page.resource %>
<header class="main-content__header" role="banner">
<h1 class="main-content__page-title">
<%= content_for(:title) %>
</h1>
<div>
<%= link_to(
"#{t("administrate.actions.edit")} #{page.page_title}",
[:edit, namespace, page.resource],
class: "button",
) if valid_action? :edit %>
</div>
<div>
<% if !procedure.whitelisted? %>
<%= link_to 'whitelister', whitelist_manager_procedure_path(procedure), method: :post, class: 'button' %>
<% end %>
<div>
</header>
<section class="main-content__body">
<dl>
<% page.attributes.each do |attribute| %>
<dt class="attribute-label" id="<%= attribute.name %>">
<%= t(
"helpers.label.#{resource_name}.#{attribute.name}",
default: attribute.name.titleize,
) %>
</dt>
<dd class="attribute-data attribute-data--<%=attribute.html_class%>"
><%= render_field attribute %></dd>
<% end %>
</dl>
</section>

View file

@ -1,16 +0,0 @@
- content_for(:title) { page.page_title }
- procedure = page.resource
%header.header
%h1.header__heading= content_for(:title)
.header__actions
- if !procedure.whitelisted?
= link_to 'whitelister', whitelist_manager_procedure_path(procedure), method: :post, class: 'button'
%dl
- page.attributes.each do |attribute|
%dt.attribute-label
= t("helpers.label.#{resource_name}.#{attribute.name}", default: attribute.name.titleize)
%dd.attribute-data{ class: "attribute-data--#{attribute.html_class}" }
= render_field attribute

View file

@ -0,0 +1,5 @@
class AddAskBirthdayToProcedure < ActiveRecord::Migration[5.0]
def change
add_column :procedures, :ask_birthday, :boolean, default: false, null: false
end
end

View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20180201163642) do
ActiveRecord::Schema.define(version: 20180206153121) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@ -382,6 +382,7 @@ ActiveRecord::Schema.define(version: 20180201163642) do
t.datetime "hidden_at"
t.datetime "archived_at"
t.datetime "whitelisted_at"
t.boolean "ask_birthday", default: false, null: false
t.index ["hidden_at"], name: "index_procedures_on_hidden_at", using: :btree
end

View file

@ -36,6 +36,17 @@ describe NewGestionnaire::RechercheController, type: :controller do
expect(assigns(:dossiers).count).to eq(0)
end
end
context 'with an id out of range' do
let(:query) { 123456789876543234567 }
it { is_expected.to have_http_status(200) }
it 'does not return the dossier' do
subject
expect(assigns(:dossiers).count).to eq(0)
end
end
end
end
end

View file

@ -7,7 +7,7 @@ feature 'As a User I wanna create a dossier' do
context 'Right after sign_in I shall see inscription by credentials/siret, I can create a new Dossier' do
let(:procedure_with_siret) { create(:procedure, :published, :with_api_carto, :with_type_de_champ, :with_two_type_de_piece_justificative) }
let(:procedure_for_individual) { create(:procedure, :published, :for_individual, :with_api_carto, :with_type_de_champ, :with_two_type_de_piece_justificative) }
let(:procedure_for_individual) { create(:procedure, :published, :for_individual, :with_api_carto, :with_type_de_champ, :with_two_type_de_piece_justificative, ask_birthday: ask_birthday) }
context 'Identification for individual' do
before do
@ -18,26 +18,44 @@ feature 'As a User I wanna create a dossier' do
find(:css, "#dossier_autorisation_donnees[value='1']").set(true)
end
scenario "with a proper date input field for birthdate (type='date' supported)" do
fill_in 'dossier_individual_attributes_birthdate', with: '1987-10-14'
page.find_by_id('etape_suivante').click
expect(page).to have_current_path(users_dossier_carte_path(procedure_for_individual.dossiers.last.id.to_s))
page.find_by_id('etape_suivante').click
fill_in "champs_#{procedure_for_individual.dossiers.last.champs.first.id}", with: 'contenu du champ 1'
page.find_by_id('suivant').click
expect(user.dossiers.first.individual.birthdate).to eq("1987-10-14")
expect(page).to have_current_path(users_dossier_recapitulatif_path(procedure_for_individual.dossiers.last.id.to_s))
context "when birthday is asked" do
let(:ask_birthday) { true }
scenario "with a proper date input field for birthdate (type='date' supported)" do
fill_in 'dossier_individual_attributes_birthdate', with: '1987-10-14'
page.find_by_id('etape_suivante').click
expect(page).to have_current_path(users_dossier_carte_path(procedure_for_individual.dossiers.last.id.to_s))
page.find_by_id('etape_suivante').click
fill_in "champs_#{procedure_for_individual.dossiers.last.champs.first.id}", with: 'contenu du champ 1'
page.find_by_id('suivant').click
expect(user.dossiers.first.individual.birthdate).to eq("1987-10-14")
expect(page).to have_current_path(users_dossier_recapitulatif_path(procedure_for_individual.dossiers.last.id.to_s))
end
scenario "with a basic text input field for birthdate (type='date' unsupported)" do
fill_in 'dossier_individual_attributes_birthdate', with: '14/10/1987'
page.find_by_id('etape_suivante').click
expect(page).to have_current_path(users_dossier_carte_path(procedure_for_individual.dossiers.last.id.to_s))
page.find_by_id('etape_suivante').click
fill_in "champs_#{procedure_for_individual.dossiers.last.champs.first.id}", with: 'contenu du champ 1'
page.find_by_id('suivant').click
expect(user.dossiers.first.individual.birthdate).to eq("1987-10-14")
expect(page).to have_current_path(users_dossier_recapitulatif_path(procedure_for_individual.dossiers.last.id.to_s))
end
end
scenario "with a basic text input field for birthdate (type='date' unsupported)" do
fill_in 'dossier_individual_attributes_birthdate', with: '14/10/1987'
page.find_by_id('etape_suivante').click
expect(page).to have_current_path(users_dossier_carte_path(procedure_for_individual.dossiers.last.id.to_s))
page.find_by_id('etape_suivante').click
fill_in "champs_#{procedure_for_individual.dossiers.last.champs.first.id}", with: 'contenu du champ 1'
page.find_by_id('suivant').click
expect(user.dossiers.first.individual.birthdate).to eq("1987-10-14")
expect(page).to have_current_path(users_dossier_recapitulatif_path(procedure_for_individual.dossiers.last.id.to_s))
context "when birthday is not asked" do
let(:ask_birthday) { false }
scenario "no need for birthday" do
page.find_by_id('etape_suivante').click
expect(page).to have_current_path(users_dossier_carte_path(procedure_for_individual.dossiers.last.id.to_s))
page.find_by_id('etape_suivante').click
fill_in "champs_#{procedure_for_individual.dossiers.last.champs.first.id}", with: 'contenu du champ 1'
page.find_by_id('suivant').click
expect(user.dossiers.first.individual.birthdate).to eq(nil)
expect(page).to have_current_path(users_dossier_recapitulatif_path(procedure_for_individual.dossiers.last.id.to_s))
end
end
end

View file

@ -2,7 +2,7 @@ require 'spec_helper'
feature 'As a User I want to sort and paginate dossiers', js: true do
let(:user) { create(:user) }
let(:procedure_for_individual) { create(:procedure, :published, :for_individual) }
let(:procedure_for_individual) { create(:procedure, :published, :for_individual, ask_birthday: true) }
before "Create dossier" do
login_as user, scope: :user