diff --git a/app/assets/stylesheets/new_design/manager.scss b/app/assets/stylesheets/new_design/manager.scss deleted file mode 100644 index f2f140f26..000000000 --- a/app/assets/stylesheets/new_design/manager.scss +++ /dev/null @@ -1,8 +0,0 @@ -.types-de-champs-table { - table-layout: fixed; - - td { - white-space: normal; - vertical-align: top; - } -} diff --git a/app/controllers/admin/procedures_controller.rb b/app/controllers/admin/procedures_controller.rb index c827ad5b6..336e267b9 100644 --- a/app/controllers/admin/procedures_controller.rb +++ b/app/controllers/admin/procedures_controller.rb @@ -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 diff --git a/app/controllers/new_gestionnaire/recherche_controller.rb b/app/controllers/new_gestionnaire/recherche_controller.rb index 0f7dcf159..58658a08b 100644 --- a/app/controllers/new_gestionnaire/recherche_controller.rb +++ b/app/controllers/new_gestionnaire/recherche_controller.rb @@ -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 diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index f7effb1ed..944e9b285 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -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" diff --git a/app/decorators/user_decorator.rb b/app/decorators/user_decorator.rb index 8f77dc857..2ec79a39a 100644 --- a/app/decorators/user_decorator.rb +++ b/app/decorators/user_decorator.rb @@ -9,8 +9,4 @@ class UserDecorator < Draper::Decorator 'Mme' end end - - def birthdate_fr - birthdate.strftime('%d/%m/%Y') - end end diff --git a/app/views/admin/procedures/_informations.html.haml b/app/views/admin/procedures/_informations.html.haml index 0adefb703..542b96bd8 100644 --- a/app/views/admin/procedures/_informations.html.haml +++ b/app/views/admin/procedures/_informations.html.haml @@ -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 diff --git a/app/views/dossiers/etapes/etape_2/_individual.html.haml b/app/views/dossiers/etapes/etape_2/_individual.html.haml index bb7c8e55f..e1cce9eb9 100644 --- a/app/views/dossiers/etapes/etape_2/_individual.html.haml +++ b/app/views/dossiers/etapes/etape_2/_individual.html.haml @@ -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;' } diff --git a/app/views/fields/types_de_champ_collection_field/_show.html.haml b/app/views/fields/types_de_champ_collection_field/_show.html.haml index 849a79af9..c54bb1c64 100644 --- a/app/views/fields/types_de_champ_collection_field/_show.html.haml +++ b/app/views/fields/types_de_champ_collection_field/_show.html.haml @@ -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 diff --git a/app/views/layouts/manager/application.html.haml b/app/views/layouts/manager/application.html.haml deleted file mode 100644 index 9ab026a33..000000000 --- a/app/views/layouts/manager/application.html.haml +++ /dev/null @@ -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" diff --git a/app/views/manager/administrateurs/index.html.haml b/app/views/manager/administrateurs/index.html.haml deleted file mode 100644 index 17b5ad587..000000000 --- a/app/views/manager/administrateurs/index.html.haml +++ /dev/null @@ -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 diff --git a/app/views/manager/administrateurs/show.html.erb b/app/views/manager/administrateurs/show.html.erb new file mode 100644 index 000000000..df139d013 --- /dev/null +++ b/app/views/manager/administrateurs/show.html.erb @@ -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 %> + + + +
+
+ <% page.attributes.each do |attribute| %> +
+ <%= t( + "helpers.label.#{resource_name}.#{attribute.name}", + default: attribute.name.titleize, + ) %> +
+ +
<%= render_field attribute %>
+ <% end %> +
+
diff --git a/app/views/manager/application/_collection.html.haml b/app/views/manager/application/_collection.html.haml deleted file mode 100644 index ca18cdcd2..000000000 --- a/app/views/manager/application/_collection.html.haml +++ /dev/null @@ -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 diff --git a/app/views/manager/application/_flashes.html.haml b/app/views/manager/application/_flashes.html.haml deleted file mode 100644 index f5fd0ebc9..000000000 --- a/app/views/manager/application/_flashes.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -- if flash.any? - .flashes - - flash.each do |key, value| - .flash{ class: "flash--#{key}" } - = value diff --git a/app/views/manager/application/_javascript.html.haml b/app/views/manager/application/_javascript.html.haml deleted file mode 100644 index de1850bf7..000000000 --- a/app/views/manager/application/_javascript.html.haml +++ /dev/null @@ -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 }); diff --git a/app/views/manager/application/_navigation.html.erb b/app/views/manager/application/_navigation.html.erb new file mode 100644 index 000000000..ba8850049 --- /dev/null +++ b/app/views/manager/application/_navigation.html.erb @@ -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 +%> + + diff --git a/app/views/manager/application/_sidebar.html.haml b/app/views/manager/application/_sidebar.html.haml deleted file mode 100644 index feb738b62..000000000 --- a/app/views/manager/application/_sidebar.html.haml +++ /dev/null @@ -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" diff --git a/app/views/manager/application/index.html.haml b/app/views/manager/application/index.html.haml deleted file mode 100644 index ce051bf66..000000000 --- a/app/views/manager/application/index.html.haml +++ /dev/null @@ -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 diff --git a/app/views/manager/application/show.html.haml b/app/views/manager/application/show.html.haml deleted file mode 100644 index a17f35005..000000000 --- a/app/views/manager/application/show.html.haml +++ /dev/null @@ -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 diff --git a/app/views/manager/procedures/show.html.erb b/app/views/manager/procedures/show.html.erb new file mode 100644 index 000000000..fda6239e9 --- /dev/null +++ b/app/views/manager/procedures/show.html.erb @@ -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 %> + + + +
+
+ <% page.attributes.each do |attribute| %> +
+ <%= t( + "helpers.label.#{resource_name}.#{attribute.name}", + default: attribute.name.titleize, + ) %> +
+ +
<%= render_field attribute %>
+ <% end %> +
+
diff --git a/app/views/manager/procedures/show.html.haml b/app/views/manager/procedures/show.html.haml deleted file mode 100644 index 1627fa667..000000000 --- a/app/views/manager/procedures/show.html.haml +++ /dev/null @@ -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 diff --git a/db/migrate/20180206153121_add_ask_birthday_to_procedure.rb b/db/migrate/20180206153121_add_ask_birthday_to_procedure.rb new file mode 100644 index 000000000..6dc56e59f --- /dev/null +++ b/db/migrate/20180206153121_add_ask_birthday_to_procedure.rb @@ -0,0 +1,5 @@ +class AddAskBirthdayToProcedure < ActiveRecord::Migration[5.0] + def change + add_column :procedures, :ask_birthday, :boolean, default: false, null: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 95d468ba7..76daf76cd 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -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 diff --git a/spec/controllers/new_gestionnaire/recherche_controller_spec.rb b/spec/controllers/new_gestionnaire/recherche_controller_spec.rb index 7e4a67039..4e3ac6288 100644 --- a/spec/controllers/new_gestionnaire/recherche_controller_spec.rb +++ b/spec/controllers/new_gestionnaire/recherche_controller_spec.rb @@ -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 diff --git a/spec/features/users/dossier_creation_spec.rb b/spec/features/users/dossier_creation_spec.rb index 7543c4c0f..a1c7ab759 100644 --- a/spec/features/users/dossier_creation_spec.rb +++ b/spec/features/users/dossier_creation_spec.rb @@ -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 diff --git a/spec/features/users/dossier_index_spec.rb b/spec/features/users/dossier_index_spec.rb index e508add36..614059d63 100644 --- a/spec/features/users/dossier_index_spec.rb +++ b/spec/features/users/dossier_index_spec.rb @@ -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