diff --git a/Gemfile b/Gemfile index 8dcca1dac..0b9fa75cd 100644 --- a/Gemfile +++ b/Gemfile @@ -64,8 +64,6 @@ gem 'leaflet-rails' gem 'leaflet-markercluster-rails', '~> 0.7.0' gem 'leaflet-draw-rails' -gem 'bootstrap-datepicker-rails' - gem 'chartkick' gem 'logstasher' @@ -76,7 +74,10 @@ gem 'hashie' gem 'mailjet' -gem 'smart_listing' +# FIXME: this is a fork, go back to official version +# once https://github.com/Sology/smart_listing/pull/139 +# has been merged and released +gem 'smart_listing', git: 'https://github.com/mizinsky/smart_listing.git', branch: 'kaminari-update' gem 'bootstrap-wysihtml5-rails', '~> 0.3.3.8' diff --git a/Gemfile.lock b/Gemfile.lock index f8a50a1ad..a66a3bb47 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -15,6 +15,17 @@ GIT open4 (~> 1.3.4) rake +GIT + remote: https://github.com/mizinsky/smart_listing.git + revision: bcdd4f25954fc6f4faa3d6ea6ea9a69c65da678b + branch: kaminari-update + specs: + smart_listing (1.2.1) + coffee-rails + jquery-rails + kaminari (>= 0.17) + rails (>= 3.2) + GEM remote: https://rubygems.org/ specs: @@ -93,8 +104,6 @@ GEM bcrypt (3.1.11) bindata (2.4.1) bindex (0.5.0) - bootstrap-datepicker-rails (1.6.4.1) - railties (>= 3.0) bootstrap-sass (3.3.7) autoprefixer-rails (>= 5.2.1) sass (>= 3.3.4) @@ -668,11 +677,6 @@ GEM tilt (~> 2.0) skylight (1.5.0) activesupport (>= 3.0.0) - smart_listing (1.2.0) - coffee-rails - jquery-rails - kaminari (~> 0.17) - rails (>= 3.2) spreadsheet_architect (1.4.8) axlsx (>= 2.0) rodf (= 0.3.7) @@ -753,7 +757,6 @@ DEPENDENCIES active_model_serializers administrate apipie-rails - bootstrap-datepicker-rails bootstrap-sass (~> 3.3.5) bootstrap-wysihtml5-rails (~> 0.3.3.8) brakeman @@ -823,7 +826,7 @@ DEPENDENCIES shoulda-matchers simple_form skylight - smart_listing + smart_listing! spreadsheet_architect (~> 1.4.8) spring spring-commands-rspec diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index d5ce61307..62f9b7d15 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -17,8 +17,6 @@ //= require chartkick //= require_tree ./old_design //= require bootstrap-sprockets -//= require bootstrap-datepicker/core -//= require bootstrap-datepicker/locales/bootstrap-datepicker.fr.js //= require leaflet.js //= require d3.min diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 99cf3f12a..ed0ae2bf5 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -46,7 +46,6 @@ // = require attestation_recapitulatif // = require_self -// = require bootstrap-datepicker3 // = require leaflet // = require font-awesome // = require franceconnect diff --git a/app/assets/stylesheets/description.scss b/app/assets/stylesheets/description.scss index 3efa4d01b..3c97d8476 100644 --- a/app/assets/stylesheets/description.scss +++ b/app/assets/stylesheets/description.scss @@ -1,5 +1,4 @@ @import "bootstrap"; -@import "bootstrap-datepicker3"; #description-page #liste-champs { diff --git a/app/controllers/admin/accompagnateurs_controller.rb b/app/controllers/admin/accompagnateurs_controller.rb index 259f6112f..1f7ca7c7f 100644 --- a/app/controllers/admin/accompagnateurs_controller.rb +++ b/app/controllers/admin/accompagnateurs_controller.rb @@ -6,6 +6,16 @@ class Admin::AccompagnateursController < AdminController def show assign_scope = @procedure.gestionnaires + + # FIXME: remove this comment (no code to remove) when + # https://github.com/Sology/smart_listing/issues/134 + # is fixed. + # + # No need to permit parameters for smart_listing, because + # there are no sortable columns + # + # END OF FIXME + @accompagnateurs_assign = smart_listing_create :accompagnateurs_assign, assign_scope, partial: "admin/accompagnateurs/list_assign", @@ -14,6 +24,15 @@ class Admin::AccompagnateursController < AdminController not_assign_scope = current_administrateur.gestionnaires.where.not(id: assign_scope.ids) not_assign_scope = not_assign_scope.where("email LIKE ?", "%#{params[:filter]}%") if params[:filter] + # FIXME: remove this comment (no code to remove) when + # https://github.com/Sology/smart_listing/issues/134 + # is fixed. + # + # No need to permit parameters for smart_listing, because + # there are no sortable columns + # + # END OF FIXME + @accompagnateurs_not_assign = smart_listing_create :accompagnateurs_not_assign, not_assign_scope, partial: "admin/accompagnateurs/list_not_assign", diff --git a/app/controllers/admin/gestionnaires_controller.rb b/app/controllers/admin/gestionnaires_controller.rb index e8f1848f3..f6bdb1966 100644 --- a/app/controllers/admin/gestionnaires_controller.rb +++ b/app/controllers/admin/gestionnaires_controller.rb @@ -3,6 +3,12 @@ class Admin::GestionnairesController < AdminController helper SmartListing::Helper def index + # FIXME: remove when + # https://github.com/Sology/smart_listing/issues/134 + # is fixed + permit_smart_listing_params + # END OF FIXME + @gestionnaires = smart_listing_create :gestionnaires, current_administrateur.gestionnaires, partial: "admin/gestionnaires/list", diff --git a/app/controllers/admin/procedures_controller.rb b/app/controllers/admin/procedures_controller.rb index e451af182..c827ad5b6 100644 --- a/app/controllers/admin/procedures_controller.rb +++ b/app/controllers/admin/procedures_controller.rb @@ -5,6 +5,12 @@ class Admin::ProceduresController < AdminController before_action :retrieve_procedure, only: [:show, :edit] def index + # FIXME: remove when + # https://github.com/Sology/smart_listing/issues/134 + # is fixed + permit_smart_listing_params + # END OF FIXME + @procedures = smart_listing_create :procedures, current_administrateur.procedures.publiees.order(published_at: :desc), partial: "admin/procedures/list", @@ -14,6 +20,12 @@ class Admin::ProceduresController < AdminController end def archived + # FIXME: remove when + # https://github.com/Sology/smart_listing/issues/134 + # is fixed + permit_smart_listing_params + # END OF FIXME + @procedures = smart_listing_create :procedures, current_administrateur.procedures.archivees.order(published_at: :desc), partial: "admin/procedures/list", @@ -25,6 +37,12 @@ class Admin::ProceduresController < AdminController end def draft + # FIXME: remove when + # https://github.com/Sology/smart_listing/issues/134 + # is fixed + permit_smart_listing_params + # END OF FIXME + @procedures = smart_listing_create :procedures, current_administrateur.procedures.brouillons.order(created_at: :desc), partial: "admin/procedures/list", diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 559acd6df..88d2a343a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -109,4 +109,35 @@ class ApplicationController < ActionController::Base }) end end + + def permit_smart_listing_params + # FIXME: remove when + # https://github.com/Sology/smart_listing/issues/134 + # is fixed + self.params = params.permit( + # Dossiers + :liste, + dossiers_smart_listing: + [ + :page, + :per_page, + { sort: [:id, :'procedure.libelle', :state, :updated_at] } + ], + # Gestionnaires + gestionnaires_smart_listing: + [ + :page, + :per_page, + { sort: [:email] } + ], + # Procédures + procedures_smart_listing: + [ + :page, + :per_page, + { sort: [:id, :libelle, :published_at] } + ] + ) + # END OF FIXME + end end diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 9c042590e..f7effb1ed 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -29,6 +29,12 @@ class Users::DossiersController < UsersController return redirect_to users_dossiers_path end + # FIXME: remove when + # https://github.com/Sology/smart_listing/issues/134 + # is fixed + permit_smart_listing_params + # END OF FIXME + @dossiers = smart_listing_create :dossiers, @dossiers_filtered, partial: "users/dossiers/list", diff --git a/app/decorators/champ_decorator.rb b/app/decorators/champ_decorator.rb index 4652d5d08..eb65538a4 100644 --- a/app/decorators/champ_decorator.rb +++ b/app/decorators/champ_decorator.rb @@ -19,6 +19,16 @@ class ChampDecorator < Draper::Decorator end end + def date_for_input + if object.value.present? + if type_champ == "date" + object.value + elsif type_champ == "datetime" && object.value != ' 00:00' + DateTime.parse(object.value, "%Y-%m-%d %H:%M").strftime("%Y-%m-%d") + end + end + end + def description_with_links description.gsub(URI.regexp, '\0') if description end diff --git a/app/lib/siade/etablissement_adapter.rb b/app/lib/siade/etablissement_adapter.rb index ef03721b3..6b52d6bda 100644 --- a/app/lib/siade/etablissement_adapter.rb +++ b/app/lib/siade/etablissement_adapter.rb @@ -32,13 +32,9 @@ class SIADE::EtablissementAdapter end def adresse - adresse = '' - [:l1, :l2, :l3, :l4, :l5, :l6, :l7].each do |line| - if data_source[:etablissement][:adresse][line].present? - adresse = adresse + data_source[:etablissement][:adresse][line] + "\r\n" - end - end - adresse + [:l1, :l2, :l3, :l4, :l5, :l6, :l7].map do |line| + data_source[:etablissement][:adresse][line] + end.compact.join("\r\n") end def address_attribut_to_fetch diff --git a/app/models/champ.rb b/app/models/champ.rb index ca6a59c8c..2b7747105 100644 --- a/app/models/champ.rb +++ b/app/models/champ.rb @@ -6,7 +6,7 @@ class Champ < ActiveRecord::Base delegate :libelle, :type_champ, :order_place, :mandatory, :description, :drop_down_list, to: :type_de_champ before_save :format_date_to_iso, if: Proc.new { type_champ == 'date' } - before_save :serialize_datetime_if_needed, if: Proc.new { type_champ == 'datetime' } + before_save :format_datetime, if: Proc.new { type_champ == 'datetime' } before_save :multiple_select_to_string, if: Proc.new { type_champ == 'multiple_drop_down_list' } after_save :internal_notification, if: Proc.new { dossier.present? } @@ -17,15 +17,6 @@ class Champ < ActiveRecord::Base mandatory end - def data_provide - return 'datepicker' if (type_champ == 'datetime') && !(BROWSER.value.chrome? || BROWSER.value.edge?) - return 'typeahead' if type_champ == 'address' - end - - def data_date_format - ('dd/mm/yyyy' if type_champ == 'datetime') - end - def same_hour? num same_date? num, '%H' end @@ -102,7 +93,7 @@ class Champ < ActiveRecord::Base self.value = date end - def serialize_datetime_if_needed + def format_datetime if (value =~ /=>/).present? date = begin hash_date = YAML.safe_load(value.gsub('=>', ': ')) @@ -111,8 +102,11 @@ class Champ < ActiveRecord::Base rescue nil end - self.value = date + elsif /^\d{2}\/\d{2}\/\d{4}\s\d{2}:\d{2}$/ =~ value # old browsers can send with dd/mm/yyyy hh:mm format + self.value = DateTime.parse(value, "%d/%m/%Y %H:%M").strftime("%Y-%m-%d %H:%M") + elsif !(/^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}$/ =~ value) # a datetime not correctly formatted should not be stored + self.value = nil end end diff --git a/app/models/commentaire.rb b/app/models/commentaire.rb index 7b3c651d9..3cfeab1da 100644 --- a/app/models/commentaire.rb +++ b/app/models/commentaire.rb @@ -14,7 +14,7 @@ class Commentaire < ActiveRecord::Base after_create :notify def header - "#{email}, " + I18n.l(created_at.localtime, format: '%d %b %Y %H:%M') + "#{email}, #{I18n.l(created_at.localtime, format: '%d %b %Y %H:%M')}" end def file_url diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 5843337d2..a1dd384e1 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -154,12 +154,9 @@ class Dossier < ActiveRecord::Base end def convert_specific_hash_values_to_string(hash_to_convert) - hash = {} - hash_to_convert.each do |key, value| - value = serialize_value_for_export(value) - hash.store(key, value) + hash_to_convert.transform_values do |value| + serialize_value_for_export(value) end - hash end def full_data_strings_array @@ -170,11 +167,11 @@ class Dossier < ActiveRecord::Base def export_entreprise_data if entreprise.present? - etablissement_attr = EtablissementCsvSerializer.new(self.etablissement).attributes.map { |k, v| ["etablissement.#{k}".parameterize.underscore.to_sym, v] }.to_h - entreprise_attr = EntrepriseSerializer.new(self.entreprise).attributes.map { |k, v| ["entreprise.#{k}".parameterize.underscore.to_sym, v] }.to_h + etablissement_attr = EtablissementCsvSerializer.new(self.etablissement).attributes.transform_keys { |k| "etablissement.#{k}".parameterize.underscore.to_sym } + entreprise_attr = EntrepriseSerializer.new(self.entreprise).attributes.transform_keys { |k| "entreprise.#{k}".parameterize.underscore.to_sym } else - etablissement_attr = EtablissementSerializer.new(Etablissement.new).attributes.map { |k, v| ["etablissement.#{k}".parameterize.underscore.to_sym, v] }.to_h - entreprise_attr = EntrepriseSerializer.new(Entreprise.new).attributes.map { |k, v| ["entreprise.#{k}".parameterize.underscore.to_sym, v] }.to_h + etablissement_attr = EtablissementSerializer.new(Etablissement.new).attributes.transform_keys { |k| "etablissement.#{k}".parameterize.underscore.to_sym } + entreprise_attr = EntrepriseSerializer.new(Entreprise.new).attributes.transform_keys { |k| "entreprise.#{k}".parameterize.underscore.to_sym } end convert_specific_hash_values_to_string(etablissement_attr.merge(entreprise_attr)) end diff --git a/app/models/gestionnaire.rb b/app/models/gestionnaire.rb index 02cd33e81..1b965373a 100644 --- a/app/models/gestionnaire.rb +++ b/app/models/gestionnaire.rb @@ -55,8 +55,8 @@ class Gestionnaire < ActiveRecord::Base procedure_ids = followed_dossiers.pluck(:procedure_id) if procedure_ids.include?(procedure.id) - return followed_dossiers.where(procedure_id: procedure.id).inject(0) do |acc, dossier| - acc += dossier.notifications.where(already_read: false).count + return followed_dossiers.where(procedure_id: procedure.id).sum do |dossier| + dossier.notifications.where(already_read: false).count end end 0 diff --git a/app/services/render_partial_service.rb b/app/services/render_partial_service.rb index 5d37024ea..186c8f633 100644 --- a/app/services/render_partial_service.rb +++ b/app/services/render_partial_service.rb @@ -23,11 +23,11 @@ class RenderPartialService private def retrieve_navbar - 'layouts/navbars/navbar_' + retrieve_name + "layouts/navbars/navbar_#{retrieve_name}" end def retrieve_left_panel - 'layouts/left_panels/left_panel_' + retrieve_name + "layouts/left_panels/left_panel_#{retrieve_name}" end def retrieve_name diff --git a/app/views/users/description/champs/_date.html.haml b/app/views/users/description/champs/_date.html.haml index 74088b67c..7e0d94563 100644 --- a/app/views/users/description/champs/_date.html.haml +++ b/app/views/users/description/champs/_date.html.haml @@ -1,5 +1,5 @@ %input.form-control{ name: "champs['#{champ.id}']", placeholder: "JJ/MM/AAAA", id: "champs_#{champ.id}", - value: champ.value ? champ.object.value : champ.value, + value: champ.date_for_input, type: "date" } diff --git a/app/views/users/description/champs/_datetime.html.haml b/app/views/users/description/champs/_datetime.html.haml index 061ed821d..1ed6a5584 100644 --- a/app/views/users/description/champs/_datetime.html.haml +++ b/app/views/users/description/champs/_datetime.html.haml @@ -1,18 +1,13 @@ -%input.form-control{ name: "champs['#{champ.id}']", - placeholder: champ.libelle, - id: "champs_#{champ.id}", - value: (champ.value.split(/[ ][0-9]*:[0-9]*/).first if champ.value.present?), - type: champ.type_champ, - 'data-provide' => champ.data_provide, - 'data-date-format' => champ.data_date_format } += render partial: 'users/description/champs/date', locals: { champ: champ } -%select.form-control{ name: "time_hour['#{champ.id}']", style: 'margin-left: 5px;', id: "time_hour_#{champ.id}" } +%br +%select.form-control{ name: "time_hour['#{champ.id}']", style: 'width:70px;display:inline;', id: "time_hour_#{champ.id}" } - (0..23).each do |num| - num = "%.2i" %num %option{ value: num, selected: (:selected if champ.same_hour?(num)) } = num h -%select.form-control{ name: "time_minute['#{champ.id}']", id: "time_minute_#{champ.id}" } +%select.form-control{ name: "time_minute['#{champ.id}']", style: 'width:70px;display:inline;', id: "time_minute_#{champ.id}" } - (0..59).each do |num| - num = "%.2i" %num - if num.to_i%5 == 0 diff --git a/lib/tasks/2018_01_18_clean_datetime_in_champs.rake b/lib/tasks/2018_01_18_clean_datetime_in_champs.rake new file mode 100644 index 000000000..846b5c8be --- /dev/null +++ b/lib/tasks/2018_01_18_clean_datetime_in_champs.rake @@ -0,0 +1,30 @@ +namespace :'2018_01_18_clean_datetime_in_champs' do + task clean: :environment do + datetime_champs = TypeDeChamp.where(type_champ: "datetime").flat_map{ |t| t.champ } + + # Match " HH:MM" => nil a datetime is not valid if not composed by date AND time + datetime_champs.select { |c| /^\s\d{2}:\d{2}$/.match(c.value) }.each do |c| + puts "cleaning #{c.value} => nil" + c.update_columns(value: nil) + end + + # Match "dd/mm/YYYY HH:MM" => "YYYY-mm-dd HH:MM" + datetime_champs.select { |c| /^\d{2}\/\d{2}\/\d{4}\s\d{2}:\d{2}$/ =~ c.value }.each do |c| + formated_date = DateTime.parse(c.value, "%d/%m/%Y %H:%M").strftime("%Y-%m-%d %H:%M") + puts "cleaning #{c.value} => #{formated_date}" + c.update_columns(value: formated_date) + end + + # Match "ddmmYYYY HH:MM" => "YYYY-mm-dd HH:MM" + datetime_champs.select { |c| /^\d{8}\s\d{2}:\d{2}$/ =~ c.value }.each do |c| + day = c.value[0,2] + month = c.value[2,2] + year = c.value[4,4] + hours = c.value[9,2] + minutes = c.value[12,2] + formated_date = "#{year}-#{month}-#{day} #{hours}:#{minutes}" + puts "cleaning #{c.value} => #{formated_date}" + c.update_columns(value: formated_date) + end + end +end diff --git a/spec/controllers/admin/gestionnaires_controller_spec.rb b/spec/controllers/admin/gestionnaires_controller_spec.rb index 3d2bcf246..1e2c701f9 100644 --- a/spec/controllers/admin/gestionnaires_controller_spec.rb +++ b/spec/controllers/admin/gestionnaires_controller_spec.rb @@ -14,6 +14,17 @@ describe Admin::GestionnairesController, type: :controller do it { expect(subject.status).to eq(200) } end + describe 'GET #index with sorting and pagination' do + subject { + get :index, + 'gestionnaires_smart_listing[page]': 1, + 'gestionnaires_smart_listing[per_page]': 10, + 'gestionnaires_smart_listing[sort][email]': 'asc' + } + + it { expect(subject.status).to eq(200) } + end + describe 'POST #create' do let(:email) { 'test@plop.com' } let(:procedure_id) { nil } diff --git a/spec/controllers/admin/procedures_controller_spec.rb b/spec/controllers/admin/procedures_controller_spec.rb index 829b3a7cb..2ea08fd37 100644 --- a/spec/controllers/admin/procedures_controller_spec.rb +++ b/spec/controllers/admin/procedures_controller_spec.rb @@ -42,18 +42,51 @@ describe Admin::ProceduresController, type: :controller do it { expect(response.status).to eq(200) } end + describe 'GET #index with sorting and pagination' do + subject { + get :index, + 'procedures_smart_listing[page]': 1, + 'procedures_smart_listing[per_page]': 10, + 'procedures_smart_listing[sort][id]': 'asc' + } + + it { expect(subject.status).to eq(200) } + end + describe 'GET #archived' do subject { get :archived } it { expect(response.status).to eq(200) } end + describe 'GET #archived with sorting and pagination' do + subject { + get :archived, + 'procedures_smart_listing[page]': 1, + 'procedures_smart_listing[per_page]': 10, + 'procedures_smart_listing[sort][libelle]': 'asc' + } + + it { expect(subject.status).to eq(200) } + end + describe 'GET #published' do subject { get :published } it { expect(response.status).to eq(200) } end + describe 'GET #draft with sorting and pagination' do + subject { + get :draft, + 'procedures_smart_listing[page]': 1, + 'procedures_smart_listing[per_page]': 10, + 'procedures_smart_listing[sort][published_at]': 'asc' + } + + it { expect(subject.status).to eq(200) } + end + describe 'DELETE #destroy' do let(:procedure_draft) { create :procedure, administrateur: admin, published_at: nil, archived_at: nil } let(:procedure_published) { create :procedure, administrateur: admin, published_at: Time.now, archived_at: nil } diff --git a/spec/controllers/users/description_controller_shared_example.rb b/spec/controllers/users/description_controller_shared_example.rb index 68da86a82..4a5d57e85 100644 --- a/spec/controllers/users/description_controller_shared_example.rb +++ b/spec/controllers/users/description_controller_shared_example.rb @@ -249,7 +249,7 @@ shared_examples 'description_controller_spec' do describe 'Sauvegarde des champs' do let(:champs_dossier) { dossier.champs } let(:dossier_text_value) { 'test value' } - let(:dossier_date_value) { '23/06/2016' } + let(:dossier_date_value) { '2018-01-31' } let(:dossier_hour_value) { '17' } let(:dossier_minute_value) { '00' } let(:dossier_datetime_champ_id) { dossier.champs.find { |c| c.type_champ == "datetime" }.id } @@ -302,8 +302,8 @@ shared_examples 'description_controller_spec' do before do post :update, params: { dossier_id: dossier_id, - 'piece_justificative_' + all_pj_type[0].to_s => piece_justificative_0, - 'piece_justificative_' + all_pj_type[1].to_s => piece_justificative_1 + "piece_justificative_#{all_pj_type[0].to_s}" => piece_justificative_0, + "piece_justificative_#{all_pj_type[1].to_s}" => piece_justificative_1 } dossier.reload end @@ -314,8 +314,8 @@ shared_examples 'description_controller_spec' do post :update, params: { dossier_id: dossier_id, - 'piece_justificative_' + all_pj_type[0].to_s => piece_justificative_0, - 'piece_justificative_' + all_pj_type[1].to_s => piece_justificative_1 + "piece_justificative_#{all_pj_type[0].to_s}" => piece_justificative_0, + "piece_justificative_#{all_pj_type[1].to_s}" => piece_justificative_1 } end end @@ -355,8 +355,8 @@ shared_examples 'description_controller_spec' do subject { patch :pieces_justificatives, params: { dossier_id: dossier.id, - 'piece_justificative_' + all_pj_type[0].to_s => piece_justificative_0, - 'piece_justificative_' + all_pj_type[1].to_s => piece_justificative_1 + "piece_justificative_#{all_pj_type[0].to_s}" => piece_justificative_0, + "piece_justificative_#{all_pj_type[1].to_s}" => piece_justificative_1 } } @@ -434,8 +434,8 @@ shared_examples 'description_controller_spec_POST_piece_justificatives_for_owner subject { patch :pieces_justificatives, params: { dossier_id: dossier.id, - 'piece_justificative_' + all_pj_type[0].to_s => piece_justificative_0, - 'piece_justificative_' + all_pj_type[1].to_s => piece_justificative_1 + "piece_justificative_#{all_pj_type[0].to_s}" => piece_justificative_0, + "piece_justificative_#{all_pj_type[1].to_s}" => piece_justificative_1 } } diff --git a/spec/decorators/champ_decorator_spec.rb b/spec/decorators/champ_decorator_spec.rb index bcf58ed17..c01beac14 100644 --- a/spec/decorators/champ_decorator_spec.rb +++ b/spec/decorators/champ_decorator_spec.rb @@ -61,4 +61,36 @@ describe ChampDecorator do end end end + + describe '#date_for_input' do + subject { decorator.date_for_input } + + describe "for a date" do + let(:type_champ) { :date } + + context "when value is an ISO date" do + before { champ.update value: "2017-12-31" } + it { is_expected.to eq "2017-12-31" } + end + + context "when value is empty" do + before { champ.update value: nil } + it { is_expected.to eq nil } + end + end + + describe "for a datetime" do + let(:type_champ) { :date } + + context "when value is an formatted datetime" do + before { champ.update value: "2017-12-30 23:17" } + it { is_expected.to eq "2017-12-30" } + end + + context "when value is empty" do + before { champ.update value: nil } + it { is_expected.to eq nil } + end + end + end end diff --git a/spec/features/description_page/upload_piece_justificative_spec.rb b/spec/features/description_page/upload_piece_justificative_spec.rb index 25ccf4f75..50f00c9fb 100644 --- a/spec/features/description_page/upload_piece_justificative_spec.rb +++ b/spec/features/description_page/upload_piece_justificative_spec.rb @@ -44,7 +44,7 @@ feature 'user is on description page' do end context 'when he adds a piece_justificative and submit form', vcr: { cassette_name: 'description_page_upload_piece_justificative_adds_cerfa_and_submit' } do before do - file_input_id = 'piece_justificative_' + dossier.types_de_piece_justificative.first.id.to_s + file_input_id = "piece_justificative_#{dossier.types_de_piece_justificative.first.id.to_s}" attach_file(file_input_id, File.path('spec/support/files/dossierPDF.pdf')) click_on('Soumettre mon dossier') dossier.reload diff --git a/spec/features/users/dossier_edition_spec.rb b/spec/features/users/dossier_edition_spec.rb index d64311de5..3de44ef52 100644 --- a/spec/features/users/dossier_edition_spec.rb +++ b/spec/features/users/dossier_edition_spec.rb @@ -21,7 +21,7 @@ feature 'As a User I want to edit a dossier I own' do end scenario 'Getting a dossier, I want to create a new message on', js: true do - page.find_by_id('tr_dossier_' + dossier.id.to_s).click + page.find_by_id("tr_dossier_#{dossier.id.to_s}").click expect(page).to have_current_path(users_dossier_recapitulatif_path(Dossier.first.id.to_s)) page.find_by_id('open-message').click page.execute_script("$('#texte_commentaire').data('wysihtml5').editor.setValue('Contenu du nouveau message')") @@ -30,7 +30,7 @@ feature 'As a User I want to edit a dossier I own' do end scenario 'On the same dossier, I want to edit informations', js: true do - page.find_by_id('tr_dossier_' + dossier.id.to_s).click + page.find_by_id("tr_dossier_#{dossier.id.to_s}").click expect(page).to have_current_path(users_dossier_recapitulatif_path(dossier.id.to_s)) # Linked Dossier diff --git a/spec/lib/siade/etablissement_adapter_spec.rb b/spec/lib/siade/etablissement_adapter_spec.rb index 394f2ee70..3e5092692 100644 --- a/spec/lib/siade/etablissement_adapter_spec.rb +++ b/spec/lib/siade/etablissement_adapter_spec.rb @@ -33,7 +33,7 @@ describe SIADE::EtablissementAdapter do context 'Concaténation lignes adresse' do it 'L\'entreprise contient bien une adresse sur plusieurs lignes' do - expect(subject[:adresse]).to eq("OCTO TECHNOLOGY\r\n50 AVENUE DES CHAMPS ELYSEES\r\n75008 PARIS\r\nFRANCE\r\n") + expect(subject[:adresse]).to eq("OCTO TECHNOLOGY\r\n50 AVENUE DES CHAMPS ELYSEES\r\n75008 PARIS\r\nFRANCE") end end diff --git a/spec/models/champ_shared_example.rb b/spec/models/champ_shared_example.rb index c8bb4360e..60dc38e9a 100644 --- a/spec/models/champ_shared_example.rb +++ b/spec/models/champ_shared_example.rb @@ -26,28 +26,6 @@ shared_examples 'champ_spec' do end end - describe 'data_provide' do - let(:champ) { create :champ } - - subject { champ.data_provide } - - context 'when type_champ is datetime' do - before do - champ.type_de_champ = create :type_de_champ_public, type_champ: 'datetime' - end - - it { is_expected.to eq 'datepicker' } - end - - context 'when type_champ is address' do - before do - champ.type_de_champ = create :type_de_champ_public, type_champ: 'address' - end - - it { is_expected.to eq 'typeahead' } - end - end - describe '.departement', vcr: { cassette_name: 'call_geo_api_departements' } do subject { Champ.departements } diff --git a/spec/models/champ_spec.rb b/spec/models/champ_spec.rb index 1db3481da..6085a5719 100644 --- a/spec/models/champ_spec.rb +++ b/spec/models/champ_spec.rb @@ -5,24 +5,22 @@ describe Champ do it_should_behave_like "champ_spec" - describe '#serialize_datetime_if_needed' do + describe '#format_datetime' do let(:type_de_champ) { TypeDeChamp.new(type_champ: 'datetime') } let(:champ) { Champ.new(type_de_champ: type_de_champ, value: value) } before { champ.save } - # when using the old form, and the ChampsService Class - # TODO: to remove - context 'when the value is already serialized' do - let(:value) { '12/01/2017 10:23' } + context 'when the value is sent by a modern browser' do + let(:value) { '2017-12-31 10:23' } it { expect(champ.value).to eq(value) } end - context 'when the value is not already serialized' do - let(:value) { '{ 1=>2017, 2=>01, 3=>12, 4=>10, 5=>23 }' } + context 'when the value is sent by a old browser' do + let(:value) { '31/12/2018 09:26' } - it { expect(champ.value).to eq('12/01/2017 10:23') } + it { expect(champ.value).to eq('2018-12-31 09:26') } end end diff --git a/spec/models/concern/tags_substitution_concern_spec.rb b/spec/models/concern/tags_substitution_concern_spec.rb index 906e20ee3..4f6f185a2 100644 --- a/spec/models/concern/tags_substitution_concern_spec.rb +++ b/spec/models/concern/tags_substitution_concern_spec.rb @@ -179,10 +179,10 @@ describe TagsSubstitutionConcern, type: :model do dossier.champs .select { |champ| champ.type_champ == 'datetime' } .first - .update_attributes(value: '13/09/2017 09:00') + .update_attributes(value: '2017-09-13 09:00') end - it { is_expected.to eq('15/04/2017 13/09/2017 09:00') } + it { is_expected.to eq('15/04/2017 2017-09-13 09:00') } end end end diff --git a/spec/models/gestionnaire_spec.rb b/spec/models/gestionnaire_spec.rb index e300ffe6c..7b92dd830 100644 --- a/spec/models/gestionnaire_spec.rb +++ b/spec/models/gestionnaire_spec.rb @@ -95,7 +95,7 @@ describe Gestionnaire, type: :model do it { is_expected.to eq 0 } it { expect(gestionnaire.follows.count).to eq 0 } it do - expect_any_instance_of(Dossier::ActiveRecord_AssociationRelation).not_to receive(:inject) + expect_any_instance_of(Dossier::ActiveRecord_AssociationRelation).not_to receive(:sum) subject end end @@ -108,7 +108,7 @@ describe Gestionnaire, type: :model do it { is_expected.to eq 0 } it { expect(gestionnaire.follows.count).to eq 1 } it do - expect_any_instance_of(Dossier::ActiveRecord_AssociationRelation).not_to receive(:inject) + expect_any_instance_of(Dossier::ActiveRecord_AssociationRelation).not_to receive(:sum) subject end end @@ -124,7 +124,7 @@ describe Gestionnaire, type: :model do it { is_expected.to eq 1 } it { expect(gestionnaire.follows.count).to eq 1 } it do - expect_any_instance_of(Dossier::ActiveRecord_AssociationRelation).to receive(:inject) + expect_any_instance_of(Dossier::ActiveRecord_AssociationRelation).to receive(:sum) subject end end diff --git a/spec/services/champs_service_spec.rb b/spec/services/champs_service_spec.rb index 67f4c04d1..2912da0e9 100644 --- a/spec/services/champs_service_spec.rb +++ b/spec/services/champs_service_spec.rb @@ -28,7 +28,7 @@ describe ChampsService do end it 'parses and save the date' do - expect(champ_datetime.value).to eq('d 12:24') + expect(champ_datetime.value).to eq(nil) end end diff --git a/spec/views/users/description/show.html.haml_spec.rb b/spec/views/users/description/show.html.haml_spec.rb index 4f7bf3d62..afe24dc62 100644 --- a/spec/views/users/description/show.html.haml_spec.rb +++ b/spec/views/users/description/show.html.haml_spec.rb @@ -66,7 +66,7 @@ describe 'users/description/show.html.haml', type: :view do let(:champ_datetime) { champs.where(type_de_champ_id: types_de_champ.id).first } before do - champ_datetime.value = "22/06/2016 12:05" + champ_datetime.value = "2016-06-22 12:05" champ_datetime.save render end @@ -82,7 +82,7 @@ describe 'users/description/show.html.haml', type: :view do end describe 'datetime value is correctly setup when is not nil' do - it { expect(rendered).to have_css("input[type='datetime'][id='champs_#{champ_datetime.id}'][value='22/06/2016']") } + it { expect(rendered).to have_css("input[type='date'][id='champs_#{champ_datetime.id}'][value='2016-06-22']") } it { expect(rendered).to have_css("option[value='12'][selected='selected']") } it { expect(rendered).to have_css("option[value='05'][selected='selected']") } end