From 320d5da40fdd9eeda6e86bdd65d2f764e5f788f3 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Thu, 13 Apr 2017 15:05:55 +0200 Subject: [PATCH 001/102] Add individual infos to flat table export serializer --- app/models/dossier.rb | 4 +-- .../dossier_procedure_serializer.rb | 13 ------- .../dossier_table_export_serializer.rb | 34 +++++++++++++++++++ spec/factories/individual.rb | 1 + spec/models/dossier_spec.rb | 31 +++++++++++++++-- 5 files changed, 66 insertions(+), 17 deletions(-) delete mode 100644 app/serializers/dossier_procedure_serializer.rb create mode 100644 app/serializers/dossier_table_export_serializer.rb diff --git a/app/models/dossier.rb b/app/models/dossier.rb index bdadb8c00..0a2848c07 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -245,7 +245,7 @@ class Dossier < ActiveRecord::Base end def data_with_champs - serialized_dossier = DossierProcedureSerializer.new(self) + serialized_dossier = DossierTableExportSerializer.new(self) data = serialized_dossier.attributes.values data += self.champs.order('type_de_champ_id ASC').map(&:value) data += self.export_entreprise_data.values @@ -253,7 +253,7 @@ class Dossier < ActiveRecord::Base end def export_headers - serialized_dossier = DossierProcedureSerializer.new(self) + serialized_dossier = DossierTableExportSerializer.new(self) headers = serialized_dossier.attributes.keys headers += self.procedure.types_de_champ.order('id ASC').map { |types_de_champ| types_de_champ.libelle.parameterize.underscore.to_sym } headers += self.export_entreprise_data.keys diff --git a/app/serializers/dossier_procedure_serializer.rb b/app/serializers/dossier_procedure_serializer.rb deleted file mode 100644 index 02ebc4815..000000000 --- a/app/serializers/dossier_procedure_serializer.rb +++ /dev/null @@ -1,13 +0,0 @@ -class DossierProcedureSerializer < ActiveModel::Serializer - attributes :id, - :created_at, - :updated_at, - :archived, - :mandataire_social, - :state, - :initiated_at, - :received_at, - :processed_at - - attribute :followers_gestionnaires_emails, key: :emails_accompagnateurs -end diff --git a/app/serializers/dossier_table_export_serializer.rb b/app/serializers/dossier_table_export_serializer.rb new file mode 100644 index 000000000..9ed5dce82 --- /dev/null +++ b/app/serializers/dossier_table_export_serializer.rb @@ -0,0 +1,34 @@ +class DossierTableExportSerializer < ActiveModel::Serializer + attributes :id, + :created_at, + :updated_at, + :archived, + :mandataire_social, + :state, + :initiated_at, + :received_at, + :processed_at + + attribute :followers_gestionnaires_emails, key: :emails_accompagnateurs + + attributes :individual_gender, + :individual_prenom, + :individual_nom, + :individual_birthdate + + def individual_prenom + object.individual.try(:prenom) + end + + def individual_nom + object.individual.try(:nom) + end + + def individual_birthdate + object.individual.try(:birthdate) + end + + def individual_gender + object.individual.try(:gender) + end +end diff --git a/spec/factories/individual.rb b/spec/factories/individual.rb index c5924d57c..c4b7a1c52 100644 --- a/spec/factories/individual.rb +++ b/spec/factories/individual.rb @@ -1,5 +1,6 @@ FactoryGirl.define do factory :individual do + gender 'M.' nom 'Julien' prenom 'Xavier' birthdate '20/01/1991' diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 63092998b..344f41c19 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -576,6 +576,10 @@ describe Dossier do it { expect(subject[:entreprise_date_creation]).to eq('Thu, 28 Jan 2016 10:16:29 UTC +00:0') } it { expect(subject[:entreprise_nom]).to be_nil } it { expect(subject[:entreprise_prenom]).to be_nil } + it { expect(subject[:individual_gender]).to be_nil } + it { expect(subject[:individual_prenom]).to be_nil } + it { expect(subject[:individual_nom]).to be_nil } + it { expect(subject[:individual_birthdate]).to be_nil } context 'when dossier does not have enterprise' do let(:dossier) { create(:dossier, user: user, procedure: procedure) } @@ -598,7 +602,11 @@ describe Dossier do subject { dossier.export_headers } it { expect(subject).to include(:description) } - it { expect(subject.count).to eq(DossierProcedureSerializer.new(dossier).attributes.count + dossier.procedure.types_de_champ.count + dossier.export_entreprise_data.count) } + it { expect(subject).to include(:individual_gender) } + it { expect(subject).to include(:individual_nom) } + it { expect(subject).to include(:individual_prenom) } + it { expect(subject).to include(:individual_birthdate) } + it { expect(subject.count).to eq(DossierTableExportSerializer.new(dossier).attributes.count + dossier.procedure.types_de_champ.count + dossier.export_entreprise_data.count) } end describe '#data_with_champs' do @@ -614,7 +622,22 @@ describe Dossier do it { expect(subject[7]).to eq(date2) } it { expect(subject[8]).to eq(date3) } it { expect(subject[9]).to eq(dossier.followers_gestionnaires_emails) } - it { expect(subject.count).to eq(DossierProcedureSerializer.new(dossier).attributes.count + dossier.procedure.types_de_champ.count + dossier.export_entreprise_data.count) } + it { expect(subject[10]).to be_nil } + it { expect(subject[11]).to be_nil } + it { expect(subject[12]).to be_nil } + it { expect(subject[13]).to be_nil } + it { expect(subject.count).to eq(DossierTableExportSerializer.new(dossier).attributes.count + dossier.procedure.types_de_champ.count + dossier.export_entreprise_data.count) } + + context 'dossier for individual' do + let(:dossier_with_individual) { create(:dossier, :for_individual, user: user, procedure: procedure) } + + subject { dossier_with_individual.data_with_champs } + + it { expect(subject[10]).to eq(dossier_with_individual.individual.gender) } + it { expect(subject[11]).to eq(dossier_with_individual.individual.prenom) } + it { expect(subject[12]).to eq(dossier_with_individual.individual.nom) } + it { expect(subject[13]).to eq(dossier_with_individual.individual.birthdate) } + end end describe "#full_data_string" do @@ -631,6 +654,10 @@ describe Dossier do dossier.processed_at, gestionnaire.email, nil, + nil, + nil, + nil, + nil, "44011762001530", "true", "4950Z", From 1612b60126e822e677c6087183cc47f4c6d776e6 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Thu, 13 Apr 2017 16:42:23 +0200 Subject: [PATCH 002/102] Remove useless code --- app/models/dossier.rb | 13 ----- spec/models/dossier_spec.rb | 103 ------------------------------------ 2 files changed, 116 deletions(-) diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 0a2848c07..14026026f 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -1,6 +1,4 @@ class Dossier < ActiveRecord::Base - include SpreadsheetArchitect - enum state: {draft: 'draft', initiated: 'initiated', replied: 'replied', #action utilisateur demandé @@ -233,17 +231,6 @@ class Dossier < ActiveRecord::Base return convert_specific_hash_values_to_string(etablissement_attr.merge(entreprise_attr)) end - def export_default_columns - dossier_attr = DossierSerializer.new(self).attributes - dossier_attr = convert_specific_hash_values_to_string(dossier_attr) - dossier_attr = dossier_attr.merge(self.export_entreprise_data) - return dossier_attr - end - - def spreadsheet_columns - self.export_default_columns.to_a - end - def data_with_champs serialized_dossier = DossierTableExportSerializer.new(self) data = serialized_dossier.attributes.values diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 344f41c19..37ca54b3a 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -546,49 +546,6 @@ describe Dossier do it { expect(subject.count).to eq(EntrepriseSerializer.new(Entreprise.new).as_json.count + EtablissementSerializer.new(Etablissement.new).as_json.count) } end - describe '#export_default_columns' do - let(:procedure) { create(:procedure) } - let(:dossier) { create(:dossier, :with_entreprise, user: user, procedure: procedure) } - subject { dossier.export_default_columns } - - it { expect(subject[:archived]).to eq('false') } - it { expect(subject[:etablissement_siret]).to eq('44011762001530') } - it { expect(subject[:etablissement_siege_social]).to eq('true') } - it { expect(subject[:etablissement_naf]).to eq('4950Z') } - it { expect(subject[:etablissement_libelle_naf]).to eq('Transports par conduites') } - it { expect(subject[:etablissement_adresse]).to eq('GRTGAZ IMMEUBLE BORA 6 RUE RAOUL NORDLING 92270 BOIS COLOMBES') } - it { expect(subject[:etablissement_numero_voie]).to eq('6') } - it { expect(subject[:etablissement_type_voie]).to eq('RUE') } - it { expect(subject[:etablissement_nom_voie]).to eq('RAOUL NORDLING') } - it { expect(subject[:etablissement_complement_adresse]).to eq('IMMEUBLE BORA') } - it { expect(subject[:etablissement_code_postal]).to eq('92270') } - it { expect(subject[:etablissement_localite]).to eq('BOIS COLOMBES') } - it { expect(subject[:etablissement_code_insee_localite]).to eq('92009') } - it { expect(subject[:entreprise_siren]).to eq('440117620') } - it { expect(subject[:entreprise_capital_social]).to eq('537100000') } - it { expect(subject[:entreprise_numero_tva_intracommunautaire]).to eq('FR27440117620') } - it { expect(subject[:entreprise_forme_juridique]).to eq("SA à conseil d'administration (s.a.i.)") } - it { expect(subject[:entreprise_forme_juridique_code]).to eq('5599') } - it { expect(subject[:entreprise_nom_commercial]).to eq('GRTGAZ') } - it { expect(subject[:entreprise_raison_sociale]).to eq('GRTGAZ') } - it { expect(subject[:entreprise_siret_siege_social]).to eq('44011762001530') } - it { expect(subject[:entreprise_code_effectif_entreprise]).to eq('51') } - it { expect(subject[:entreprise_date_creation]).to eq('Thu, 28 Jan 2016 10:16:29 UTC +00:0') } - it { expect(subject[:entreprise_nom]).to be_nil } - it { expect(subject[:entreprise_prenom]).to be_nil } - it { expect(subject[:individual_gender]).to be_nil } - it { expect(subject[:individual_prenom]).to be_nil } - it { expect(subject[:individual_nom]).to be_nil } - it { expect(subject[:individual_birthdate]).to be_nil } - - context 'when dossier does not have enterprise' do - let(:dossier) { create(:dossier, user: user, procedure: procedure) } - subject { dossier.export_default_columns } - - it { expect(subject[:archived]).to eq('false') } - end - end - context 'when dossier is followed' do let(:procedure) { create(:procedure, :with_type_de_champ) } let(:gestionnaire) { create(:gestionnaire) } @@ -691,66 +648,6 @@ describe Dossier do end end - describe '#Dossier.to_csv' do - let!(:procedure) { create(:procedure) } - let!(:dossier) { create(:dossier, :with_entreprise, user: user, procedure: procedure, ) } - - subject do - dossier_hash = {} - dossier_splitted = Dossier.to_csv.split("\n").map { |cell| cell.split(",") } - index = 0 - dossier_splitted[0].each do |column| - dossier_hash.store(column.to_sym, dossier_splitted[1][index]) - index = index + 1 - end - dossier_hash - end - - it { expect(subject[:archived]).to eq('false') } - it { expect(subject[:etablissement_siret]).to eq('44011762001530') } - it { expect(subject[:etablissement_siege_social]).to eq('true') } - it { expect(subject[:etablissement_naf]).to eq('4950Z') } - it { expect(subject[:etablissement_libelle_naf]).to eq('Transports par conduites') } - it { expect(subject[:etablissement_adresse]).to eq('GRTGAZ IMMEUBLE BORA 6 RUE RAOUL NORDLING 92270 BOIS COLOMBES') } - it { expect(subject[:etablissement_numero_voie]).to eq('6') } - it { expect(subject[:etablissement_type_voie]).to eq('RUE') } - it { expect(subject[:etablissement_nom_voie]).to eq('RAOUL NORDLING') } - it { expect(subject[:etablissement_complement_adresse]).to eq('IMMEUBLE BORA') } - it { expect(subject[:etablissement_code_postal]).to eq('92270') } - it { expect(subject[:etablissement_localite]).to eq('BOIS COLOMBES') } - it { expect(subject[:etablissement_code_insee_localite]).to eq('92009') } - it { expect(subject[:entreprise_siren]).to eq('440117620') } - it { expect(subject[:entreprise_capital_social]).to eq('537100000') } - it { expect(subject[:entreprise_numero_tva_intracommunautaire]).to eq('FR27440117620') } - it { expect(subject[:entreprise_forme_juridique]).to eq("SA à conseil d'administration (s.a.i.)") } - it { expect(subject[:entreprise_forme_juridique_code]).to eq('5599') } - it { expect(subject[:entreprise_nom_commercial]).to eq('GRTGAZ') } - it { expect(subject[:entreprise_raison_sociale]).to eq('GRTGAZ') } - it { expect(subject[:entreprise_siret_siege_social]).to eq('44011762001530') } - it { expect(subject[:entreprise_code_effectif_entreprise]).to eq('51') } - it { expect(subject[:entreprise_date_creation]).to eq('2016-01-28 10:16:29 UTC') } - it { expect(subject[:entreprise_nom]).to be_nil } - it { expect(subject[:entreprise_prenom]).to be_nil } - end - - describe '#Dossier.to_xlsx' do - let!(:procedure) { create(:procedure) } - let!(:dossier) { create(:dossier, :with_entreprise, user: user, procedure: procedure) } - - subject { Dossier.to_xlsx } - - it { expect(subject).is_a?(String) } - end - - describe '#Dossier.to_ods' do - let!(:procedure) { create(:procedure) } - let!(:dossier) { create(:dossier, :with_entreprise, user: user, procedure: procedure) } - - subject { Dossier.to_ods } - - it { expect(subject).is_a?(String) } - end - describe '#reset!' do let!(:dossier) { create :dossier, :with_entreprise, autorisation_donnees: true } let!(:rna_information) { create :rna_information, entreprise: dossier.entreprise } From cc36ec49e277a538fb6c6d8e27484ef08fa6e30e Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 14 Apr 2017 16:14:17 +0200 Subject: [PATCH 003/102] Remove tps_v2 reference in deploy script --- config/deploy.rb | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/config/deploy.rb b/config/deploy.rb index f03e38682..13367378b 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -11,7 +11,7 @@ require 'mina/rbenv' # for rbenv support. (http://rbenv.org) # branch - Branch name to deploy. (needed by mina/git) ENV['to'] ||= "staging" -raise "Bad to=#{+ENV['to']}" unless ["staging", "production", "tps_v2"].include?(ENV['to']) +raise "Bad to=#{+ENV['to']}" unless ["staging", "production"].include?(ENV['to']) raise "missing domain, run with 'rake deploy domain=37.187.154.237'" if ENV['domain'].nil? @@ -42,23 +42,10 @@ elsif ENV["to"] == "production" set :deploy_to, '/var/www/tps' set :user, 'tps' # Username in the server to SSH to. appname = 'tps' -elsif ENV["to"] == "tps_v2" - if ENV['branch'].nil? - set :branch, 'staging_v2' - else - set :branch, ENV['branch'] - end - set :deploy_to, '/var/www/tps_v2' - set :user, 'tps_v2' # Username in the server to SSH to. - appname = 'tps_v2' end set :rails_env, ENV["to"] -if ENV["to"] == "tps_v2" - set :rails_env, "staging" -end - # For system-wide RVM install. # set :rvm_path, '/usr/local/rvm/bin/rvm' From 21ff863dab8bbe36ad5a583e032fe5c631df4e21 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Mon, 17 Apr 2017 19:32:26 +0200 Subject: [PATCH 004/102] [Fix #112] Add favicons --- app/assets/images/favicons/16x16.png | Bin 0 -> 466 bytes app/assets/images/favicons/32x32.png | Bin 0 -> 889 bytes app/assets/images/favicons/96x96.png | Bin 0 -> 2557 bytes app/views/layouts/application.html.haml | 4 ++++ 4 files changed, 4 insertions(+) create mode 100644 app/assets/images/favicons/16x16.png create mode 100644 app/assets/images/favicons/32x32.png create mode 100644 app/assets/images/favicons/96x96.png diff --git a/app/assets/images/favicons/16x16.png b/app/assets/images/favicons/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c73712dba80395a62963b701b7fd25623182e474 GIT binary patch literal 466 zcmV;@0WJQCP)&sBeXnEk!_StcIcAJ2o)|* zaWI|xoOyM^ciD}Kv`55cdy0?co+KXaHO_1b8SYOpI*tz0eF<}LQ^SvXFu^m!j~k>W za2~)K(nu5jx26ezUH!0jii7P9{Aqb#hpo8#v6G5gq;}}GWtYH&31$A_pu%Yc@;&ir zHU9*P_t=W+th#R8(yO2&uQvpqR{ZTLkSBlfC6V++}-Q zKXGKccQ|vz`!ef_>F z_s*O%XQcHqR9HUXBufe>DqFb<`36^^RCA(y0{@TUq{?QF_rYv_156|ghL9CtBsX9P zUkyh741UkXcOL+FywTvCq=X@$(zZedtv3=`z>TQ?vi??P(oGav|G zfKdoSMXsvnlq4blYJ#_wEdDld#cGf&K3exYhRN^rF1fOBzh9aPTx%4pRA#OFln|0w zU?V{;fUoa6PM10jh1W61w}8vzJX|)1gQ@UD1E!4V+IV|Ejo^D3iJ>l} zS0Zh)%j@(C27-c~MJKD6qoe+Lhf-O(>Nv^TQ1g7S>!js=u;feX_p|0D=ZyjbfQCz{1MK?& zTEAfMocC;nb`AKpLS*EN_QPc&yvPa>JHe9Nh@M_dNyx+xLUZ=iV+{>- zWAg&4cbwHwzQzKQ``qto{GG0)1Rc#C%WuwG9a09=VZD)5;|Mluf}71>A?PLse%x^e zIMzZOCBbCfVGxxew5>XfvVKG*=0r;(&Wx)n(ek^u&Uweod1M!?1rs6az~TMh1D^jI z|EJ-Z!tPuILVj?+kVLsJf?sm84VQNqQT3&58Dk|kmyFl zh>y}9$2{-DN*_fxq>B;#3T;z-FGR2tln~0j3;z$N#dmKEgB6T|Q7{Ssgk;6$fjMIX P00000NkvXXu0mjfNvWgr literal 0 HcmV?d00001 diff --git a/app/assets/images/favicons/96x96.png b/app/assets/images/favicons/96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d73f1d7fe22f6040d9dab3fcaddae339916782 GIT binary patch literal 2557 zcmaKu`6Cky1Axa|BWCWi+>6juGURMt%-M1zVUvV~SQ+vW=3FF4$eAmtrPo=xnIQ}% zwH(WlB{Fl*`M%#D@O?i#&+{)lDUSA*g8VZ4002PH+6saCx9I=E$Mdh}^6+o~07SM% zm^p=i|8qm&k<%CHnLYC}#-cS%tb}hhy?&YjEa{@J+FT8!WM}-g@x)67LP8zC@o$$D z{wu(tqFc?EnjX4Li(f&II8=9oY)pqP28y3huoBPdeZU+73>F{7TrBuaWi#$Gy&y=-j^}u2OIWmW76SvA6OLJh_JGSnl zj!r6^X=oW;p^wwe%kJP+D4ddBn}YU`@;@Wh=x>8LyTcSB#7|DcB=`pRSY}Y;XUGzM zuC`Y5CJ1P%?yCaG*`KlDuH>y-Gi((oKOZE zcF@j8@tWO9v$`7+2Xi5Y%-fIN32k*}-PJ<4s4N)^;|_@Ys}&KekIT{@i1IDE?as7w zcH8!}3B>dM=CL3NUT zil>!fW(U>RUtRECnJSu}u*;*_Jvpv4dMOI_@z^k9@`BOc&~ewqD5y~(%#e9{EXtt9 zNJ3)&q{UI)%Rr@P_Z07LXgT9b=Y?)QMgR;)vuYj!rW!?t>9M}nlS-^LVgb`}VWi|} zN^hEe@{f6Sy=C{M$j}6|oq*IGwle53!`Fk@0~EaT$Nk(~3wF5JZKpP~SHVc?%&%z> zMHKaQyvae+3y|LYSJ|QLy-NSy@t2l28<2j{-$^CASXjbY#|RZ$JXREN@?#^#)4C$c zl^q@aX|kjqZY7Cz6Xr2#q?|$QmMm>B3nr3#U~y_$5d)jS4IsrJ>eHdE>AKH??*&4S zD@kY(yPEcf;rLPLogM=a)|w~7Nm}`G^^+dPP zp%^&OBArZE@lToU3N!t5nAHvNg1&{y)w=0;;H0%Zh1iddzTuQYf#T@|NTt z=G)i&^03End)VJIy7e8*ANFGVd}kexWCu_#hJXMpi&Nj%zHQHeSvo-2(7JvwZU!N? zm0R-$!nGY2aJ~Mvwa~2giBYlrQN~SP83^}?cItuZoZlUh@&GB_vqX;6=_MOgD)}i& zHUQka-FYN1`s8Zt07b>k!aBO>5y4BT|CkS-m}nKA_!{A6ud$ahWwDFX{W;N>0STGP zL#W$%9U)yzQ>i0`FV!W-)${9}(|JSUUvD8?wE$Paeuh8&LAWVB6Qa6^LImhJ+bebv z{3TmZUP-5jw^LJ4qpj9Nl?T~EN3C9)J7XYLy#v*XsbZ%c?!`YXIP2Oj_-5)uEe^n4lKYS#Z zG6iOS&KnxaNHVY%^w_a#o?P7N0DYaLO8y|S4{!XR<2XNYy3^-6*MXmnS4eY7=vCAq zopzC=Tq3-UF%f#EWpVM?pcQkOE0yUTdWClD(mIcT1WP^`sfyG3_8EA+BTe{2-j~hm zt`0@{!=I~;j8_r|HS!qJTno^b0LZJzJSV4UBXy>(Qr{#eFD5X9(|DID8Fz*q5G$L# z%-XI%PCe4Yf)->AA3KBPKF`9y1k&$r1YTCv0@rgL^eOu&<@v)aeAU z**r+ivt8gt>p=L(yX56p4(0xP9oFv-q54}~Zb*fo*91O;SoQd_)a5o;kCN5pXf@t# z&R)?M&P#}`)*>%($Sh1Qv9U4UKy zn*Nyl%>>D|bZOd6

U7_5XY)ACSD$gn6YOQZ@Rd9wY6SD}G~?>b>mqunCuQ`|=*D zl}e~8<0RJ-tD8)d)csviplE$9Y~w_B-E_`VLIl?Sr-ui2nvAHeog zd3F2_*f~_y=Z2|z(AXi}>RyY?cIoyFshLzK;j6!FD$?$rdr_`OI8LxT+jV3#T6>)!VUKuYj*j~W7NyK~ literal 0 HcmV?d00001 diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 053d04646..0508e568c 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -6,6 +6,10 @@ = t('dynamics.page_title') %meta{ 'http-equiv' => "X-UA-Compatible", :content => "IE=edge" } + = favicon_link_tag(image_url("favicons/16x16.png"), type: "image/png", sizes: "16x16") + = favicon_link_tag(image_url("favicons/32x32.png"), type: "image/png", sizes: "32x32") + = favicon_link_tag(image_url("favicons/96x96.png"), type: "image/png", sizes: "96x96") + = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true = stylesheet_link_tag 'print', media: 'print', 'data-turbolinks-track' => true = javascript_include_tag 'application', 'data-turbolinks-track' => true From 858109c64b3997879c1ec1c57907198b3032beb2 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Mon, 17 Apr 2017 12:11:50 +0200 Subject: [PATCH 005/102] Add the complete french number part of fr.yml --- config/locales/fr.yml | 54 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 7 deletions(-) diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 5f8a4ad9e..1a47bd2a1 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -37,13 +37,53 @@ fr: first: Premier number: - currency: - format: - unit: '€' - delimiter: ' ' - separator: ',' - precision: 2 - format: '%n %u' + currency: + format: + delimiter: " " + format: "%n %u" + precision: 2 + separator: "," + significant: false + strip_insignificant_zeros: false + unit: "€" + format: + delimiter: " " + precision: 3 + separator: "," + significant: false + strip_insignificant_zeros: false + human: + decimal_units: + format: "%n %u" + units: + billion: milliard + million: million + quadrillion: million de milliards + thousand: millier + trillion: billion + unit: '' + format: + delimiter: '' + precision: 3 + significant: true + strip_insignificant_zeros: true + storage_units: + format: "%n %u" + units: + byte: + one: octet + other: octets + gb: Go + kb: ko + mb: Mo + tb: To + percentage: + format: + delimiter: '' + format: "%n%" + precision: + format: + delimiter: '' activerecord: errors: models: From 3abbb0bdcd45a0785b99b2bf31bb4111683b0b1c Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Mon, 17 Apr 2017 12:12:19 +0200 Subject: [PATCH 006/102] Use french formatting for numbers on the Stats page --- app/views/stats/index.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/stats/index.html.haml b/app/views/stats/index.html.haml index 42d6ea90c..9eef92610 100644 --- a/app/views/stats/index.html.haml +++ b/app/views/stats/index.html.haml @@ -43,11 +43,11 @@ .stat-card.stat-card-half.big-number-card.pull-left %span.big-number-card-title TOTAL DÉMARCHES DÉMATÉRIALISÉES %span.big-number-card-number - = @procedures_count + = number_with_delimiter(@procedures_count, :locale => :fr) .stat-card.stat-card-half.big-number-card.pull-left %span.big-number-card-title TOTAL DOSSIERS DÉPOSÉS %span.big-number-card-number - = @dossiers_count + = number_with_delimiter(@dossiers_count, :locale => :fr) .clearfix From a907b9c0625f86210c184216c0a324d5218d7a79 Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Wed, 29 Mar 2017 14:30:29 +0200 Subject: [PATCH 007/102] Migration: add mandatory column to type de piece justificative --- ...0_add_mandatory_column_to_types_de_piece_justificative.rb | 5 +++++ db/schema.rb | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20170328142700_add_mandatory_column_to_types_de_piece_justificative.rb diff --git a/db/migrate/20170328142700_add_mandatory_column_to_types_de_piece_justificative.rb b/db/migrate/20170328142700_add_mandatory_column_to_types_de_piece_justificative.rb new file mode 100644 index 000000000..46f603b62 --- /dev/null +++ b/db/migrate/20170328142700_add_mandatory_column_to_types_de_piece_justificative.rb @@ -0,0 +1,5 @@ +class AddMandatoryColumnToTypesDePieceJustificative < ActiveRecord::Migration[5.0] + def change + add_column :types_de_piece_justificative, :mandatory, :boolean, default: false + end +end diff --git a/db/schema.rb b/db/schema.rb index 0ff0aa06a..e390453da 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: 20170313140834) do +ActiveRecord::Schema.define(version: 20170328142700) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -403,6 +403,7 @@ ActiveRecord::Schema.define(version: 20170313140834) do t.integer "procedure_id" t.integer "order_place" t.string "lien_demarche" + t.boolean "mandatory", default: false end create_table "users", force: :cascade do |t| From e49ea2d0e0465d62186c693e8fa65b0c91bed30b Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Wed, 29 Mar 2017 14:38:54 +0200 Subject: [PATCH 008/102] PiecesJustificative: add field to set it mandatory small css to align the fields --- .../pieces_justificatives_fields.scss | 3 + .../admin/pieces_justificatives_controller.rb | 2 +- .../pieces_justificatives/_fields.html.haml | 61 ++++++++++--------- 3 files changed, 37 insertions(+), 29 deletions(-) create mode 100644 app/assets/stylesheets/pieces_justificatives_fields.scss diff --git a/app/assets/stylesheets/pieces_justificatives_fields.scss b/app/assets/stylesheets/pieces_justificatives_fields.scss new file mode 100644 index 000000000..12a88199c --- /dev/null +++ b/app/assets/stylesheets/pieces_justificatives_fields.scss @@ -0,0 +1,3 @@ +.pieces_justificatives_fields { + .form-inline > .form-group { vertical-align: top; } +} diff --git a/app/controllers/admin/pieces_justificatives_controller.rb b/app/controllers/admin/pieces_justificatives_controller.rb index c899e3486..0f6d14987 100644 --- a/app/controllers/admin/pieces_justificatives_controller.rb +++ b/app/controllers/admin/pieces_justificatives_controller.rb @@ -25,7 +25,7 @@ class Admin::PiecesJustificativesController < AdminController def update_params params .require(:procedure) - .permit(types_de_piece_justificative_attributes: [:libelle, :description, :id, :order_place, :lien_demarche]) + .permit(types_de_piece_justificative_attributes: [:libelle, :description, :id, :order_place, :mandatory, :lien_demarche]) end def move_up diff --git a/app/views/admin/pieces_justificatives/_fields.html.haml b/app/views/admin/pieces_justificatives/_fields.html.haml index 7cbdf5a99..82ec1d409 100644 --- a/app/views/admin/pieces_justificatives/_fields.html.haml +++ b/app/views/admin/pieces_justificatives/_fields.html.haml @@ -1,31 +1,36 @@ -= f.fields_for :types_de_piece_justificative, types_de_piece_justificative, remote: true do |ff| - .form-inline - .form-group - %h4 Libellé - = ff.text_field :libelle, class: 'form-control libelle', placeholder: 'Libellé' - .form-group - %h4 Description - = ff.text_area :description, class: 'form-control description', placeholder: 'Description' - .form-group - %h4 - Lien du formulaire vierge - %small - (optionel) - = ff.url_field :lien_demarche, class: 'form-control', placeholder: 'Lien du document vierge' +.pieces_justificatives_fields + = f.fields_for :types_de_piece_justificative, types_de_piece_justificative, remote: true do |ff| + .form-inline + .form-group + %h4 Libellé + = ff.text_field :libelle, class: 'form-control libelle', placeholder: 'Libellé' + .form-group + %h4 Description + = ff.text_area :description, class: 'form-control description', placeholder: 'Description' + .form-group + %h4 + Lien du formulaire vierge + %small + (optionel) + = ff.url_field :lien_demarche, class: 'form-control', placeholder: 'Lien du document vierge' + + .form-group + = ff.hidden_field :order_place, value: ff.index + = ff.hidden_field :id + - unless ff.object.id.nil? + .form-group + %br   + = ff.object.button_up(index: ff.index, url: move_up_admin_procedure_pieces_justificatives_path(@procedure, ff.index)) + = ff.object.button_down(index: ff.index, url: move_down_admin_procedure_pieces_justificatives_path(@procedure, ff.index)) + + .form-group + %h4 Obligatoire ? + .center + = ff.check_box :mandatory - .form-group - = ff.hidden_field :order_place, value: ff.index - = ff.hidden_field :id - - unless ff.object.id.nil? .form-group %br   - = ff.object.button_up(index: ff.index, url: move_up_admin_procedure_pieces_justificatives_path(@procedure, ff.index)) - = ff.object.button_down(index: ff.index, url: move_down_admin_procedure_pieces_justificatives_path(@procedure, ff.index)) - - - .form-group - %br   - - if ff.object.id.nil? - = f.submit('Ajouter la pièce', class: 'btn btn-success', id: 'add_piece_justificative') - - else - = link_to("", admin_procedure_piece_justificative_path(@procedure, ff.object.id), method: :delete, remote: true, id: "delete_type_de_piece_justificative_#{ff.object.id}", class: %w(form-control btn btn-danger fa fa-trash-o) ) + - if ff.object.id.nil? + = f.submit('Ajouter la pièce', class: 'btn btn-success', id: 'add_piece_justificative') + - else + = link_to("", admin_procedure_piece_justificative_path(@procedure, ff.object.id), method: :delete, remote: true, id: "delete_type_de_piece_justificative_#{ff.object.id}", class: %w(form-control btn btn-danger fa fa-trash-o) ) From 03e9cd523ea23c223cbdb8a5c53e564f8dfcebc4 Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Wed, 29 Mar 2017 21:42:52 +0200 Subject: [PATCH 009/102] PiecesJustificativesService: mandatory pj check and add test --- app/services/pieces_justificatives_service.rb | 49 ++++++----- .../pieces_justificatives_service_spec.rb | 81 +++++++++++++++++++ 2 files changed, 112 insertions(+), 18 deletions(-) create mode 100644 spec/services/pieces_justificatives_service_spec.rb diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 266c4fffa..2f2d1eb16 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -1,25 +1,21 @@ class PiecesJustificativesService - def self.upload! dossier, user, params - errors = '' + def self.upload!(dossier, user, params) + tpj_contents = dossier.types_de_piece_justificative + .map { |tpj| [tpj, params["piece_justificative_#{tpj.id}"]] } + .select { |_, content| content } - dossier.types_de_piece_justificative.each do |type_de_pieces_justificatives| - unless params["piece_justificative_#{type_de_pieces_justificatives.id}"].nil? + without_virus, with_virus = tpj_contents + .partition { |_, content| ClamavService.safe_file?(content.path) } - if ClamavService.safe_file? params["piece_justificative_#{type_de_pieces_justificatives.id}"].path - piece_justificative = PieceJustificative.new(content: params["piece_justificative_#{type_de_pieces_justificatives.id}"], - dossier: dossier, - type_de_piece_justificative: type_de_pieces_justificatives, - user: user) + errors = with_virus + .map { |_, content| content.original_filename + ': Virus détecté !!
' } - unless piece_justificative.save - errors << piece_justificative.errors.messages[:content][0]+" (#{piece_justificative.libelle})"+"
" - end - else - errors << params["piece_justificative_#{type_de_pieces_justificatives.id}"].original_filename+": Virus détecté !!"+"
" - end - end - end - errors + errors += without_virus + .map { |tpj, content| save_pj(content, dossier, tpj, user) } + + errors += missing_pj_error_messages(dossier) + + errors.join end def self.upload_one! dossier, user, params @@ -37,4 +33,21 @@ class PiecesJustificativesService piece_justificative end + + def self.save_pj(content, dossier, tpj, user) + pj = PieceJustificative.new(content: content, + dossier: dossier, + type_de_piece_justificative: tpj, + user: user) + + pj.save ? '' : "le fichier #{pj.libelle} n'a pas pu être sauvegardé
" + end + + def self.missing_pj_error_messages(dossier) + mandatory_pjs = dossier.types_de_piece_justificative.select(&:mandatory) + present_pjs = dossier.pieces_justificatives.map(&:type_de_piece_justificative) + missing_pjs = mandatory_pjs - present_pjs + + missing_pjs.map { |pj| "La pièce jointe #{pj.libelle} doit être fournie.
" } + end end diff --git a/spec/services/pieces_justificatives_service_spec.rb b/spec/services/pieces_justificatives_service_spec.rb new file mode 100644 index 000000000..8f10f4eb8 --- /dev/null +++ b/spec/services/pieces_justificatives_service_spec.rb @@ -0,0 +1,81 @@ +require 'spec_helper' + +describe PiecesJustificativesService do + let(:user) { create(:user) } + let(:safe_file) { true } + + before :each do + allow(ClamavService).to receive(:safe_file?).and_return(safe_file) + end + + describe 'self.upload!' do + let(:hash) { {} } + let!(:tpj_not_mandatory) do + TypeDePieceJustificative.create(libelle: 'not mandatory', mandatory: false) + end + let!(:tpj_mandatory) do + TypeDePieceJustificative.create(libelle: 'justificatif', mandatory: true) + end + let(:procedure) { Procedure.create(types_de_piece_justificative: tpjs) } + let(:dossier) { Dossier.create(procedure: procedure) } + let(:errors) { PiecesJustificativesService.upload!(dossier, user, hash) } + + context 'when no piece justificative is required' do + let(:tpjs) { [tpj_not_mandatory] } + + context 'when no params are given' do + it { expect(errors).to eq('') } + end + + context 'when sometihing wrong with file save' do + let(:hash) do + { + "piece_justificative_#{tpj_not_mandatory.id}" => + double(path: '', original_filename: 'file') + } + end + + it { expect(errors).to eq("le fichier not mandatory n'a pas pu être sauvegardé
") } + end + + context 'when a virus is provided' do + let(:safe_file) { false } + let(:hash) do + { + "piece_justificative_#{tpj_not_mandatory.id}" => + double(path: '', original_filename: 'bad_file') + } + end + + it { expect(errors).to eq('bad_file: Virus détecté !!
') } + end + end + + context 'when a piece justificative is required' do + let(:tpjs) { [tpj_mandatory] } + + context 'when no params are given' do + it { expect(errors).to eq('La pièce jointe justificatif doit être fournie.
') } + end + + context 'when the piece justificative is provided' do + before :each do + # we are messing around piece_justificative + # because directly doubling carrierwave params seems complicated + + allow(PiecesJustificativesService).to receive(:save_pj).and_return('') + piece_justificative_double = double(type_de_piece_justificative: tpj_mandatory) + expect(dossier).to receive(:pieces_justificatives).and_return([piece_justificative_double]) + end + + let(:hash) do + { + "piece_justificative_#{tpj_mandatory.id}" => double(path: '') + } + end + + it { expect(errors).to eq('') } + end + end + end +end From 591ed2037e4e9e9b9fbb724ee5053f73394cc196 Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Wed, 29 Mar 2017 21:58:26 +0200 Subject: [PATCH 010/102] PiecesJustificativesServices: refactor upload_one! --- app/services/pieces_justificatives_service.rb | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 2f2d1eb16..8dc309df8 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -19,19 +19,20 @@ class PiecesJustificativesService end def self.upload_one! dossier, user, params - if ClamavService.safe_file? params[:piece_justificative][:content].path - piece_justificative = PieceJustificative.new(content: params[:piece_justificative][:content], - dossier: dossier, - type_de_piece_justificative: nil, - user: user) + content = params[:piece_justificative][:content] + if ClamavService.safe_file? content.path + pj = PieceJustificative.new(content: content, + dossier: dossier, + type_de_piece_justificative: nil, + user: user) - piece_justificative.save + pj.save else - piece_justificative = PieceJustificative.new - piece_justificative.errors.add(:content, params[:piece_justificative][:content].original_filename+": Virus détecté !!") + pj = PieceJustificative.new + pj.errors.add(:content, content.original_filename + ': Virus détecté !!') end - piece_justificative + pj end def self.save_pj(content, dossier, tpj, user) From 367b7c6ae169fe80224d65dd0c1544bf889023ff Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Thu, 30 Mar 2017 09:50:30 +0200 Subject: [PATCH 011/102] DescriptionController: use common system to redirect with errors --- .../private_formulaires_controller.rb | 2 +- .../users/description_controller.rb | 24 ++++++++----------- app/services/champs_service.rb | 6 +---- app/services/pieces_justificatives_service.rb | 9 ++++--- spec/services/champs_service_spec.rb | 2 +- .../pieces_justificatives_service_spec.rb | 10 ++++---- 6 files changed, 22 insertions(+), 31 deletions(-) diff --git a/app/controllers/backoffice/private_formulaires_controller.rb b/app/controllers/backoffice/private_formulaires_controller.rb index 81a728085..3c62ad362 100644 --- a/app/controllers/backoffice/private_formulaires_controller.rb +++ b/app/controllers/backoffice/private_formulaires_controller.rb @@ -10,7 +10,7 @@ class Backoffice::PrivateFormulairesController < ApplicationController if champs_service_errors.empty? flash[:notice] = "Formulaire enregistré" else - flash[:alert] = (champs_service_errors.inject('') { |acc, error| acc+= error[:message]+'
' }).html_safe + flash[:alert] = champs_service_errors.join('
').html_safe end end diff --git a/app/controllers/users/description_controller.rb b/app/controllers/users/description_controller.rb index a45a402fb..49664c5b6 100644 --- a/app/controllers/users/description_controller.rb +++ b/app/controllers/users/description_controller.rb @@ -38,25 +38,16 @@ class Users::DescriptionController < UsersController params, check_mandatory_fields - unless champs_service_errors.empty? - flash.alert = (champs_service_errors.inject('') { |acc, error| acc+= error[:message]+'
' }).html_safe - return redirect_to users_dossier_description_path(dossier_id: @dossier.id) - end + return redirect_to_description_with_errors(@dossier, champs_service_errors) if champs_service_errors.any? end if @procedure.cerfa_flag? && params[:cerfa_pdf] cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: @dossier, user: current_user) - unless cerfa.save - flash.alert = cerfa.errors.full_messages.join('
').html_safe - return redirect_to users_dossier_description_path(dossier_id: @dossier.id) - end + return redirect_to_description_with_errors(@dossier, cerfa.errors.full_messages) unless cerfa.save end errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params) - unless errors_upload.empty? - flash.alert = errors_upload.html_safe - return redirect_to users_dossier_description_path(dossier_id: @dossier.id) - end + return redirect_to_description_with_errors(@dossier, errors_upload) if errors_upload.any? if draft_submission? flash.notice = 'Votre brouillon a bien été sauvegardé.' @@ -88,9 +79,9 @@ class Users::DescriptionController < UsersController if !((errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params)).empty?) if flash.alert.nil? - flash.alert = errors_upload.html_safe + flash.alert = errors_upload.join('
').html_safe else - flash.alert = (flash.alert + '
' + errors_upload.html_safe).html_safe + flash.alert = (flash.alert + '
' + errors_upload.join('
').html_safe).html_safe end else @@ -111,6 +102,11 @@ class Users::DescriptionController < UsersController private + def redirect_to_description_with_errors(dossier, errors) + flash.alert = errors.join('
').html_safe + redirect_to users_dossier_description_path(dossier_id: dossier.id) + end + def draft_submission? params[:submit] && params[:submit].keys.first == 'brouillon' end diff --git a/app/services/champs_service.rb b/app/services/champs_service.rb index 31b53973f..b35ec4d7b 100644 --- a/app/services/champs_service.rb +++ b/app/services/champs_service.rb @@ -31,11 +31,7 @@ class ChampsService def build_error_messages(champs) champs.select(&:mandatory_and_blank?) - .map { |c| build_champ_error_message(c) } - end - - def build_champ_error_message(champ) - { message: "Le champ #{champ.libelle} doit être rempli." } + .map { |c| "Le champ #{c.libelle} doit être rempli." } end end end diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 8dc309df8..6b10ecbeb 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -8,14 +8,13 @@ class PiecesJustificativesService .partition { |_, content| ClamavService.safe_file?(content.path) } errors = with_virus - .map { |_, content| content.original_filename + ': Virus détecté !!
' } + .map { |_, content| content.original_filename + ': Virus détecté !!' } errors += without_virus .map { |tpj, content| save_pj(content, dossier, tpj, user) } + .reject(&:empty?) errors += missing_pj_error_messages(dossier) - - errors.join end def self.upload_one! dossier, user, params @@ -41,7 +40,7 @@ class PiecesJustificativesService type_de_piece_justificative: tpj, user: user) - pj.save ? '' : "le fichier #{pj.libelle} n'a pas pu être sauvegardé
" + pj.save ? '' : "le fichier #{pj.libelle} n'a pas pu être sauvegardé" end def self.missing_pj_error_messages(dossier) @@ -49,6 +48,6 @@ class PiecesJustificativesService present_pjs = dossier.pieces_justificatives.map(&:type_de_piece_justificative) missing_pjs = mandatory_pjs - present_pjs - missing_pjs.map { |pj| "La pièce jointe #{pj.libelle} doit être fournie.
" } + missing_pjs.map { |pj| "La pièce jointe #{pj.libelle} doit être fournie." } end end diff --git a/spec/services/champs_service_spec.rb b/spec/services/champs_service_spec.rb index 4e8ce53a1..ee0047ea2 100644 --- a/spec/services/champs_service_spec.rb +++ b/spec/services/champs_service_spec.rb @@ -34,7 +34,7 @@ describe ChampsService do end it 'adds error for the missing mandatory champ' do - expect(@errors).to match([{ message: 'Le champ mandatory doit être rempli.' }]) + expect(@errors).to match(['Le champ mandatory doit être rempli.']) end end diff --git a/spec/services/pieces_justificatives_service_spec.rb b/spec/services/pieces_justificatives_service_spec.rb index 8f10f4eb8..922befc4e 100644 --- a/spec/services/pieces_justificatives_service_spec.rb +++ b/spec/services/pieces_justificatives_service_spec.rb @@ -24,7 +24,7 @@ describe PiecesJustificativesService do let(:tpjs) { [tpj_not_mandatory] } context 'when no params are given' do - it { expect(errors).to eq('') } + it { expect(errors).to eq([]) } end context 'when sometihing wrong with file save' do @@ -35,7 +35,7 @@ describe PiecesJustificativesService do } end - it { expect(errors).to eq("le fichier not mandatory n'a pas pu être sauvegardé
") } + it { expect(errors).to match(["le fichier not mandatory n'a pas pu être sauvegardé"]) } end context 'when a virus is provided' do @@ -47,7 +47,7 @@ describe PiecesJustificativesService do } end - it { expect(errors).to eq('bad_file: Virus détecté !!
') } + it { expect(errors).to match(['bad_file: Virus détecté !!']) } end end @@ -55,7 +55,7 @@ describe PiecesJustificativesService do let(:tpjs) { [tpj_mandatory] } context 'when no params are given' do - it { expect(errors).to eq('La pièce jointe justificatif doit être fournie.
') } + it { expect(errors).to match(['La pièce jointe justificatif doit être fournie.']) } end context 'when the piece justificative is provided' do @@ -74,7 +74,7 @@ describe PiecesJustificativesService do } end - it { expect(errors).to eq('') } + it { expect(errors).to match([]) } end end end From 4c74b04a91e7eea5f7b6d57ab7838cd94d66d66a Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Tue, 18 Apr 2017 17:33:24 +0200 Subject: [PATCH 012/102] Commentaire: use fr local to display date --- app/models/commentaire.rb | 2 +- config/locales/fr.yml | 53 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/app/models/commentaire.rb b/app/models/commentaire.rb index 09c147dd4..0e39e5eba 100644 --- a/app/models/commentaire.rb +++ b/app/models/commentaire.rb @@ -7,7 +7,7 @@ class Commentaire < ActiveRecord::Base after_save :internal_notification def header - "#{email}, " + created_at.localtime.strftime('%d %b %Y %H:%M') + "#{email}, " + I18n.l(created_at.localtime, format: '%d %b %Y %H:%M') end private diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 1a47bd2a1..d67a7166c 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -189,6 +189,59 @@ fr: extension_white_list_error: "Le format de fichier de la pièce jointe n'est pas valide." procedure_archived: "Cette démarche en ligne a été fermée, il n'est plus possible de déposer de dossier." + date: + abbr_day_names: + - dim + - lun + - mar + - mer + - jeu + - ven + - sam + abbr_month_names: + - + - jan. + - fév. + - mar. + - avr. + - mai + - juin + - juil. + - août + - sept. + - oct. + - nov. + - déc. + day_names: + - dimanche + - lundi + - mardi + - mercredi + - jeudi + - vendredi + - samedi + formats: + default: "%d/%m/%Y" + short: "%e %b" + long: "%e %B %Y" + month_names: + - + - janvier + - février + - mars + - avril + - mai + - juin + - juillet + - août + - septembre + - octobre + - novembre + - décembre + order: + - :day + - :month + - :year datetime: distance_in_words: about_x_hours: From 8e7e7a8ab49dc85c10452a387382b93206a07be4 Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Wed, 19 Apr 2017 10:05:10 +0200 Subject: [PATCH 013/102] Stats Index: remove useless locale --- app/views/stats/index.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/stats/index.html.haml b/app/views/stats/index.html.haml index 9eef92610..19048dfe1 100644 --- a/app/views/stats/index.html.haml +++ b/app/views/stats/index.html.haml @@ -43,11 +43,11 @@ .stat-card.stat-card-half.big-number-card.pull-left %span.big-number-card-title TOTAL DÉMARCHES DÉMATÉRIALISÉES %span.big-number-card-number - = number_with_delimiter(@procedures_count, :locale => :fr) + = number_with_delimiter(@procedures_count) .stat-card.stat-card-half.big-number-card.pull-left %span.big-number-card-title TOTAL DOSSIERS DÉPOSÉS %span.big-number-card-number - = number_with_delimiter(@dossiers_count, :locale => :fr) + = number_with_delimiter(@dossiers_count) .clearfix From e0828dda135bd0b4fd4e7e45824ae7f03542dbbc Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Wed, 19 Apr 2017 10:16:30 +0200 Subject: [PATCH 014/102] PiecesJustificativesService: save_pj returns nil if no errors --- app/services/pieces_justificatives_service.rb | 4 ++-- spec/services/pieces_justificatives_service_spec.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 6b10ecbeb..7be9e0dc2 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -12,7 +12,7 @@ class PiecesJustificativesService errors += without_virus .map { |tpj, content| save_pj(content, dossier, tpj, user) } - .reject(&:empty?) + .compact() errors += missing_pj_error_messages(dossier) end @@ -40,7 +40,7 @@ class PiecesJustificativesService type_de_piece_justificative: tpj, user: user) - pj.save ? '' : "le fichier #{pj.libelle} n'a pas pu être sauvegardé" + pj.save ? nil : "le fichier #{pj.libelle} n'a pas pu être sauvegardé" end def self.missing_pj_error_messages(dossier) diff --git a/spec/services/pieces_justificatives_service_spec.rb b/spec/services/pieces_justificatives_service_spec.rb index 922befc4e..7a734bc48 100644 --- a/spec/services/pieces_justificatives_service_spec.rb +++ b/spec/services/pieces_justificatives_service_spec.rb @@ -63,7 +63,7 @@ describe PiecesJustificativesService do # we are messing around piece_justificative # because directly doubling carrierwave params seems complicated - allow(PiecesJustificativesService).to receive(:save_pj).and_return('') + allow(PiecesJustificativesService).to receive(:save_pj).and_return(nil) piece_justificative_double = double(type_de_piece_justificative: tpj_mandatory) expect(dossier).to receive(:pieces_justificatives).and_return([piece_justificative_double]) end From 395c9d5bb15b8eff2999e63a61b83c5276699bbe Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Wed, 19 Apr 2017 10:20:32 +0200 Subject: [PATCH 015/102] PiecesJustificativesService: improve error message when the file cannot be saved --- app/services/pieces_justificatives_service.rb | 2 +- spec/services/pieces_justificatives_service_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 7be9e0dc2..3bc0291c4 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -40,7 +40,7 @@ class PiecesJustificativesService type_de_piece_justificative: tpj, user: user) - pj.save ? nil : "le fichier #{pj.libelle} n'a pas pu être sauvegardé" + pj.save ? nil : "le fichier #{content.original_filename} (#{pj.libelle}) n'a pas pu être sauvegardé" end def self.missing_pj_error_messages(dossier) diff --git a/spec/services/pieces_justificatives_service_spec.rb b/spec/services/pieces_justificatives_service_spec.rb index 7a734bc48..b9181c01e 100644 --- a/spec/services/pieces_justificatives_service_spec.rb +++ b/spec/services/pieces_justificatives_service_spec.rb @@ -31,11 +31,11 @@ describe PiecesJustificativesService do let(:hash) do { "piece_justificative_#{tpj_not_mandatory.id}" => - double(path: '', original_filename: 'file') + double(path: '', original_filename: 'filename') } end - it { expect(errors).to match(["le fichier not mandatory n'a pas pu être sauvegardé"]) } + it { expect(errors).to match(["le fichier filename (not mandatory) n'a pas pu être sauvegardé"]) } end context 'when a virus is provided' do From 21d7a960626247c33bb2ba2363d19eec691ba36f Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Wed, 19 Apr 2017 10:22:30 +0200 Subject: [PATCH 016/102] PiecesJustificativesService: less violent error message in case of virus --- app/services/pieces_justificatives_service.rb | 2 +- spec/services/pieces_justificatives_service_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 3bc0291c4..dd611550b 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -8,7 +8,7 @@ class PiecesJustificativesService .partition { |_, content| ClamavService.safe_file?(content.path) } errors = with_virus - .map { |_, content| content.original_filename + ': Virus détecté !!' } + .map { |_, content| content.original_filename + ' : virus détecté' } errors += without_virus .map { |tpj, content| save_pj(content, dossier, tpj, user) } diff --git a/spec/services/pieces_justificatives_service_spec.rb b/spec/services/pieces_justificatives_service_spec.rb index b9181c01e..d6ac03c87 100644 --- a/spec/services/pieces_justificatives_service_spec.rb +++ b/spec/services/pieces_justificatives_service_spec.rb @@ -47,7 +47,7 @@ describe PiecesJustificativesService do } end - it { expect(errors).to match(['bad_file: Virus détecté !!']) } + it { expect(errors).to match(['bad_file : virus détecté']) } end end From 71542f6a3a947cae0f0be5c1f3ea0167daafcde1 Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Wed, 19 Apr 2017 10:24:08 +0200 Subject: [PATCH 017/102] PiecesJustificativesService: more explicit selection of content --- app/services/pieces_justificatives_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index dd611550b..1298897e5 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -2,7 +2,7 @@ class PiecesJustificativesService def self.upload!(dossier, user, params) tpj_contents = dossier.types_de_piece_justificative .map { |tpj| [tpj, params["piece_justificative_#{tpj.id}"]] } - .select { |_, content| content } + .select { |_, content| content.present? } without_virus, with_virus = tpj_contents .partition { |_, content| ClamavService.safe_file?(content.path) } From 157d1818b2917108b816402c310ecb80c22efaad Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Mon, 10 Apr 2017 12:29:14 +0200 Subject: [PATCH 018/102] DescriptionController: move instance var to local var --- .../users/description_controller.rb | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/controllers/users/description_controller.rb b/app/controllers/users/description_controller.rb index 49664c5b6..af105cdcc 100644 --- a/app/controllers/users/description_controller.rb +++ b/app/controllers/users/description_controller.rb @@ -24,41 +24,41 @@ class Users::DescriptionController < UsersController end def update - @dossier = current_user_dossier - @procedure = @dossier.procedure + dossier = current_user_dossier + procedure = dossier.procedure - return head :forbidden unless @dossier.can_be_initiated? + return head :forbidden unless dossier.can_be_initiated? - @champs = @dossier.ordered_champs + @champs = dossier.ordered_champs check_mandatory_fields = !draft_submission? if params[:champs] - champs_service_errors = ChampsService.save_champs @dossier.champs, + champs_service_errors = ChampsService.save_champs dossier.champs, params, check_mandatory_fields - return redirect_to_description_with_errors(@dossier, champs_service_errors) if champs_service_errors.any? + return redirect_to_description_with_errors(dossier, champs_service_errors) if champs_service_errors.any? end - if @procedure.cerfa_flag? && params[:cerfa_pdf] - cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: @dossier, user: current_user) - return redirect_to_description_with_errors(@dossier, cerfa.errors.full_messages) unless cerfa.save + if procedure.cerfa_flag? && params[:cerfa_pdf] + cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: dossier, user: current_user) + return redirect_to_description_with_errors(dossier, cerfa.errors.full_messages) unless cerfa.save end - errors_upload = PiecesJustificativesService.upload!(@dossier, current_user, params) - return redirect_to_description_with_errors(@dossier, errors_upload) if errors_upload.any? + errors_upload = PiecesJustificativesService.upload!(dossier, current_user, params) + return redirect_to_description_with_errors(dossier, errors_upload) if errors_upload.any? if draft_submission? flash.notice = 'Votre brouillon a bien été sauvegardé.' redirect_to url_for(controller: :dossiers, action: :index, liste: :brouillon) else - if @dossier.draft? - @dossier.initiated! - NotificationMailer.send_notification(@dossier, @dossier.procedure.initiated_mail).deliver_now! + if dossier.draft? + dossier.initiated! + NotificationMailer.send_notification(dossier, procedure.initiated_mail).deliver_now! end flash.notice = 'Félicitations, votre demande a bien été enregistrée.' - redirect_to url_for(controller: :recapitulatif, action: :show, dossier_id: @dossier.id) + redirect_to url_for(controller: :recapitulatif, action: :show, dossier_id: dossier.id) end end From 866a54085c09d3c4094655709b8deb1d91f0d179 Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Thu, 30 Mar 2017 10:41:20 +0200 Subject: [PATCH 019/102] DescriptionController: cosmetic --- app/controllers/users/description_controller.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/controllers/users/description_controller.rb b/app/controllers/users/description_controller.rb index af105cdcc..9b7fba56d 100644 --- a/app/controllers/users/description_controller.rb +++ b/app/controllers/users/description_controller.rb @@ -34,10 +34,8 @@ class Users::DescriptionController < UsersController check_mandatory_fields = !draft_submission? if params[:champs] - champs_service_errors = ChampsService.save_champs dossier.champs, - params, - check_mandatory_fields - + champs_service_errors = + ChampsService.save_champs(dossier.champs, params, check_mandatory_fields) return redirect_to_description_with_errors(dossier, champs_service_errors) if champs_service_errors.any? end From eb3bb63a8f2fab2e36d041e49ce9f65158a9098c Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Thu, 30 Mar 2017 10:41:39 +0200 Subject: [PATCH 020/102] DescriptionController: remove useless @champs --- app/controllers/users/description_controller.rb | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/controllers/users/description_controller.rb b/app/controllers/users/description_controller.rb index 9b7fba56d..7c42c3cdd 100644 --- a/app/controllers/users/description_controller.rb +++ b/app/controllers/users/description_controller.rb @@ -28,9 +28,6 @@ class Users::DescriptionController < UsersController procedure = dossier.procedure return head :forbidden unless dossier.can_be_initiated? - - @champs = dossier.ordered_champs - check_mandatory_fields = !draft_submission? if params[:champs] From 4cd21580fb4e9706940ec36add36379a9ebfcfb7 Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Thu, 30 Mar 2017 11:17:22 +0200 Subject: [PATCH 021/102] DescriptionController: move html_safe to the view html_safe could not work upon redirection as stated here : https://groups.google.com/forum/#!topic/rubyonrails-core/z52zgDgUmbs --- app/controllers/users/description_controller.rb | 2 +- app/views/layouts/_flash_messages.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/users/description_controller.rb b/app/controllers/users/description_controller.rb index 7c42c3cdd..69e17b4a8 100644 --- a/app/controllers/users/description_controller.rb +++ b/app/controllers/users/description_controller.rb @@ -98,7 +98,7 @@ class Users::DescriptionController < UsersController private def redirect_to_description_with_errors(dossier, errors) - flash.alert = errors.join('
').html_safe + flash.alert = errors.join('
') redirect_to users_dossier_description_path(dossier_id: dossier.id) end diff --git a/app/views/layouts/_flash_messages.html.haml b/app/views/layouts/_flash_messages.html.haml index 2ed1b4013..a661dcdbd 100644 --- a/app/views/layouts/_flash_messages.html.haml +++ b/app/views/layouts/_flash_messages.html.haml @@ -4,4 +4,4 @@ = flash.notice - if flash.alert .alert.alert-danger - = flash.alert + = flash.alert.html_safe From ba4ee68019eb8624a6324ced6d740ab8e4dcdc26 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Thu, 6 Apr 2017 18:09:41 +0200 Subject: [PATCH 022/102] Use masculine ordinal indicator instead of the degree sign MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It’s the right way to contract “numéro” We should use the superscript lowercase o but it’s hard to do in places where only raw text is available --- app/assets/javascripts/carte/cadastre.js | 2 +- app/decorators/notification_decorator.rb | 2 +- app/mailers/notification_mailer.rb | 2 +- app/models/mails/closed_mail.rb | 2 +- app/models/mails/initiated_mail.rb | 2 +- app/models/mails/received_mail.rb | 2 +- app/models/mails/refused_mail.rb | 2 +- app/models/mails/without_continuation_mail.rb | 2 +- app/models/notification.rb | 2 +- app/models/preference_list_dossier.rb | 2 +- app/services/notification_service.rb | 2 +- app/views/cgu/index.html.haml | 8 ++++---- ...ft_panel_backoffice_dossierscontroller_index.html.haml | 2 +- app/views/mails/closed_mail.html.haml | 2 +- app/views/mails/initiated_mail.html.haml | 2 +- app/views/mails/received_mail.html.haml | 2 +- app/views/mails/refused_mail.html.haml | 2 +- app/views/mails/without_continuation_mail.html.haml | 2 +- config/locales/dynamics/fr.yml | 2 +- ...901082824_initiated_all_received_mail_for_procedure.rb | 4 ++-- spec/factories/mail_templates.rb | 4 ++-- spec/mailers/notification_mailer_spec.rb | 2 +- spec/models/preference_list_dossier_spec.rb | 2 +- 23 files changed, 28 insertions(+), 28 deletions(-) diff --git a/app/assets/javascripts/carte/cadastre.js b/app/assets/javascripts/carte/cadastre.js index ea9de02a8..d46cfecfd 100644 --- a/app/assets/javascripts/carte/cadastre.js +++ b/app/assets/javascripts/carte/cadastre.js @@ -33,7 +33,7 @@ function display_cadastre(cadastre_array) { else if (cadastre_array.length > 0) { cadastre_array.forEach(function (cadastre) { - $("#cadastre.list ul").append('

  • Parcelle n°' + cadastre.numero + ' - Feuille ' + cadastre.code_arr + ' ' + cadastre.section + ' ' + cadastre.feuille+ '
  • '); + $("#cadastre.list ul").append('
  • Parcelle nº' + cadastre.numero + ' - Feuille ' + cadastre.code_arr + ' ' + cadastre.section + ' ' + cadastre.feuille+ '
  • '); cadastreItems.addData(cadastre.geometry); }); diff --git a/app/decorators/notification_decorator.rb b/app/decorators/notification_decorator.rb index 0763f1dc2..e020dcbca 100644 --- a/app/decorators/notification_decorator.rb +++ b/app/decorators/notification_decorator.rb @@ -3,6 +3,6 @@ class NotificationDecorator < Draper::Decorator def index_display ['champs', 'piece_justificative'].include?(type_notif) ? type = liste.join(" ") : type = liste.last - { dossier: "Dossier n°#{dossier.id}", date: created_at.strftime('%d/%m %H:%M'), type: type } + { dossier: "Dossier nº#{dossier.id}", date: created_at.strftime('%d/%m %H:%M'), type: type } end end diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb index 185543d22..f00e90c93 100644 --- a/app/mailers/notification_mailer.rb +++ b/app/mailers/notification_mailer.rb @@ -12,7 +12,7 @@ class NotificationMailer < ApplicationMailer end def new_answer dossier - send_mail dossier, "Nouveau message pour votre dossier TPS N°#{dossier.id}" + send_mail dossier, "Nouveau message pour votre dossier TPS Nº#{dossier.id}" end private diff --git a/app/models/mails/closed_mail.rb b/app/models/mails/closed_mail.rb index 3db0d84dc..58dbff537 100644 --- a/app/models/mails/closed_mail.rb +++ b/app/models/mails/closed_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = "Accusé d'acceptation" - DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- a été accepté' + DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- a été accepté' end end diff --git a/app/models/mails/initiated_mail.rb b/app/models/mails/initiated_mail.rb index e39aa0e7a..b7083b178 100644 --- a/app/models/mails/initiated_mail.rb +++ b/app/models/mails/initiated_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de réception' - DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- a été bien reçu' + DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- a été bien reçu' end end diff --git a/app/models/mails/received_mail.rb b/app/models/mails/received_mail.rb index 41344f6ca..c9ce55f45 100644 --- a/app/models/mails/received_mail.rb +++ b/app/models/mails/received_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de passage en instruction' - DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- va être instruit' + DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- va être instruit' end end diff --git a/app/models/mails/refused_mail.rb b/app/models/mails/refused_mail.rb index a1a1af8b4..18e27c4b1 100644 --- a/app/models/mails/refused_mail.rb +++ b/app/models/mails/refused_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de rejet du dossier' - DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- a été refusé' + DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- a été refusé' end end diff --git a/app/models/mails/without_continuation_mail.rb b/app/models/mails/without_continuation_mail.rb index da9724cf6..01e666de5 100644 --- a/app/models/mails/without_continuation_mail.rb +++ b/app/models/mails/without_continuation_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de classement sans suite' - DEFAULT_OBJECT = 'Votre dossier TPS N°--numero_dossier-- a été classé sans suite' + DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- a été classé sans suite' end end diff --git a/app/models/notification.rb b/app/models/notification.rb index 4ff810f37..9d1230a33 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -13,7 +13,7 @@ class Notification < ActiveRecord::Base # def broadcast_notification # ActionCable.server.broadcast 'notifications', - # message: "Dossier n°#{self.dossier.id} : #{self.liste.last}", + # message: "Dossier nº#{self.dossier.id} : #{self.liste.last}", # dossier: {id: self.dossier.id} # end end diff --git a/app/models/preference_list_dossier.rb b/app/models/preference_list_dossier.rb index b7880d5c1..60ec5b82c 100644 --- a/app/models/preference_list_dossier.rb +++ b/app/models/preference_list_dossier.rb @@ -36,7 +36,7 @@ class PreferenceListDossier < ActiveRecord::Base table = nil { - dossier_id: create_column('N°', table, 'id', 'id', 1), + dossier_id: create_column('Nº', table, 'id', 'id', 1), created_at: create_column('Créé le', table, 'created_at', 'first_creation', 2), updated_at: create_column('Mise à jour le', table, 'updated_at', 'last_update', 2), state: create_column('État', table, 'state', 'display_state', 1) diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 01bfe97e3..02e5dbf4b 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -34,7 +34,7 @@ class NotificationService when 'champs' attribut when 'submitted' - "Le dossier n°#{@dossier_id} a été déposé." + "Le dossier nº#{@dossier_id} a été déposé." else 'Notification par défaut' end diff --git a/app/views/cgu/index.html.haml b/app/views/cgu/index.html.haml index 7f2116cd0..5f1448c24 100644 --- a/app/views/cgu/index.html.haml +++ b/app/views/cgu/index.html.haml @@ -35,7 +35,7 @@ %br/ Code APE 6202A %br/ - N° TVA : FR 22 424 761 419 + Nº TVA : FR 22 424 761 419 %br/ Siège social : 2 rue Kellermann - 59100 Roubaix - France. %br @@ -61,7 +61,7 @@ Déclaration CNIL %p Le SGMAP a procédé à la déclaration CNIL de TPS. Celle-ci porte le numéro "1986658 v 0" à la date du 30 août 2016. Néanmoins les administrations devront procéder à une déclaration complémentaire auprès de la CNIL si les données du formulaire qu’elles ont produit comportent des données de la nature suivante : %ul - %li N° de sécurité sociale, + %li Nº de sécurité sociale, %li Infractions, condamnations, mesures de sécurité, %li %a{ :href => "https://www.declaration.cnil.fr/declarations/declaration/donneesSensibles_DN.display.action" } Opinions philosophiques, politiques, religieuses, syndicales, vie sexuelle, données de santé, origine raciale. @@ -77,10 +77,10 @@ Traitement des données à caractère personnel %h4 Données personnelles : %p - En application de la loi n°78-17 Informatique et Libertés du 6 janvier 1978, vous disposez d'un droit d'accès, de rectification, de modification et de suppression concernant les données qui vous concernent. Vous pouvez exercer ce droit à travers la rubrique + En application de la loi nº78-17 Informatique et Libertés du 6 janvier 1978, vous disposez d'un droit d'accès, de rectification, de modification et de suppression concernant les données qui vous concernent. Vous pouvez exercer ce droit à travers la rubrique %a{ :href => "http://www.faire-simple.gouv.fr/contact" } Contact %h4 Données de connexion : - %p Conformément à la loi n°2004-575 du 21 juin 2004 pour la confiance dans l’économie numérique, certaines données de connexion sont conservées par le service aux fins de protection contre les intrusions et de poursuites judiciaires le cas échéant. Ces données sont conservées pendant un an. + %p Conformément à la loi nº2004-575 du 21 juin 2004 pour la confiance dans l’économie numérique, certaines données de connexion sont conservées par le service aux fins de protection contre les intrusions et de poursuites judiciaires le cas échéant. Ces données sont conservées pendant un an. %br %h3#entreprise_information diff --git a/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml b/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml index cd378550c..a4c6a4c8e 100644 --- a/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml +++ b/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml @@ -39,6 +39,6 @@ - @facade_data_view.dossiers_with_unread_notifications.each do |dossier| = link_to backoffice_dossier_path(dossier.id) do .notification - .dossier-index= "Dossier n°#{dossier.id}" + .dossier-index= "Dossier nº#{dossier.id}" .updated-at-index= dossier.first_unread_notification.created_at.strftime('%d/%m %H:%M') .count= dossier.unreaded_notifications.count diff --git a/app/views/mails/closed_mail.html.haml b/app/views/mails/closed_mail.html.haml index 636817517..3afbbd0cb 100644 --- a/app/views/mails/closed_mail.html.haml +++ b/app/views/mails/closed_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre dossier N°--numero_dossier-- a été accepté. +Votre dossier Nº--numero_dossier-- a été accepté. %br %br A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/app/views/mails/initiated_mail.html.haml b/app/views/mails/initiated_mail.html.haml index d1e0ab917..e3b5f3ec6 100644 --- a/app/views/mails/initiated_mail.html.haml +++ b/app/views/mails/initiated_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier--. +Votre administration vous confirme la bonne réception de votre dossier nº--numero_dossier--. %br %br A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/app/views/mails/received_mail.html.haml b/app/views/mails/received_mail.html.haml index bc0b64ffa..5a17aa07c 100644 --- a/app/views/mails/received_mail.html.haml +++ b/app/views/mails/received_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier--. Celui-ci sera instruit dans le délai légal déclaré par votre interlocuteur. +Votre administration vous confirme la bonne réception de votre dossier nº--numero_dossier--. Celui-ci sera instruit dans le délai légal déclaré par votre interlocuteur. %br %br Bonne journée diff --git a/app/views/mails/refused_mail.html.haml b/app/views/mails/refused_mail.html.haml index d98bacab6..22968c704 100644 --- a/app/views/mails/refused_mail.html.haml +++ b/app/views/mails/refused_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre dossier N°--numero_dossier-- a été refusé. +Votre dossier Nº--numero_dossier-- a été refusé. %br %br Pour en savoir plus sur le motif du refus, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/app/views/mails/without_continuation_mail.html.haml b/app/views/mails/without_continuation_mail.html.haml index 5277c51a6..77fa27d0e 100644 --- a/app/views/mails/without_continuation_mail.html.haml +++ b/app/views/mails/without_continuation_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre dossier N°--numero_dossier-- a été classé sans suite. +Votre dossier Nº--numero_dossier-- a été classé sans suite. %br %br Pour en savoir plus sur les raisons de ce classement sans suite, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/config/locales/dynamics/fr.yml b/config/locales/dynamics/fr.yml index 72c3aa0f2..74931a96b 100644 --- a/config/locales/dynamics/fr.yml +++ b/config/locales/dynamics/fr.yml @@ -23,7 +23,7 @@ fr: dossiers: depositaite: "Dépositaire" - numéro: 'Dossier n°' + numéro: 'Dossier nº' followers: title: "Personnes suivant l'activité de ce dossier" empty: "Aucune personne ne suit ce dossier" diff --git a/db/migrate/20160901082824_initiated_all_received_mail_for_procedure.rb b/db/migrate/20160901082824_initiated_all_received_mail_for_procedure.rb index 225745646..e5bb6db7a 100644 --- a/db/migrate/20160901082824_initiated_all_received_mail_for_procedure.rb +++ b/db/migrate/20160901082824_initiated_all_received_mail_for_procedure.rb @@ -11,11 +11,11 @@ class InitiatedAllReceivedMailForProcedure < ActiveRecord::Migration before_save :default_values def default_values - self.object ||= "[TPS] Accusé de réception pour votre dossier n°--numero_dossier--" + self.object ||= "[TPS] Accusé de réception pour votre dossier nº--numero_dossier--" self.body ||= "Bonjour,

    - Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier-- complet. Celui-ci sera instruit dans le délais légal déclaré par votre interlocuteur.
    + Votre administration vous confirme la bonne réception de votre dossier nº--numero_dossier-- complet. Celui-ci sera instruit dans le délais légal déclaré par votre interlocuteur.

    En vous souhaitant une bonne journée,
    diff --git a/spec/factories/mail_templates.rb b/spec/factories/mail_templates.rb index aac0d3615..a3940bca8 100644 --- a/spec/factories/mail_templates.rb +++ b/spec/factories/mail_templates.rb @@ -13,8 +13,8 @@ FactoryGirl.define do end trait :dossier_received do - object "[TPS] Accusé de réception pour votre dossier n°--numero_dossier--" - body "Votre administration vous confirme la bonne réception de votre dossier n°--numero_dossier--" + object "[TPS] Accusé de réception pour votre dossier nº--numero_dossier--" + body "Votre administration vous confirme la bonne réception de votre dossier nº--numero_dossier--" type 'MailReceived' end end diff --git a/spec/mailers/notification_mailer_spec.rb b/spec/mailers/notification_mailer_spec.rb index 0f9aeba80..e1a634917 100644 --- a/spec/mailers/notification_mailer_spec.rb +++ b/spec/mailers/notification_mailer_spec.rb @@ -19,6 +19,6 @@ RSpec.describe NotificationMailer, type: :mailer do it { expect(subject.body).to match('Un nouveau message est disponible dans votre espace TPS.') } it { expect(subject.body).to include("Pour le consulter, merci de vous rendre sur #{users_dossier_recapitulatif_url(dossier_id: dossier.id)}") } - it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS N°#{dossier.id}") } + it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS Nº#{dossier.id}") } end end diff --git a/spec/models/preference_list_dossier_spec.rb b/spec/models/preference_list_dossier_spec.rb index 76abc8441..c54163e12 100644 --- a/spec/models/preference_list_dossier_spec.rb +++ b/spec/models/preference_list_dossier_spec.rb @@ -26,7 +26,7 @@ describe PreferenceListDossier do describe 'dossier_id' do subject { super()[:dossier_id] } - it { expect(subject[:libelle]).to eq 'N°' } + it { expect(subject[:libelle]).to eq 'Nº' } it { expect(subject[:table]).to be_nil } it { expect(subject[:attr]).to eq 'id' } it { expect(subject[:attr_decorate]).to eq 'id' } From aa41349f0cc551ec1aafefcc5e8635568b52bf30 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Thu, 6 Apr 2017 18:13:20 +0200 Subject: [PATCH 023/102] =?UTF-8?q?Lowercase=20the=20=E2=80=9Cn=E2=80=9D?= =?UTF-8?q?=20of=20=E2=80=9Cnum=C3=A9ro=E2=80=9D=20contraction=20where=20n?= =?UTF-8?q?eeded?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/mailers/notification_mailer.rb | 2 +- app/models/mails/closed_mail.rb | 2 +- app/models/mails/initiated_mail.rb | 2 +- app/models/mails/received_mail.rb | 2 +- app/models/mails/refused_mail.rb | 2 +- app/models/mails/without_continuation_mail.rb | 2 +- app/views/mails/closed_mail.html.haml | 2 +- app/views/mails/refused_mail.html.haml | 2 +- app/views/mails/without_continuation_mail.html.haml | 2 +- spec/mailers/notification_mailer_spec.rb | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb index f00e90c93..15309f718 100644 --- a/app/mailers/notification_mailer.rb +++ b/app/mailers/notification_mailer.rb @@ -12,7 +12,7 @@ class NotificationMailer < ApplicationMailer end def new_answer dossier - send_mail dossier, "Nouveau message pour votre dossier TPS Nº#{dossier.id}" + send_mail dossier, "Nouveau message pour votre dossier TPS nº#{dossier.id}" end private diff --git a/app/models/mails/closed_mail.rb b/app/models/mails/closed_mail.rb index 58dbff537..119cd4f61 100644 --- a/app/models/mails/closed_mail.rb +++ b/app/models/mails/closed_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = "Accusé d'acceptation" - DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- a été accepté' + DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- a été accepté' end end diff --git a/app/models/mails/initiated_mail.rb b/app/models/mails/initiated_mail.rb index b7083b178..3419c3692 100644 --- a/app/models/mails/initiated_mail.rb +++ b/app/models/mails/initiated_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de réception' - DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- a été bien reçu' + DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- a été bien reçu' end end diff --git a/app/models/mails/received_mail.rb b/app/models/mails/received_mail.rb index c9ce55f45..8ffda8e21 100644 --- a/app/models/mails/received_mail.rb +++ b/app/models/mails/received_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de passage en instruction' - DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- va être instruit' + DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- va être instruit' end end diff --git a/app/models/mails/refused_mail.rb b/app/models/mails/refused_mail.rb index 18e27c4b1..01f138aca 100644 --- a/app/models/mails/refused_mail.rb +++ b/app/models/mails/refused_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de rejet du dossier' - DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- a été refusé' + DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- a été refusé' end end diff --git a/app/models/mails/without_continuation_mail.rb b/app/models/mails/without_continuation_mail.rb index 01e666de5..b5dfdd638 100644 --- a/app/models/mails/without_continuation_mail.rb +++ b/app/models/mails/without_continuation_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de classement sans suite' - DEFAULT_OBJECT = 'Votre dossier TPS Nº--numero_dossier-- a été classé sans suite' + DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- a été classé sans suite' end end diff --git a/app/views/mails/closed_mail.html.haml b/app/views/mails/closed_mail.html.haml index 3afbbd0cb..0fa0287b1 100644 --- a/app/views/mails/closed_mail.html.haml +++ b/app/views/mails/closed_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre dossier Nº--numero_dossier-- a été accepté. +Votre dossier nº--numero_dossier-- a été accepté. %br %br A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/app/views/mails/refused_mail.html.haml b/app/views/mails/refused_mail.html.haml index 22968c704..d3510d160 100644 --- a/app/views/mails/refused_mail.html.haml +++ b/app/views/mails/refused_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre dossier Nº--numero_dossier-- a été refusé. +Votre dossier nº--numero_dossier-- a été refusé. %br %br Pour en savoir plus sur le motif du refus, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/app/views/mails/without_continuation_mail.html.haml b/app/views/mails/without_continuation_mail.html.haml index 77fa27d0e..4742dadbe 100644 --- a/app/views/mails/without_continuation_mail.html.haml +++ b/app/views/mails/without_continuation_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre dossier Nº--numero_dossier-- a été classé sans suite. +Votre dossier nº--numero_dossier-- a été classé sans suite. %br %br Pour en savoir plus sur les raisons de ce classement sans suite, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/spec/mailers/notification_mailer_spec.rb b/spec/mailers/notification_mailer_spec.rb index e1a634917..8686c5e55 100644 --- a/spec/mailers/notification_mailer_spec.rb +++ b/spec/mailers/notification_mailer_spec.rb @@ -19,6 +19,6 @@ RSpec.describe NotificationMailer, type: :mailer do it { expect(subject.body).to match('Un nouveau message est disponible dans votre espace TPS.') } it { expect(subject.body).to include("Pour le consulter, merci de vous rendre sur #{users_dossier_recapitulatif_url(dossier_id: dossier.id)}") } - it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS Nº#{dossier.id}") } + it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS nº#{dossier.id}") } end end From ddf02ccd6deb0bea02fa26fa5153b160934a62e3 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Thu, 6 Apr 2017 18:16:11 +0200 Subject: [PATCH 024/102] =?UTF-8?q?Use=20a=20non-breaking=20space=20after?= =?UTF-8?q?=20the=20=E2=80=9Cnum=C3=A9ro=E2=80=9D=20contraction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/carte/cadastre.js | 2 +- app/decorators/notification_decorator.rb | 2 +- app/mailers/notification_mailer.rb | 2 +- app/models/mails/closed_mail.rb | 2 +- app/models/mails/initiated_mail.rb | 2 +- app/models/mails/received_mail.rb | 2 +- app/models/mails/refused_mail.rb | 2 +- app/models/mails/without_continuation_mail.rb | 2 +- app/models/notification.rb | 2 +- app/services/notification_service.rb | 2 +- app/views/cgu/index.html.haml | 8 ++++---- ...ft_panel_backoffice_dossierscontroller_index.html.haml | 2 +- app/views/mails/closed_mail.html.haml | 2 +- app/views/mails/initiated_mail.html.haml | 2 +- app/views/mails/received_mail.html.haml | 2 +- app/views/mails/refused_mail.html.haml | 2 +- app/views/mails/without_continuation_mail.html.haml | 2 +- config/locales/dynamics/fr.yml | 2 +- ...901082824_initiated_all_received_mail_for_procedure.rb | 2 +- spec/factories/mail_templates.rb | 4 ++-- spec/mailers/notification_mailer_spec.rb | 2 +- 21 files changed, 25 insertions(+), 25 deletions(-) diff --git a/app/assets/javascripts/carte/cadastre.js b/app/assets/javascripts/carte/cadastre.js index d46cfecfd..81bff065c 100644 --- a/app/assets/javascripts/carte/cadastre.js +++ b/app/assets/javascripts/carte/cadastre.js @@ -33,7 +33,7 @@ function display_cadastre(cadastre_array) { else if (cadastre_array.length > 0) { cadastre_array.forEach(function (cadastre) { - $("#cadastre.list ul").append('
  • Parcelle nº' + cadastre.numero + ' - Feuille ' + cadastre.code_arr + ' ' + cadastre.section + ' ' + cadastre.feuille+ '
  • '); + $("#cadastre.list ul").append('
  • Parcelle nº ' + cadastre.numero + ' - Feuille ' + cadastre.code_arr + ' ' + cadastre.section + ' ' + cadastre.feuille+ '
  • '); cadastreItems.addData(cadastre.geometry); }); diff --git a/app/decorators/notification_decorator.rb b/app/decorators/notification_decorator.rb index e020dcbca..23cc86273 100644 --- a/app/decorators/notification_decorator.rb +++ b/app/decorators/notification_decorator.rb @@ -3,6 +3,6 @@ class NotificationDecorator < Draper::Decorator def index_display ['champs', 'piece_justificative'].include?(type_notif) ? type = liste.join(" ") : type = liste.last - { dossier: "Dossier nº#{dossier.id}", date: created_at.strftime('%d/%m %H:%M'), type: type } + { dossier: "Dossier nº #{dossier.id}", date: created_at.strftime('%d/%m %H:%M'), type: type } end end diff --git a/app/mailers/notification_mailer.rb b/app/mailers/notification_mailer.rb index 15309f718..1fa5265ea 100644 --- a/app/mailers/notification_mailer.rb +++ b/app/mailers/notification_mailer.rb @@ -12,7 +12,7 @@ class NotificationMailer < ApplicationMailer end def new_answer dossier - send_mail dossier, "Nouveau message pour votre dossier TPS nº#{dossier.id}" + send_mail dossier, "Nouveau message pour votre dossier TPS nº #{dossier.id}" end private diff --git a/app/models/mails/closed_mail.rb b/app/models/mails/closed_mail.rb index 119cd4f61..2d113f71d 100644 --- a/app/models/mails/closed_mail.rb +++ b/app/models/mails/closed_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = "Accusé d'acceptation" - DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- a été accepté' + DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été accepté' end end diff --git a/app/models/mails/initiated_mail.rb b/app/models/mails/initiated_mail.rb index 3419c3692..4f401e65e 100644 --- a/app/models/mails/initiated_mail.rb +++ b/app/models/mails/initiated_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de réception' - DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- a été bien reçu' + DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été bien reçu' end end diff --git a/app/models/mails/received_mail.rb b/app/models/mails/received_mail.rb index 8ffda8e21..be65a36b2 100644 --- a/app/models/mails/received_mail.rb +++ b/app/models/mails/received_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de passage en instruction' - DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- va être instruit' + DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- va être instruit' end end diff --git a/app/models/mails/refused_mail.rb b/app/models/mails/refused_mail.rb index 01f138aca..281788535 100644 --- a/app/models/mails/refused_mail.rb +++ b/app/models/mails/refused_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de rejet du dossier' - DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- a été refusé' + DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été refusé' end end diff --git a/app/models/mails/without_continuation_mail.rb b/app/models/mails/without_continuation_mail.rb index b5dfdd638..3d3bd8f74 100644 --- a/app/models/mails/without_continuation_mail.rb +++ b/app/models/mails/without_continuation_mail.rb @@ -3,7 +3,7 @@ module Mails include MailTemplateConcern DISPLAYED_NAME = 'Accusé de classement sans suite' - DEFAULT_OBJECT = 'Votre dossier TPS nº--numero_dossier-- a été classé sans suite' + DEFAULT_OBJECT = 'Votre dossier TPS nº --numero_dossier-- a été classé sans suite' end end diff --git a/app/models/notification.rb b/app/models/notification.rb index 9d1230a33..2d93de8b3 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -13,7 +13,7 @@ class Notification < ActiveRecord::Base # def broadcast_notification # ActionCable.server.broadcast 'notifications', - # message: "Dossier nº#{self.dossier.id} : #{self.liste.last}", + # message: "Dossier nº #{self.dossier.id} : #{self.liste.last}", # dossier: {id: self.dossier.id} # end end diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 02e5dbf4b..18415ebbd 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -34,7 +34,7 @@ class NotificationService when 'champs' attribut when 'submitted' - "Le dossier nº#{@dossier_id} a été déposé." + "Le dossier nº #{@dossier_id} a été déposé." else 'Notification par défaut' end diff --git a/app/views/cgu/index.html.haml b/app/views/cgu/index.html.haml index 5f1448c24..779d6ff83 100644 --- a/app/views/cgu/index.html.haml +++ b/app/views/cgu/index.html.haml @@ -35,7 +35,7 @@ %br/ Code APE 6202A %br/ - Nº TVA : FR 22 424 761 419 + Nº TVA : FR 22 424 761 419 %br/ Siège social : 2 rue Kellermann - 59100 Roubaix - France. %br @@ -61,7 +61,7 @@ Déclaration CNIL %p Le SGMAP a procédé à la déclaration CNIL de TPS. Celle-ci porte le numéro "1986658 v 0" à la date du 30 août 2016. Néanmoins les administrations devront procéder à une déclaration complémentaire auprès de la CNIL si les données du formulaire qu’elles ont produit comportent des données de la nature suivante : %ul - %li Nº de sécurité sociale, + %li Nº de sécurité sociale, %li Infractions, condamnations, mesures de sécurité, %li %a{ :href => "https://www.declaration.cnil.fr/declarations/declaration/donneesSensibles_DN.display.action" } Opinions philosophiques, politiques, religieuses, syndicales, vie sexuelle, données de santé, origine raciale. @@ -77,10 +77,10 @@ Traitement des données à caractère personnel %h4 Données personnelles : %p - En application de la loi nº78-17 Informatique et Libertés du 6 janvier 1978, vous disposez d'un droit d'accès, de rectification, de modification et de suppression concernant les données qui vous concernent. Vous pouvez exercer ce droit à travers la rubrique + En application de la loi nº 78-17 Informatique et Libertés du 6 janvier 1978, vous disposez d'un droit d'accès, de rectification, de modification et de suppression concernant les données qui vous concernent. Vous pouvez exercer ce droit à travers la rubrique %a{ :href => "http://www.faire-simple.gouv.fr/contact" } Contact %h4 Données de connexion : - %p Conformément à la loi nº2004-575 du 21 juin 2004 pour la confiance dans l’économie numérique, certaines données de connexion sont conservées par le service aux fins de protection contre les intrusions et de poursuites judiciaires le cas échéant. Ces données sont conservées pendant un an. + %p Conformément à la loi nº 2004-575 du 21 juin 2004 pour la confiance dans l’économie numérique, certaines données de connexion sont conservées par le service aux fins de protection contre les intrusions et de poursuites judiciaires le cas échéant. Ces données sont conservées pendant un an. %br %h3#entreprise_information diff --git a/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml b/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml index a4c6a4c8e..d99573c44 100644 --- a/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml +++ b/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml @@ -39,6 +39,6 @@ - @facade_data_view.dossiers_with_unread_notifications.each do |dossier| = link_to backoffice_dossier_path(dossier.id) do .notification - .dossier-index= "Dossier nº#{dossier.id}" + .dossier-index= "Dossier nº #{dossier.id}" .updated-at-index= dossier.first_unread_notification.created_at.strftime('%d/%m %H:%M') .count= dossier.unreaded_notifications.count diff --git a/app/views/mails/closed_mail.html.haml b/app/views/mails/closed_mail.html.haml index 0fa0287b1..ac3153c9a 100644 --- a/app/views/mails/closed_mail.html.haml +++ b/app/views/mails/closed_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre dossier nº--numero_dossier-- a été accepté. +Votre dossier nº --numero_dossier-- a été accepté. %br %br A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/app/views/mails/initiated_mail.html.haml b/app/views/mails/initiated_mail.html.haml index e3b5f3ec6..ce3ae6324 100644 --- a/app/views/mails/initiated_mail.html.haml +++ b/app/views/mails/initiated_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre administration vous confirme la bonne réception de votre dossier nº--numero_dossier--. +Votre administration vous confirme la bonne réception de votre dossier nº --numero_dossier--. %br %br A tout moment, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/app/views/mails/received_mail.html.haml b/app/views/mails/received_mail.html.haml index 5a17aa07c..113139052 100644 --- a/app/views/mails/received_mail.html.haml +++ b/app/views/mails/received_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre administration vous confirme la bonne réception de votre dossier nº--numero_dossier--. Celui-ci sera instruit dans le délai légal déclaré par votre interlocuteur. +Votre administration vous confirme la bonne réception de votre dossier nº --numero_dossier--. Celui-ci sera instruit dans le délai légal déclaré par votre interlocuteur. %br %br Bonne journée diff --git a/app/views/mails/refused_mail.html.haml b/app/views/mails/refused_mail.html.haml index d3510d160..900942f26 100644 --- a/app/views/mails/refused_mail.html.haml +++ b/app/views/mails/refused_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre dossier nº--numero_dossier-- a été refusé. +Votre dossier nº --numero_dossier-- a été refusé. %br %br Pour en savoir plus sur le motif du refus, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/app/views/mails/without_continuation_mail.html.haml b/app/views/mails/without_continuation_mail.html.haml index 4742dadbe..03ab071cc 100644 --- a/app/views/mails/without_continuation_mail.html.haml +++ b/app/views/mails/without_continuation_mail.html.haml @@ -1,7 +1,7 @@ Bonjour %br %br -Votre dossier nº--numero_dossier-- a été classé sans suite. +Votre dossier nº --numero_dossier-- a été classé sans suite. %br %br Pour en savoir plus sur les raisons de ce classement sans suite, vous pouvez consulter le contenu de vos dossiers et les éventuels commentaires de l'administration à cette adresse : --lien_dossier-- diff --git a/config/locales/dynamics/fr.yml b/config/locales/dynamics/fr.yml index 74931a96b..9846ccec1 100644 --- a/config/locales/dynamics/fr.yml +++ b/config/locales/dynamics/fr.yml @@ -23,7 +23,7 @@ fr: dossiers: depositaite: "Dépositaire" - numéro: 'Dossier nº' + numéro: 'Dossier nº ' followers: title: "Personnes suivant l'activité de ce dossier" empty: "Aucune personne ne suit ce dossier" diff --git a/db/migrate/20160901082824_initiated_all_received_mail_for_procedure.rb b/db/migrate/20160901082824_initiated_all_received_mail_for_procedure.rb index e5bb6db7a..89e5f03cd 100644 --- a/db/migrate/20160901082824_initiated_all_received_mail_for_procedure.rb +++ b/db/migrate/20160901082824_initiated_all_received_mail_for_procedure.rb @@ -11,7 +11,7 @@ class InitiatedAllReceivedMailForProcedure < ActiveRecord::Migration before_save :default_values def default_values - self.object ||= "[TPS] Accusé de réception pour votre dossier nº--numero_dossier--" + self.object ||= "[TPS] Accusé de réception pour votre dossier nº --numero_dossier--" self.body ||= "Bonjour,

    diff --git a/spec/factories/mail_templates.rb b/spec/factories/mail_templates.rb index a3940bca8..2f3a72122 100644 --- a/spec/factories/mail_templates.rb +++ b/spec/factories/mail_templates.rb @@ -13,8 +13,8 @@ FactoryGirl.define do end trait :dossier_received do - object "[TPS] Accusé de réception pour votre dossier nº--numero_dossier--" - body "Votre administration vous confirme la bonne réception de votre dossier nº--numero_dossier--" + object "[TPS] Accusé de réception pour votre dossier nº --numero_dossier--" + body "Votre administration vous confirme la bonne réception de votre dossier nº --numero_dossier--" type 'MailReceived' end end diff --git a/spec/mailers/notification_mailer_spec.rb b/spec/mailers/notification_mailer_spec.rb index 8686c5e55..4c8f26fc1 100644 --- a/spec/mailers/notification_mailer_spec.rb +++ b/spec/mailers/notification_mailer_spec.rb @@ -19,6 +19,6 @@ RSpec.describe NotificationMailer, type: :mailer do it { expect(subject.body).to match('Un nouveau message est disponible dans votre espace TPS.') } it { expect(subject.body).to include("Pour le consulter, merci de vous rendre sur #{users_dossier_recapitulatif_url(dossier_id: dossier.id)}") } - it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS nº#{dossier.id}") } + it { expect(subject.subject).to eq("Nouveau message pour votre dossier TPS nº #{dossier.id}") } end end From 9071656b5514b9444e7cab90ac6b07faef039dfe Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 5 Apr 2017 10:00:15 +0200 Subject: [PATCH 025/102] Use #each instead of #map where appropriated --- app/controllers/users/carte_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/users/carte_controller.rb b/app/controllers/users/carte_controller.rb index 0b8a328e9..f38f52ab5 100644 --- a/app/controllers/users/carte_controller.rb +++ b/app/controllers/users/carte_controller.rb @@ -15,8 +15,8 @@ class Users::CarteController < UsersController def save dossier = current_user_dossier - dossier.quartier_prioritaires.map(&:destroy) - dossier.cadastres.map(&:destroy) + dossier.quartier_prioritaires.each(&:destroy) + dossier.cadastres.each(&:destroy) unless params[:json_latlngs].blank? ModuleApiCartoService.save_qp! dossier, params[:json_latlngs] From b00eb914da9e13b883875eaa67baab101d758417 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 5 Apr 2017 10:22:37 +0200 Subject: [PATCH 026/102] Use case statements instead of if statements where appropriated --- app/controllers/users/sessions_controller.rb | 5 +- app/decorators/user_decorator.rb | 8 +- app/models/dossier.rb | 74 ++++++++++--------- app/services/accompagnateur_service.rb | 5 +- .../dossiers/_state_description.html.haml | 13 ++-- .../champs/_render_list_champs.html.haml | 25 ++++--- .../dossiers/_state_description.html.haml | 17 +++-- config/deploy.rb | 5 +- 8 files changed, 82 insertions(+), 70 deletions(-) diff --git a/app/controllers/users/sessions_controller.rb b/app/controllers/users/sessions_controller.rb index fee9dfad2..3e8efd878 100644 --- a/app/controllers/users/sessions_controller.rb +++ b/app/controllers/users/sessions_controller.rb @@ -54,10 +54,11 @@ class Users::SessionsController < Sessions::SessionsController sign_out :user - if connected_with_france_connect == 'entreprise' + case connected_with_france_connect + when 'entreprise' redirect_to FRANCE_CONNECT.entreprise_logout_endpoint return - elsif connected_with_france_connect == 'particulier' + when 'particulier' redirect_to FRANCE_CONNECT.particulier_logout_endpoint return end diff --git a/app/decorators/user_decorator.rb b/app/decorators/user_decorator.rb index d870ccd0a..8f77dc857 100644 --- a/app/decorators/user_decorator.rb +++ b/app/decorators/user_decorator.rb @@ -2,8 +2,12 @@ class UserDecorator < Draper::Decorator delegate_all def gender_fr - return 'M.' if gender == 'male' - return 'Mme' if gender == 'female' + case gender + when 'male' + 'M.' + when 'female' + 'Mme' + end end def birthdate_fr diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 14026026f..731320a5f 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -111,47 +111,49 @@ class Dossier < ActiveRecord::Base fail 'role is not valid' end - if role == 'user' + case role + when 'user' case action - when 'initiate' - if draft? - initiated! - end - when 'update' - if replied? - updated! - end - when 'comment' - if replied? - updated! - end + when 'initiate' + if draft? + initiated! + end + when 'update' + if replied? + updated! + end + when 'comment' + if replied? + updated! + end end - elsif role == 'gestionnaire' + when 'gestionnaire' case action - when 'comment' - if updated? - replied! - elsif initiated? - replied! - end - when 'follow' - if initiated? - updated! - end - when 'close' - if received? - closed! - end - when 'refuse' - if received? - refused! - end - when 'without_continuation' - if received? - without_continuation! - end + when 'comment' + if updated? + replied! + elsif initiated? + replied! + end + when 'follow' + if initiated? + updated! + end + when 'close' + if received? + closed! + end + when 'refuse' + if received? + refused! + end + when 'without_continuation' + if received? + without_continuation! + end end end + state end diff --git a/app/services/accompagnateur_service.rb b/app/services/accompagnateur_service.rb index d526167a0..3c4129e4c 100644 --- a/app/services/accompagnateur_service.rb +++ b/app/services/accompagnateur_service.rb @@ -9,9 +9,10 @@ class AccompagnateurService end def change_assignement! - if @to == ASSIGN + case @to + when ASSIGN AssignTo.create(gestionnaire: @accompagnateur, procedure: @procedure) - elsif @to == NOT_ASSIGN + when NOT_ASSIGN AssignTo.where(gestionnaire: @accompagnateur, procedure: @procedure).delete_all end end diff --git a/app/views/backoffice/dossiers/_state_description.html.haml b/app/views/backoffice/dossiers/_state_description.html.haml index b7d58ceea..345b3fecf 100644 --- a/app/views/backoffice/dossiers/_state_description.html.haml +++ b/app/views/backoffice/dossiers/_state_description.html.haml @@ -5,17 +5,18 @@ .col-md-1.col-lg-1.col-sm-1.col-xs-1.col-sm-1.col-xs-1 .fa.fa-info-circle.text-info{ style: 'font-size: 2em; margin-top: 20%;' } .col-xs-11 - - if dossiers_list_facade.liste == 'nouveaux' + - case dossiers_list_facade.liste + - when 'nouveaux' Tous les dossiers présents dans cette liste sont ceux qui %b n'ont jamais été ouvert par votre service. Il attende une première lecture et intervention de votre part. - - elsif dossiers_list_facade.liste == 'a_traiter' + - when 'a_traiter' Tous les dossiers présents dans cette liste sont ceux qui sont %b en cours de construction avec l'usager. Ils ne sont pas figés et ne sont donc pas complets. - - elsif dossiers_list_facade.liste == 'fige' + - when 'fige' Tous les dossiers présents dans cette liste ont été déclarés %b complets @@ -23,14 +24,14 @@ %b plus modifiables par l'usager. Ils attendent donc leurs dépots officiels qui doit être effectué par l'usager. - - elsif dossiers_list_facade.liste == 'deposes' + - when 'deposes' Tous les dossiers présents dans cette liste ont été %b officiellement déposé par l'usager pour examen. Il faut donc que vous confirmiez par "accusé de réception" la bonne réception de toutes les informations et documents demandés avant examen final. - - elsif dossiers_list_facade.liste == 'a_instruire' + - when 'a_instruire' Tous les dossiers présents dans cette liste sont à instruire. Ceux sont tous les dossiers %b qui ont reçu bonne réception. - - elsif dossiers_list_facade.liste == 'termine' + - when 'termine' Tous les dossiers présents dans cette liste sont considérés comme cloturé car ils ont tous reçu un verdict final qui peut être "Validé", "Refusé" ou "Sans suite". diff --git a/app/views/users/description/champs/_render_list_champs.html.haml b/app/views/users/description/champs/_render_list_champs.html.haml index 0d1f91f76..01c395d33 100644 --- a/app/views/users/description/champs/_render_list_champs.html.haml +++ b/app/views/users/description/champs/_render_list_champs.html.haml @@ -11,40 +11,41 @@ - if champ.mandatory? * - - if champ.type_champ == 'textarea' + - case champ.type_champ + - when 'textarea' = render partial: 'users/description/champs/textarea', locals: { champ: champ } - - elsif champ.type_champ == 'checkbox' + - when 'checkbox' = render partial: 'users/description/champs/checkbox', locals: { champ: champ } - - elsif champ.type_champ == 'civilite' + - when 'civilite' = render partial: 'users/description/champs/civilite', locals: { champ: champ } - - elsif champ.type_champ == 'datetime' + - when 'datetime' = render partial: 'users/description/champs/datetime', locals: { champ: champ } - - elsif champ.type_champ == 'yes_no' + - when 'yes_no' = render partial: 'users/description/champs/yes_no', locals: { champ: champ } - - elsif %w(drop_down_list multiple_drop_down_list).include?(champ.type_champ) + - when 'drop_down_list', 'multiple_drop_down_list' = render partial: 'users/description/champs/drop_down_list', locals: { champ: champ } - - elsif champ.type_champ == 'pays' + - when 'pays' = render partial: 'users/description/champs/pays', locals: { champ: champ } - - elsif champ.type_champ == 'regions' + - when 'regions' = render partial: 'users/description/champs/regions', locals: { champ: champ } - - elsif champ.type_champ == 'engagement' + - when 'engagement' = render partial: 'users/description/champs/engagement', locals: { champ: champ } - - elsif champ.type_champ == 'departements' + - when 'departements' = render partial: 'users/description/champs/departements', locals: { champ: champ } - - elsif champ.type_champ == 'dossier_link' + - when 'dossier_link' = render partial: 'users/description/champs/dossier_link', locals: { champ: champ } - - elsif champ.type_champ == 'explication' + - when 'explication' - else %input.form-control{ name: "champs['#{champ.id}']", diff --git a/app/views/users/dossiers/_state_description.html.haml b/app/views/users/dossiers/_state_description.html.haml index 52d13cab2..27674ad2b 100644 --- a/app/views/users/dossiers/_state_description.html.haml +++ b/app/views/users/dossiers/_state_description.html.haml @@ -5,33 +5,34 @@ .col-md-1.col-lg-1.col-sm-1.col-xs-1 .fa.fa-info-circle.text-info{ style: 'font-size: 2em; margin-top: 20%;' } .col-xs-11 - - if dossiers_list_facade.liste == 'brouillon' + - case dossiers_list_facade.liste + - when 'brouillon' Les dossiers présents dans cette liste %b n'ont pas encore été soumis aux services instructeurs. Ils ne sont visibles que par vous. - - elsif dossiers_list_facade.liste == 'nouveaux' + - when 'nouveaux' Les dossiers présents dans cette liste %b n'ont pas encore été ouverts par les services instructeurs. Une notification vous sera envoyée quand votre demande aura été étudiée. - - elsif dossiers_list_facade.liste == 'a_traiter' + - when 'a_traiter' Les dossiers présents dans cette liste sont %b visibles par les services instructeurs. %br Ces dossiers ne sont pas encore figés et peuvent être modifiés à souhait. - - elsif dossiers_list_facade.liste == 'en_attente' + - when 'en_attente' Les dossiers présents dans cette liste sont %b en cours de relecture par les services instructeurs. Il reviendra vers vous si des informations ou documents sont manquants pour le futur examen de votre dossier. - - elsif dossiers_list_facade.liste == 'valides' + - when 'valides' Les dossiers présents dans cette liste ont été %b relus et considérés comme complets pour examen par les services instructeurs. Ceux-ci ne peuvent maintenant plus être modifiés. Il faut que vous procédiez à leur dépôt afin qu'une décision finale soit rendue. - - elsif dossiers_list_facade.liste == 'en_instruction' + - when 'en_instruction' Les dossiers présents dans cette liste sont %b en cours de réception @@ -39,12 +40,12 @@ %b en cours d'examen par les services instructeurs. Une notification vous sera envoyée une fois qu'une décision aura été rendue. - - elsif dossiers_list_facade.liste == 'termine' + - when 'termine' Les dossiers présents dans cette liste sont ceux qui ont été instruits et pour lesquels %b une décision finale a été rendue. Ils peuvent posséder trois états différents : Accepté, Refusé ou Sans Suite. - - elsif dossiers_list_facade.liste == 'invite' + - when 'invite' Les dossiers présents dans cette liste sont ceux %b auxquels vous avez été invités diff --git a/config/deploy.rb b/config/deploy.rb index 13367378b..eae817ea8 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -24,7 +24,8 @@ set :port, 2200 set :deploy_to, '/var/www/tps_dev' -if ENV["to"] == "staging" +case ENV["to"] +when "staging" if ENV['branch'].nil? set :branch, 'staging' else @@ -33,7 +34,7 @@ if ENV["to"] == "staging" set :deploy_to, '/var/www/tps_dev' set :user, 'tps_dev' # Username in the server to SSH to. appname = 'tps_dev' -elsif ENV["to"] == "production" +when "production" if ENV['branch'].nil? set :branch, 'master' else From 2b969ef575240578b0154b58a57fa679a78716f8 Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Thu, 30 Mar 2017 16:12:01 +0200 Subject: [PATCH 027/102] MandatoryAttachment: group missing errors logic together and show errors only if not draft --- .../private_formulaires_controller.rb | 3 +- .../users/description_controller.rb | 14 +- app/services/champs_service.rb | 12 +- app/services/pieces_justificatives_service.rb | 2 - spec/services/champs_service_spec.rb | 45 +++--- .../pieces_justificatives_service_spec.rb | 129 ++++++++++-------- 6 files changed, 103 insertions(+), 102 deletions(-) diff --git a/app/controllers/backoffice/private_formulaires_controller.rb b/app/controllers/backoffice/private_formulaires_controller.rb index 3c62ad362..0353b02f3 100644 --- a/app/controllers/backoffice/private_formulaires_controller.rb +++ b/app/controllers/backoffice/private_formulaires_controller.rb @@ -5,7 +5,8 @@ class Backoffice::PrivateFormulairesController < ApplicationController dossier = current_gestionnaire.dossiers.find(params[:dossier_id]) unless params[:champs].nil? - champs_service_errors = ChampsService.save_champs dossier.champs_private, params + ChampsService.save_champs dossier.champs_private, params + champs_service_errors = ChampsService.build_error_messages(dossier.champs_private) if champs_service_errors.empty? flash[:notice] = "Formulaire enregistré" diff --git a/app/controllers/users/description_controller.rb b/app/controllers/users/description_controller.rb index 69e17b4a8..bdd38cce9 100644 --- a/app/controllers/users/description_controller.rb +++ b/app/controllers/users/description_controller.rb @@ -28,13 +28,8 @@ class Users::DescriptionController < UsersController procedure = dossier.procedure return head :forbidden unless dossier.can_be_initiated? - check_mandatory_fields = !draft_submission? - if params[:champs] - champs_service_errors = - ChampsService.save_champs(dossier.champs, params, check_mandatory_fields) - return redirect_to_description_with_errors(dossier, champs_service_errors) if champs_service_errors.any? - end + ChampsService.save_champs(dossier.champs, params) if params[:champs] if procedure.cerfa_flag? && params[:cerfa_pdf] cerfa = Cerfa.new(content: params[:cerfa_pdf], dossier: dossier, user: current_user) @@ -44,6 +39,13 @@ class Users::DescriptionController < UsersController errors_upload = PiecesJustificativesService.upload!(dossier, current_user, params) return redirect_to_description_with_errors(dossier, errors_upload) if errors_upload.any? + if params[:champs] && !draft_submission? + errors = + ChampsService.build_error_messages(dossier.champs) + + PiecesJustificativesService.missing_pj_error_messages(dossier) + return redirect_to_description_with_errors(dossier, errors) if errors.any? + end + if draft_submission? flash.notice = 'Votre brouillon a bien été sauvegardé.' redirect_to url_for(controller: :dossiers, action: :index, liste: :brouillon) diff --git a/app/services/champs_service.rb b/app/services/champs_service.rb index b35ec4d7b..40c46a993 100644 --- a/app/services/champs_service.rb +++ b/app/services/champs_service.rb @@ -1,11 +1,14 @@ class ChampsService class << self - def save_champs(champs, params, check_mandatory = true) + def save_champs(champs, params) fill_champs(champs, params) champs.select(&:changed?).each(&:save) + end - check_mandatory ? build_error_messages(champs) : [] + def build_error_messages(champs) + champs.select(&:mandatory_and_blank?) + .map { |c| "Le champ #{c.libelle} doit être rempli." } end private @@ -28,10 +31,5 @@ class ChampsService def extract_minute(champ_id, h) h[:time_minute]["'#{champ_id}'"] end - - def build_error_messages(champs) - champs.select(&:mandatory_and_blank?) - .map { |c| "Le champ #{c.libelle} doit être rempli." } - end end end diff --git a/app/services/pieces_justificatives_service.rb b/app/services/pieces_justificatives_service.rb index 1298897e5..8003e3c92 100644 --- a/app/services/pieces_justificatives_service.rb +++ b/app/services/pieces_justificatives_service.rb @@ -13,8 +13,6 @@ class PiecesJustificativesService errors += without_virus .map { |tpj, content| save_pj(content, dossier, tpj, user) } .compact() - - errors += missing_pj_error_messages(dossier) end def self.upload_one! dossier, user, params diff --git a/spec/services/champs_service_spec.rb b/spec/services/champs_service_spec.rb index ee0047ea2..67f4c04d1 100644 --- a/spec/services/champs_service_spec.rb +++ b/spec/services/champs_service_spec.rb @@ -1,15 +1,15 @@ require 'spec_helper' describe ChampsService do - describe 'save_champs' do - let!(:champ) { Champ.create(value: 'toto', type_de_champ: TypeDeChamp.new) } - let!(:champ_mandatory_empty) { Champ.create(type_de_champ: TypeDeChamp.new(libelle: 'mandatory', mandatory: true)) } - let!(:champ_datetime) do - champ_datetime = TypeDeChamp.new(type_champ: 'datetime') - Champ.create(type_de_champ: champ_datetime) - end - let!(:champs) { [champ, champ_mandatory_empty, champ_datetime] } + let!(:champ) { Champ.create(value: 'toto', type_de_champ: TypeDeChamp.new) } + let!(:champ_mandatory_empty) { Champ.create(type_de_champ: TypeDeChamp.new(libelle: 'mandatory', mandatory: true)) } + let!(:champ_datetime) do + champ_datetime = TypeDeChamp.new(type_champ: 'datetime') + Champ.create(type_de_champ: champ_datetime) + end + let!(:champs) { [champ, champ_mandatory_empty, champ_datetime] } + describe 'save_champs' do before :each do params_hash = { champs: { @@ -19,31 +19,22 @@ describe ChampsService do time_hour: { "'#{champ_datetime.id}'" => '12' }, time_minute: { "'#{champ_datetime.id}'" => '24' } } - @errors = ChampsService.save_champs(champs, params_hash, check_mandatory) + ChampsService.save_champs(champs, params_hash) champs.each(&:reload) end - context 'check_mandatory is true' do - let(:check_mandatory) { true } - it 'saves the changed champ' do - expect(champ.value).to eq('yop') - end - - it 'parses and save the date' do - expect(champ_datetime.value).to eq('d 12:24') - end - - it 'adds error for the missing mandatory champ' do - expect(@errors).to match(['Le champ mandatory doit être rempli.']) - end + it 'saves the changed champ' do + expect(champ.value).to eq('yop') end - context 'check_mandatory is false' do - let(:check_mandatory) { false } + it 'parses and save the date' do + expect(champ_datetime.value).to eq('d 12:24') + end + end - it 'does not add errors' do - expect(@errors).to match([]) - end + describe 'build_error_message' do + it 'adds error for the missing mandatory champ' do + expect(ChampsService.build_error_messages(champs)).to match(['Le champ mandatory doit être rempli.']) end end end diff --git a/spec/services/pieces_justificatives_service_spec.rb b/spec/services/pieces_justificatives_service_spec.rb index d6ac03c87..0e6704515 100644 --- a/spec/services/pieces_justificatives_service_spec.rb +++ b/spec/services/pieces_justificatives_service_spec.rb @@ -8,74 +8,85 @@ describe PiecesJustificativesService do allow(ClamavService).to receive(:safe_file?).and_return(safe_file) end + let(:hash) { {} } + let!(:tpj_not_mandatory) do + TypeDePieceJustificative.create(libelle: 'not mandatory', mandatory: false) + end + let!(:tpj_mandatory) do + TypeDePieceJustificative.create(libelle: 'justificatif', mandatory: true) + end + let(:procedure) { Procedure.create(types_de_piece_justificative: tpjs) } + let(:dossier) { Dossier.create(procedure: procedure) } + let(:errors) { PiecesJustificativesService.upload!(dossier, user, hash) } + let(:tpjs) { [tpj_not_mandatory] } + describe 'self.upload!' do - let(:hash) { {} } - let!(:tpj_not_mandatory) do - TypeDePieceJustificative.create(libelle: 'not mandatory', mandatory: false) - end - let!(:tpj_mandatory) do - TypeDePieceJustificative.create(libelle: 'justificatif', mandatory: true) - end - let(:procedure) { Procedure.create(types_de_piece_justificative: tpjs) } - let(:dossier) { Dossier.create(procedure: procedure) } - let(:errors) { PiecesJustificativesService.upload!(dossier, user, hash) } - - context 'when no piece justificative is required' do - let(:tpjs) { [tpj_not_mandatory] } - - context 'when no params are given' do - it { expect(errors).to eq([]) } - end - - context 'when sometihing wrong with file save' do - let(:hash) do - { - "piece_justificative_#{tpj_not_mandatory.id}" => - double(path: '', original_filename: 'filename') - } - end - - it { expect(errors).to match(["le fichier filename (not mandatory) n'a pas pu être sauvegardé"]) } - end - - context 'when a virus is provided' do - let(:safe_file) { false } - let(:hash) do - { - "piece_justificative_#{tpj_not_mandatory.id}" => - double(path: '', original_filename: 'bad_file') - } - end - - it { expect(errors).to match(['bad_file : virus détecté']) } - end + context 'when no params are given' do + it { expect(errors).to eq([]) } end - context 'when a piece justificative is required' do - let(:tpjs) { [tpj_mandatory] } - - context 'when no params are given' do - it { expect(errors).to match(['La pièce jointe justificatif doit être fournie.']) } + context 'when there is something wrong with file save' do + let(:hash) do + { + "piece_justificative_#{tpj_not_mandatory.id}" => + double(path: '', original_filename: 'filename') + } end - context 'when the piece justificative is provided' do - before :each do - # we are messing around piece_justificative - # because directly doubling carrierwave params seems complicated + it { expect(errors).to match(["le fichier filename (not mandatory) n'a pas pu être sauvegardé"]) } + end - allow(PiecesJustificativesService).to receive(:save_pj).and_return(nil) - piece_justificative_double = double(type_de_piece_justificative: tpj_mandatory) - expect(dossier).to receive(:pieces_justificatives).and_return([piece_justificative_double]) - end + context 'when a virus is provided' do + let(:safe_file) { false } + let(:hash) do + { + "piece_justificative_#{tpj_not_mandatory.id}" => + double(path: '', original_filename: 'bad_file') + } + end - let(:hash) do - { - "piece_justificative_#{tpj_mandatory.id}" => double(path: '') - } - end + it { expect(errors).to match(['bad_file : virus détecté']) } + end - it { expect(errors).to match([]) } + context 'when a regular file is provided' do + let(:content) { double(path: '', original_filename: 'filename') } + let(:hash) do + { + "piece_justificative_#{tpj_not_mandatory.id}" => + content + } + end + + before :each do + expect(PiecesJustificativesService).to receive(:save_pj) + .with(content, dossier, tpj_not_mandatory, user) + .and_return(nil) + end + + it 'is saved' do + expect(errors).to match([]) end end end + + describe 'missing_pj_error_messages' do + let(:errors) { PiecesJustificativesService.missing_pj_error_messages(dossier) } + let(:tpjs) { [tpj_mandatory] } + + context 'when no params are given' do + it { expect(errors).to match(['La pièce jointe justificatif doit être fournie.']) } + end + + context 'when the piece justificative is provided' do + before :each do + # we are messing around piece_justificative + # because directly doubling carrierwave params seems complicated + + piece_justificative_double = double(type_de_piece_justificative: tpj_mandatory) + expect(dossier).to receive(:pieces_justificatives).and_return([piece_justificative_double]) + end + + it { expect(errors).to match([]) } + end + end end From ce4a23ec7ff97495db7fed8edcd90935e459841b Mon Sep 17 00:00:00 2001 From: Simon Lehericey Date: Thu, 30 Mar 2017 16:12:26 +0200 Subject: [PATCH 028/102] MandatoryAttachment: show * near mandatory attachment --- .../_pieces_justificatives.html.haml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/views/users/description/_pieces_justificatives.html.haml b/app/views/users/description/_pieces_justificatives.html.haml index e3a109ba9..bb6604478 100644 --- a/app/views/users/description/_pieces_justificatives.html.haml +++ b/app/views/users/description/_pieces_justificatives.html.haml @@ -18,24 +18,24 @@ - else %input{ type: 'file', name: 'cerfa_pdf', id: 'cerfa_pdf', accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes } - - dossier.types_de_piece_justificative.order('order_place ASC').each do |type_de_piece_justificative| + - dossier.types_de_piece_justificative.order('order_place ASC').each do |tpj| %tr %th.piece-libelle - = type_de_piece_justificative.libelle + = tpj.mandatory ? tpj.libelle + ' *' : tpj.libelle %td - - unless type_de_piece_justificative.lien_demarche.blank? + - unless tpj.lien_demarche.blank? %em Récupérer le formulaire vierge pour mon dossier : - = link_to "Télécharger", type_de_piece_justificative.lien_demarche, target: :blank + = link_to "Télécharger", tpj.lien_demarche, target: :blank %td - - if type_de_piece_justificative.api_entreprise - %span.text-success{ id: "piece_justificative_#{type_de_piece_justificative.id}" } Nous l'avons récupéré pour vous. + - if tpj.api_entreprise + %span.text-success{ id: "piece_justificative_#{tpj.id}" } Nous l'avons récupéré pour vous. - else - - if dossier.retrieve_last_piece_justificative_by_type(type_de_piece_justificative.id).nil? - = file_field_tag "piece_justificative_#{type_de_piece_justificative.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes + - if dossier.retrieve_last_piece_justificative_by_type(tpj.id).nil? + = file_field_tag "piece_justificative_#{tpj.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes - else %span.btn.btn-sm.btn-file.btn-success Modifier - = file_field_tag "piece_justificative_#{type_de_piece_justificative.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes + = file_field_tag "piece_justificative_#{tpj.id}", accept: PieceJustificative.accept_format, :max_file_size => 6.megabytes From db331447e1c908d54112e7e94e978d3e8fa90353 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 16:36:03 +0200 Subject: [PATCH 029/102] Use hex codes for colors --- app/assets/stylesheets/_card.scss | 2 +- app/assets/stylesheets/admin_procedures_modal.scss | 2 +- app/assets/stylesheets/admin_type_de_champ.scss | 2 +- app/assets/stylesheets/application.scss | 6 +++--- app/assets/stylesheets/carte.scss | 6 +++--- app/assets/stylesheets/description.scss | 4 ++-- app/assets/stylesheets/landing.scss | 8 ++++---- app/assets/stylesheets/left_panel.scss | 2 +- app/assets/stylesheets/navbar.scss | 4 ++-- app/assets/stylesheets/notification_alert.scss | 2 +- app/assets/stylesheets/pref_list_menu.scss | 2 +- app/assets/stylesheets/stats.scss | 4 ++-- app/assets/stylesheets/support_navigator_banner.scss | 2 +- 13 files changed, 23 insertions(+), 23 deletions(-) diff --git a/app/assets/stylesheets/_card.scss b/app/assets/stylesheets/_card.scss index 813406a9f..118715fba 100644 --- a/app/assets/stylesheets/_card.scss +++ b/app/assets/stylesheets/_card.scss @@ -1,5 +1,5 @@ .card { - background: white; + background: #FFFFFF; padding: 15px; box-shadow: 0 1px 3px rgba(0, 0, 0, .15); border-radius: 2px; diff --git a/app/assets/stylesheets/admin_procedures_modal.scss b/app/assets/stylesheets/admin_procedures_modal.scss index 2ef9d03b0..4a5d9f24e 100644 --- a/app/assets/stylesheets/admin_procedures_modal.scss +++ b/app/assets/stylesheets/admin_procedures_modal.scss @@ -1,5 +1,5 @@ .path_mine_false { - color: red + color: #FF0000 } #path_messages { diff --git a/app/assets/stylesheets/admin_type_de_champ.scss b/app/assets/stylesheets/admin_type_de_champ.scss index bc2613075..c5129f144 100644 --- a/app/assets/stylesheets/admin_type_de_champ.scss +++ b/app/assets/stylesheets/admin_type_de_champ.scss @@ -7,7 +7,7 @@ text-align:center; padding-bottom: 8px; - color: white; + color: #FFFFFF; .form-control.libelle { font-weight: bold; diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index dd10a3f2b..d1d4a830f 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -94,7 +94,7 @@ form { } .text-default { - color: grey; + color: #808080; } .progress-bar-purple { @@ -125,13 +125,13 @@ form { filter: alpha(opacity=0); opacity: 0; outline: none; - background: white; + background: #FFFFFF; cursor: inherit; display: block; } .vr { - border-left: 1px solid grey; + border-left: 1px solid #808080; } .center { diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index 486e98b64..e840168c9 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -83,7 +83,7 @@ #map div.polygon-elbow { -webkit-transition: opacity .25s; - box-shadow: 0 0 0 2px white, 0 0 10px rgba(0, 0, 0, .35); + box-shadow: 0 0 0 2px #FFFFFF, 0 0 10px rgba(0, 0, 0, .35); border: 5px solid #D7217E; border-radius: 10px; transition: opacity 0.25s; @@ -98,7 +98,7 @@ #map div.polygon-elbow.non-polygon { opacity: 0 !important; pointer-events: none !important; - border: 5px solid darkgray; + border: 5px solid #A9A9A9; } #map.mode-edit div.polygon-elbow { @@ -119,7 +119,7 @@ .info { padding: 6px 8px; font: 14px/16px Arial, Helvetica, sans-serif; - background: white; + background: #FFFFFF; background: rgba(255, 255, 255, 0.8); box-shadow: 0 0 15px rgba(0, 0, 0, 0.2); border-radius: 5px; diff --git a/app/assets/stylesheets/description.scss b/app/assets/stylesheets/description.scss index c471c10c1..f978697ec 100644 --- a/app/assets/stylesheets/description.scss +++ b/app/assets/stylesheets/description.scss @@ -23,8 +23,8 @@ } .input-error { - color: darkred !important; - border-color: darkred !important + color: #8B0000 !important; + border-color: #8B0000 !important } .type_champ-text { diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 249e37743..4b91e713b 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -10,7 +10,7 @@ background-repeat: no-repeat; h5{ - color: grey; + color: #808080; } .logos { @@ -29,14 +29,14 @@ text-shadow: none; } - color: white; + color: #FFFFFF; text-shadow: 0px 0px 10px rgb(0, 0, 0); } } .background-tps{ background-color: #668AEA; - color: white; + color: #FFFFFF; } .latest_release{ @@ -51,7 +51,7 @@ margin-top: 40px; margin-bottom: 20px; - border-color: grey; + border-color: #808080; width: 40%; } diff --git a/app/assets/stylesheets/left_panel.scss b/app/assets/stylesheets/left_panel.scss index 0b250ab77..01bc8e223 100644 --- a/app/assets/stylesheets/left_panel.scss +++ b/app/assets/stylesheets/left_panel.scss @@ -7,7 +7,7 @@ top: 0; left: 0; bottom: 0; - color: white; + color: #FFFFFF; overflow-y: scroll; #first-block { diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index 1ed38032d..4f9a75bc9 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -9,7 +9,7 @@ border-radius: 0; height: 60px; #title_navbar{ - color: white; + color: #FFFFFF; font-weight: bold; font-size: 1.8em; z-index: 10; @@ -118,7 +118,7 @@ } .btn-nav { - color: white; + color: #FFFFFF; background-color: transparent; margin-top: 6px; height: 36px; diff --git a/app/assets/stylesheets/notification_alert.scss b/app/assets/stylesheets/notification_alert.scss index 6ba4e8f0b..fbcd63efd 100644 --- a/app/assets/stylesheets/notification_alert.scss +++ b/app/assets/stylesheets/notification_alert.scss @@ -8,5 +8,5 @@ width: 250px; height: 80px; - border: solid black 1px; + border: solid #000000 1px; } diff --git a/app/assets/stylesheets/pref_list_menu.scss b/app/assets/stylesheets/pref_list_menu.scss index af4a430a7..ebea47305 100644 --- a/app/assets/stylesheets/pref_list_menu.scss +++ b/app/assets/stylesheets/pref_list_menu.scss @@ -6,7 +6,7 @@ top: 10px; right: -470px; background-color: rgba(255, 255, 255, 0.95); - border-left: solid 1px lightgrey; + border-left: solid 1px #D3D3D3; box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2); width: 470px; height: calc(100% - 25px); diff --git a/app/assets/stylesheets/stats.scss b/app/assets/stylesheets/stats.scss index 48d602275..a633cddf1 100644 --- a/app/assets/stylesheets/stats.scss +++ b/app/assets/stylesheets/stats.scss @@ -84,14 +84,14 @@ $segmented-control-item-border-radius: 2 * $default-space; &:hover { background-color: $blue-hover; - color: white; + color: #FFFFFF; cursor: pointer; } } .segmented-control-item-active { background-color: $blue; - color: white; + color: #FFFFFF; } .chart-container { diff --git a/app/assets/stylesheets/support_navigator_banner.scss b/app/assets/stylesheets/support_navigator_banner.scss index bb6651142..b72953590 100644 --- a/app/assets/stylesheets/support_navigator_banner.scss +++ b/app/assets/stylesheets/support_navigator_banner.scss @@ -2,7 +2,7 @@ position: fixed; text-align:center; line-height: 2em; - color: white; + color: #FFFFFF; background-color: #990000; width: 100%; margin: 0; From bb0233918337defc48052256b34cd2ff757d59bd Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 16:37:27 +0200 Subject: [PATCH 030/102] Use border: none instead of border: 0 --- app/assets/stylesheets/login.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/login.scss b/app/assets/stylesheets/login.scss index 364a3176b..195eacc23 100644 --- a/app/assets/stylesheets/login.scss +++ b/app/assets/stylesheets/login.scss @@ -22,7 +22,7 @@ hr { margin-bottom: 40px; - border: 0; + border: none; height: 1px; background-image: linear-gradient(to right, rgba(100, 100, 100, 0), rgba(100, 100, 100, 0.75), rgba(100, 100, 100, 0)); } From c5fc77b606047a783b6cb81bdb118225d6e5fb15 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 16:38:26 +0200 Subject: [PATCH 031/102] Change the comments style --- app/assets/stylesheets/application.scss | 44 ++++++++++++------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index d1d4a830f..9afcca471 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -1,27 +1,27 @@ //= depend_on_asset "layers.png" //= depend_on_asset "layers-2x.png" -/* - * This is a manifest file that'll be compiled into application.css, which will include all the files - * listed below. - * - * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, - * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. - * - * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any styles - * defined in the other CSS/SCSS files in this directory. It is generally better to create a new - * file per style scope. - * - *= require_tree . - *= require_self - *= require bootstrap-datepicker3 - *= require leaflet - *= require font-awesome - *= require franceconnect - *= require bootstrap-wysihtml5 - *= require select2 - *= require select2-bootstrap - */ + +// This is a manifest file that'll be compiled into application.css, which will include all the files +// listed below. +// +// Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, +// or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. +// +// You're free to add application-wide styles to this file and they'll appear at the bottom of the +// compiled file so the styles you add here take precedence over styles defined in any styles +// defined in the other CSS/SCSS files in this directory. It is generally better to create a new +// file per style scope. +// +// = require_tree . +// = require_self +// = require bootstrap-datepicker3 +// = require leaflet +// = require font-awesome +// = require franceconnect +// = require bootstrap-wysihtml5 +// = require select2 +// = require select2-bootstrap + @import "variables"; @import "bootstrap-sprockets"; @import "bootstrap"; From 0ed13c9fe704a9ead827a8edb2b776c80f104fc1 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 16:41:43 +0200 Subject: [PATCH 032/102] Remove duplicated properties --- app/assets/stylesheets/carte.scss | 1 - app/assets/stylesheets/left_panel.scss | 1 - app/assets/stylesheets/stats.scss | 1 - app/assets/stylesheets/typeahead.scss | 1 - 4 files changed, 4 deletions(-) diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index e840168c9..4c41854fc 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -119,7 +119,6 @@ .info { padding: 6px 8px; font: 14px/16px Arial, Helvetica, sans-serif; - background: #FFFFFF; background: rgba(255, 255, 255, 0.8); box-shadow: 0 0 15px rgba(0, 0, 0, 0.2); border-radius: 5px; diff --git a/app/assets/stylesheets/left_panel.scss b/app/assets/stylesheets/left_panel.scss index 01bc8e223..e85b91cb6 100644 --- a/app/assets/stylesheets/left_panel.scss +++ b/app/assets/stylesheets/left_panel.scss @@ -158,7 +158,6 @@ .dossier-state { text-align: center; font-size: 25px; - width: 200px; margin-top: 20px; width: 200px; margin-left: auto; diff --git a/app/assets/stylesheets/stats.scss b/app/assets/stylesheets/stats.scss index a633cddf1..bea15d74d 100644 --- a/app/assets/stylesheets/stats.scss +++ b/app/assets/stylesheets/stats.scss @@ -64,7 +64,6 @@ $segmented-control-margin-top: $default-space; $segmented-control-item-horizontal-padding: $default-space; $segmented-control-item-border-radius: 2 * $default-space; .segmented-control-item { - color: $blue; display: inline-block; font-size: 15px; border: 2px solid $blue; diff --git a/app/assets/stylesheets/typeahead.scss b/app/assets/stylesheets/typeahead.scss index c22dbf622..568c10453 100644 --- a/app/assets/stylesheets/typeahead.scss +++ b/app/assets/stylesheets/typeahead.scss @@ -5,7 +5,6 @@ .tt-menu { padding: 8px 0; background-color: #fff; - border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); -webkit-border-radius: 8px; -moz-border-radius: 8px; From 6a13e481fd62558d7e1ba6463d3bdc6f47d5d1cd Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 16:42:14 +0200 Subject: [PATCH 033/102] Fix the declaration order --- app/assets/stylesheets/landing.scss | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 4b91e713b..6d68c655b 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -20,6 +20,8 @@ #title { padding-bottom: 2%; padding-top: 1%; + color: #FFFFFF; + text-shadow: 0px 0px 10px rgb(0, 0, 0); h2 { font-size: 35px; @@ -28,9 +30,6 @@ .btn { text-shadow: none; } - - color: #FFFFFF; - text-shadow: 0px 0px 10px rgb(0, 0, 0); } } From 0d5dd9d492d4b66c4e104eb8b4bb12bf85d926ed Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 17:02:15 +0200 Subject: [PATCH 034/102] Remove empty rules --- app/assets/stylesheets/dossier_show.scss | 4 ---- app/assets/stylesheets/users.scss | 3 --- 2 files changed, 7 deletions(-) diff --git a/app/assets/stylesheets/dossier_show.scss b/app/assets/stylesheets/dossier_show.scss index f840b193a..94a343aa5 100644 --- a/app/assets/stylesheets/dossier_show.scss +++ b/app/assets/stylesheets/dossier_show.scss @@ -62,8 +62,6 @@ text-align: end; } } - #carto { - } #private-fields { .text-primary { color: #337ab7; @@ -101,8 +99,6 @@ font-weight: bold; text-align: end; } - .depositaire-info { - } .btn-action{ border: none; margin: 20px 0 40px 0; diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss index bdf586ad3..cca4eb4eb 100644 --- a/app/assets/stylesheets/users.scss +++ b/app/assets/stylesheets/users.scss @@ -20,9 +20,6 @@ margin: 20px; } -#description_page { -} - #carto_page { margin: 20px; } From 2cae8e751eda072a0d9d2ac01d2d6e897a5e9ed8 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 17:06:30 +0200 Subject: [PATCH 035/102] Blocks must be separated by an empty line --- .../stylesheets/admin_procedures_modal.scss | 1 + .../stylesheets/admin_type_de_champ.scss | 1 + app/assets/stylesheets/application.scss | 3 ++ app/assets/stylesheets/backoffice.scss | 3 ++ app/assets/stylesheets/carte.scss | 1 + .../stylesheets/default_data_block.scss | 10 +++++ app/assets/stylesheets/description.scss | 3 ++ app/assets/stylesheets/dossier_show.scss | 33 ++++++++++++++++ app/assets/stylesheets/dossiers.scss | 5 +++ app/assets/stylesheets/etapes.scss | 1 + app/assets/stylesheets/left_panel.scss | 38 +++++++++++++++++++ app/assets/stylesheets/navbar.scss | 18 +++++++++ app/assets/stylesheets/stats.scss | 7 ++++ .../stylesheets/support_navigator_banner.scss | 1 + app/assets/stylesheets/users.scss | 7 ++++ 15 files changed, 132 insertions(+) diff --git a/app/assets/stylesheets/admin_procedures_modal.scss b/app/assets/stylesheets/admin_procedures_modal.scss index 4a5d9f24e..0f6180a0d 100644 --- a/app/assets/stylesheets/admin_procedures_modal.scss +++ b/app/assets/stylesheets/admin_procedures_modal.scss @@ -12,6 +12,7 @@ .twitter-typeahead { width: 300px; } + .tt-menu { width: 300px; } diff --git a/app/assets/stylesheets/admin_type_de_champ.scss b/app/assets/stylesheets/admin_type_de_champ.scss index c5129f144..3baa6f6ce 100644 --- a/app/assets/stylesheets/admin_type_de_champ.scss +++ b/app/assets/stylesheets/admin_type_de_champ.scss @@ -42,6 +42,7 @@ .description { padding: 0; + textarea { padding: 6px 12px; } diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 9afcca471..5a236ae5a 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -66,12 +66,15 @@ form { background-color: $light-blue; text-align: center; padding: 0; + a, p { color: #000000; } + a:hover { color: #000000; } + p { line-height: 40px; padding: 0; diff --git a/app/assets/stylesheets/backoffice.scss b/app/assets/stylesheets/backoffice.scss index 4956cfeb4..b6ead167c 100644 --- a/app/assets/stylesheets/backoffice.scss +++ b/app/assets/stylesheets/backoffice.scss @@ -5,13 +5,16 @@ .default_data_block { background-color: #FFFFFF; margin-top: 20px; + .show-block { width: 100%; } + .body { height: auto; } } + .fixed-right { position: fixed; right: 20px; diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index 4c41854fc..e83aa97eb 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -133,6 +133,7 @@ .twitter-typeahead { width: 555px; } + .tt-menu { width: 555px; } diff --git a/app/assets/stylesheets/default_data_block.scss b/app/assets/stylesheets/default_data_block.scss index 9590ce8ff..316ceac4a 100644 --- a/app/assets/stylesheets/default_data_block.scss +++ b/app/assets/stylesheets/default_data_block.scss @@ -9,6 +9,7 @@ box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5); margin-bottom: 40px; } + .carret-right { float: left; width: 0; @@ -18,6 +19,7 @@ border-left: 14px solid #FFFFFF; margin: 12px 12px 0 15px; } + .carret-down { float: left; width: 0; @@ -28,24 +30,29 @@ border-top: 14px solid #FFFFFF; margin: 12px 12px 0 15px; } + .header { background-color: #003C92; height: 40px; color: #FFFFFF; font-size: 18px; font-weight: bold; + .title, .title-no-expanse, .action, .count { height: 100%; line-height: 40px; padding: 0px; text-transform: uppercase; } + .title-no-expanse { cursor: not-allowed; } + .title, .action, .count { cursor: pointer; } + .action { background-color: #E45B51; text-align: center; @@ -54,14 +61,17 @@ text-decoration: none; color: #FFFFFF; } + .action:hover { color: $light-blue; } + .count { font-size: 16px; text-align: center; } } + .body { background-color: #FFFFFF; display: none; diff --git a/app/assets/stylesheets/description.scss b/app/assets/stylesheets/description.scss index f978697ec..5669c8462 100644 --- a/app/assets/stylesheets/description.scss +++ b/app/assets/stylesheets/description.scss @@ -6,6 +6,7 @@ .default_data_block { .show-block { width: 90%; + .body{ padding: 15px; } @@ -47,11 +48,13 @@ .twitter-typeahead { width: 100%; + input { width: 100%; display: block !important; } } + .tt-menu { width: 100%; } diff --git a/app/assets/stylesheets/dossier_show.scss b/app/assets/stylesheets/dossier_show.scss index 94a343aa5..74ff23cb6 100644 --- a/app/assets/stylesheets/dossier_show.scss +++ b/app/assets/stylesheets/dossier_show.scss @@ -4,24 +4,29 @@ .last-commentaire { display: block; background-color: #FFFFFF; + .content, .new-action { margin-bottom: 20px; } } + .body { .commentaires { max-height: 350px; overflow-y: scroll; background: linear-gradient(to bottom, rgba(0, 0, 0, 0.075) 0%, rgba(219, 219, 219, 0) 50%, rgba(250, 251, 253, 0.18) 51%, #ffffff 100%); } + .no-commentaires { text-align: center; font-size: 18px; padding-top: 20px; } } + .last-commentaire, .commentaire { padding: 20px 0 0 20px; + .comment-header { font-family: Arial; font-size: 14px; @@ -30,10 +35,12 @@ color: #000000; margin-bottom: 10px; } + .file { padding-right: 70px; text-align: center; margin-bottom: 20px; + .link { span { width: 100%; @@ -42,39 +49,48 @@ } } } + .split-hr { margin: 20px 20px 0 20px; border-bottom: 1px solid #979797; } + #new-commentaire { padding: 15px; } } + .infos { .split-row { margin: 0 0 20px 0; } + .entreprise-info { font-size: 14px; } + .entreprise-label { font-weight: bold; text-align: end; } } + #private-fields { .text-primary { color: #337ab7; } } + #pieces-jointes { .piece-row { margin: 20px; + .piece-label { text-align: right; font-weight: bold; } } + .modal-title { color: #000000; } @@ -91,24 +107,30 @@ .body { padding: 20px 20px 0 20px; color: #000000; + .libelle-procedure { font-style: italic; padding: 10px; } + .depositaire-label { font-weight: bold; text-align: end; } + .btn-action{ border: none; margin: 20px 0 40px 0; } + .btn-action:hover { color: #EEEEEE; } + .action { margin: 50px 0 0 15px; } + .action, .btn-action { background-color: #E45B51; text-align: center; @@ -121,43 +143,54 @@ font-size: 16px; font-weight: bold; text-decoration: none; + a:hover { color: #EEEEEE; } } + .historique { color: #000000; margin-left: 20px; } + .comments { margin-right: -10px; } + .comments-off { margin-right: -35px; } + .dossier-title { font-size: 16px; min-height: 40px; text-align: center; } + .split-hr { border-bottom: 1px solid #979797; height: 12px; min-height: 10px; } + .title-row { margin: 20px 10px 10px 10px; } + .margin-top-40 { margin-top: 40px; } + .margin-top-20 { margin-top: 20px; } + .margin-bot-40 { margin-bottom: 40px; } } + #pieces_justificatives { .piece-row { margin: 0 0 0 0; diff --git a/app/assets/stylesheets/dossiers.scss b/app/assets/stylesheets/dossiers.scss index c6a493da8..73499621d 100644 --- a/app/assets/stylesheets/dossiers.scss +++ b/app/assets/stylesheets/dossiers.scss @@ -45,21 +45,26 @@ h5 span { #procedure_list, #notifications_list { margin-left: -10px; margin-top: 20px; + a, a:hover { color: #FFFFFF; text-decoration: none; } + .procedure_list_element.active, .notification.active { background-color: #668ABD; } + .procedure_list_element, .notification { padding: 15px 40px 15px 20px; cursor: pointer; line-height: 1.8em; + .progress-bar-warning { background-color: #E4594F; } } + .procedure_list_element:hover, .notification:hover { background-color: #668ABD; cursor: pointer; diff --git a/app/assets/stylesheets/etapes.scss b/app/assets/stylesheets/etapes.scss index 4bef8c51a..637ea23f8 100644 --- a/app/assets/stylesheets/etapes.scss +++ b/app/assets/stylesheets/etapes.scss @@ -8,6 +8,7 @@ margin-top: 8px; } } + .etapes_informations{ padding-top: 15px; } diff --git a/app/assets/stylesheets/left_panel.scss b/app/assets/stylesheets/left_panel.scss index e85b91cb6..df1816f05 100644 --- a/app/assets/stylesheets/left_panel.scss +++ b/app/assets/stylesheets/left_panel.scss @@ -15,16 +15,19 @@ font-size: 16px; line-height: 18px; margin-top: 20px; + .infos { font-size: 25px; text-align: center; margin: 10px 10px 30px 0; + .projet-name { font-size: 25px; line-height: normal; padding: 5px; } } + .count { display: inline-block; padding: 3px; @@ -33,37 +36,45 @@ text-align: center; line-height: 23px; } + .text { display: inline-block; width: 30px; margin: 0 0 0 8px; } + .dossiers-en-cours, .en-cours { margin-top: 20px; } + .dossiers-en-cours { .count { border: 1px solid #FFFFFF; } } + .nouveaux-dossiers { .count { background-color: #5CB85C; } } + .nouvelles-notifications { .count { background-color: #E4594F; } } + .dossiers-en-cours, .nouveaux-dossiers, .nouvelles-notifications, .en-cours { margin: 5px auto 0 20px; width: 150px; } } + #action-block { text-align: center; margin: 10px; + .action { background-color: #E45B51; text-align: center; @@ -78,6 +89,7 @@ border: none; width: 100%; } + .close-dossier, .refuse-dossier, .forget-dossier { border: 1px solid #FFFFFF; border-radius: 25px; @@ -86,20 +98,25 @@ margin-right: auto; width: 60px; } + .close-dossier:hover, .refuse-dossier:hover, .forget-dossier:hover { color: #000000; border-color: #000000; } + .close-dossier { background-color: #2A9E2A; } + .refuse-dossier { background-color: #E4594F; } + .forget-dossier { background-color: #FF8300; } } + #menu-block { #switch-buttons { height: 30px; @@ -113,19 +130,23 @@ padding: 0 0 0 10px; border-radius: 25px; cursor: pointer; + .active { background-color: #668ABD !important; cursor: default; } + .separator { height: 26px; width: 1px; display: inline-block; background-color: #FFFFFF; } + #switch-procedures:hover, #switch-notifications:hover { background-color: #668AEA; } + #switch-procedures { height: 28px; margin: 0 0 0 -10px; @@ -134,6 +155,7 @@ display: inline-block; border-radius: 25px 0 0 25px; } + #switch-notifications { width: 103px; display: inline-block; @@ -143,18 +165,21 @@ padding: 0 0 0 5px; } } + .split-hr { border-bottom: 1px solid #FFFFFF; width: 200px; margin: 20px 0 20px 0; } } + #infos-block { .split-hr { border-bottom: 1px solid #FFFFFF; width: 200px; margin: 20px 0 20px 0; } + .dossier-state { text-align: center; font-size: 25px; @@ -163,24 +188,29 @@ margin-left: auto; margin-right: auto; } + #notifications_list { .no-notification { margin: 0 30px 0 30px; } + .notification { padding: 10px 2px 10px 15px; + .dossier, .updated-at { display: inline-block; color: #CCCCCC; font-size: 12px; text-align: left; } + .dossier-index, .updated-at-index, .count { display: inline-block; color: #FFFFFF; font-size: 14px; text-align: left; } + .count { background-color: #F0AD4E; border-radius: 25px; @@ -188,33 +218,41 @@ width: 25px; text-align: center; } + .type-notif { font-size: 16px; } } } + .notifications { margin: 20px 10px 0 5px; + .fa { font-size: 25px; width: 100%; margin: 0 0 15px 0; } + .type-notif { font-size: 16px; float: right; width: 30px; } + .notification { margin: 10px 0 10px 10px; + .type { margin-bottom: 20px; } + .updated-at { color: #CCCCCC; font-size: 12px; text-align: left; } + .split-hr { width: 40px; margin: auto; diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index 4f9a75bc9..5b2a454f4 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -8,6 +8,7 @@ z-index: 10; border-radius: 0; height: 60px; + #title_navbar{ color: #FFFFFF; font-weight: bold; @@ -15,18 +16,22 @@ z-index: 10; overflow: hidden; } + #title_navbar:hover{ text-decoration: none; } + #home { text-align: center; box-shadow: 0 1px 2px 0 rgba(0,0,0,0.5); background-color: #003189; height: 60px; + .logo { margin-top: 10px; height: 40px; } + #tps-title { font-family: Arial; font-size: 24px; @@ -35,11 +40,13 @@ margin-top: 17px; } } + #navbar-body { min-height: 60px; background-color: #FFFFFF; box-shadow: 0 1px 2px 0 rgba(50,50,50,0.5); padding-left: 50px; + .main-info { font-family: Arial; font-size: 18px; @@ -51,6 +58,7 @@ white-space: nowrap; text-overflow: ellipsis; } + .options { font-family: Arial; font-size: 14px; @@ -60,18 +68,22 @@ padding: 8px; border-right: 1px solid #C8C6C8; min-height: 60px; + .dropdown-toggle { cursor: pointer; } + .dropdown-pannel { min-height: 100px; width: 400px; padding-left: 10px; } + .centered-option { line-height: 40px; height: 40px; } + .caret-right { border-bottom: 4px solid transparent; border-top: 4px solid transparent; @@ -86,6 +98,7 @@ #sign_in{ margin-top: 7px; + .btn { float: right; margin-right: 15px; @@ -103,6 +116,7 @@ margin-right: 0.5em; font-size: 40px; } + .fa:hover { color: #668ABD; } @@ -145,6 +159,7 @@ .navbar { border: 0 !important; + .sign_in_FC { margin-top: -18px; height: 70px; @@ -181,11 +196,13 @@ text-align: center; padding: 2px; float: right; + .fa { font-size: 20px; margin-right: 10px; } } + .button-navbar-action:hover { color: $light-blue; } @@ -200,6 +217,7 @@ padding: 10px; left: -130px; text-align: center; + .description { font-weight: bold; font-size: 20px; diff --git a/app/assets/stylesheets/stats.scss b/app/assets/stylesheets/stats.scss index bea15d74d..7c58d62bb 100644 --- a/app/assets/stylesheets/stats.scss +++ b/app/assets/stylesheets/stats.scss @@ -8,6 +8,7 @@ $blue-hover: rgba(61, 149, 236, 0.8); $default-space: 15px; $new-h1-margin-bottom: 4 * $default-space; + .new-h1 { color: $dark-grey; text-align: center; @@ -16,6 +17,7 @@ $new-h1-margin-bottom: 4 * $default-space; } $statistiques-padding-top: $default-space * 2; + .statistiques { width: 1040px; margin: 0 auto; @@ -29,6 +31,7 @@ $statistiques-padding-top: $default-space * 2; } $stat-card-margin-bottom: 3 * $default-space; + .stat-card { @extend .card; margin-bottom: $stat-card-margin-bottom; @@ -38,6 +41,7 @@ $stat-card-margin-bottom: 3 * $default-space; } $stat-card-half-horizontal-spacing: 4 * $default-space; + .stat-card-half { width: calc((100% - #{$stat-card-half-horizontal-spacing}) / 2); margin-right: 3 * $default-space; @@ -51,6 +55,7 @@ $stat-card-half-horizontal-spacing: 4 * $default-space; } $segmented-control-margin-top: $default-space; + .segmented-control { border-radius: 36px; height: 36px; @@ -63,6 +68,7 @@ $segmented-control-margin-top: $default-space; $segmented-control-item-horizontal-padding: $default-space; $segmented-control-item-border-radius: 2 * $default-space; + .segmented-control-item { display: inline-block; font-size: 15px; @@ -102,6 +108,7 @@ $segmented-control-item-border-radius: 2 * $default-space; } $big-number-card-padding: 2 * $segmented-control-item-border-radius; + .big-number-card { padding: $big-number-card-padding; } diff --git a/app/assets/stylesheets/support_navigator_banner.scss b/app/assets/stylesheets/support_navigator_banner.scss index b72953590..aade2e1f2 100644 --- a/app/assets/stylesheets/support_navigator_banner.scss +++ b/app/assets/stylesheets/support_navigator_banner.scss @@ -9,6 +9,7 @@ bottom: 0; left: 0; z-index: 1000; + a{ color: #c3d9ff; } diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss index cca4eb4eb..595095334 100644 --- a/app/assets/stylesheets/users.scss +++ b/app/assets/stylesheets/users.scss @@ -7,9 +7,11 @@ .default_data_block { margin-top: 20px; background-color: #FFFFFF; + .show-block { width: 100%; } + .body { height: auto; } @@ -26,6 +28,7 @@ .white-back { margin: 20px !important; + #previsualisation { margin-top: 30px; } @@ -35,6 +38,7 @@ background-color: #FFFFFF; box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5); padding: 20px; + .action { background-color: #E45B51; text-align: center; @@ -46,12 +50,15 @@ border: none; padding: 10px; } + .action:hover { color: $light-blue; } + .padding-left-30 { padding-left: 30px; } + h3 { margin-bottom: 20px; } From f519896e54308fca79a6acbcb7f844af2fbdafad Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 18:37:02 +0200 Subject: [PATCH 036/102] Hex colors must be 6 characters long --- app/assets/stylesheets/carte.scss | 2 +- app/assets/stylesheets/custom-mails.scss | 2 +- app/assets/stylesheets/navbar.scss | 4 ++-- app/assets/stylesheets/typeahead.scss | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index e83aa97eb..d04a0b78d 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -126,7 +126,7 @@ .info h4 { margin: 0 0 5px; - color: #777; + color: #777777; } #search_by_address { diff --git a/app/assets/stylesheets/custom-mails.scss b/app/assets/stylesheets/custom-mails.scss index 6552f757f..c17eaeffa 100644 --- a/app/assets/stylesheets/custom-mails.scss +++ b/app/assets/stylesheets/custom-mails.scss @@ -2,7 +2,7 @@ padding: 20px; .wrapper { - background-color: #FFF; + background-color: #FFFFFF; box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5); margin: 15px auto; max-width: 800px; diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index 5b2a454f4..f8b0576e7 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -140,7 +140,7 @@ .btn-nav:hover { background-color: #eeeeee; - border-color: #eeeeee #eeeeee #ddd; + border-color: #eeeeee #eeeeee #dddddd; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } @@ -175,7 +175,7 @@ transform: rotate(-45deg); width: 150px; background-color: #008cba; - color: #fff; + color: #ffffff; padding: 5px; font-size: 15px; font-weight: 700; diff --git a/app/assets/stylesheets/typeahead.scss b/app/assets/stylesheets/typeahead.scss index 568c10453..c13455f48 100644 --- a/app/assets/stylesheets/typeahead.scss +++ b/app/assets/stylesheets/typeahead.scss @@ -4,7 +4,7 @@ .tt-menu { padding: 8px 0; - background-color: #fff; + background-color: #ffffff; border: 1px solid rgba(0, 0, 0, 0.2); -webkit-border-radius: 8px; -moz-border-radius: 8px; @@ -22,12 +22,12 @@ .tt-suggestion:hover { cursor: pointer; - color: #fff; + color: #ffffff; background-color: #0097cf; } .tt-suggestion.tt-cursor { - color: #fff; + color: #ffffff; background-color: #0097cf; } From c9ff601b28c999cda125817e6160d9630dfc4264 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 18:40:01 +0200 Subject: [PATCH 037/102] Hex colors must be written with uppercase letters --- app/assets/stylesheets/carte.scss | 2 +- app/assets/stylesheets/description.scss | 2 +- app/assets/stylesheets/dossier_show.scss | 4 ++-- app/assets/stylesheets/dossiers.scss | 2 +- app/assets/stylesheets/navbar.scss | 14 +++++++------- .../stylesheets/support_navigator_banner.scss | 2 +- app/assets/stylesheets/typeahead.scss | 10 +++++----- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index d04a0b78d..91f44ff18 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -78,7 +78,7 @@ } #map.mode-delete path:hover { - fill: #4d4d4d !important; + fill: #4D4D4D !important; } #map div.polygon-elbow { diff --git a/app/assets/stylesheets/description.scss b/app/assets/stylesheets/description.scss index 5669c8462..a658d1cb7 100644 --- a/app/assets/stylesheets/description.scss +++ b/app/assets/stylesheets/description.scss @@ -95,7 +95,7 @@ } .datepicker-switch { - color: #0086b3; + color: #0086B3; text-decoration: underline; } diff --git a/app/assets/stylesheets/dossier_show.scss b/app/assets/stylesheets/dossier_show.scss index 74ff23cb6..48992a25a 100644 --- a/app/assets/stylesheets/dossier_show.scss +++ b/app/assets/stylesheets/dossier_show.scss @@ -14,7 +14,7 @@ .commentaires { max-height: 350px; overflow-y: scroll; - background: linear-gradient(to bottom, rgba(0, 0, 0, 0.075) 0%, rgba(219, 219, 219, 0) 50%, rgba(250, 251, 253, 0.18) 51%, #ffffff 100%); + background: linear-gradient(to bottom, rgba(0, 0, 0, 0.075) 0%, rgba(219, 219, 219, 0) 50%, rgba(250, 251, 253, 0.18) 51%, #FFFFFF 100%); } .no-commentaires { @@ -77,7 +77,7 @@ #private-fields { .text-primary { - color: #337ab7; + color: #337AB7; } } diff --git a/app/assets/stylesheets/dossiers.scss b/app/assets/stylesheets/dossiers.scss index 73499621d..8c6ff80f9 100644 --- a/app/assets/stylesheets/dossiers.scss +++ b/app/assets/stylesheets/dossiers.scss @@ -38,7 +38,7 @@ h5 span { } #dossiers_list tr:hover{ - background-color: #eeeeee; + background-color: #EEEEEE; cursor: pointer; } diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index f8b0576e7..9ee68238f 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -139,22 +139,22 @@ } .btn-nav:hover { - background-color: #eeeeee; - border-color: #eeeeee #eeeeee #dddddd; + background-color: #EEEEEE; + border-color: #EEEEEE #EEEEEE #DDDDDD; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .btn-nav.text-info:hover { - color: #23527c; + color: #23527C; } .btn-nav.text-success:hover { - color: #3c763d; + color: #3C763D; } .btn-nav.text-danger:hover { - color: #a94442; + color: #A94442; } .navbar { @@ -174,8 +174,8 @@ right: -35px; transform: rotate(-45deg); width: 150px; - background-color: #008cba; - color: #ffffff; + background-color: #008CBA; + color: #FFFFFF; padding: 5px; font-size: 15px; font-weight: 700; diff --git a/app/assets/stylesheets/support_navigator_banner.scss b/app/assets/stylesheets/support_navigator_banner.scss index aade2e1f2..01e3e8154 100644 --- a/app/assets/stylesheets/support_navigator_banner.scss +++ b/app/assets/stylesheets/support_navigator_banner.scss @@ -11,6 +11,6 @@ z-index: 1000; a{ - color: #c3d9ff; + color: #C3D9FF; } } diff --git a/app/assets/stylesheets/typeahead.scss b/app/assets/stylesheets/typeahead.scss index c13455f48..454b9d01e 100644 --- a/app/assets/stylesheets/typeahead.scss +++ b/app/assets/stylesheets/typeahead.scss @@ -4,7 +4,7 @@ .tt-menu { padding: 8px 0; - background-color: #ffffff; + background-color: #FFFFFF; border: 1px solid rgba(0, 0, 0, 0.2); -webkit-border-radius: 8px; -moz-border-radius: 8px; @@ -22,12 +22,12 @@ .tt-suggestion:hover { cursor: pointer; - color: #ffffff; - background-color: #0097cf; + color: #FFFFFF; + background-color: #0097CF; } .tt-suggestion.tt-cursor { - color: #ffffff; - background-color: #0097cf; + color: #FFFFFF; + background-color: #0097CF; } From af7b611dd0ad2ad82bdff7c32faceeaeb72a7766 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 18:45:35 +0200 Subject: [PATCH 038/102] < 1 numbers must all have a leading zero --- app/assets/stylesheets/_card.scss | 2 +- app/assets/stylesheets/carte.scss | 8 ++++---- app/assets/stylesheets/typeahead.scss | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/_card.scss b/app/assets/stylesheets/_card.scss index 118715fba..02cd722cc 100644 --- a/app/assets/stylesheets/_card.scss +++ b/app/assets/stylesheets/_card.scss @@ -1,6 +1,6 @@ .card { background: #FFFFFF; padding: 15px; - box-shadow: 0 1px 3px rgba(0, 0, 0, .15); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); border-radius: 2px; } diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index 91f44ff18..8f1499eb4 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -51,7 +51,7 @@ top: 0; left: 0; pointer-events: none; - box-shadow: inset -100px 0 100px -100px rgba(0, 0, 0, .25); + box-shadow: inset -100px 0 100px -100px rgba(0, 0, 0, 0.25); width: 100%; height: 100%; z-index: 2001; @@ -69,7 +69,7 @@ position: absolute; z-index: 1001; fill: #D7217E; - fill-opacity: .75; + fill-opacity: 0.75; -webkit-filter: none; } @@ -82,8 +82,8 @@ } #map div.polygon-elbow { - -webkit-transition: opacity .25s; - box-shadow: 0 0 0 2px #FFFFFF, 0 0 10px rgba(0, 0, 0, .35); + -webkit-transition: opacity 0.25s; + box-shadow: 0 0 0 2px #FFFFFF, 0 0 10px rgba(0, 0, 0, 0.35); border: 5px solid #D7217E; border-radius: 10px; transition: opacity 0.25s; diff --git a/app/assets/stylesheets/typeahead.scss b/app/assets/stylesheets/typeahead.scss index 454b9d01e..e10668176 100644 --- a/app/assets/stylesheets/typeahead.scss +++ b/app/assets/stylesheets/typeahead.scss @@ -9,9 +9,9 @@ -webkit-border-radius: 8px; -moz-border-radius: 8px; border-radius: 8px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } .tt-suggestion { From f3ec7f1d42970cea524a13c43ff928403a043070 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 09:37:06 +0200 Subject: [PATCH 039/102] Indent with two spaces --- app/assets/stylesheets/typeahead.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/typeahead.scss b/app/assets/stylesheets/typeahead.scss index e10668176..61ba54b83 100644 --- a/app/assets/stylesheets/typeahead.scss +++ b/app/assets/stylesheets/typeahead.scss @@ -1,5 +1,5 @@ .twitter-typeahead { - width: 100%; // http://stackoverflow.com/questions/17957513/extending-the-width-of-bootstrap-typeahead-to-match-input-field + width: 100%; // http://stackoverflow.com/questions/17957513/extending-the-width-of-bootstrap-typeahead-to-match-input-field } .tt-menu { From 4b39e76c8add20f85a4faf64678b87630e8c68f3 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:02:20 +0200 Subject: [PATCH 040/102] Use extend only with placeholders --- app/assets/stylesheets/carte.scss | 8 -------- app/assets/stylesheets/stats.scss | 1 - app/views/stats/index.html.haml | 8 ++++---- app/views/users/carte/_map.html.haml | 6 +++--- 4 files changed, 7 insertions(+), 16 deletions(-) diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index 8f1499eb4..72cfa3a86 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -5,24 +5,16 @@ #carte_page { #map { - @extend .col-md-12; - @extend .col-lg-12; - margin-left: 15px; width: 90%; height: 600px; } #map.qp, #map.cadastre { - @extend .col-md-9; - @extend .col-lg-9; - width: 70%; } .list { - @extend .col-md-3; - @extend .col-lg-3; margin-bottom: 20px; h3 { diff --git a/app/assets/stylesheets/stats.scss b/app/assets/stylesheets/stats.scss index 7c58d62bb..42fef6ac1 100644 --- a/app/assets/stylesheets/stats.scss +++ b/app/assets/stylesheets/stats.scss @@ -33,7 +33,6 @@ $statistiques-padding-top: $default-space * 2; $stat-card-margin-bottom: 3 * $default-space; .stat-card { - @extend .card; margin-bottom: $stat-card-margin-bottom; border-radius: 5px; box-shadow: none; diff --git a/app/views/stats/index.html.haml b/app/views/stats/index.html.haml index 19048dfe1..88e596ab4 100644 --- a/app/views/stats/index.html.haml +++ b/app/views/stats/index.html.haml @@ -6,7 +6,7 @@ .stat-cards - .stat-card.stat-card-half.pull-left + .card.stat-card.stat-card-half.pull-left %ul.segmented-control.pull-right %li.segmented-control-item.segmented-control-item-active{ :onclick => "TPS.toggleChart(event, '.cumulative-procedures-chart');" } Cumul @@ -23,7 +23,7 @@ = line_chart @procedures_30_days_flow, :colors => ["rgba(61, 149, 236, 1)"] - .stat-card.stat-card-half.pull-left + .card.stat-card.stat-card-half.pull-left %ul.segmented-control.pull-right %li.segmented-control-item.segmented-control-item-active{ :onclick => "TPS.toggleChart(event, '.cumulative-dossiers-chart');" } Cumul @@ -40,12 +40,12 @@ = line_chart @dossiers_30_days_flow, :colors => ["rgba(61, 149, 236, 1)"] - .stat-card.stat-card-half.big-number-card.pull-left + .card.stat-card.stat-card-half.big-number-card.pull-left %span.big-number-card-title TOTAL DÉMARCHES DÉMATÉRIALISÉES %span.big-number-card-number = number_with_delimiter(@procedures_count) - .stat-card.stat-card-half.big-number-card.pull-left + .card.stat-card.stat-card-half.big-number-card.pull-left %span.big-number-card-title TOTAL DOSSIERS DÉPOSÉS %span.big-number-card-number = number_with_delimiter(@dossiers_count) diff --git a/app/views/users/carte/_map.html.haml b/app/views/users/carte/_map.html.haml index 8915c35d0..ffd2b3343 100644 --- a/app/views/users/carte/_map.html.haml +++ b/app/views/users/carte/_map.html.haml @@ -1,12 +1,12 @@ #carte_page.row - #map{ class: dossier.procedure.module_api_carto.classes } + .col-md-12.col-lg-12#map{ class: dossier.procedure.module_api_carto.classes } - if dossier.procedure.module_api_carto.quartiers_prioritaires - #qp.list + .col-md-9.col-lg-9#qp.col-md-3.col-lg-3.list %h3.text-info Quartiers prioritaites %ul - if dossier.procedure.module_api_carto.cadastre - #cadastre.list + .col-md-9.col-lg-9#cadastre.col-md-3.col-lg-3.list %h3.text-warning Cadastres %ul From 4f0de677abd15ec52158c428f9cdc5c45b1c035a Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:02:22 +0200 Subject: [PATCH 041/102] Begin pseudo elements with double colons --- app/assets/stylesheets/application.scss | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 5a236ae5a..e0c15dd3e 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -53,12 +53,12 @@ form { overflow: hidden; } -#wrap:after { +#wrap::after { content: ""; display: block; } -#footer, #wrap:after { +#footer, #wrap::after { height: 50px; } @@ -202,11 +202,11 @@ div.pagination { right: 50px; } -#fconnect-access:before { +#fconnect-access::before { left: 22.7% !important; } -#fconnect-access:after { +#fconnect-access::after { left: 23% !important; } From 4b575bd386cefc7592cd0951c58f44cbe4d44983 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:29:46 +0200 Subject: [PATCH 042/102] Commas are followed by a space --- app/assets/stylesheets/navbar.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index 9ee68238f..2d6024f5d 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -23,7 +23,7 @@ #home { text-align: center; - box-shadow: 0 1px 2px 0 rgba(0,0,0,0.5); + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.5); background-color: #003189; height: 60px; @@ -44,7 +44,7 @@ #navbar-body { min-height: 60px; background-color: #FFFFFF; - box-shadow: 0 1px 2px 0 rgba(50,50,50,0.5); + box-shadow: 0 1px 2px 0 rgba(50, 50, 50, 0.5); padding-left: 50px; .main-info { From 8906801d6ccdab665481b1408bc50d3fad5366b0 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:31:31 +0200 Subject: [PATCH 043/102] Comment literals must be followed by a space --- app/assets/stylesheets/application.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index e0c15dd3e..36c5f6332 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -1,5 +1,5 @@ -//= depend_on_asset "layers.png" -//= depend_on_asset "layers-2x.png" +// = depend_on_asset "layers.png" +// = depend_on_asset "layers-2x.png" // This is a manifest file that'll be compiled into application.css, which will include all the files // listed below. From 0789cfd311bda85ce174e86c3c72be9e70cad12d Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:33:16 +0200 Subject: [PATCH 044/102] Colons must be followed by a single space --- app/assets/stylesheets/admin_type_de_champ.scss | 4 ++-- app/assets/stylesheets/france_connect_particulier.scss | 4 ++-- app/assets/stylesheets/login.scss | 10 +++++----- app/assets/stylesheets/support_navigator_banner.scss | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/admin_type_de_champ.scss b/app/assets/stylesheets/admin_type_de_champ.scss index 3baa6f6ce..b21fae2a1 100644 --- a/app/assets/stylesheets/admin_type_de_champ.scss +++ b/app/assets/stylesheets/admin_type_de_champ.scss @@ -4,7 +4,7 @@ margin-bottom: 10px; margin-left: 0; margin-right: 0; - text-align:center; + text-align: center; padding-bottom: 8px; color: #FFFFFF; @@ -37,7 +37,7 @@ .form-group { vertical-align: top; - margin-right: 15px; + margin-right: 15px; } .description { diff --git a/app/assets/stylesheets/france_connect_particulier.scss b/app/assets/stylesheets/france_connect_particulier.scss index 98cb7738e..61bafa91a 100644 --- a/app/assets/stylesheets/france_connect_particulier.scss +++ b/app/assets/stylesheets/france_connect_particulier.scss @@ -1,5 +1,5 @@ #france_connect_particulier_email{ width: 300px; - margin-left:auto; - margin-right:auto; + margin-left: auto; + margin-right: auto; } diff --git a/app/assets/stylesheets/login.scss b/app/assets/stylesheets/login.scss index 195eacc23..ae31e1ed6 100644 --- a/app/assets/stylesheets/login.scss +++ b/app/assets/stylesheets/login.scss @@ -1,9 +1,9 @@ #form_login{ text-align: center; - max-width:500px; + max-width: 500px; - margin-left:auto; - margin-right:auto; + margin-left: auto; + margin-right: auto; padding: 20px; @@ -16,8 +16,8 @@ #new_user{ width: 80%; - margin-left:auto; - margin-right:auto; + margin-left: auto; + margin-right: auto; } hr { diff --git a/app/assets/stylesheets/support_navigator_banner.scss b/app/assets/stylesheets/support_navigator_banner.scss index 01e3e8154..b10939527 100644 --- a/app/assets/stylesheets/support_navigator_banner.scss +++ b/app/assets/stylesheets/support_navigator_banner.scss @@ -1,6 +1,6 @@ #support_navigator_banner{ position: fixed; - text-align:center; + text-align: center; line-height: 2em; color: #FFFFFF; background-color: #990000; From 8cad7361cfbf667ce9cf6141c6f0f786827ad556 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:42:11 +0200 Subject: [PATCH 045/102] An operator must be surrounded by single spaces --- app/assets/stylesheets/application.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 36c5f6332..d5be7f827 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -125,7 +125,7 @@ form { min-height: 100%; font-size: 100px; text-align: right; - filter: alpha(opacity=0); + filter: alpha(opacity = 0); opacity: 0; outline: none; background: #FFFFFF; From 5e1c99d6421b9c949c6f9bb0019853e1436fb72a Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:42:48 +0200 Subject: [PATCH 046/102] Opening curly braces must be preceded by one single space --- app/assets/stylesheets/admin_index.scss | 2 +- app/assets/stylesheets/admin_type_de_champ.scss | 6 +++--- app/assets/stylesheets/description.scss | 4 ++-- app/assets/stylesheets/dossier_show.scss | 2 +- app/assets/stylesheets/dossiers.scss | 2 +- app/assets/stylesheets/etapes.scss | 10 +++++----- app/assets/stylesheets/france_connect_particulier.scss | 2 +- app/assets/stylesheets/landing.scss | 10 +++++----- app/assets/stylesheets/login.scss | 4 ++-- app/assets/stylesheets/navbar.scss | 8 ++++---- app/assets/stylesheets/pref_list_menu.scss | 2 +- app/assets/stylesheets/print.scss | 2 +- app/assets/stylesheets/procedure.scss | 2 +- app/assets/stylesheets/search.scss | 4 ++-- app/assets/stylesheets/support_navigator_banner.scss | 4 ++-- app/assets/stylesheets/switch_menu.scss | 2 +- app/assets/stylesheets/users.scss | 2 +- 17 files changed, 34 insertions(+), 34 deletions(-) diff --git a/app/assets/stylesheets/admin_index.scss b/app/assets/stylesheets/admin_index.scss index 8a4d10b22..fe6c3d73c 100644 --- a/app/assets/stylesheets/admin_index.scss +++ b/app/assets/stylesheets/admin_index.scss @@ -1,4 +1,4 @@ -#admin_index{ +#admin_index { margin-left: 2em; margin-right: 2em; diff --git a/app/assets/stylesheets/admin_type_de_champ.scss b/app/assets/stylesheets/admin_type_de_champ.scss index b21fae2a1..6c8a5ffcb 100644 --- a/app/assets/stylesheets/admin_type_de_champ.scss +++ b/app/assets/stylesheets/admin_type_de_champ.scss @@ -1,4 +1,4 @@ -.header_section{ +.header_section { background-color: rgb(0, 49, 137); margin-top: 20px; margin-bottom: 10px; @@ -22,7 +22,7 @@ } } -#liste_champ{ +#liste_champ { .form-inline { margin-bottom: 30px; } @@ -31,7 +31,7 @@ display: inline-block !important; } - .form-group.drop_down_list{ + .form-group.drop_down_list { display: none; } diff --git a/app/assets/stylesheets/description.scss b/app/assets/stylesheets/description.scss index a658d1cb7..66b3f5e9d 100644 --- a/app/assets/stylesheets/description.scss +++ b/app/assets/stylesheets/description.scss @@ -7,7 +7,7 @@ .show-block { width: 90%; - .body{ + .body { padding: 15px; } } @@ -19,7 +19,7 @@ } } -.page-header{ +.page-header { border-bottom: 1px solid #CCCCCC !important; } diff --git a/app/assets/stylesheets/dossier_show.scss b/app/assets/stylesheets/dossier_show.scss index 48992a25a..b453da366 100644 --- a/app/assets/stylesheets/dossier_show.scss +++ b/app/assets/stylesheets/dossier_show.scss @@ -118,7 +118,7 @@ text-align: end; } - .btn-action{ + .btn-action { border: none; margin: 20px 0 40px 0; } diff --git a/app/assets/stylesheets/dossiers.scss b/app/assets/stylesheets/dossiers.scss index 8c6ff80f9..3793159f2 100644 --- a/app/assets/stylesheets/dossiers.scss +++ b/app/assets/stylesheets/dossiers.scss @@ -37,7 +37,7 @@ h5 span { } } -#dossiers_list tr:hover{ +#dossiers_list tr:hover { background-color: #EEEEEE; cursor: pointer; } diff --git a/app/assets/stylesheets/etapes.scss b/app/assets/stylesheets/etapes.scss index 637ea23f8..58ed601f4 100644 --- a/app/assets/stylesheets/etapes.scss +++ b/app/assets/stylesheets/etapes.scss @@ -1,15 +1,15 @@ -.etape_2{ - .etapes_menu{ - #dossier_siret{ +.etape_2 { + .etapes_menu { + #dossier_siret { width: 200px; } - button{ + button { margin-top: 8px; } } - .etapes_informations{ + .etapes_informations { padding-top: 15px; } } diff --git a/app/assets/stylesheets/france_connect_particulier.scss b/app/assets/stylesheets/france_connect_particulier.scss index 61bafa91a..03d671366 100644 --- a/app/assets/stylesheets/france_connect_particulier.scss +++ b/app/assets/stylesheets/france_connect_particulier.scss @@ -1,4 +1,4 @@ -#france_connect_particulier_email{ +#france_connect_particulier_email { width: 300px; margin-left: auto; margin-right: auto; diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 6d68c655b..a36884f41 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -9,7 +9,7 @@ background-position: top center; background-repeat: no-repeat; - h5{ + h5 { color: #808080; } @@ -33,16 +33,16 @@ } } -.background-tps{ +.background-tps { background-color: #668AEA; color: #FFFFFF; } -.latest_release{ +.latest_release { margin-left: 1% } -#landing_body{ +#landing_body { .split-hr-left { margin-left: auto; margin-right: auto; @@ -54,7 +54,7 @@ width: 40%; } - #etapes, #request_access{ + #etapes, #request_access { margin-top: 20px; margin-bottom: 20px; } diff --git a/app/assets/stylesheets/login.scss b/app/assets/stylesheets/login.scss index ae31e1ed6..c3d162d47 100644 --- a/app/assets/stylesheets/login.scss +++ b/app/assets/stylesheets/login.scss @@ -1,4 +1,4 @@ -#form_login{ +#form_login { text-align: center; max-width: 500px; @@ -14,7 +14,7 @@ } } - #new_user{ + #new_user { width: 80%; margin-left: auto; margin-right: auto; diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index 2d6024f5d..72f6aa02c 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -9,7 +9,7 @@ border-radius: 0; height: 60px; - #title_navbar{ + #title_navbar { color: #FFFFFF; font-weight: bold; font-size: 1.8em; @@ -17,7 +17,7 @@ overflow: hidden; } - #title_navbar:hover{ + #title_navbar:hover { text-decoration: none; } @@ -96,7 +96,7 @@ } } - #sign_in{ + #sign_in { margin-top: 7px; .btn { @@ -105,7 +105,7 @@ } } - #sign_out{ + #sign_out { height: 60px; .fa { diff --git a/app/assets/stylesheets/pref_list_menu.scss b/app/assets/stylesheets/pref_list_menu.scss index ebea47305..84dee03a5 100644 --- a/app/assets/stylesheets/pref_list_menu.scss +++ b/app/assets/stylesheets/pref_list_menu.scss @@ -1,4 +1,4 @@ -#pref_list_menu{ +#pref_list_menu { z-index: 100; display: none; position: fixed; diff --git a/app/assets/stylesheets/print.scss b/app/assets/stylesheets/print.scss index bdbc39347..acae37478 100644 --- a/app/assets/stylesheets/print.scss +++ b/app/assets/stylesheets/print.scss @@ -3,7 +3,7 @@ margin: 0; } - #main_div{ + #main_div { margin-left: 50px; margin-right: 0; } diff --git a/app/assets/stylesheets/procedure.scss b/app/assets/stylesheets/procedure.scss index bb353956f..2bc5b4e87 100644 --- a/app/assets/stylesheets/procedure.scss +++ b/app/assets/stylesheets/procedure.scss @@ -2,7 +2,7 @@ display: none; } -#procedure_lien_demarche{ +#procedure_lien_demarche { display: none; } diff --git a/app/assets/stylesheets/search.scss b/app/assets/stylesheets/search.scss index ce3219ac5..af9a8e362 100644 --- a/app/assets/stylesheets/search.scss +++ b/app/assets/stylesheets/search.scss @@ -1,4 +1,4 @@ -#search-block{ +#search-block { margin: 15px 10px 0 10px; height: 30px; } @@ -7,7 +7,7 @@ height: 34px; } -#mask_search{ +#mask_search { display: none; position: fixed; background-color: rgba(0, 0, 0, 0.4); diff --git a/app/assets/stylesheets/support_navigator_banner.scss b/app/assets/stylesheets/support_navigator_banner.scss index b10939527..9371dd4d2 100644 --- a/app/assets/stylesheets/support_navigator_banner.scss +++ b/app/assets/stylesheets/support_navigator_banner.scss @@ -1,4 +1,4 @@ -#support_navigator_banner{ +#support_navigator_banner { position: fixed; text-align: center; line-height: 2em; @@ -10,7 +10,7 @@ left: 0; z-index: 1000; - a{ + a { color: #C3D9FF; } } diff --git a/app/assets/stylesheets/switch_menu.scss b/app/assets/stylesheets/switch_menu.scss index a7c66e6c1..49fb5289c 100644 --- a/app/assets/stylesheets/switch_menu.scss +++ b/app/assets/stylesheets/switch_menu.scss @@ -1,4 +1,4 @@ -#switch_menu{ +#switch_menu { position: fixed; left: 10px; bottom: 10px; diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss index 595095334..4e94a6e28 100644 --- a/app/assets/stylesheets/users.scss +++ b/app/assets/stylesheets/users.scss @@ -1,6 +1,6 @@ @import "variables"; -#users_index, #admins_index{ +#users_index, #admins_index { margin-left: 2rem; margin-right: 2rem; From 11e59439897125706048530ef0429087009a5691 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:51:35 +0200 Subject: [PATCH 047/102] Only one selector per line --- app/assets/stylesheets/application.scss | 9 ++++--- app/assets/stylesheets/backoffice.scss | 6 +++-- app/assets/stylesheets/carte.scss | 3 ++- .../stylesheets/default_data_block.scss | 9 +++++-- app/assets/stylesheets/description.scss | 5 +++- app/assets/stylesheets/dossier_show.scss | 18 +++++++++---- app/assets/stylesheets/dossiers.scss | 15 +++++++---- app/assets/stylesheets/landing.scss | 3 ++- app/assets/stylesheets/left_panel.scss | 26 ++++++++++++++----- app/assets/stylesheets/navbar.scss | 3 ++- app/assets/stylesheets/print.scss | 3 ++- app/assets/stylesheets/users.scss | 8 ++++-- 12 files changed, 77 insertions(+), 31 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index d5be7f827..645c0c2a3 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -30,7 +30,8 @@ body { background-color: $light-blue; } -html, body { +html, +body { height: 100%; } @@ -58,7 +59,8 @@ form { display: block; } -#footer, #wrap::after { +#footer, +#wrap::after { height: 50px; } @@ -67,7 +69,8 @@ form { text-align: center; padding: 0; - a, p { + a, + p { color: #000000; } diff --git a/app/assets/stylesheets/backoffice.scss b/app/assets/stylesheets/backoffice.scss index b6ead167c..3aa7b1b80 100644 --- a/app/assets/stylesheets/backoffice.scss +++ b/app/assets/stylesheets/backoffice.scss @@ -1,4 +1,5 @@ -#backoffice_index, #backoffice_search { +#backoffice_index, +#backoffice_search { margin-left: 2rem; margin-right: 2rem; @@ -30,7 +31,8 @@ #onglets { ul { - li, li.active { + li, + li.active { a { margin-top: 12px; height: 45px; diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index 72cfa3a86..968b53e2f 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -10,7 +10,8 @@ height: 600px; } - #map.qp, #map.cadastre { + #map.qp, + #map.cadastre { width: 70%; } diff --git a/app/assets/stylesheets/default_data_block.scss b/app/assets/stylesheets/default_data_block.scss index 316ceac4a..237eaaf17 100644 --- a/app/assets/stylesheets/default_data_block.scss +++ b/app/assets/stylesheets/default_data_block.scss @@ -38,7 +38,10 @@ font-size: 18px; font-weight: bold; - .title, .title-no-expanse, .action, .count { + .title, + .title-no-expanse, + .action, + .count { height: 100%; line-height: 40px; padding: 0px; @@ -49,7 +52,9 @@ cursor: not-allowed; } - .title, .action, .count { + .title, + .action, + .count { cursor: pointer; } diff --git a/app/assets/stylesheets/description.scss b/app/assets/stylesheets/description.scss index 66b3f5e9d..24aabdac8 100644 --- a/app/assets/stylesheets/description.scss +++ b/app/assets/stylesheets/description.scss @@ -69,7 +69,10 @@ } } -.type_champ-drop_down_list, .type_champ-regions, .type_champ-departements, .type_champ-pays { +.type_champ-drop_down_list, +.type_champ-regions, +.type_champ-departements, +.type_champ-pays { @extend .col-md-4; @extend .col-lg-4; diff --git a/app/assets/stylesheets/dossier_show.scss b/app/assets/stylesheets/dossier_show.scss index b453da366..d7c77f88e 100644 --- a/app/assets/stylesheets/dossier_show.scss +++ b/app/assets/stylesheets/dossier_show.scss @@ -1,11 +1,13 @@ -#backoffice_dossier_show, #users_recapitulatif_dossier_show { +#backoffice_dossier_show, +#users_recapitulatif_dossier_show { #messages { .last-commentaire { display: block; background-color: #FFFFFF; - .content, .new-action { + .content, + .new-action { margin-bottom: 20px; } } @@ -24,7 +26,8 @@ } } - .last-commentaire, .commentaire { + .last-commentaire, + .commentaire { padding: 20px 0 0 20px; .comment-header { @@ -103,7 +106,11 @@ } } - #dossier, #pieces-jointes, .infos, #carto, #private-fields { + #dossier, + #pieces-jointes, + .infos, + #carto, + #private-fields { .body { padding: 20px 20px 0 20px; color: #000000; @@ -131,7 +138,8 @@ margin: 50px 0 0 15px; } - .action, .btn-action { + .action, + .btn-action { background-color: #E45B51; text-align: center; cursor: pointer; diff --git a/app/assets/stylesheets/dossiers.scss b/app/assets/stylesheets/dossiers.scss index 3793159f2..c0a817739 100644 --- a/app/assets/stylesheets/dossiers.scss +++ b/app/assets/stylesheets/dossiers.scss @@ -42,20 +42,24 @@ h5 span { cursor: pointer; } -#procedure_list, #notifications_list { +#procedure_list, +#notifications_list { margin-left: -10px; margin-top: 20px; - a, a:hover { + a, + a:hover { color: #FFFFFF; text-decoration: none; } - .procedure_list_element.active, .notification.active { + .procedure_list_element.active, + .notification.active { background-color: #668ABD; } - .procedure_list_element, .notification { + .procedure_list_element, + .notification { padding: 15px 40px 15px 20px; cursor: pointer; line-height: 1.8em; @@ -65,7 +69,8 @@ h5 span { } } - .procedure_list_element:hover, .notification:hover { + .procedure_list_element:hover, + .notification:hover { background-color: #668ABD; cursor: pointer; } diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index a36884f41..767ffec5c 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -54,7 +54,8 @@ width: 40%; } - #etapes, #request_access { + #etapes, + #request_access { margin-top: 20px; margin-bottom: 20px; } diff --git a/app/assets/stylesheets/left_panel.scss b/app/assets/stylesheets/left_panel.scss index df1816f05..8d17f86a7 100644 --- a/app/assets/stylesheets/left_panel.scss +++ b/app/assets/stylesheets/left_panel.scss @@ -43,7 +43,8 @@ margin: 0 0 0 8px; } - .dossiers-en-cours, .en-cours { + .dossiers-en-cours, + .en-cours { margin-top: 20px; } @@ -65,7 +66,10 @@ } } - .dossiers-en-cours, .nouveaux-dossiers, .nouvelles-notifications, .en-cours { + .dossiers-en-cours, + .nouveaux-dossiers, + .nouvelles-notifications, + .en-cours { margin: 5px auto 0 20px; width: 150px; } @@ -90,7 +94,9 @@ width: 100%; } - .close-dossier, .refuse-dossier, .forget-dossier { + .close-dossier, + .refuse-dossier, + .forget-dossier { border: 1px solid #FFFFFF; border-radius: 25px; margin: 5px; @@ -99,7 +105,9 @@ width: 60px; } - .close-dossier:hover, .refuse-dossier:hover, .forget-dossier:hover { + .close-dossier:hover, + .refuse-dossier:hover, + .forget-dossier:hover { color: #000000; border-color: #000000; } @@ -143,7 +151,8 @@ background-color: #FFFFFF; } - #switch-procedures:hover, #switch-notifications:hover { + #switch-procedures:hover, + #switch-notifications:hover { background-color: #668AEA; } @@ -197,14 +206,17 @@ .notification { padding: 10px 2px 10px 15px; - .dossier, .updated-at { + .dossier, + .updated-at { display: inline-block; color: #CCCCCC; font-size: 12px; text-align: left; } - .dossier-index, .updated-at-index, .count { + .dossier-index, + .updated-at-index, + .count { display: inline-block; color: #FFFFFF; font-size: 14px; diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index 72f6aa02c..455d5eb5a 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -207,7 +207,8 @@ color: $light-blue; } -.button_navbar:hover, .button-navbar-action:hover { +.button_navbar:hover, +.button-navbar-action:hover { text-decoration: none; } diff --git a/app/assets/stylesheets/print.scss b/app/assets/stylesheets/print.scss index acae37478..51fe5ca57 100644 --- a/app/assets/stylesheets/print.scss +++ b/app/assets/stylesheets/print.scss @@ -1,5 +1,6 @@ @media print { - html, body { + html, + body { margin: 0; } diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss index 4e94a6e28..e4988dbb3 100644 --- a/app/assets/stylesheets/users.scss +++ b/app/assets/stylesheets/users.scss @@ -1,6 +1,7 @@ @import "variables"; -#users_index, #admins_index { +#users_index, +#admins_index { margin-left: 2rem; margin-right: 2rem; @@ -34,7 +35,10 @@ } } -.white-back, #users_siret_index, #description_page, #carto_page { +.white-back, +#users_siret_index, +#description_page, +#carto_page { background-color: #FFFFFF; box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5); padding: 20px; From 0316bac137da78939e82af88335f4805c7b60c17 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:52:14 +0200 Subject: [PATCH 048/102] Use double-quoted strings --- app/assets/stylesheets/carte.scss | 4 ++-- app/assets/stylesheets/landing.scss | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index 968b53e2f..de89ef3ee 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -29,7 +29,7 @@ } .leaflet-container path { - cursor: url('/assets/edit.png'), default !important; + cursor: url("/assets/edit.png"), default !important; } #infos_dossier { @@ -51,7 +51,7 @@ } #map.mode-create { - cursor: url('/assets/pencil.png'), crosshair !important; + cursor: url("/assets/pencil.png"), crosshair !important; } #map g path.tracer { diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 767ffec5c..19acc16b2 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -3,7 +3,7 @@ } #landing { - background-image: image-url('landing_background.png'); + background-image: image-url("landing_background.png"); background-attachment: fixed; background-size: 130% auto; background-position: top center; From e2bd606e494fb3e569dab5b09a6ac0a024449aa7 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 10:53:00 +0200 Subject: [PATCH 049/102] Declarations must be terminated by a semicolon --- app/assets/stylesheets/admin_procedures_modal.scss | 4 ++-- app/assets/stylesheets/application.scss | 2 +- app/assets/stylesheets/description.scss | 2 +- app/assets/stylesheets/dossiers.scss | 2 +- app/assets/stylesheets/landing.scss | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/admin_procedures_modal.scss b/app/assets/stylesheets/admin_procedures_modal.scss index 0f6180a0d..901d68c27 100644 --- a/app/assets/stylesheets/admin_procedures_modal.scss +++ b/app/assets/stylesheets/admin_procedures_modal.scss @@ -1,10 +1,10 @@ .path_mine_false { - color: #FF0000 + color: #FF0000; } #path_messages { .message { - display: none + display: none; } } diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 645c0c2a3..2f56b4d44 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -96,7 +96,7 @@ form { } .text-purple { - color: #8B008B + color: #8B008B; } .text-default { diff --git a/app/assets/stylesheets/description.scss b/app/assets/stylesheets/description.scss index 24aabdac8..5eea3b4c7 100644 --- a/app/assets/stylesheets/description.scss +++ b/app/assets/stylesheets/description.scss @@ -25,7 +25,7 @@ .input-error { color: #8B0000 !important; - border-color: #8B0000 !important + border-color: #8B0000 !important; } .type_champ-text { diff --git a/app/assets/stylesheets/dossiers.scss b/app/assets/stylesheets/dossiers.scss index c0a817739..10a5ebed2 100644 --- a/app/assets/stylesheets/dossiers.scss +++ b/app/assets/stylesheets/dossiers.scss @@ -3,7 +3,7 @@ // You can use Sass (SCSS) here: http://sass-lang.com/ h5 span { - font-weight: normal + font-weight: normal; } #insee_infogreffe { diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 19acc16b2..b9960d22a 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -39,7 +39,7 @@ } .latest_release { - margin-left: 1% + margin-left: 1%; } #landing_body { From c32a2432c73d43193cb4c7183366041d45718053 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 11:00:25 +0200 Subject: [PATCH 050/102] =?UTF-8?q?Don=E2=80=99t=20use=20vendor=20prefixes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/stylesheets/carte.scss | 2 -- app/assets/stylesheets/typeahead.scss | 4 ---- 2 files changed, 6 deletions(-) diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index de89ef3ee..7f492169a 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -63,7 +63,6 @@ z-index: 1001; fill: #D7217E; fill-opacity: 0.75; - -webkit-filter: none; } #map.mode-delete path { @@ -75,7 +74,6 @@ } #map div.polygon-elbow { - -webkit-transition: opacity 0.25s; box-shadow: 0 0 0 2px #FFFFFF, 0 0 10px rgba(0, 0, 0, 0.35); border: 5px solid #D7217E; border-radius: 10px; diff --git a/app/assets/stylesheets/typeahead.scss b/app/assets/stylesheets/typeahead.scss index 61ba54b83..1c6d87816 100644 --- a/app/assets/stylesheets/typeahead.scss +++ b/app/assets/stylesheets/typeahead.scss @@ -6,11 +6,7 @@ padding: 8px 0; background-color: #FFFFFF; border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 8px; - -moz-border-radius: 8px; border-radius: 8px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } From 73caee0ff3f4019298c145e985ce1c36a9ebb191 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 11:11:42 +0200 Subject: [PATCH 051/102] Remove unused declarations --- app/assets/stylesheets/admin_index.scss | 22 ---------------------- app/assets/stylesheets/application.scss | 11 ----------- app/assets/stylesheets/backoffice.scss | 7 ------- app/assets/stylesheets/dossiers.scss | 6 ------ app/assets/stylesheets/landing.scss | 4 ---- app/assets/stylesheets/navbar.scss | 5 ----- app/assets/stylesheets/pref_list_menu.scss | 5 ----- app/assets/stylesheets/print.scss | 13 ------------- app/assets/stylesheets/ul.scss | 14 -------------- 9 files changed, 87 deletions(-) delete mode 100644 app/assets/stylesheets/admin_index.scss delete mode 100644 app/assets/stylesheets/ul.scss diff --git a/app/assets/stylesheets/admin_index.scss b/app/assets/stylesheets/admin_index.scss deleted file mode 100644 index fe6c3d73c..000000000 --- a/app/assets/stylesheets/admin_index.scss +++ /dev/null @@ -1,22 +0,0 @@ -#admin_index { - margin-left: 2em; - margin-right: 2em; - - .table { - #id { - width: 5%; - } - - #libelle { - width: 40%; - } - - #organisation { - width: 28%; - } - - #direction { - width: 22%; - } - } -} diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 2f56b4d44..3646321b5 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -88,13 +88,6 @@ form { background-color: #B00100 !important; } -.staging_warning { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); -} - .text-purple { color: #8B008B; } @@ -148,10 +141,6 @@ textarea#description { width: 100%; } -.logo_fc_small { - max-width: 27px; -} - div.pagination { padding-top: 20px; display: block; diff --git a/app/assets/stylesheets/backoffice.scss b/app/assets/stylesheets/backoffice.scss index 3aa7b1b80..503233dcd 100644 --- a/app/assets/stylesheets/backoffice.scss +++ b/app/assets/stylesheets/backoffice.scss @@ -22,13 +22,6 @@ } } -#pref_list { - .dropdown-menu { - padding: 10px; - width: 500px; - } -} - #onglets { ul { li, diff --git a/app/assets/stylesheets/dossiers.scss b/app/assets/stylesheets/dossiers.scss index 10a5ebed2..755323661 100644 --- a/app/assets/stylesheets/dossiers.scss +++ b/app/assets/stylesheets/dossiers.scss @@ -23,12 +23,6 @@ h5 span { } } -#recap_dossier { - #validate_button { - float: right; - } -} - #dossiers_list { .filter { cursor: pointer; diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index b9960d22a..703464480 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -38,10 +38,6 @@ color: #FFFFFF; } -.latest_release { - margin-left: 1%; -} - #landing_body { .split-hr-left { margin-left: auto; diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index 455d5eb5a..88cd3dbcd 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -159,11 +159,6 @@ .navbar { border: 0 !important; - - .sign_in_FC { - margin-top: -18px; - height: 70px; - } } #beta { diff --git a/app/assets/stylesheets/pref_list_menu.scss b/app/assets/stylesheets/pref_list_menu.scss index 84dee03a5..d087da79c 100644 --- a/app/assets/stylesheets/pref_list_menu.scss +++ b/app/assets/stylesheets/pref_list_menu.scss @@ -13,8 +13,3 @@ padding: 15px; overflow-y: scroll; } - -.open_pref_list { - right: 0 !important; - display: block !important; -} diff --git a/app/assets/stylesheets/print.scss b/app/assets/stylesheets/print.scss index 51fe5ca57..583676e89 100644 --- a/app/assets/stylesheets/print.scss +++ b/app/assets/stylesheets/print.scss @@ -4,19 +4,6 @@ margin: 0; } - #main_div { - margin-left: 50px; - margin-right: 0; - } - - #commentaire_new { - display: none; - } - - #commentaires_flux { - margin-top: -50px; - } - #infos_dossier .row:last-child { display: none; } diff --git a/app/assets/stylesheets/ul.scss b/app/assets/stylesheets/ul.scss deleted file mode 100644 index 25f26e3a5..000000000 --- a/app/assets/stylesheets/ul.scss +++ /dev/null @@ -1,14 +0,0 @@ -.dynamic_ul { - margin-left: 20px; - margin-top: 13%; - - li { - font: 200 20px/1.5 Helvetica, Verdana, sans-serif; - margin-top: 15px; - margin-bottom: 15px; - } - - li:last-child { - border: none; - } -} From c10c2fc31b2ea62c6358baf74271917a65d9846c Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 11:12:05 +0200 Subject: [PATCH 052/102] Selectors must be written in lowercase with hyphens --- app/assets/javascripts/admin.js | 12 +++---- .../javascripts/admin_procedures_modal.js | 16 ++++----- app/assets/javascripts/carte/carte.js | 4 +-- .../javascripts/channels/notifications.js | 6 ++-- app/assets/javascripts/default_data_block.js | 12 +++---- app/assets/javascripts/dossiers.js | 16 ++++----- app/assets/javascripts/dossiers_list_link.js | 2 +- .../javascripts/gestionnaire_dossier_modal.js | 8 ++--- app/assets/javascripts/pref_list_dossier.js | 18 +++++----- app/assets/javascripts/procedure.js | 16 ++++----- app/assets/javascripts/search.js | 18 +++++----- .../stylesheets/admin_procedures_modal.scss | 6 ++-- .../stylesheets/admin_type_de_champ.scss | 8 ++--- app/assets/stylesheets/application.scss | 4 +-- app/assets/stylesheets/backoffice.scss | 6 ++-- app/assets/stylesheets/carte.scss | 6 ++-- .../stylesheets/default_data_block.scss | 2 +- app/assets/stylesheets/description.scss | 34 +++++++++---------- app/assets/stylesheets/dossier_show.scss | 6 ++-- app/assets/stylesheets/dossiers.scss | 16 ++++----- app/assets/stylesheets/etapes.scss | 8 ++--- .../france_connect_particulier.scss | 2 +- app/assets/stylesheets/landing.scss | 4 +-- app/assets/stylesheets/left_panel.scss | 2 +- app/assets/stylesheets/login.scss | 6 ++-- app/assets/stylesheets/navbar.scss | 12 +++---- .../stylesheets/notification_alert.scss | 2 +- .../pieces_justificatives_fields.scss | 2 +- app/assets/stylesheets/pj_modal.scss | 4 +-- app/assets/stylesheets/pref_list_menu.scss | 2 +- app/assets/stylesheets/print.scss | 6 ++-- app/assets/stylesheets/procedure.scss | 6 ++-- app/assets/stylesheets/recapitulatif.scss | 2 +- app/assets/stylesheets/search.scss | 4 +-- app/assets/stylesheets/siret.scss | 2 +- .../stylesheets/support_navigator_banner.scss | 2 +- app/assets/stylesheets/switch_menu.scss | 2 +- app/assets/stylesheets/users.scss | 16 ++++----- .../accompagnateurs/_list_assign.html.haml | 2 +- .../_list_not_assign.html.haml | 2 +- app/views/admin/gestionnaires/_list.html.haml | 2 +- .../pieces_justificatives/_fields.html.haml | 2 +- .../admin/pieces_justificatives/show.js.erb | 2 +- .../admin/procedures/_informations.html.haml | 6 ++-- app/views/admin/procedures/_list.html.haml | 2 +- .../admin/procedures/_modal_publish.html.haml | 6 ++-- app/views/admin/procedures/index.html.haml | 4 +-- app/views/admin/procedures/show.html.haml | 6 ++-- .../admin/types_de_champ/_fields.html.haml | 6 ++-- app/views/admin/types_de_champ/show.html.haml | 2 +- app/views/admin/types_de_champ/show.js.erb | 6 ++-- .../administrateurs/sessions/new.html.haml | 4 +-- app/views/backoffice/dossiers/_list.html.haml | 2 +- .../backoffice/dossiers/_pref_list.html.haml | 2 +- .../backoffice/dossiers/_pref_list.js.erb | 2 +- .../dossiers/formulaire_private.js.erb | 2 +- app/views/backoffice/dossiers/index.html.haml | 12 +++---- .../backoffice/dossiers/search.html.haml | 6 ++-- app/views/backoffice/dossiers/show.html.haml | 2 +- app/views/dossiers/_dossier_show.html.haml | 12 +++---- .../dossiers/_download_dossiers.html.haml | 2 +- .../dossiers/_edit_pieces_jointes.html.haml | 2 +- app/views/dossiers/_infos_dossier.html.haml | 16 ++++----- .../dossiers/_infos_pieces_jointes.html.haml | 6 ++-- app/views/dossiers/_messagerie.html.haml | 2 +- .../dossiers/_pieces_justificatives.html.haml | 6 ++-- app/views/dossiers/_show.html.haml | 4 +-- app/views/dossiers/add_siret.js.erb | 6 ++-- app/views/dossiers/etapes/_etape1.html.haml | 4 +-- app/views/dossiers/etapes/_etape3.html.haml | 4 +-- app/views/dossiers/etapes/_etape4.html.haml | 4 +-- .../etapes/etape_2/_entreprise.html.haml | 10 +++--- .../etapes/etape_2/_individual.html.haml | 2 +- app/views/dossiers/new_siret.js.erb | 6 ++-- .../particulier/check_email.html.haml | 2 +- .../france_connect/particulier/new.html.haml | 2 +- .../gestionnaires/passwords/edit.html.haml | 4 +-- .../gestionnaires/passwords/new.html.haml | 4 +-- .../gestionnaires/sessions/new.html.haml | 4 +-- app/views/layouts/_navbar.html.haml | 2 +- .../layouts/_notifications_alert.html.haml | 2 +- .../_support_navigator_banner.html.haml | 2 +- .../_switch_devise_profile_module.html.haml | 2 +- app/views/layouts/application.html.haml | 4 +-- ...admin_procedurescontroller_index.html.haml | 8 ++--- ...dmin_procedurescontroller_navbar.html.haml | 18 +++++----- ...koffice_dossierscontroller_index.html.haml | 6 ++-- .../_left_panel_cgucontroller_index.html.haml | 30 ++++++++-------- ...l_users_dossierscontroller_index.html.haml | 12 +++---- .../left_panels/_search_area.html.haml | 4 +-- ...ssiers_procedurecontroller_index.html.haml | 2 +- .../navbars/_navbar_log_options.html.haml | 8 ++--- app/views/root/landing.html.haml | 4 +-- app/views/users/carte/_map.html.haml | 2 +- app/views/users/carte/show.html.haml | 4 +-- app/views/users/description/_champs.html.haml | 2 +- app/views/users/description/_show.html.haml | 4 +-- .../champs/_header_section.html.haml | 2 +- app/views/users/dossiers/_list.html.haml | 2 +- .../users/dossiers/add_siret/show.html.haml | 2 +- app/views/users/dossiers/index.html.haml | 4 +-- app/views/users/passwords/edit.html.haml | 4 +-- app/views/users/passwords/new.html.haml | 4 +-- .../recapitulatif/_modal_upload_pj.html.haml | 2 +- app/views/users/recapitulatif/show.html.haml | 2 +- app/views/users/registrations/new.html.haml | 4 +-- .../sessions/_resume_procedure.html.haml | 2 +- app/views/users/sessions/new.html.haml | 21 ++++++------ app/views/users/siret/_pro.html.haml | 2 +- app/views/users/siret/index.html.haml | 2 +- spec/features/admin/connection_spec.rb | 8 ++--- spec/features/backoffice/connection_spec.rb | 2 +- .../backoffice/index_show_procedure_spec.rb | 14 ++++---- ..._page_pref_list_dossier_backoffice_spec.rb | 12 +++---- ...st_dossier_by_procedure_backoffice_spec.rb | 12 +++---- .../backoffice/navigate_to_dossier_spec.rb | 4 +-- spec/features/backoffice/search_file_spec.rb | 4 +-- .../upload_piece_justificative_spec.rb | 4 +-- .../france_connect_particulier_spec.rb | 10 +++--- spec/features/users/complete_demande_spec.rb | 18 +++++----- spec/features/users/dossier_creation_spec.rb | 6 ++-- spec/features/users/dossier_edition_spec.rb | 2 +- spec/features/users/dossier_index_spec.rb | 20 +++++------ .../drawing_a_zone_with_freedraw_spec.rb | 6 ++-- spec/features/users/list_dossiers_spec.rb | 4 +-- spec/features/users/onglets_link_spec.rb | 8 ++--- spec/features/users/start_demande_spec.rb | 8 ++--- .../dossiers/show.html.html_spec.rb | 4 +-- .../recapitulatif/show.html.haml_spec.rb | 4 +-- .../users/sessions/new.html.haml_spec.rb | 6 ++-- .../views/users/siret/index.html.haml_spec.rb | 2 +- 131 files changed, 405 insertions(+), 404 deletions(-) diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js index 435a42006..5284d467d 100644 --- a/app/assets/javascripts/admin.js +++ b/app/assets/javascripts/admin.js @@ -16,27 +16,27 @@ function destroy_action(){ $(this).closest('td').find(".confirm").hide(); }); - $("#liste_gestionnaire #libelle").on('click', function(){ + $("#liste-gestionnaire #libelle").on('click', function(){ setTimeout(destroy_action, 500); }); } function on_change_type_de_champ_select (){ - $("select.form-control.type_champ").on('change', function(e){ + $("select.form-control.type-champ").on('change', function(e){ parent = $(this).parent().parent(); - parent.removeClass('header_section'); - parent.children(".drop_down_list").removeClass('show_inline'); + parent.removeClass('header-section'); + parent.children(".drop-down-list").removeClass('show-inline'); $('.mandatory', parent).show(); switch(this.value){ case 'header_section': - parent.addClass('header_section'); + parent.addClass('header-section'); break; case 'drop_down_list': case 'multiple_drop_down_list': - parent.children(".drop_down_list").addClass('show_inline'); + parent.children(".drop-down-list").addClass('show-inline'); break; case 'explication': $('.mandatory', parent).hide(); diff --git a/app/assets/javascripts/admin_procedures_modal.js b/app/assets/javascripts/admin_procedures_modal.js index b5059bf29..342cc64f5 100644 --- a/app/assets/javascripts/admin_procedures_modal.js +++ b/app/assets/javascripts/admin_procedures_modal.js @@ -8,16 +8,16 @@ function init_path_modal() { } function path_modal_action() { - $('#publishModal').on('show.bs.modal', function (event) { - $("#publishModal .modal-body .table .tr_content").hide(); + $('#publish-modal').on('show.bs.modal', function (event) { + $("#publish-modal .modal-body .table .tr-content").hide(); var button = $(event.relatedTarget) // Button that triggered the modal var modal_title = button.data('modal_title'); // Extract info from data-* attributes var modal_index = button.data('modal_index'); // Extract info from data-* attributes var modal = $(this) - modal.find('#publishModal_title').html(modal_title); - $("#publishModal .modal-body .table #"+modal_index).show(); + modal.find('#publish-modal-title').html(modal_title); + $("#publish-modal .modal-body .table #"+modal_index).show(); }) } @@ -29,7 +29,7 @@ function path_validation_action() { } function togglePathMessage(valid, mine) { - $('#path_messages .message').hide(); + $('#path-messages .message').hide(); if (valid === true && mine === true) { $('#path_is_mine').show(); @@ -40,9 +40,9 @@ function togglePathMessage(valid, mine) { } if ((valid && mine === null) || mine === true) - $('#publishModal #publish').removeAttr('disabled') + $('#publish-modal #publish').removeAttr('disabled') else - $('#publishModal #publish').attr('disabled', 'disabled') + $('#publish-modal #publish').attr('disabled', 'disabled') } function path_validation(el) { @@ -77,7 +77,7 @@ function path_type_init() { source: bloodhound, templates: { empty: 'Ce lien est disponible !', - suggestion: Handlebars.compile("
    {{label}}
    ") + suggestion: Handlebars.compile("
    {{label}}
    ") }, limit: 5 }); diff --git a/app/assets/javascripts/carte/carte.js b/app/assets/javascripts/carte/carte.js index 6966e3791..5ce16d28f 100644 --- a/app/assets/javascripts/carte/carte.js +++ b/app/assets/javascripts/carte/carte.js @@ -152,11 +152,11 @@ function jsObject_to_array(qp_list) { } function add_event_search_address() { - $("#search_by_address input[type='address']").bind('typeahead:select', function (ev, seggestion) { + $("#search-by-address input[type='address']").bind('typeahead:select', function (ev, seggestion) { get_address_point(seggestion['label']); }); - $("#search_by_address input[type='address']").keypress(function (e) { + $("#search-by-address input[type='address']").keypress(function (e) { if (e.keyCode == 13) get_address_point($(this).val()); }); diff --git a/app/assets/javascripts/channels/notifications.js b/app/assets/javascripts/channels/notifications.js index 7a76c26b6..f1f2d519d 100644 --- a/app/assets/javascripts/channels/notifications.js +++ b/app/assets/javascripts/channels/notifications.js @@ -1,7 +1,7 @@ //App.messages = App.cable.subscriptions.create('NotificationsChannel', { // received: function (data) { // if (window.location.href.indexOf('backoffice') !== -1) { -// $("#notification_alert").html(data['message']); +// $("#notification-alert").html(data['message']); // // slideIn_notification_alert(); // } @@ -9,7 +9,7 @@ //}); function slideIn_notification_alert (){ - $("#notification_alert").animate({ + $("#notification-alert").animate({ right: '20px' }, 250); @@ -17,7 +17,7 @@ function slideIn_notification_alert (){ } function slideOut_notification_alert (){ - $("#notification_alert").animate({ + $("#notification-alert").animate({ right: '-250px' }, 200); } diff --git a/app/assets/javascripts/default_data_block.js b/app/assets/javascripts/default_data_block.js index 107681782..071d07bb0 100644 --- a/app/assets/javascripts/default_data_block.js +++ b/app/assets/javascripts/default_data_block.js @@ -1,20 +1,20 @@ $(document).on('turbolinks:load', init_default_data_block); function init_default_data_block() { - $('.default_data_block #dossier .body').toggle(); - $('.default_data_block #dossier .carret-right').toggle(); - $('.default_data_block #dossier .carret-down').toggle(); + $('.default-data-block #dossier .body').toggle(); + $('.default-data-block #dossier .carret-right').toggle(); + $('.default-data-block #dossier .carret-down').toggle(); - $('.default_data_block .title').click(function () { + $('.default-data-block .title').click(function () { toggle_default_data_bloc(this, 400); }); $('.new-action').click(function () { - var messages_block = $(this).parents().closest('.default_data_block').find('.title') + var messages_block = $(this).parents().closest('.default-data-block').find('.title') toggle_default_data_bloc(messages_block, 400); }); - $('.default_data_block.default_visible').each(function() { + $('.default-data-block.default_visible').each(function() { toggle_default_data_bloc($(this).find('.title'), 0); }); diff --git a/app/assets/javascripts/dossiers.js b/app/assets/javascripts/dossiers.js index 4e0d1836c..401eca7f8 100644 --- a/app/assets/javascripts/dossiers.js +++ b/app/assets/javascripts/dossiers.js @@ -3,14 +3,14 @@ $(document).on('turbolinks:load', pannel_switch); function pannel_switch() { $('#switch-notifications').click(function () { - $('#procedure_list').addClass('hidden'); - $('#notifications_list').removeClass('hidden'); + $('#procedure-list').addClass('hidden'); + $('#notifications-list').removeClass('hidden'); $(this).addClass('active'); $('#switch-procedures').removeClass('active'); }) $('#switch-procedures').click(function () { - $('#notifications_list').addClass('hidden'); - $('#procedure_list').removeClass('hidden'); + $('#notifications-list').addClass('hidden'); + $('#procedure-list').removeClass('hidden'); $(this).addClass('active'); $('#switch-notifications').removeClass('active'); }) @@ -44,16 +44,16 @@ function error_form_siret(invalid_siret) { $("input[type='submit']").removeClass('btn-success').addClass('btn-danger'); - $("#dossier_siret").addClass('input-error').val(invalid_siret).on('input', reset_form_siret); + $("#dossier-siret").addClass('input-error').val(invalid_siret).on('input', reset_form_siret); } function reset_form_siret() { $("input[type='submit']").removeClass('btn-danger').addClass('btn-success').val('Valider'); - $("#dossier_siret").removeClass('input-error'); + $("#dossier-siret").removeClass('input-error'); } function toggle_etape_1() { - $('.row.etape.etape_1 .etapes_menu #logos').toggle(100); - $('.row.etape.etape_1 .etapes_informations #description_procedure').toggle(100); + $('.row.etape.etape_1 .etapes-menu #logos').toggle(100); + $('.row.etape.etape_1 .etapes-informations #description_procedure').toggle(100); } diff --git a/app/assets/javascripts/dossiers_list_link.js b/app/assets/javascripts/dossiers_list_link.js index 147e109a3..cf2d74859 100644 --- a/app/assets/javascripts/dossiers_list_link.js +++ b/app/assets/javascripts/dossiers_list_link.js @@ -1,7 +1,7 @@ $(document).on('turbolinks:load', link_init); function link_init() { - $('#dossiers_list tr').on('click', function () { + $('#dossiers-list tr').on('click', function () { $(location).attr('href', $(this).data('dossier_url')) }); } diff --git a/app/assets/javascripts/gestionnaire_dossier_modal.js b/app/assets/javascripts/gestionnaire_dossier_modal.js index bb02ca501..65ca00dbb 100644 --- a/app/assets/javascripts/gestionnaire_dossier_modal.js +++ b/app/assets/javascripts/gestionnaire_dossier_modal.js @@ -1,15 +1,15 @@ $(document).on('turbolinks:load', modal_action); function modal_action() { - $('#PJmodal').on('show.bs.modal', function (event) { - $("#PJmodal .modal-body .table .tr_content").hide(); + $('#pj-modal').on('show.bs.modal', function (event) { + $("#pj-modal .modal-body .table .tr-content").hide(); var button = $(event.relatedTarget) // Button that triggered the modal var modal_title = button.data('modal_title'); // Extract info from data-* attributes var modal_index = button.data('modal_index'); // Extract info from data-* attributes var modal = $(this) - modal.find('#PJmodal_title').html(modal_title); - $("#PJmodal .modal-body .table #"+modal_index).show(); + modal.find('#pj-modal-title').html(modal_title); + $("#pj-modal .modal-body .table #"+modal_index).show(); }) } diff --git a/app/assets/javascripts/pref_list_dossier.js b/app/assets/javascripts/pref_list_dossier.js index 21e7966df..1e81e3eee 100644 --- a/app/assets/javascripts/pref_list_dossier.js +++ b/app/assets/javascripts/pref_list_dossier.js @@ -6,25 +6,25 @@ function pref_list_dossier_actions() { } function pref_list_dossier_open_action() { - $("#pref_list_dossier_open_action").on('click', function () { - $("#pref_list_menu").css('display', 'block'); - $("#pref_list_menu").css('visibility', 'visible'); + $("#pref-list-dossier-open-action").on('click', function () { + $("#pref-list-menu").css('display', 'block'); + $("#pref-list-menu").css('visibility', 'visible'); - $("#pref_list_menu").animate({ + $("#pref-list-menu").animate({ right: 0 }, 250); }); } function pref_list_dossier_close_action() { - $("#pref_list_dossier_close_action").on('click', function () { - $("#pref_list_menu").animate({ - right: parseInt($("#pref_list_menu").css('width'), 10)*(-1)+'px' + $("#pref-list-dossier-close-action").on('click', function () { + $("#pref-list-menu").animate({ + right: parseInt($("#pref-list-menu").css('width'), 10)*(-1)+'px' },{ duration: 250, complete: function () { - $("#pref_list_menu").css('display', 'none'); - $("#pref_list_menu").css('visibility', 'hidden'); + $("#pref-list-menu").css('display', 'none'); + $("#pref-list-menu").css('visibility', 'hidden'); } } ) diff --git a/app/assets/javascripts/procedure.js b/app/assets/javascripts/procedure.js index d4f89f012..c2bcffb54 100644 --- a/app/assets/javascripts/procedure.js +++ b/app/assets/javascripts/procedure.js @@ -8,30 +8,30 @@ function button_edit_procedure_init(){ function buttons_api_carto () { - $("#procedure_module_api_carto_use_api_carto").on('change', function() { - $("#modules_api_carto").toggle() + $("#procedure-module-api-carto-use-api-carto").on('change', function() { + $("#modules-api-carto").toggle() }); - if ($('#procedure_module_api_carto_use_api_carto').is(':checked')) - $("#modules_api_carto").show(); + if ($('#procedure-module-api-carto-use-api-carto').is(':checked')) + $("#modules-api-carto").show(); } function button_cerfa () { $("#procedure_cerfa_flag").on('change', function() { - $("#procedure_lien_demarche").toggle() + $("#procedure-lien-demarche").toggle() }); if ($('#procedure_cerfa_flag').is(':checked')) - $("#procedure_lien_demarche").show(); + $("#procedure-lien-demarche").show(); } function button_individual () { $("#procedure_for_individual").on('change', function() { - $("#individual_with_siret").toggle() + $("#individual-with-siret").toggle() }); if ($('#procedure_for_individual').is(':checked')) - $("#individual_with_siret").show(); + $("#individual-with-siret").show(); } diff --git a/app/assets/javascripts/search.js b/app/assets/javascripts/search.js index bfbc7aded..eb61ae055 100644 --- a/app/assets/javascripts/search.js +++ b/app/assets/javascripts/search.js @@ -1,11 +1,11 @@ $(document).on('turbolinks:load', init_search_anim); function init_search_anim(){ - $("#search_area").on('click', search_fadeIn); + $("#search-area").on('click', search_fadeIn); } function search_fadeIn(){ - var search_area = $("#search_area"); + var search_area = $("#search-area"); var body_dom = $('body'); var positions = search_area.position(); var width = search_area.width(); @@ -16,10 +16,10 @@ function search_fadeIn(){ search_area.css('z-index', 300); search_area.css('width', width); search_area.find('#q').animate({ height: '50px' }); - search_area.find('#search_button').animate({ height: '50px' }); + search_area.find('#search-button').animate({ height: '50px' }); body_dom.append(search_area); - $('#mask_search').fadeIn(200); + $('#mask-search').fadeIn(200); var body_width = body_dom.width(); @@ -30,16 +30,16 @@ function search_fadeIn(){ left: (body_width/2 - search_area_width/2 + 40) }, 400, function() { search_area.off(); - $("#search_area input").focus(); + $("#search-area input").focus(); - $('#mask_search').on('click', search_fadeOut) + $('#mask-search').on('click', search_fadeOut) }); } function search_fadeOut(){ - var search_area = $("#search_area"); + var search_area = $("#search-area"); - $('#mask_search').fadeOut(200); + $('#mask-search').fadeOut(200); search_area.fadeOut(200, function(){ search_area.css('position', 'static'); @@ -48,7 +48,7 @@ function search_fadeOut(){ search_area.css('z-index', ''); search_area.css('width', 'auto'); search_area.find('#q').css('height', 34); - search_area.find('#search_button').css('height', 34); + search_area.find('#search-button').css('height', 34); $('#search-block').append(search_area); search_area.fadeIn(200); diff --git a/app/assets/stylesheets/admin_procedures_modal.scss b/app/assets/stylesheets/admin_procedures_modal.scss index 901d68c27..6c1cf1497 100644 --- a/app/assets/stylesheets/admin_procedures_modal.scss +++ b/app/assets/stylesheets/admin_procedures_modal.scss @@ -1,14 +1,14 @@ -.path_mine_false { +.path-mine-false { color: #FF0000; } -#path_messages { +#path-messages { .message { display: none; } } -#publishModal { +#publish-modal { .twitter-typeahead { width: 300px; } diff --git a/app/assets/stylesheets/admin_type_de_champ.scss b/app/assets/stylesheets/admin_type_de_champ.scss index 6c8a5ffcb..5fc7aa54b 100644 --- a/app/assets/stylesheets/admin_type_de_champ.scss +++ b/app/assets/stylesheets/admin_type_de_champ.scss @@ -1,4 +1,4 @@ -.header_section { +.header-section { background-color: rgb(0, 49, 137); margin-top: 20px; margin-bottom: 10px; @@ -22,16 +22,16 @@ } } -#liste_champ { +#liste-champ { .form-inline { margin-bottom: 30px; } - .show_inline { + .show-inline { display: inline-block !important; } - .form-group.drop_down_list { + .form-group.drop-down-list { display: none; } diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 3646321b5..135e0a776 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -84,7 +84,7 @@ form { } } -.beta_staging { +.beta-staging { background-color: #B00100 !important; } @@ -151,7 +151,7 @@ div.pagination { margin-bottom: 0px; } -.alert.alert-success.move_up, +.alert.alert-success.move-up, .alert.alert-danger.siret { position: fixed; top: 0px; diff --git a/app/assets/stylesheets/backoffice.scss b/app/assets/stylesheets/backoffice.scss index 503233dcd..cdbe3fa52 100644 --- a/app/assets/stylesheets/backoffice.scss +++ b/app/assets/stylesheets/backoffice.scss @@ -1,9 +1,9 @@ -#backoffice_index, -#backoffice_search { +#backoffice-index, +#backoffice-search { margin-left: 2rem; margin-right: 2rem; - .default_data_block { + .default-data-block { background-color: #FFFFFF; margin-top: 20px; diff --git a/app/assets/stylesheets/carte.scss b/app/assets/stylesheets/carte.scss index 7f492169a..8220729ad 100644 --- a/app/assets/stylesheets/carte.scss +++ b/app/assets/stylesheets/carte.scss @@ -3,7 +3,7 @@ // You can use Sass (SCSS) here: http://sass-lang.com/ @import "bootstrap"; -#carte_page { +#carte-page { #map { margin-left: 15px; width: 90%; @@ -32,7 +32,7 @@ cursor: url("/assets/edit.png"), default !important; } -#infos_dossier { +#infos-dossiers { #map.mini { height: 300px; width: 100%; @@ -120,7 +120,7 @@ color: #777777; } -#search_by_address { +#search-by-address { .twitter-typeahead { width: 555px; } diff --git a/app/assets/stylesheets/default_data_block.scss b/app/assets/stylesheets/default_data_block.scss index 237eaaf17..339af02f8 100644 --- a/app/assets/stylesheets/default_data_block.scss +++ b/app/assets/stylesheets/default_data_block.scss @@ -1,6 +1,6 @@ @import "variables"; -.default_data_block { +.default-data-block { font-family: Arial; .show-block { diff --git a/app/assets/stylesheets/description.scss b/app/assets/stylesheets/description.scss index 5eea3b4c7..6ad2f4339 100644 --- a/app/assets/stylesheets/description.scss +++ b/app/assets/stylesheets/description.scss @@ -1,9 +1,9 @@ @import "bootstrap"; @import "bootstrap-datepicker3"; -#description_page #liste_champs { +#description-page #liste-champs { - .default_data_block { + .default-data-block { .show-block { width: 90%; @@ -28,7 +28,7 @@ border-color: #8B0000 !important; } -.type_champ-text { +.type-champ-text { @extend .col-md-6; @extend .col-lg-6; @@ -37,12 +37,12 @@ } } -.type_champ-header_section { +.type-champ-header-section { @extend .col-md-12; @extend .col-lg-12; } -.type_champ-address { +.type-champ-address { @extend .col-md-6; @extend .col-lg-6; @@ -60,7 +60,7 @@ } } -.type_champ-email { +.type-champ-email { @extend .col-md-4; @extend .col-lg-4; @@ -69,26 +69,26 @@ } } -.type_champ-drop_down_list, -.type_champ-regions, -.type_champ-departements, -.type_champ-pays { +.type-champ-drop-down-list, +.type-champ-regions, +.type-champ-departements, +.type-champ-pays { @extend .col-md-4; @extend .col-lg-4; } -.type_champ-civilite { +.type-champ-civilite { @extend .col-md-3; @extend .col-lg-3; } -.type_champ-yes_no { +.type-champ-yes-no { @extend .col-md-3; @extend .col-lg-3; } -.type_champ-phone { +.type-champ-phone { @extend .col-md-2; @extend .col-lg-2; @@ -102,7 +102,7 @@ text-decoration: underline; } -.type_champ-textarea { +.type-champ-textarea { @extend .col-md-8; @extend .col-lg-8; @@ -112,7 +112,7 @@ } } -.type_champ-number { +.type-champ-number { @extend .col-md-3; @extend .col-lg-3; @@ -121,7 +121,7 @@ } } -.type_champ-date { +.type-champ-date { @extend .col-md-2; @extend .col-lg-2; @@ -130,7 +130,7 @@ } } -.type_champ-datetime { +.type-champ-datetime { @extend .col-md-5; @extend .col-lg-5; diff --git a/app/assets/stylesheets/dossier_show.scss b/app/assets/stylesheets/dossier_show.scss index d7c77f88e..93f8ba5a5 100644 --- a/app/assets/stylesheets/dossier_show.scss +++ b/app/assets/stylesheets/dossier_show.scss @@ -1,5 +1,5 @@ -#backoffice_dossier_show, -#users_recapitulatif_dossier_show { +#backoffice-dossier-show, +#users-recapitulatif-dossier-show { #messages { .last-commentaire { @@ -199,7 +199,7 @@ } } - #pieces_justificatives { + #pieces-justificatives { .piece-row { margin: 0 0 0 0; } diff --git a/app/assets/stylesheets/dossiers.scss b/app/assets/stylesheets/dossiers.scss index 755323661..5a59dd7a8 100644 --- a/app/assets/stylesheets/dossiers.scss +++ b/app/assets/stylesheets/dossiers.scss @@ -6,7 +6,7 @@ h5 span { font-weight: normal; } -#insee_infogreffe { +#insee-infogreffe { font-size: 17px; } @@ -23,7 +23,7 @@ h5 span { } } -#dossiers_list { +#dossiers-list { .filter { cursor: pointer; font-size: 1.1em; @@ -31,13 +31,13 @@ h5 span { } } -#dossiers_list tr:hover { +#dossiers-list tr:hover { background-color: #EEEEEE; cursor: pointer; } -#procedure_list, -#notifications_list { +#procedure-list, +#notifications-list { margin-left: -10px; margin-top: 20px; @@ -47,12 +47,12 @@ h5 span { text-decoration: none; } - .procedure_list_element.active, + .procedure-list-element.active, .notification.active { background-color: #668ABD; } - .procedure_list_element, + .procedure-list-element, .notification { padding: 15px 40px 15px 20px; cursor: pointer; @@ -63,7 +63,7 @@ h5 span { } } - .procedure_list_element:hover, + .procedure-list-element:hover, .notification:hover { background-color: #668ABD; cursor: pointer; diff --git a/app/assets/stylesheets/etapes.scss b/app/assets/stylesheets/etapes.scss index 58ed601f4..2ff84fa6f 100644 --- a/app/assets/stylesheets/etapes.scss +++ b/app/assets/stylesheets/etapes.scss @@ -1,6 +1,6 @@ -.etape_2 { - .etapes_menu { - #dossier_siret { +.etape-2 { + .etapes-menu { + #dossier-siret { width: 200px; } @@ -9,7 +9,7 @@ } } - .etapes_informations { + .etapes-informations { padding-top: 15px; } } diff --git a/app/assets/stylesheets/france_connect_particulier.scss b/app/assets/stylesheets/france_connect_particulier.scss index 03d671366..72025e3a3 100644 --- a/app/assets/stylesheets/france_connect_particulier.scss +++ b/app/assets/stylesheets/france_connect_particulier.scss @@ -1,4 +1,4 @@ -#france_connect_particulier_email { +#france-connect-particulier-email { width: 300px; margin-left: auto; margin-right: auto; diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 703464480..de55f5732 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -38,7 +38,7 @@ color: #FFFFFF; } -#landing_body { +#landing-body { .split-hr-left { margin-left: auto; margin-right: auto; @@ -51,7 +51,7 @@ } #etapes, - #request_access { + #request-access { margin-top: 20px; margin-bottom: 20px; } diff --git a/app/assets/stylesheets/left_panel.scss b/app/assets/stylesheets/left_panel.scss index 8d17f86a7..02658aab1 100644 --- a/app/assets/stylesheets/left_panel.scss +++ b/app/assets/stylesheets/left_panel.scss @@ -198,7 +198,7 @@ margin-right: auto; } - #notifications_list { + #notifications-list { .no-notification { margin: 0 30px 0 30px; } diff --git a/app/assets/stylesheets/login.scss b/app/assets/stylesheets/login.scss index c3d162d47..6be7b6cb3 100644 --- a/app/assets/stylesheets/login.scss +++ b/app/assets/stylesheets/login.scss @@ -1,4 +1,4 @@ -#form_login { +#form-login { text-align: center; max-width: 500px; @@ -7,14 +7,14 @@ padding: 20px; - .btn_fc { + .btn-fc { img { height: 100px; } } - #new_user { + #new-user { width: 80%; margin-left: auto; margin-right: auto; diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index 88cd3dbcd..612532c27 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -9,7 +9,7 @@ border-radius: 0; height: 60px; - #title_navbar { + #title-navbar { color: #FFFFFF; font-weight: bold; font-size: 1.8em; @@ -17,7 +17,7 @@ overflow: hidden; } - #title_navbar:hover { + #title-navbar:hover { text-decoration: none; } @@ -96,7 +96,7 @@ } } - #sign_in { + #sign-in { margin-top: 7px; .btn { @@ -105,7 +105,7 @@ } } - #sign_out { + #sign-out { height: 60px; .fa { @@ -177,7 +177,7 @@ z-index: 10; } -.button_navbar { +.button-navbar { color: #666666; cursor: pointer; } @@ -202,7 +202,7 @@ color: $light-blue; } -.button_navbar:hover, +.button-navbar:hover, .button-navbar-action:hover { text-decoration: none; } diff --git a/app/assets/stylesheets/notification_alert.scss b/app/assets/stylesheets/notification_alert.scss index fbcd63efd..49e7d4893 100644 --- a/app/assets/stylesheets/notification_alert.scss +++ b/app/assets/stylesheets/notification_alert.scss @@ -1,4 +1,4 @@ -#notification_alert { +#notification-alert { position: fixed; top: 20px; right: -250px; diff --git a/app/assets/stylesheets/pieces_justificatives_fields.scss b/app/assets/stylesheets/pieces_justificatives_fields.scss index 12a88199c..7cf6d8719 100644 --- a/app/assets/stylesheets/pieces_justificatives_fields.scss +++ b/app/assets/stylesheets/pieces_justificatives_fields.scss @@ -1,3 +1,3 @@ -.pieces_justificatives_fields { +.pieces-justificatives-fields { .form-inline > .form-group { vertical-align: top; } } diff --git a/app/assets/stylesheets/pj_modal.scss b/app/assets/stylesheets/pj_modal.scss index 4f3ab1c4b..deba37dfc 100644 --- a/app/assets/stylesheets/pj_modal.scss +++ b/app/assets/stylesheets/pj_modal.scss @@ -1,7 +1,7 @@ -#PJmodal { +#pj-modal { .modal-body { .table { - .tr_content { + .tr-content { display: none; } } diff --git a/app/assets/stylesheets/pref_list_menu.scss b/app/assets/stylesheets/pref_list_menu.scss index d087da79c..11920ade8 100644 --- a/app/assets/stylesheets/pref_list_menu.scss +++ b/app/assets/stylesheets/pref_list_menu.scss @@ -1,4 +1,4 @@ -#pref_list_menu { +#pref-list-menu { z-index: 100; display: none; position: fixed; diff --git a/app/assets/stylesheets/print.scss b/app/assets/stylesheets/print.scss index 583676e89..4d0ef86b3 100644 --- a/app/assets/stylesheets/print.scss +++ b/app/assets/stylesheets/print.scss @@ -4,15 +4,15 @@ margin: 0; } - #infos_dossier .row:last-child { + #infos-dossiers .row:last-child { display: none; } - #infos_dossier { + #infos-dossiers { margin-bottom: -70px; } - #backoffice_dossier_show .nav-tabs { + #backoffice-dossier-show .nav-tabs { display: none; } diff --git a/app/assets/stylesheets/procedure.scss b/app/assets/stylesheets/procedure.scss index 2bc5b4e87..b1e5194f5 100644 --- a/app/assets/stylesheets/procedure.scss +++ b/app/assets/stylesheets/procedure.scss @@ -1,12 +1,12 @@ -#modules_api_carto { +#modules-api-carto { display: none; } -#procedure_lien_demarche { +#procedure-lien-demarche { display: none; } -#individual_with_siret { +#individual-with-siret { display: none; } diff --git a/app/assets/stylesheets/recapitulatif.scss b/app/assets/stylesheets/recapitulatif.scss index 7d81a7c46..7a07fbd75 100644 --- a/app/assets/stylesheets/recapitulatif.scss +++ b/app/assets/stylesheets/recapitulatif.scss @@ -1,4 +1,4 @@ -#UploadPJmodal { +#upload-pj-modal { text-align: left; table { diff --git a/app/assets/stylesheets/search.scss b/app/assets/stylesheets/search.scss index af9a8e362..26e91409a 100644 --- a/app/assets/stylesheets/search.scss +++ b/app/assets/stylesheets/search.scss @@ -3,11 +3,11 @@ height: 30px; } -#search_button { +#search-button { height: 34px; } -#mask_search { +#mask-search { display: none; position: fixed; background-color: rgba(0, 0, 0, 0.4); diff --git a/app/assets/stylesheets/siret.scss b/app/assets/stylesheets/siret.scss index c5eac6f02..e5bdf2050 100644 --- a/app/assets/stylesheets/siret.scss +++ b/app/assets/stylesheets/siret.scss @@ -6,7 +6,7 @@ display: none; } -#titre_procedure { +#titre-procedure { margin-top: 3%; margin-bottom: 2%; } diff --git a/app/assets/stylesheets/support_navigator_banner.scss b/app/assets/stylesheets/support_navigator_banner.scss index 9371dd4d2..bfb8a21fe 100644 --- a/app/assets/stylesheets/support_navigator_banner.scss +++ b/app/assets/stylesheets/support_navigator_banner.scss @@ -1,4 +1,4 @@ -#support_navigator_banner { +#support-navigator-banner { position: fixed; text-align: center; line-height: 2em; diff --git a/app/assets/stylesheets/switch_menu.scss b/app/assets/stylesheets/switch_menu.scss index 49fb5289c..e9c18733c 100644 --- a/app/assets/stylesheets/switch_menu.scss +++ b/app/assets/stylesheets/switch_menu.scss @@ -1,4 +1,4 @@ -#switch_menu { +#switch-menu { position: fixed; left: 10px; bottom: 10px; diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss index e4988dbb3..393083a74 100644 --- a/app/assets/stylesheets/users.scss +++ b/app/assets/stylesheets/users.scss @@ -1,11 +1,11 @@ @import "variables"; -#users_index, -#admins_index { +#users-index, +#admins-index { margin-left: 2rem; margin-right: 2rem; - .default_data_block { + .default-data-block { margin-top: 20px; background-color: #FFFFFF; @@ -19,11 +19,11 @@ } } -#users_siret_index { +#users-siret-index { margin: 20px; } -#carto_page { +#carto-page { margin: 20px; } @@ -36,9 +36,9 @@ } .white-back, -#users_siret_index, -#description_page, -#carto_page { +#users-siret-index, +#description-page, +#carto-page { background-color: #FFFFFF; box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5); padding: 20px; diff --git a/app/views/admin/accompagnateurs/_list_assign.html.haml b/app/views/admin/accompagnateurs/_list_assign.html.haml index faeec752d..d685264e4 100644 --- a/app/views/admin/accompagnateurs/_list_assign.html.haml +++ b/app/views/admin/accompagnateurs/_list_assign.html.haml @@ -1,7 +1,7 @@ .row{ style: 'height: 34px;' } - unless smart_listing.empty? - %table.table#liste_gestionnaire + %table.table#liste-gestionnaire %thead %th Enlever %th#email{ style: 'text-align: right;' } Email diff --git a/app/views/admin/accompagnateurs/_list_not_assign.html.haml b/app/views/admin/accompagnateurs/_list_not_assign.html.haml index d016ffe90..d310c1360 100644 --- a/app/views/admin/accompagnateurs/_list_not_assign.html.haml +++ b/app/views/admin/accompagnateurs/_list_not_assign.html.haml @@ -7,7 +7,7 @@ - unless smart_listing.empty? - %table.table#liste_gestionnaire + %table.table#liste-gestionnaire %thead %th#email Email %th Ajouter diff --git a/app/views/admin/gestionnaires/_list.html.haml b/app/views/admin/gestionnaires/_list.html.haml index 259f3c31f..bb93b043e 100644 --- a/app/views/admin/gestionnaires/_list.html.haml +++ b/app/views/admin/gestionnaires/_list.html.haml @@ -1,5 +1,5 @@ - unless smart_listing.empty? - %table.table#liste_gestionnaire + %table.table#liste-gestionnaire %thead %th#libelle= smart_listing.sortable 'Email', 'email' %th diff --git a/app/views/admin/pieces_justificatives/_fields.html.haml b/app/views/admin/pieces_justificatives/_fields.html.haml index 82ec1d409..e51a2676e 100644 --- a/app/views/admin/pieces_justificatives/_fields.html.haml +++ b/app/views/admin/pieces_justificatives/_fields.html.haml @@ -1,4 +1,4 @@ -.pieces_justificatives_fields +.pieces-justificatives-fields = f.fields_for :types_de_piece_justificative, types_de_piece_justificative, remote: true do |ff| .form-inline .form-group diff --git a/app/views/admin/pieces_justificatives/show.js.erb b/app/views/admin/pieces_justificatives/show.js.erb index 094e982cb..34ce0066b 100644 --- a/app/views/admin/pieces_justificatives/show.js.erb +++ b/app/views/admin/pieces_justificatives/show.js.erb @@ -1,4 +1,4 @@ <% flash.each do |type, message| %> -$("#flash_message").html("
    <%= message.html_safe %>
    ").children().fadeOut(5000) +$("#flash_message").html("
    <%= message.html_safe %>
    ").children().fadeOut(5000) <% end %> $('#piece_justificative_form').html("<%= escape_javascript(render partial: 'form', locals: { procedure: @procedure } ) %>"); diff --git a/app/views/admin/procedures/_informations.html.haml b/app/views/admin/procedures/_informations.html.haml index 476b8d250..553457b48 100644 --- a/app/views/admin/procedures/_informations.html.haml +++ b/app/views/admin/procedures/_informations.html.haml @@ -37,10 +37,10 @@ = f.fields_for :module_api_carto, @procedure.module_api_carto do |ff| .checkbox %label - = ff.check_box :use_api_carto, id: :procedure_module_api_carto_use_api_carto + = ff.check_box :use_api_carto, id: "procedure-module-api-carto-use-api-carto" Utilisation de la cartographie - %ul#modules_api_carto + %ul#modules-api-carto %li .checkbox %label @@ -73,7 +73,7 @@ ne possède pas (ou pas encore) de numéro SIRET, qui doivent donc s'identifier en tant que personne physique. - %ul#individual_with_siret + %ul#individual-with-siret %li .checkbox %label diff --git a/app/views/admin/procedures/_list.html.haml b/app/views/admin/procedures/_list.html.haml index cc2f21c65..5cf85a729 100644 --- a/app/views/admin/procedures/_list.html.haml +++ b/app/views/admin/procedures/_list.html.haml @@ -1,5 +1,5 @@ - unless smart_listing.empty? - %table.table#dossiers_list + %table.table#dossiers-list %thead %th#ID= smart_listing.sortable 'ID', 'id' %th#libelle= smart_listing.sortable 'Libellé', 'libelle' diff --git a/app/views/admin/procedures/_modal_publish.html.haml b/app/views/admin/procedures/_modal_publish.html.haml index 2619ca5e5..b5c282d34 100644 --- a/app/views/admin/procedures/_modal_publish.html.haml +++ b/app/views/admin/procedures/_modal_publish.html.haml @@ -1,4 +1,4 @@ -#publishModal.modal.fade{ "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1" } +#publish-modal.modal.fade{ "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1" } .modal-dialog.modal-lg{ :role => "document" } = form_tag admin_procedure_publish_path(procedure_id: @procedure.id), method: :put, remote: true do .modal-content @@ -8,7 +8,7 @@ %h4#myModalLabel.modal-title = @procedure.archived? ? 'Réactiver' : 'Publier' la procédure - %span#publishModal_title + %span#publish-modal-title .modal-body Vous vous apprêtez à = @procedure.archived? ? 'republier' : 'publier' @@ -30,7 +30,7 @@ class: 'form-control', maxlength: 30, style: 'width: 300px; display: inline;') - #path_messages + #path-messages #path_is_mine.text-warning.center.message Ce lien est déjà utilisé par une de vos procédure. %br diff --git a/app/views/admin/procedures/index.html.haml b/app/views/admin/procedures/index.html.haml index 570a8cb9b..7b2e1370c 100644 --- a/app/views/admin/procedures/index.html.haml +++ b/app/views/admin/procedures/index.html.haml @@ -1,5 +1,5 @@ -#admins_index - .default_data_block.default_visible +#admins-index + .default-data-block.default_visible .row.show-block#new_dossiers .header .col-lg-10.col-md-10.col-sm-10.col-xs-10.title diff --git a/app/views/admin/procedures/show.html.haml b/app/views/admin/procedures/show.html.haml index 3913a4235..79d3090d9 100644 --- a/app/views/admin/procedures/show.html.haml +++ b/app/views/admin/procedures/show.html.haml @@ -6,7 +6,7 @@ %i.fa.fa-eraser Publier - else - %a.btn.btn-success{ "data-target" => "#publishModal", "data-toggle" => "modal", :type => "button", style: 'float: right; margin-top: 10px;', id: 'publish-procedure' } + %a.btn.btn-success{ "data-target" => "#publish-modal", "data-toggle" => "modal", :type => "button", style: 'float: right; margin-top: 10px;', id: 'publish-procedure' } %i.fa.fa-eraser Publier @@ -19,7 +19,7 @@ = render partial: '/admin/procedures/modal_transfer' - if @facade.procedure.archived? - %a#reenable.btn.btn-small.btn-default.text-info{ "data-target" => "#publishModal", "data-toggle" => "modal", :type => "button", style: 'float: right; margin-top: 10px;' } + %a#reenable.btn.btn-small.btn-default.text-info{ "data-target" => "#publish-modal", "data-toggle" => "modal", :type => "button", style: 'float: right; margin-top: 10px;' } %i.fa.fa-eraser Réactiver @@ -80,7 +80,7 @@ - @facade.procedure.types_de_champ_private.order(:order_place).each do |champ| %li= champ.libelle - .pieces_justificatives.col-xs-6.col-md-3 + .pieces-justificatives.col-xs-6.col-md-3 %h4.text-info Pièces jointes .badge.progress-bar-info diff --git a/app/views/admin/types_de_champ/_fields.html.haml b/app/views/admin/types_de_champ/_fields.html.haml index 3e84b68d7..aaf0a5ea6 100644 --- a/app/views/admin/types_de_champ/_fields.html.haml +++ b/app/views/admin/types_de_champ/_fields.html.haml @@ -1,20 +1,20 @@ = f.fields_for @types_de_champ_facade.fields_for_var, types_de_champ, remote: true do |ff| - type_champ = ff.object.object.type_champ - .form-inline{ class: (type_champ == 'header_section' ? 'header_section' : nil) } + .form-inline{ class: (type_champ == 'header_section' ? 'header-section' : nil) } .form-group.libelle %h4 Libellé = ff.text_field :libelle, class: 'form-control libelle', placeholder: 'Libellé' .form-group.type %h4 Type - = ff.select :type_champ, TypeDeChamp.type_de_champs_list_fr, {}, { class: 'form-control type_champ' } + = ff.select :type_champ, TypeDeChamp.type_de_champs_list_fr, {}, { class: 'form-control type-champ' } .form-group.description %h4 Description = ff.text_area :description, class: 'form-control description', placeholder: 'Description', rows: 3 - .form-group.drop_down_list{ class: (%w(drop_down_list multiple_drop_down_list).include?(type_champ) ? 'show_inline' : nil), style: 'margin-right: 5px;' } + .form-group.drop-down-list{ class: (%w(drop_down_list multiple_drop_down_list).include?(type_champ) ? 'show-inline' : nil), style: 'margin-right: 5px;' } %h4 Liste déroulante = ff.fields_for :drop_down_list_attributes, ff.object.object.drop_down_list do |fff| ~ fff.text_area :value, class: 'form-control drop_down_list', placeholder: "Ecrire une valeur par ligne et --valeur-- pour un séparateur.", rows: 3, cols: 30 diff --git a/app/views/admin/types_de_champ/show.html.haml b/app/views/admin/types_de_champ/show.html.haml index 1ec8b0871..6b3522fa1 100644 --- a/app/views/admin/types_de_champ/show.html.haml +++ b/app/views/admin/types_de_champ/show.html.haml @@ -1,3 +1,3 @@ .row.white-back - #liste_champ + #liste-champ = render partial: 'admin/types_de_champ/form' diff --git a/app/views/admin/types_de_champ/show.js.erb b/app/views/admin/types_de_champ/show.js.erb index 1406b46c8..1e156d1bb 100644 --- a/app/views/admin/types_de_champ/show.js.erb +++ b/app/views/admin/types_de_champ/show.js.erb @@ -1,5 +1,5 @@ <% flash.each do |type, message| %> -$("#flash_message").html("
    <%= message.html_safe %>
    ").children().fadeOut(5000) +$("#flash_message").html("
    <%= message.html_safe %>
    ").children().fadeOut(5000) <% end %> -$('#liste_champ').html("<%= escape_javascript(render partial: 'admin/types_de_champ/form', locals: { procedure: @procedure, types_de_champ: @types_de_champ } ) %>"); -on_change_type_de_champ_select (); \ No newline at end of file +$('#liste-champ').html("<%= escape_javascript(render partial: 'admin/types_de_champ/form', locals: { procedure: @procedure, types_de_champ: @types_de_champ } ) %>"); +on_change_type_de_champ_select (); diff --git a/app/views/administrateurs/sessions/new.html.haml b/app/views/administrateurs/sessions/new.html.haml index 7ebe37ba9..1a480db6f 100644 --- a/app/views/administrateurs/sessions/new.html.haml +++ b/app/views/administrateurs/sessions/new.html.haml @@ -1,4 +1,4 @@ -#form_login +#form-login %br = image_tag(image_url(LOGO_NAME)) %br @@ -7,7 +7,7 @@ %br %br - #new_user + #new-user = form_for @administrateur, url: { controller: 'administrateurs/sessions', action: :create } do |f| %h4 = f.label :email diff --git a/app/views/backoffice/dossiers/_list.html.haml b/app/views/backoffice/dossiers/_list.html.haml index 1aebea3ba..3316aa0c8 100644 --- a/app/views/backoffice/dossiers/_list.html.haml +++ b/app/views/backoffice/dossiers/_list.html.haml @@ -1,4 +1,4 @@ -%table#dossiers_list.table +%table#dossiers-list.table %thead - if smart_listing.name.to_s == 'follow_dossiers' %th.col-xs-1.center diff --git a/app/views/backoffice/dossiers/_pref_list.html.haml b/app/views/backoffice/dossiers/_pref_list.html.haml index b92e4a41c..31d6c1fed 100644 --- a/app/views/backoffice/dossiers/_pref_list.html.haml +++ b/app/views/backoffice/dossiers/_pref_list.html.haml @@ -1,4 +1,4 @@ -%button#pref_list_dossier_close_action.btn.btn-danger.btn-xs.fixed-right +%button#pref-list-dossier-close-action.btn.btn-danger.btn-xs.fixed-right %i.fa.fa-close %h3 = t('dynamics.backoffice.pref_list.title') diff --git a/app/views/backoffice/dossiers/_pref_list.js.erb b/app/views/backoffice/dossiers/_pref_list.js.erb index e15e3f068..00a569dd4 100644 --- a/app/views/backoffice/dossiers/_pref_list.js.erb +++ b/app/views/backoffice/dossiers/_pref_list.js.erb @@ -9,6 +9,6 @@ $.ajax({ url: '/backoffice/preference_list_dossier/reload_pref_list?procedure_id=<%= @procedure_id %>', async: true }).done(function (data) { - $("#pref_list_menu").html(data); + $("#pref-list-menu").html(data); pref_list_dossier_actions(); }); diff --git a/app/views/backoffice/dossiers/formulaire_private.js.erb b/app/views/backoffice/dossiers/formulaire_private.js.erb index a4a9f595b..44b5a576a 100644 --- a/app/views/backoffice/dossiers/formulaire_private.js.erb +++ b/app/views/backoffice/dossiers/formulaire_private.js.erb @@ -1,4 +1,4 @@ <% flash.each do |type, message| %> -$("#flash_message").html("
    <%= message.html_safe %>
    ").children().fadeOut(5000) +$("#flash_message").html("
    <%= message.html_safe %>
    ").children().fadeOut(5000) <% end %> <% flash.clear %> diff --git a/app/views/backoffice/dossiers/index.html.haml b/app/views/backoffice/dossiers/index.html.haml index f10570616..54d14c648 100644 --- a/app/views/backoffice/dossiers/index.html.haml +++ b/app/views/backoffice/dossiers/index.html.haml @@ -1,8 +1,8 @@ -#backoffice_index - #pref_list_menu +#backoffice-index + #pref-list-menu = render partial: 'backoffice/dossiers/pref_list' - .default_data_block + .default-data-block .row.show-block#new_dossiers .header .col-xs-10.title @@ -24,7 +24,7 @@ .col-xs-3 = link_to 'Terminés', '?liste=termine', class: 'text-success', style: "text-decoration: #{@facade_data_view.liste == 'termine'? 'underline' : ''}" - .default_data_block.default_visible + .default-data-block.default_visible .row.show-block#follow_dossiers .header .col-xs-10.title @@ -36,7 +36,7 @@ .body = smart_listing_render :follow_dossiers - .default_data_block + .default-data-block .row.show-block#all_dossiers .header .col-xs-10.title @@ -50,7 +50,7 @@ - if @archived_dossiers - .default_data_block + .default-data-block .row.show-block#archived_dossiers .header .col-xs-10.title diff --git a/app/views/backoffice/dossiers/search.html.haml b/app/views/backoffice/dossiers/search.html.haml index 34ffd639d..6a17e254c 100644 --- a/app/views/backoffice/dossiers/search.html.haml +++ b/app/views/backoffice/dossiers/search.html.haml @@ -1,8 +1,8 @@ -#backoffice_search - #pref_list_menu +#backoffice-search + #pref-list-menu = render partial: 'backoffice/dossiers/pref_list' - .default_data_block.default_visible + .default-data-block.default_visible .row.show-block#new_dossiers .header .col-lg-10.col-md-10.col-sm-10.col-xs-10.title diff --git a/app/views/backoffice/dossiers/show.html.haml b/app/views/backoffice/dossiers/show.html.haml index be9e5d17d..de5a91238 100644 --- a/app/views/backoffice/dossiers/show.html.haml +++ b/app/views/backoffice/dossiers/show.html.haml @@ -1,2 +1,2 @@ -#backoffice_dossier_show.col-xs-12 +#backoffice-dossier-show.col-xs-12 = render partial: "dossiers/dossier_show" diff --git a/app/views/dossiers/_dossier_show.html.haml b/app/views/dossiers/_dossier_show.html.haml index be5f83190..2a96ccc76 100644 --- a/app/views/dossiers/_dossier_show.html.haml +++ b/app/views/dossiers/_dossier_show.html.haml @@ -1,7 +1,7 @@ = render partial: 'dossiers/messagerie', locals: { dossier_facade: @facade } - if @facade.procedure.individual_with_siret - .default_data_block + .default-data-block .row.show-block.infos .header .col-xs-8.title-no-expanse @@ -13,7 +13,7 @@ Renseigner un SIRET - unless @facade.entreprise.nil? - .default_data_block + .default-data-block .row.show-block.infos#infos_entreprise .header .col-xs-12.title @@ -23,8 +23,8 @@ .body.display-block-on-print = render partial: '/dossiers/infos_entreprise' -.default_data_block.default_visible - .row.show-block.infos#infos_dossier +.default-data-block.default_visible + .row.show-block.infos#infos-dossiers .header .col-xs-10.title .carret-right @@ -35,7 +35,7 @@ = render partial: '/dossiers/infos_dossier' - if @facade.dossier.procedure.module_api_carto.use_api_carto - .default_data_block.default_visible.no-page-break-inside + .default-data-block.default_visible.no-page-break-inside .row.show-block#carto .header .col-xs-10.title @@ -53,7 +53,7 @@ - if @current_gestionnaire && gestionnaire_signed_in? && @champs_private.count > 0 - .default_data_block.default_visible + .default-data-block.default_visible .row.show-block#private-fields .header .col-xs-10.title diff --git a/app/views/dossiers/_download_dossiers.html.haml b/app/views/dossiers/_download_dossiers.html.haml index 369bd4327..26abe6925 100644 --- a/app/views/dossiers/_download_dossiers.html.haml +++ b/app/views/dossiers/_download_dossiers.html.haml @@ -1,5 +1,5 @@ .dropdown.pull-right#download-menu - %a.dropdown-toggle.button_navbar{ type: :button, 'data-toggle' => 'dropdown', 'aria-haspopup' => true, 'aria-expanded' => false } + %a.dropdown-toggle.button-navbar{ type: :button, 'data-toggle' => 'dropdown', 'aria-haspopup' => true, 'aria-expanded' => false } %i.fa.fa-download Télécharger tous les dossiers %span.caret diff --git a/app/views/dossiers/_edit_pieces_jointes.html.haml b/app/views/dossiers/_edit_pieces_jointes.html.haml index 61a8dc794..3584221a3 100644 --- a/app/views/dossiers/_edit_pieces_jointes.html.haml +++ b/app/views/dossiers/_edit_pieces_jointes.html.haml @@ -2,7 +2,7 @@ - if user_signed_in? && (@facade.dossier.owner?(current_user.email) || @facade.dossier.invite_by_user?(current_user.email)) - if @facade.procedure.cerfa_flag? || @facade.dossier.types_de_piece_justificative.size > 0 .col-lg-4.col-md-4.col-sm-4.col-xs-4.action - %a#maj_pj.action{ "data-target" => "#UploadPJmodal", + %a#maj_pj.action{ "data-target" => "#upload-pj-modal", "data-toggle" => "modal", :type => "button", style: 'margin-bottom: 15px; margin-top: -30px;' } diff --git a/app/views/dossiers/_infos_dossier.html.haml b/app/views/dossiers/_infos_dossier.html.haml index 954aa6856..00b37b627 100644 --- a/app/views/dossiers/_infos_dossier.html.haml +++ b/app/views/dossiers/_infos_dossier.html.haml @@ -62,7 +62,7 @@ .col-xs-4.dossier-title= t('utils.pieces').upcase .col-xs-4.split-hr - .col-xs-12#pieces_justificatives.margin-bot-40 + .col-xs-12#pieces-justificatives.margin-bot-40 .row - if @facade.procedure.cerfa_flag? .col-xs-12#piece_justificative_0 @@ -74,7 +74,7 @@ %a{ href: "#{@facade.dossier.cerfa.last.content_url}", target: '_blank' } Consulter %span{ style: 'margin-left: 12px;' } \- - = link_to "", class: "historique", "data-toggle" => "modal", "data-target" => "#PJmodal", :type => "button", "data-modal_title" => 'formulaires', "data-modal_index" => 'cerfa' do + = link_to "", class: "historique", "data-toggle" => "modal", "data-target" => "#pj-modal", :type => "button", "data-modal_title" => 'formulaires', "data-modal_index" => 'cerfa' do %span.fa.fa-clock-o - else Pièce non fournie @@ -94,7 +94,7 @@ %span{ style: 'margin-left: 12px;' } \- - if @facade.dossier.pieces_justificatives.where(type_de_piece_justificative_id: type_de_piece_justificative.id).count > 1 - = link_to "", class: "historique", "data-toggle" => "modal", "data-target" => "#PJmodal", :type => "button", "data-modal_title" => 'formulaires', "data-modal_index" => "type_de_pj_#{type_de_piece_justificative.id}" do + = link_to "", class: "historique", "data-toggle" => "modal", "data-target" => "#pj-modal", :type => "button", "data-modal_title" => 'formulaires', "data-modal_index" => "type_de_pj_#{type_de_piece_justificative.id}" do %span.fa.fa-clock-o - else Pièce non fournie @@ -104,7 +104,7 @@ - if @facade.procedure.cerfa_flag? || @facade.dossier.types_de_piece_justificative.size > 0 .row .col-xs-4 - %a#maj_pj.action{ "data-target" => "#UploadPJmodal", "data-toggle" => "modal", :type => "button" } + %a#maj_pj.action{ "data-target" => "#upload-pj-modal", "data-toggle" => "modal", :type => "button" } .col-xs-4.action Modifier les documents %br @@ -112,7 +112,7 @@ .col-xs-4 - if gestionnaire_signed_in? - #PJmodal.modal.fade{ "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1" } + #pj-modal.modal.fade{ "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1" } .modal-dialog.modal-lg{ :role => "document" } .modal-content .modal-header @@ -120,7 +120,7 @@ %span{ "aria-hidden" => "true" } × %h4#myModalLabel.modal-title Historique des - %span#PJmodal_title + %span#pj-modal-title .modal-body %table.table %thead @@ -130,7 +130,7 @@ Date d'envoi %th Lien - %thead.tr_content#cerfa + %thead.tr-content#cerfa - if @facade.procedure.cerfa_flag? - if @facade.dossier.cerfa_available? - @facade.cerfas_ordered.each do |cerfa| @@ -142,7 +142,7 @@ %td.col-md-6.col-sm-6.col-xs-6.col-lg-4 = link_to 'Récupérer', cerfa.content_url, { target: :blank } - @facade.dossier.types_de_piece_justificative.each do |type_de_piece_justificative| - %tbody.tr_content{ id: "type_de_pj_#{type_de_piece_justificative.id}" } + %tbody.tr-content{ id: "type_de_pj_#{type_de_piece_justificative.id}" } - @facade.dossier.retrieve_all_piece_justificative_by_type(type_de_piece_justificative.id).each do |piece_justificative| %tr %td.col-md-6.col-sm-6.col-xs-6.col-lg-4 diff --git a/app/views/dossiers/_infos_pieces_jointes.html.haml b/app/views/dossiers/_infos_pieces_jointes.html.haml index 78d1df89f..05faa1417 100644 --- a/app/views/dossiers/_infos_pieces_jointes.html.haml +++ b/app/views/dossiers/_infos_pieces_jointes.html.haml @@ -1,4 +1,4 @@ -#pieces_justificatives +#pieces-justificatives .row - if @facade.procedure.cerfa_flag? .col-xs-12#piece_justificative_0 @@ -11,7 +11,7 @@ %span{ style: 'margin-left: 12px;' } \- %a.btn.fa.fa-timer{ style: 'color: black; padding-top: 0;', - "data-target" => "#PJmodal", + "data-target" => "#pj-modal", "data-toggle" => "modal", :type => "button", "data-modal_title" => 'formulaires', @@ -37,7 +37,7 @@ %span{ style: 'margin-left: 12px;' } \- %a.btn.fa.fa-timer{ style: 'color: black; padding-top: 0;', - "data-target" => "#PJmodal", + "data-target" => "#pj-modal", "data-toggle" => "modal", :type => "button", "data-modal_title" => type_de_piece_justificative.libelle, diff --git a/app/views/dossiers/_messagerie.html.haml b/app/views/dossiers/_messagerie.html.haml index eb8b59324..ca223136d 100644 --- a/app/views/dossiers/_messagerie.html.haml +++ b/app/views/dossiers/_messagerie.html.haml @@ -1,4 +1,4 @@ -.default_data_block{ style: 'margin-top: 40px;' } +.default-data-block{ style: 'margin-top: 40px;' } .row.show-block.clearfix#messages .header .col-xs-10.title diff --git a/app/views/dossiers/_pieces_justificatives.html.haml b/app/views/dossiers/_pieces_justificatives.html.haml index f547b1a4d..74d837d30 100644 --- a/app/views/dossiers/_pieces_justificatives.html.haml +++ b/app/views/dossiers/_pieces_justificatives.html.haml @@ -1,4 +1,4 @@ -#pieces_justificatives +#pieces-justificatives %table.table - if @facade.procedure.cerfa_flag? %tr{ id: "piece_justificative_0" } @@ -10,7 +10,7 @@ %span{ style: 'margin-left: 12px;' } \- %a.btn.fa.fa-timer{ style: 'color: black; padding-top: 0;', - "data-target" => "#PJmodal", + "data-target" => "#pj-modal", "data-toggle" => "modal", :type => "button", "data-modal_title" => 'formulaires', @@ -33,7 +33,7 @@ %span{ style: 'margin-left: 12px;' } \- %a.btn.fa.fa-timer{ style: 'color: black; padding-top: 0;', - "data-target" => "#PJmodal", + "data-target" => "#pj-modal", "data-toggle" => "modal", :type => "button", "data-modal_title" => type_de_piece_justificative.libelle, diff --git a/app/views/dossiers/_show.html.haml b/app/views/dossiers/_show.html.haml index 61ab17978..a63cafa14 100644 --- a/app/views/dossiers/_show.html.haml +++ b/app/views/dossiers/_show.html.haml @@ -1,9 +1,9 @@ -#users_siret_index +#users-siret-index .row.etape.etape_1 = render partial: '/dossiers/etapes/etape1' - .row.etape.etape_2 + .row.etape.etape-2 = render partial: '/dossiers/etapes/etape2' -# - if @facade.procedure.module_api_carto.use_api_carto? diff --git a/app/views/dossiers/add_siret.js.erb b/app/views/dossiers/add_siret.js.erb index 72bb92d20..fe0cdc53c 100644 --- a/app/views/dossiers/add_siret.js.erb +++ b/app/views/dossiers/add_siret.js.erb @@ -1,6 +1,6 @@ <% if flash.empty? %> -$('.row.etape.etape_2').hide(300, render_new_siret); -$('.row.etape.etape_2').slideDown(400, the_terms); +$('.row.etape.etape-2').hide(300, render_new_siret); +$('.row.etape.etape-2').slideDown(400, the_terms); <% else %> error_form_siret('<%= invalid_siret %>'); <% end %> @@ -8,5 +8,5 @@ error_form_siret('<%= invalid_siret %>'); <% flash.clear %> function render_new_siret(){ - $('.row.etape.etape_2').html("<%= escape_javascript(render partial: '/dossiers/etapes/etape_2/entreprise', locals: { facade: @facade } ) %>"); + $('.row.etape.etape-2').html("<%= escape_javascript(render partial: '/dossiers/etapes/etape_2/entreprise', locals: { facade: @facade } ) %>"); } \ No newline at end of file diff --git a/app/views/dossiers/etapes/_etape1.html.haml b/app/views/dossiers/etapes/_etape1.html.haml index 5e1d46dbc..036cdce6b 100644 --- a/app/views/dossiers/etapes/_etape1.html.haml +++ b/app/views/dossiers/etapes/_etape1.html.haml @@ -9,10 +9,10 @@ #logo_procedure.flag = image_tag( @facade.procedure.decorate.logo_img ) -.etape.etapes_informations.col-xs-9 +.etape.etapes-informations.col-xs-9 .row .col-xs-12.padding-left-30 - %h2#titre_procedure.text-info + %h2#titre-procedure.text-info = @facade.procedure.libelle %p#description_procedure{ style: 'width: 95%;', class: (@facade.entreprise.nil? ? '' : 'mask') } diff --git a/app/views/dossiers/etapes/_etape3.html.haml b/app/views/dossiers/etapes/_etape3.html.haml index a163bbe81..4a0e54e99 100644 --- a/app/views/dossiers/etapes/_etape3.html.haml +++ b/app/views/dossiers/etapes/_etape3.html.haml @@ -1,6 +1,6 @@ -.etape.etapes_menu.col-xs-3 +.etape.etapes-menu.col-xs-3 %h3 Ma zone d'intervention -.etape.etapes_informations.col-xs-9 +.etape.etapes-informations.col-xs-9 .row diff --git a/app/views/dossiers/etapes/_etape4.html.haml b/app/views/dossiers/etapes/_etape4.html.haml index 68a4c0fc4..70456b83f 100644 --- a/app/views/dossiers/etapes/_etape4.html.haml +++ b/app/views/dossiers/etapes/_etape4.html.haml @@ -1,6 +1,6 @@ -.etape.etapes_menu.col-xs-3 +.etape.etapes-menu.col-xs-3 %h3 Mon dossier -.etape.etapes_informations.col-xs-9 +.etape.etapes-informations.col-xs-9 .row diff --git a/app/views/dossiers/etapes/etape_2/_entreprise.html.haml b/app/views/dossiers/etapes/etape_2/_entreprise.html.haml index c817a95a9..7e6e6f05c 100644 --- a/app/views/dossiers/etapes/etape_2/_entreprise.html.haml +++ b/app/views/dossiers/etapes/etape_2/_entreprise.html.haml @@ -1,4 +1,4 @@ -.etape.etapes_menu.col-xs-3 +.etape.etapes-menu.col-xs-3 %h3 Mes informations %br @@ -12,21 +12,21 @@ = f.submit 'Changer de SIRET', class: %w(btn btn-xs btn-primary) -.etape.etapes_informations.col-xs-9 +.etape.etapes-informations.col-xs-9 .row - if @facade.entreprise.nil? #new_siret{ style: 'margin-left: 20%; margin-top: 5%;' } = form_for @facade.dossier, html: { class: 'form-inline' }, url: users_dossier_siret_informations_path(dossier_id: @facade.dossier.id), method: :post, remote: true do |f| .form-group.form-group-lg - = f.text_field :siret, class: "form-control", placeholder: "Entrez votre Siret", value: @siret + = f.text_field :siret, id: "dossier-siret", class: "form-control", placeholder: "Entrez votre Siret", value: @siret = f.hidden_field :dossier_id, value: @facade.dossier.id = f.submit 'Valider', class: %w(btn btn-lg btn-success), id: 'submit-siret', data: { disable_with: "Recherche en cours ..." } - else %br - #recap_info_entreprise + #recap-info-entreprise = render partial: '/dossiers/infos_entreprise' - %p#insee_infogreffe{ style: 'color: grey; float: right;' } + %p#insee-infogreffe{ style: 'color: grey; float: right;' } %i Informations récupérées auprès de l'INSEE et d'INFOGREFFE diff --git a/app/views/dossiers/etapes/etape_2/_individual.html.haml b/app/views/dossiers/etapes/etape_2/_individual.html.haml index 2e2298c33..ce87a50fc 100644 --- a/app/views/dossiers/etapes/etape_2/_individual.html.haml +++ b/app/views/dossiers/etapes/etape_2/_individual.html.haml @@ -5,7 +5,7 @@ %br vous concernant. -.etape.etapes_informations.col-xs-9 +.etape.etapes-informations.col-xs-9 = form_for @facade.dossier, url: { controller: '/users/dossiers', action: :update } do |f| .row .col-xs-12.padding-left-30 diff --git a/app/views/dossiers/new_siret.js.erb b/app/views/dossiers/new_siret.js.erb index dcb6ce2b2..a84df50d7 100644 --- a/app/views/dossiers/new_siret.js.erb +++ b/app/views/dossiers/new_siret.js.erb @@ -1,6 +1,6 @@ <% if flash.empty? %> -$('.row.etape.etape_2').hide(300, render_new_siret); -$('.row.etape.etape_2').slideDown(400, the_terms); +$('.row.etape.etape-2').hide(300, render_new_siret); +$('.row.etape.etape-2').slideDown(400, the_terms); toggle_etape_1(); <% else %> error_form_siret('<%= invalid_siret %>'); @@ -9,5 +9,5 @@ error_form_siret('<%= invalid_siret %>'); <% flash.clear %> function render_new_siret(){ - $('.row.etape.etape_2').html("<%= escape_javascript(render partial: '/dossiers/etapes/etape2', locals: { facade: @facade } ) %>"); + $('.row.etape.etape-2').html("<%= escape_javascript(render partial: '/dossiers/etapes/etape2', locals: { facade: @facade } ) %>"); } \ No newline at end of file diff --git a/app/views/france_connect/particulier/check_email.html.haml b/app/views/france_connect/particulier/check_email.html.haml index da4efd5be..9922adda2 100644 --- a/app/views/france_connect/particulier/check_email.html.haml +++ b/app/views/france_connect/particulier/check_email.html.haml @@ -12,7 +12,7 @@ Afin d'associer ce compte à votre identifiant France Connect, merci de saisir votre mot de passe TPS. %br .center - #france_connect_particulier_email + #france-connect-particulier-email = form_for @user, url: { controller: 'france_connect/particulier', action: :check_email }, method: :post do |f| .form-group.form-group-lg = f.text_field :email_france_connect, class: "form-control", readonly: 'readonly' diff --git a/app/views/france_connect/particulier/new.html.haml b/app/views/france_connect/particulier/new.html.haml index 22f6c8e72..ddb7a5b0b 100644 --- a/app/views/france_connect/particulier/new.html.haml +++ b/app/views/france_connect/particulier/new.html.haml @@ -23,7 +23,7 @@ %br .center - #france_connect_particulier_email + #france-connect-particulier-email = form_for @user, url: { controller: 'france_connect/particulier', action: :check_email }, method: :post do |f| .form-group.form-group-lg = f.text_field :email_france_connect, class: "form-control", placeholder: "Entrez votre email" diff --git a/app/views/gestionnaires/passwords/edit.html.haml b/app/views/gestionnaires/passwords/edit.html.haml index 13888a958..64acc3d70 100644 --- a/app/views/gestionnaires/passwords/edit.html.haml +++ b/app/views/gestionnaires/passwords/edit.html.haml @@ -1,13 +1,13 @@ = devise_error_messages! -#form_login +#form-login = image_tag(image_url(LOGO_NAME)) %br %h2#gestionnaire_login Changement de mot de passe %br %br - #new_user + #new-user = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| = f.hidden_field :reset_password_token %h4 diff --git a/app/views/gestionnaires/passwords/new.html.haml b/app/views/gestionnaires/passwords/new.html.haml index 5cb58e0b1..63b9cf09c 100644 --- a/app/views/gestionnaires/passwords/new.html.haml +++ b/app/views/gestionnaires/passwords/new.html.haml @@ -1,14 +1,14 @@ = devise_error_messages! %br -#form_login +#form-login = image_tag(image_url(LOGO_NAME)) %br %h2#gestionnaire_login Mot de passe oublié %br %br - #new_user + #new-user = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %h4 = f.label :email diff --git a/app/views/gestionnaires/sessions/new.html.haml b/app/views/gestionnaires/sessions/new.html.haml index 051112da6..005803443 100644 --- a/app/views/gestionnaires/sessions/new.html.haml +++ b/app/views/gestionnaires/sessions/new.html.haml @@ -1,4 +1,4 @@ -#form_login +#form-login %br = image_tag(image_url(LOGO_NAME)) %br @@ -6,7 +6,7 @@ %br %br - #new_user + #new-user = form_for @gestionnaire, url: gestionnaire_session_path, method: :post do |f| %h4 = f.label :email diff --git a/app/views/layouts/_navbar.html.haml b/app/views/layouts/_navbar.html.haml index 226fa8396..d3d3e9db5 100644 --- a/app/views/layouts/_navbar.html.haml +++ b/app/views/layouts/_navbar.html.haml @@ -1,5 +1,5 @@ .col-xs-2 - %a#title_navbar{ href: '/' } + %a#title-navbar{ href: '/' } .row#home .col-lg-6.no-padding = image_tag('marianne_small.png', class: 'logo') diff --git a/app/views/layouts/_notifications_alert.html.haml b/app/views/layouts/_notifications_alert.html.haml index 372fe7497..99c4a4682 100644 --- a/app/views/layouts/_notifications_alert.html.haml +++ b/app/views/layouts/_notifications_alert.html.haml @@ -1 +1 @@ -#notification_alert.alert.alert-success +#notification-alert.alert.alert-success diff --git a/app/views/layouts/_support_navigator_banner.html.haml b/app/views/layouts/_support_navigator_banner.html.haml index 8f892a3b8..ff3485071 100644 --- a/app/views/layouts/_support_navigator_banner.html.haml +++ b/app/views/layouts/_support_navigator_banner.html.haml @@ -1,5 +1,5 @@ - unless BrowserService.recommended_browser? - #support_navigator_banner.row + #support-navigator-banner.row .col-xs-12 = BROWSER.value.name = BROWSER.value.version diff --git a/app/views/layouts/_switch_devise_profile_module.html.haml b/app/views/layouts/_switch_devise_profile_module.html.haml index 53d3f2134..6b718ca0a 100644 --- a/app/views/layouts/_switch_devise_profile_module.html.haml +++ b/app/views/layouts/_switch_devise_profile_module.html.haml @@ -1,5 +1,5 @@ - if SwitchDeviseProfileService.new(warden).multiple_devise_profile_connect? - #switch_menu.dropdown.dropup + #switch-menu.dropdown.dropup %button.btn.btn-default.dropdown-toggle{ type: :button, 'data-toggle' => 'dropdown', 'aria-haspopup' => true, 'aria-expanded' => false } %i.fa.fa-toggle-on %span.caret diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 0508e568c..225169964 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -18,7 +18,7 @@ = action_cable_meta_tag %body = render partial: 'layouts/support_navigator_banner' - #beta{ class: (Rails.env == 'production' ? '' : 'beta_staging') } + #beta{ class: (Rails.env == 'production' ? '' : 'beta-staging') } - if Rails.env == 'production' Beta - else @@ -49,7 +49,7 @@ - main_container_size = 12 = render partial: 'layouts/main_container', locals: { main_container_size: main_container_size } - #mask_search + #mask-search %h1 %i.fa.fa-times{ style: 'position: fixed; top: 10; right: 30; color: white;' } diff --git a/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_index.html.haml b/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_index.html.haml index 53fcb38c2..865c47868 100644 --- a/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_index.html.haml +++ b/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_index.html.haml @@ -8,21 +8,21 @@ %div#menu-block .split-hr-left - #procedure_list + #procedure-list %a{ :href => "#{url_for :admin_procedures_draft}", id: "draft-procedures" } - .procedure_list_element{ class: @draft_class } + .procedure-list-element{ class: @draft_class } Brouillons .badge.progress-bar-default = current_administrateur.procedures.where(published: false, archived: false).count %a{ :href => "#{url_for :admin_procedures}", id: "active-procedures" } - .procedure_list_element{ class: @active_class } + .procedure-list-element{ class: @active_class } Actives .badge.progress-bar-success = current_administrateur.procedures.where(published: true, archived: false).count %a{ :href => "#{url_for :admin_procedures_archived}", id: "archived-procedures" } - .procedure_list_element{ class: @archived_class } + .procedure-list-element{ class: @archived_class } Archivées .badge.progress-bar-purple = current_administrateur.procedures.where(archived: true).count diff --git a/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_navbar.html.haml b/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_navbar.html.haml index 60036b2a5..e23c96832 100644 --- a/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_navbar.html.haml +++ b/app/views/layouts/left_panels/_left_panel_admin_procedurescontroller_navbar.html.haml @@ -9,40 +9,40 @@ %div#menu-block .split-hr-left - #procedure_list + #procedure-list %a{ :href => "#{url_for admin_procedure_path(@procedure)}", id: 'onglet-infos' } - .procedure_list_element{ class: ('active' if active == 'Informations') } + .procedure-list-element{ class: ('active' if active == 'Informations') } Informations %a{ :href => "#{url_for admin_procedure_accompagnateurs_path(@procedure)}", id: 'onglet-accompagnateurs' } - .procedure_list_element{ class: ('active' if active == 'Accompagnateurs') } + .procedure-list-element{ class: ('active' if active == 'Accompagnateurs') } = t('dynamics.admin.procedure.onglets.accompagnateurs') %a{ :href => "#{url_for edit_admin_procedure_path(@procedure)}", id: 'onglet-description' } - .procedure_list_element{ class: ('active' if active == 'Description') } + .procedure-list-element{ class: ('active' if active == 'Description') } Description - unless @procedure.locked? %a{ :href => "#{url_for admin_procedure_types_de_champ_path(@procedure)}", id: 'onglet-champs' } - .procedure_list_element{ class: ('active' if active == 'Champs') } + .procedure-list-element{ class: ('active' if active == 'Champs') } Champs - unless @procedure.locked? %a{ :href => "#{url_for admin_procedure_pieces_justificatives_path(@procedure)}", id: 'onglet-pieces' } - .procedure_list_element{ class: ('active' if active == 'Pieces') } + .procedure-list-element{ class: ('active' if active == 'Pieces') } Pièces jointes - unless @procedure.locked? %a{ :href => "#{url_for admin_procedure_types_de_champ_private_path(@procedure)}", id: 'onglet-private-champs' } - .procedure_list_element{ class: ('active' if active == 'Champs privés') } + .procedure-list-element{ class: ('active' if active == 'Champs privés') } Champs privés %a{ :href => "#{url_for admin_procedure_mail_templates_path(@procedure)}", id: 'onglet-inemailsfos' } - .procedure_list_element{ class: ('active' if active == 'E-mails') } + .procedure-list-element{ class: ('active' if active == 'E-mails') } E-mails %a{ :href => "#{url_for admin_procedure_previsualisation_path(@procedure)}", id: 'onglet-preview' } - .procedure_list_element{ class: ('active' if active == 'Prévisualisation') } + .procedure-list-element{ class: ('active' if active == 'Prévisualisation') } Prévisualisation .split-hr-left diff --git a/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml b/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml index d99573c44..c990c6836 100644 --- a/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml +++ b/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml @@ -19,11 +19,11 @@ %div#infos-block .split-hr-left - #procedure_list + #procedure-list - @facade_data_view.gestionnaire_procedures_name_and_id_list.each do |procedure| = link_to backoffice_dossiers_procedure_path(procedure[:id]), { title: procedure[:libelle] } do - .procedure_list_element{ class: ('active' if procedure[:id] == @facade_data_view.procedure.id rescue '') } + .procedure-list-element{ class: ('active' if procedure[:id] == @facade_data_view.procedure.id rescue '') } = truncate(procedure[:libelle], length: 50) - total_new = @facade_data_view.new_dossier_number procedure[:id] - if total_new > 0 @@ -32,7 +32,7 @@ - if procedure[:unread_notifications] > 0 .badge.progress-bar-warning{ title: 'Notifications' } = procedure[:unread_notifications] - #notifications_list.hidden + #notifications-list.hidden - if @facade_data_view.dossiers_with_unread_notifications.empty? .no-notification Aucune notification pour le moment. - else diff --git a/app/views/layouts/left_panels/_left_panel_cgucontroller_index.html.haml b/app/views/layouts/left_panels/_left_panel_cgucontroller_index.html.haml index 1d386a756..6fce145f3 100644 --- a/app/views/layouts/left_panels/_left_panel_cgucontroller_index.html.haml +++ b/app/views/layouts/left_panels/_left_panel_cgucontroller_index.html.haml @@ -1,53 +1,53 @@ %div#cgu_menu_block - #procedure_list{ style: 'margin-top: 0;' } + #procedure-list{ style: 'margin-top: 0;' } = link_to cgu_path(:anchor => "editeur") do - .procedure_list_element + .procedure-list-element Editeur = link_to cgu_path(:anchor => "ingenieurie_hebergement") do - .procedure_list_element + .procedure-list-element Ingénierie et hébergement informatique = link_to cgu_path(:anchor => "object_website") do - .procedure_list_element + .procedure-list-element Object du site internet = link_to cgu_path(:anchor => "acteurs") do - .procedure_list_element + .procedure-list-element Acteurs de TPS = link_to cgu_path(:anchor => "CNIL") do - .procedure_list_element + .procedure-list-element Déclaration CNIL = link_to cgu_path(:anchor => "data_collects") do - .procedure_list_element + .procedure-list-element Données collectées et responsabilité des organismes utilisateurs = link_to cgu_path(:anchor => "individual_data") do - .procedure_list_element + .procedure-list-element Traitement des données à caractère personnel = link_to cgu_path(:anchor => "entreprise_information") do - .procedure_list_element + .procedure-list-element Règles relatives aux informations sur les entreprises mises à disposibition = link_to cgu_path(:anchor => "reproduction") do - .procedure_list_element + .procedure-list-element Droit de reproduction = link_to cgu_path(:anchor => "propriete_intellectuelle") do - .procedure_list_element + .procedure-list-element Propriété intellectuelle = link_to cgu_path(:anchor => "navigateurs") do - .procedure_list_element + .procedure-list-element Logiciels nécessaires à la consultation = link_to cgu_path(:anchor => "conception") do - .procedure_list_element + .procedure-list-element Conception et Réalisation - .procedure_list_element + .procedure-list-element - .procedure_list_element + .procedure-list-element diff --git a/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml b/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml index 06d8817d7..3e0bebb2f 100644 --- a/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml +++ b/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml @@ -9,34 +9,34 @@ %div#menu-block .split-hr-left - #procedure_list + #procedure-list - unless current_user.dossiers.count == 0 %a{ :href => "#{url_for users_dossiers_path(liste: 'brouillon')}", 'data-toggle' => :tooltip, title: 'Les dossiers jamais proposés à la relecture.' } - .procedure_list_element{ class: @dossiers_list_facade.brouillon_class, id: 'brouillon' } + .procedure-list-element{ class: @dossiers_list_facade.brouillon_class, id: 'brouillon' } Brouillons .badge.progress-bar-default = @dossiers_list_facade.brouillon_total %a{ :href => "#{url_for users_dossiers_path(liste: 'a_traiter')}", 'data-toggle' => :tooltip, title: 'Les dossiers qui requièrent une action de votre part.' } - .procedure_list_element{ class: @dossiers_list_facade.en_construction_class, id: 'a_traiter' } + .procedure-list-element{ class: @dossiers_list_facade.en_construction_class, id: 'a_traiter' } En construction .badge.progress-bar-danger = @dossiers_list_facade.en_construction_total %a{ :href => "#{url_for users_dossiers_path(liste: 'en_instruction')}", 'data-toggle' => :tooltip, title: 'Les dossiers en cours d\'examen par l\'administration compétante.' } - .procedure_list_element{ class: @dossiers_list_facade.en_instruction_class, id: 'en_instruction' } + .procedure-list-element{ class: @dossiers_list_facade.en_instruction_class, id: 'en_instruction' } En instruction .badge.progress-bar-default = @dossiers_list_facade.en_instruction_total %a{ :href => "#{url_for users_dossiers_path(liste: 'termine')}", 'data-toggle' => :tooltip, title: 'Les dossiers cloturés qui peuvent être "Accepté", "Refusé" ou "Sans suite".' } - .procedure_list_element{ class: @dossiers_list_facade.termine_class, id: 'termine' } + .procedure-list-element{ class: @dossiers_list_facade.termine_class, id: 'termine' } Terminé .badge.progress-bar-success = @dossiers_list_facade.termine_total %a{ :href => "#{url_for users_dossiers_path(liste: 'invite')}" } - .procedure_list_element{ class: @dossiers_list_facade.invite_class, id: 'invite' } + .procedure-list-element{ class: @dossiers_list_facade.invite_class, id: 'invite' } Invitation .badge.progress-bar-warning = @dossiers_list_facade.invite_total diff --git a/app/views/layouts/left_panels/_search_area.html.haml b/app/views/layouts/left_panels/_search_area.html.haml index c4a49ea26..6532566e1 100644 --- a/app/views/layouts/left_panels/_search_area.html.haml +++ b/app/views/layouts/left_panels/_search_area.html.haml @@ -1,7 +1,7 @@ -#search_area +#search-area = form_tag(backoffice_dossiers_search_url, method: :get) do .input-group = text_field_tag('q', "#{@search_terms unless @search_terms.nil?}", id: 'q', placeholder: "Recherchez parmi tous vos dossiers", class: 'form-control') %span.input-group-btn - %button.btn.btn-default{ id: 'search_button' } + %button.btn.btn-default{ id: 'search-button' } %i.fa.fa-search diff --git a/app/views/layouts/navbars/_navbar_backoffice_dossiers_procedurecontroller_index.html.haml b/app/views/layouts/navbars/_navbar_backoffice_dossiers_procedurecontroller_index.html.haml index 64e5e776d..cc23e5ca2 100644 --- a/app/views/layouts/navbars/_navbar_backoffice_dossiers_procedurecontroller_index.html.haml +++ b/app/views/layouts/navbars/_navbar_backoffice_dossiers_procedurecontroller_index.html.haml @@ -3,7 +3,7 @@ .col-lg-3.col-md-3.col-sm-3.col-xs-3.options .row .col-lg-12.col-md-12.col-sm-12.col-xs-12 - %a.button_navbar#pref_list_dossier_open_action{ href: '#', type: :button, 'data-toggle' => 'dropdown', 'aria-haspopup' => true, 'aria-expanded' => false } + %a.button-navbar#pref-list-dossier-open-action{ href: '#', type: :button, 'data-toggle' => 'dropdown', 'aria-haspopup' => true, 'aria-expanded' => false } %i.fa.fa-pencil Modifier le tableau %span.caret-right diff --git a/app/views/layouts/navbars/_navbar_log_options.html.haml b/app/views/layouts/navbars/_navbar_log_options.html.haml index 6d04a698a..467e9b443 100644 --- a/app/views/layouts/navbars/_navbar_log_options.html.haml +++ b/app/views/layouts/navbars/_navbar_log_options.html.haml @@ -1,15 +1,15 @@ - if user_signed_in? - #sign_out.col-xs-2.no-padding + #sign-out.col-xs-2.no-padding = render partial: 'users/login_banner' = render partial: 'layouts/credentials' - elsif gestionnaire_signed_in? - #sign_out.col-xs-2.no-padding + #sign-out.col-xs-2.no-padding = render partial: 'gestionnaires/login_banner' = render partial: 'layouts/credentials' - elsif administrateur_signed_in? - #sign_out.col-xs-2.no-padding + #sign-out.col-xs-2.no-padding = render partial: 'administrateurs/login_banner' = render partial: 'layouts/credentials' - else - #sign_in.col-xs-2 + #sign-in.col-xs-2 = link_to "Connexion", new_user_session_path, :class => 'btn btn-lg btn-primary' diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml index 513517202..f41400e64 100644 --- a/app/views/root/landing.html.haml +++ b/app/views/root/landing.html.haml @@ -16,7 +16,7 @@ %p.mt-1 Vous êtes intéressés ? %p= link_to 'Programmer une démo', "mailto:#{t('dynamics.contact_email')}?subject=Demande de démo TPS", target: '_blank', class: 'btn btn-danger btn-lg' -#landing_body.max-size +#landing-body.max-size .row#etapes.center #create_1.col-lg-3.col-md-3.col-sm-3.col-xs-3 %img{ src: image_url('etapes/create_1.png') } @@ -78,7 +78,7 @@ .split-hr-left - #request_access.row.center + #request-access.row.center .col-xs-12.col-sm-12.col-md-12.col-lg-12 %h3 Envie de commencer à créer votre démarche ? diff --git a/app/views/users/carte/_map.html.haml b/app/views/users/carte/_map.html.haml index ffd2b3343..80f1bbf36 100644 --- a/app/views/users/carte/_map.html.haml +++ b/app/views/users/carte/_map.html.haml @@ -1,4 +1,4 @@ -#carte_page.row +#carte-page.row .col-md-12.col-lg-12#map{ class: dossier.procedure.module_api_carto.classes } - if dossier.procedure.module_api_carto.quartiers_prioritaires diff --git a/app/views/users/carte/show.html.haml b/app/views/users/carte/show.html.haml index de4a0505f..db8d0115e 100644 --- a/app/views/users/carte/show.html.haml +++ b/app/views/users/carte/show.html.haml @@ -1,4 +1,4 @@ -.row#carto_page +.row#carto-page .col-lg-12.col-md-12.col-sm-12.col-xs-12 %h2 Localisation @@ -11,7 +11,7 @@ %i.fa.fa-pencil Ajouter une zone - %span#search_by_address{ style: 'margin-left: 20px;' } + %span#search-by-address{ style: 'margin-left: 20px;' } %input.form-control{ type: :address, placeholder: 'Rechercher une adresse' } %br %br diff --git a/app/views/users/description/_champs.html.haml b/app/views/users/description/_champs.html.haml index d6c5184b7..ab43c5923 100644 --- a/app/views/users/description/_champs.html.haml +++ b/app/views/users/description/_champs.html.haml @@ -7,7 +7,7 @@ = render partial: render_partial_url, locals: { libelle: 'Dossier', order_place: -1, champs: @champs } - @headers.each do |header| .row - %div{ class: "type_champ-#{header.type_champ}" } + %div{ class: "type-champ-#{header.type_champ.gsub('_', '-')}" } = render partial: render_partial_url, locals: { libelle: header.libelle, order_place: header.order_place, champs: @champs } - else .row diff --git a/app/views/users/description/_show.html.haml b/app/views/users/description/_show.html.haml index 627773625..d83503308 100644 --- a/app/views/users/description/_show.html.haml +++ b/app/views/users/description/_show.html.haml @@ -1,4 +1,4 @@ -.container#description_page +.container#description-page - unless @dossier.procedure.lien_notice.blank? #lien_notice_panel.row{ style: 'width: 280px; position: fixed; background-color: white; right: 5%; top: 80px; z-index: 200;' } .panel.panel-info{ style: 'margin-bottom: 0;' } @@ -17,7 +17,7 @@ -# TODO use form_for = form_tag(url_for({ controller: 'users/description', action: :update, dossier_id: @dossier.id }), class: 'form', method: 'POST', multipart: true) do - unless @champs.nil? - #liste_champs + #liste-champs = render partial: 'users/description/champs', locals: { private: false } - if !@procedure.lien_demarche.blank? || @procedure.cerfa_flag || @dossier.types_de_piece_justificative.size > 0 diff --git a/app/views/users/description/champs/_header_section.html.haml b/app/views/users/description/champs/_header_section.html.haml index 410563165..b75094c2a 100644 --- a/app/views/users/description/champs/_header_section.html.haml +++ b/app/views/users/description/champs/_header_section.html.haml @@ -1,4 +1,4 @@ -.default_data_block.default_visible +.default-data-block.default_visible .row.show-block.infos .header .col-xs-12.title diff --git a/app/views/users/dossiers/_list.html.haml b/app/views/users/dossiers/_list.html.haml index 89d902533..969e680f2 100644 --- a/app/views/users/dossiers/_list.html.haml +++ b/app/views/users/dossiers/_list.html.haml @@ -1,5 +1,5 @@ - unless smart_listing.empty? - %table#dossiers_list.table + %table#dossiers-list.table %thead %th#sort-id.col-md-1.col-lg-1.col-sm-1.col-xs-1= smart_listing.sortable 'Numéro', 'id' %th#sort-libelle.col-xs-5= smart_listing.sortable 'Procédure', 'procedure.libelle' diff --git a/app/views/users/dossiers/add_siret/show.html.haml b/app/views/users/dossiers/add_siret/show.html.haml index 9cf12e4a3..134d78a16 100644 --- a/app/views/users/dossiers/add_siret/show.html.haml +++ b/app/views/users/dossiers/add_siret/show.html.haml @@ -1,2 +1,2 @@ -.row.etape.etape_2 +.row.etape.etape-2 = render partial: 'dossiers/etapes/etape_2/entreprise' diff --git a/app/views/users/dossiers/index.html.haml b/app/views/users/dossiers/index.html.haml index 3811c1ed8..0c0de17f4 100644 --- a/app/views/users/dossiers/index.html.haml +++ b/app/views/users/dossiers/index.html.haml @@ -1,5 +1,5 @@ -#users_index - .default_data_block.default_visible +#users-index + .default-data-block.default_visible .row.show-block#new_dossiers .header .col-lg-10.col-md-10.col-sm-10.col-xs-10.title diff --git a/app/views/users/passwords/edit.html.haml b/app/views/users/passwords/edit.html.haml index 2e6a246f4..d1688e75c 100644 --- a/app/views/users/passwords/edit.html.haml +++ b/app/views/users/passwords/edit.html.haml @@ -28,7 +28,7 @@ = devise_error_messages! -#form_login +#form-login .flag = image_tag(image_url(LOGO_NAME)) %br @@ -36,7 +36,7 @@ %br %br - #new_user + #new-user = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| = f.hidden_field :reset_password_token %h4 diff --git a/app/views/users/passwords/new.html.haml b/app/views/users/passwords/new.html.haml index 8a62b7652..fa5410532 100644 --- a/app/views/users/passwords/new.html.haml +++ b/app/views/users/passwords/new.html.haml @@ -29,7 +29,7 @@ = devise_error_messages! %br -#form_login +#form-login .flag = image_tag(image_url(LOGO_NAME)) %br @@ -37,7 +37,7 @@ %br %br - #new_user + #new-user = form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :post }) do |f| %h4 = f.label :email diff --git a/app/views/users/recapitulatif/_modal_upload_pj.html.haml b/app/views/users/recapitulatif/_modal_upload_pj.html.haml index 63c3e5322..58adcae3f 100644 --- a/app/views/users/recapitulatif/_modal_upload_pj.html.haml +++ b/app/views/users/recapitulatif/_modal_upload_pj.html.haml @@ -1,4 +1,4 @@ -#UploadPJmodal.modal.fade{ "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1" } +#upload-pj-modal.modal.fade{ "aria-labelledby" => "myModalLabel", :role => "dialog", :tabindex => "-1" } .modal-dialog{ :role => "document" } .modal-content - @dossier = @facade.dossier diff --git a/app/views/users/recapitulatif/show.html.haml b/app/views/users/recapitulatif/show.html.haml index 672ab5867..f04ac5a43 100644 --- a/app/views/users/recapitulatif/show.html.haml +++ b/app/views/users/recapitulatif/show.html.haml @@ -1,2 +1,2 @@ -.col-lg-12.col-md-12.col-sm-12.col-xs-12#users_recapitulatif_dossier_show +.col-lg-12.col-md-12.col-sm-12.col-xs-12#users-recapitulatif-dossier-show = render partial: "dossiers/dossier_show" diff --git a/app/views/users/registrations/new.html.haml b/app/views/users/registrations/new.html.haml index 82da47322..a81def70b 100644 --- a/app/views/users/registrations/new.html.haml +++ b/app/views/users/registrations/new.html.haml @@ -28,7 +28,7 @@ = devise_error_messages! -#form_login +#form-login %br .flag = image_tag(image_url(LOGO_NAME)) @@ -37,7 +37,7 @@ %br %br - #new_user + #new-user = form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %h4 = f.label :email diff --git a/app/views/users/sessions/_resume_procedure.html.haml b/app/views/users/sessions/_resume_procedure.html.haml index 236bf7a10..bf385234e 100644 --- a/app/views/users/sessions/_resume_procedure.html.haml +++ b/app/views/users/sessions/_resume_procedure.html.haml @@ -10,7 +10,7 @@ #logo_procedure.flag = image_tag( @dossier.procedure.decorate.logo_img ) - %h2#titre_procedure.text-info + %h2#titre-procedure.text-info = @dossier.procedure.libelle %p.procedure-description = h @dossier.procedure.description.html_safe diff --git a/app/views/users/sessions/new.html.haml b/app/views/users/sessions/new.html.haml index add5365c3..51ba7cda6 100644 --- a/app/views/users/sessions/new.html.haml +++ b/app/views/users/sessions/new.html.haml @@ -1,11 +1,11 @@ -#form_login.user_connexion_page +#form-login.user_connexion_page %br = render partial: 'users/sessions/resume_procedure' - %h2#login_user + %h2#login-user = t('dynamics.users.connexion_title') - %a.btn_fc#btn_fcp{ href: '/france_connect/particulier' } + %a.btn-fc#btn-fcp{ href: '/france_connect/particulier' } = image_tag 'franceconnect_logo.png' %br @@ -15,13 +15,14 @@ %hr .text-left - = simple_form_for @user, url: user_session_path do |f| - = f.input :email - = f.input :password, label: 'Mot de passe', input_html: { value: @user.password } - - if devise_mapping.rememberable? - = f.input :remember_me, as: :boolean, label: 'Se souvenir de moi' - .text-center - = f.submit "Se connecter", class: 'btn btn-primary' + #new-user + = simple_form_for @user, url: user_session_path do |f| + = f.input :email + = f.input :password, label: 'Mot de passe', input_html: { value: @user.password } + - if devise_mapping.rememberable? + = f.input :remember_me, as: :boolean, label: 'Se souvenir de moi' + .text-center + = f.submit "Se connecter", class: 'btn btn-primary' - if @user.email != DemoEmails[:gestionnaire] && @user.email != DemoEmails[:admin] = render "users/shared/links" diff --git a/app/views/users/siret/_pro.html.haml b/app/views/users/siret/_pro.html.haml index 34fe7aaaf..b5686009e 100644 --- a/app/views/users/siret/_pro.html.haml +++ b/app/views/users/siret/_pro.html.haml @@ -2,7 +2,7 @@ .flag = image_tag(image_url(LOGO_NAME)) %br - %h2#titre_procedure.text-info + %h2#titre-procedure.text-info = @procedure.libelle %p diff --git a/app/views/users/siret/index.html.haml b/app/views/users/siret/index.html.haml index a56f21779..c189ce64e 100644 --- a/app/views/users/siret/index.html.haml +++ b/app/views/users/siret/index.html.haml @@ -1,3 +1,3 @@ -.container.center#users_siret_index +.container.center#users-siret-index .row = render partial: 'pro' diff --git a/spec/features/admin/connection_spec.rb b/spec/features/admin/connection_spec.rb index 58b256be7..9915669c1 100644 --- a/spec/features/admin/connection_spec.rb +++ b/spec/features/admin/connection_spec.rb @@ -6,7 +6,7 @@ feature 'Administrator connection' do visit new_administrateur_session_path end scenario 'administrator is on admin loggin page' do - expect(page).to have_css('#form_login.user_connexion_page') + expect(page).to have_css('#form-login.user_connexion_page') end context "admin fills form and log in" do @@ -25,15 +25,15 @@ feature 'Administrator connection' do end scenario 'it displays the menu' do expect(page).to have_css('a#profile') - expect(page).to have_css('#sign_out') + expect(page).to have_css('#sign-out') expect(page).to have_css('a.fa-sign-out') end - context 'when clicking on sign_out' do + context 'when clicking on sign-out' do before do stub_request(:get, "https://api.github.com/repos/sgmap/tps/releases/latest"). to_return(:status => 200, :body => '{"tag_name": "plip", "body": "blabla", "published_at": "2016-02-09T16:46:47Z"}', :headers => {}) - page.find_by_id('sign_out').find('a.fa-sign-out').click + page.find_by_id('sign-out').find('a.fa-sign-out').click end scenario 'admin is redireted to home page' do expect(page).to have_css('#landing') diff --git a/spec/features/backoffice/connection_spec.rb b/spec/features/backoffice/connection_spec.rb index 419e14853..603546fb5 100644 --- a/spec/features/backoffice/connection_spec.rb +++ b/spec/features/backoffice/connection_spec.rb @@ -30,7 +30,7 @@ feature 'when gestionnaire come to /backoffice and is not authenticated' do page.click_on 'Se connecter' end scenario 'he is redirected to /backoffice' do - expect(page).to have_css('#backoffice_index') + expect(page).to have_css('#backoffice-index') end end end diff --git a/spec/features/backoffice/index_show_procedure_spec.rb b/spec/features/backoffice/index_show_procedure_spec.rb index 33add73bd..d24910eca 100644 --- a/spec/features/backoffice/index_show_procedure_spec.rb +++ b/spec/features/backoffice/index_show_procedure_spec.rb @@ -22,28 +22,28 @@ feature 'As an Accompagnateur I can navigate and use each functionnality around context 'On index' do scenario 'Switching between procedures' do - page.all('#procedure_list a').first.click + page.all('#procedure-list a').first.click expect(page).to have_current_path(backoffice_dossiers_procedure_path(id: procedure_1.id.to_s), only_path: true) expect(page.find('#all_dossiers .count').text).to eq('30 dossiers') - page.all('#procedure_list a').last.click + page.all('#procedure-list a').last.click expect(page).to have_current_path(backoffice_dossiers_procedure_path(id: procedure_2.id.to_s), only_path: true) expect(page.find('#all_dossiers .count').text).to eq('22 dossiers') end scenario 'Searching with search bar', js: true do - page.find_by_id('search_area').trigger('click') + page.find_by_id('search-area').trigger('click') fill_in 'q', with: (procedure_1.dossiers.first.id + 14) - page.find_by_id('search_button').click + page.find_by_id('search-button').click page.find_by_id("tr_dossier_#{(procedure_1.dossiers.first.id + 14)}").click expect(page).to have_current_path("/backoffice/dossiers/#{(procedure_1.dossiers.first.id + 14)}") end scenario 'Following dossier' do - page.all('#procedure_list a').first.click + page.all('#procedure-list a').first.click expect(page.all('#follow_dossiers .smart-listing')[0]['data-item-count']).to eq ("0") page.find_by_id('all_dossiers').click - expect(page.all('#dossiers_list a').first.text).to eq('Suivre') - page.all('#dossiers_list a').first.click + expect(page.all('#dossiers-list a').first.text).to eq('Suivre') + page.all('#dossiers-list a').first.click expect(page.all('#follow_dossiers .smart-listing')[0]['data-item-count']).to eq ("1") end diff --git a/spec/features/backoffice/lateral_page_pref_list_dossier_backoffice_spec.rb b/spec/features/backoffice/lateral_page_pref_list_dossier_backoffice_spec.rb index 13c176b46..9a36bf116 100644 --- a/spec/features/backoffice/lateral_page_pref_list_dossier_backoffice_spec.rb +++ b/spec/features/backoffice/lateral_page_pref_list_dossier_backoffice_spec.rb @@ -17,20 +17,20 @@ feature 'usage of pref list dossier lateral panel', js: true do context 'when user enter good credentials' do scenario 'he is redirected to /backoffice' do - expect(page).to have_css('#backoffice_index') + expect(page).to have_css('#backoffice-index') end scenario 'lateral panel is masked' do - expect(page).to have_css('#pref_list_menu', visible: false) + expect(page).to have_css('#pref-list-menu', visible: false) end context 'when on click on pref list button' do before do - page.click_on 'pref_list_dossier_open_action' + page.click_on 'pref-list-dossier-open-action' end scenario 'lateral panel is appeared' do - expect(page).to have_css('#pref_list_menu') + expect(page).to have_css('#pref-list-menu') end context 'when on click on add attribut button' do @@ -65,12 +65,12 @@ feature 'usage of pref list dossier lateral panel', js: true do context 'when on click on close pref list button' do before do - page.click_on 'pref_list_dossier_close_action' + page.click_on 'pref-list-dossier-close-action' end scenario 'lateral panel is masked' do wait_for_ajax - expect(page).to have_css('#pref_list_menu', visible: false) + expect(page).to have_css('#pref-list-menu', visible: false) end end end diff --git a/spec/features/backoffice/lateral_page_pref_list_dossier_by_procedure_backoffice_spec.rb b/spec/features/backoffice/lateral_page_pref_list_dossier_by_procedure_backoffice_spec.rb index 0255d9a46..9ed134a75 100644 --- a/spec/features/backoffice/lateral_page_pref_list_dossier_by_procedure_backoffice_spec.rb +++ b/spec/features/backoffice/lateral_page_pref_list_dossier_by_procedure_backoffice_spec.rb @@ -17,7 +17,7 @@ feature 'usage of pref list dossier lateral panel by procedure', js: true do context 'when user enter good credentials' do scenario 'he is redirected to /backoffice/dossiers/' do - expect(page).to have_css('#backoffice_index') + expect(page).to have_css('#backoffice-index') end describe 'user navigate to dossiers list by procedure' do @@ -26,17 +26,17 @@ feature 'usage of pref list dossier lateral panel by procedure', js: true do end scenario 'lateral panel is masked' do - expect(page).to have_css('#pref_list_menu', visible: false) + expect(page).to have_css('#pref-list-menu', visible: false) end context 'when on click on pref list button' do before do - page.click_on 'pref_list_dossier_open_action' + page.click_on 'pref-list-dossier-open-action' end scenario 'lateral panel is appeared' do wait_for_ajax - expect(page).to have_css('#pref_list_menu') + expect(page).to have_css('#pref-list-menu') end context 'when on click on add attribut specific at the procedure button' do @@ -66,12 +66,12 @@ feature 'usage of pref list dossier lateral panel by procedure', js: true do context 'when on click on close pref list button' do before do - page.click_on 'pref_list_dossier_close_action' + page.click_on 'pref-list-dossier-close-action' end scenario 'lateral panel is masked' do wait_for_ajax - expect(page).to have_css('#pref_list_menu', visible: false) + expect(page).to have_css('#pref-list-menu', visible: false) end end end diff --git a/spec/features/backoffice/navigate_to_dossier_spec.rb b/spec/features/backoffice/navigate_to_dossier_spec.rb index b7f30467c..b9c2222fa 100644 --- a/spec/features/backoffice/navigate_to_dossier_spec.rb +++ b/spec/features/backoffice/navigate_to_dossier_spec.rb @@ -29,7 +29,7 @@ feature 'on backoffice page', js: true do end scenario 'it redirect to dossier page' do - expect(page).to have_css('#backoffice_dossier_show') + expect(page).to have_css('#backoffice-dossier-show') end end end @@ -45,7 +45,7 @@ feature 'on backoffice page', js: true do end scenario 'it redirect to dossier page' do - expect(page).to have_css('#backoffice_dossier_show') + expect(page).to have_css('#backoffice-dossier-show') end end end diff --git a/spec/features/backoffice/search_file_spec.rb b/spec/features/backoffice/search_file_spec.rb index d91ea8bbf..dc6baeb85 100644 --- a/spec/features/backoffice/search_file_spec.rb +++ b/spec/features/backoffice/search_file_spec.rb @@ -18,10 +18,10 @@ feature 'search file on gestionnaire backoffice' do visit backoffice_dossiers_url page.find_by_id(:q).set terms - page.find_by_id(:search_button).click + page.find_by_id("search-button").click end - it { expect(page).to have_css('#backoffice_search') } + it { expect(page).to have_css('#backoffice-search') } context 'when terms input is empty' do it { expect(page).to have_content('Aucun dossier') } diff --git a/spec/features/description_page/upload_piece_justificative_spec.rb b/spec/features/description_page/upload_piece_justificative_spec.rb index 4f999037c..bd8cffc8a 100644 --- a/spec/features/description_page/upload_piece_justificative_spec.rb +++ b/spec/features/description_page/upload_piece_justificative_spec.rb @@ -9,14 +9,14 @@ feature 'user is on description page' do visit users_dossier_description_path dossier - within('#new_user') do + within('#new-user') do page.find_by_id('user_email').set dossier.user.email page.find_by_id('user_password').set dossier.user.password page.click_on 'Se connecter' end end - it { expect(page).to have_css('#description_page') } + it { expect(page).to have_css('#description-page') } context 'he fill description fields' do before do diff --git a/spec/features/france_connect/france_connect_particulier_spec.rb b/spec/features/france_connect/france_connect_particulier_spec.rb index 01592e8af..1ed8ca15f 100644 --- a/spec/features/france_connect/france_connect_particulier_spec.rb +++ b/spec/features/france_connect/france_connect_particulier_spec.rb @@ -26,7 +26,7 @@ feature 'France Connect Particulier Connexion' do end scenario 'link to France Connect is present' do - expect(page).to have_css('a#btn_fcp') + expect(page).to have_css('a#btn-fcp') end context 'and click on france connect link' do @@ -49,7 +49,7 @@ feature 'France Connect Particulier Connexion' do context 'when is the first connexion' do before do - page.find_by_id('btn_fcp').click + page.find_by_id('btn-fcp').click end scenario 'he is redirected to france connect particulier page' do expect(page).to have_content('Nouvelle connexion') @@ -70,7 +70,7 @@ feature 'France Connect Particulier Connexion' do context 'when is not the first connexion' do before do create(:user, france_connect_information: france_connect_information) - page.find_by_id('btn_fcp').click + page.find_by_id('btn-fcp').click end scenario 'he is redirected to user dossiers page' do @@ -83,11 +83,11 @@ feature 'France Connect Particulier Connexion' do before do allow_any_instance_of(FranceConnectParticulierClient).to receive(:authorization_uri).and_return(france_connect_particulier_callback_path(code: code)) allow(FranceConnectService).to receive(:retrieve_user_informations_particulier) { raise Rack::OAuth2::Client::Error.new(500, error: 'Unknown') } - page.find_by_id('btn_fcp').click + page.find_by_id('btn-fcp').click end scenario 'he is redirected to login page' do - expect(page).to have_css('a#btn_fcp') + expect(page).to have_css('a#btn-fcp') end scenario 'error message is displayed' do diff --git a/spec/features/users/complete_demande_spec.rb b/spec/features/users/complete_demande_spec.rb index 6554a4004..2f1eb1d42 100644 --- a/spec/features/users/complete_demande_spec.rb +++ b/spec/features/users/complete_demande_spec.rb @@ -12,21 +12,21 @@ feature 'user path for dossier creation' do end scenario 'he is redirected on login page' do - expect(page).to have_css('#login_user') + expect(page).to have_css('#login-user') expect(page).to have_css('#logo_procedure') - expect(page).to have_css('#titre_procedure') + expect(page).to have_css('#titre-procedure') end context 'user sign_in' do before do - within('#new_user') do + within('#new-user') do page.find_by_id('user_email').set user.email page.find_by_id('user_password').set user.password page.click_on 'Se connecter' end end scenario 'redirects to siret page' do - expect(page).to have_css('#dossier_siret') + expect(page).to have_css('#dossier-siret') end context 'sets siret' do before do @@ -40,12 +40,12 @@ feature 'user path for dossier creation' do stub_request(:get, "https://api-dev.apientreprise.fr/v1/associations/#{siret}?token=#{SIADETOKEN}") .to_return(status: 404, body: '') - page.find_by_id('dossier_siret').set siret + page.find_by_id('dossier-siret').set siret page.click_on 'Valider' end scenario 'user is on page recap info entreprise' do - expect(page).to have_css('#recap_info_entreprise') + expect(page).to have_css('#recap-info-entreprise') end context 'when user would like change siret' do @@ -54,7 +54,7 @@ feature 'user path for dossier creation' do end scenario 'redirects to siret page' do - expect(page).to have_css('#dossier_siret') + expect(page).to have_css('#dossier-siret') end end @@ -64,7 +64,7 @@ feature 'user path for dossier creation' do page.find_by_id('etape_suivante').trigger('click') end scenario 'user is on description page' do - expect(page).to have_css('#description_page') + expect(page).to have_css('#description-page') end context 'user fill and validate description page' do before do @@ -72,7 +72,7 @@ feature 'user path for dossier creation' do page.find_by_id('suivant').trigger('click') end scenario 'user is on recap page' do - expect(page).to have_css('#users_recapitulatif_dossier_show') + expect(page).to have_css('#users-recapitulatif-dossier-show') end end end diff --git a/spec/features/users/dossier_creation_spec.rb b/spec/features/users/dossier_creation_spec.rb index 4adf0e190..34715a567 100644 --- a/spec/features/users/dossier_creation_spec.rb +++ b/spec/features/users/dossier_creation_spec.rb @@ -45,7 +45,7 @@ feature 'As a User I wanna create a dossier' do login_as user, scope: :user visit commencer_path(procedure_path: procedure_with_siret.path) expect(page).to have_current_path(users_dossier_path(procedure_with_siret.dossiers.last.id.to_s), only_path: true) - fill_in 'dossier_siret', with: siret + fill_in 'dossier-siret', with: siret stub_request(:get, "https://api-dev.apientreprise.fr/v2/etablissements/#{siret}?token=#{SIADETOKEN}") .to_return(status: 200, body: File.read('spec/support/files/etablissement.json')) stub_request(:get, "https://api-dev.apientreprise.fr/v2/entreprises/#{siren}?token=#{SIADETOKEN}") @@ -54,9 +54,9 @@ feature 'As a User I wanna create a dossier' do .to_return(status: 200, body: File.read('spec/support/files/exercices.json')) stub_request(:get, "https://api-dev.apientreprise.fr/v1/associations/#{siret}?token=#{SIADETOKEN}") .to_return(status: 404, body: '') - page.find_by_id('dossier_siret').set siret + page.find_by_id('dossier-siret').set siret page.find_by_id('submit-siret').trigger('click') - expect(page).to have_css('#recap_info_entreprise') + expect(page).to have_css('#recap-info-entreprise') find(:css, "#dossier_autorisation_donnees[value='1']").set(true) page.find_by_id('etape_suivante').trigger('click') expect(page).to have_current_path(users_dossier_carte_path(procedure_with_siret.dossiers.last.id.to_s), only_path: true) diff --git a/spec/features/users/dossier_edition_spec.rb b/spec/features/users/dossier_edition_spec.rb index 4dc3ccee7..13bbf29a0 100644 --- a/spec/features/users/dossier_edition_spec.rb +++ b/spec/features/users/dossier_edition_spec.rb @@ -14,7 +14,7 @@ feature 'As a User I want to edit a dossier I own' do context 'After sign_in, I can navigate through dossiers indexes and edit a dossier' do scenario 'After sign_in, I can see dossiers "à traiter" (default), and other indexes' do - expect(page.find('#a_traiter')['class'] ).to eq('active procedure_list_element') + expect(page.find('#a_traiter')['class'] ).to eq('active procedure-list-element') page.find_by_id('brouillon').click page.find_by_id('a_traiter').click page.find_by_id('en_instruction').click diff --git a/spec/features/users/dossier_index_spec.rb b/spec/features/users/dossier_index_spec.rb index 4d6ec1464..9db5bd1e3 100644 --- a/spec/features/users/dossier_index_spec.rb +++ b/spec/features/users/dossier_index_spec.rb @@ -24,30 +24,30 @@ xfeature 'As a User I want to sort and paginate dossiers', js: true do scenario 'Using sort' do visit "/users/dossiers?dossiers_smart_listing[sort][id]=asc" - expect(page.all(:css, '#dossiers_list tr')[1].text.split(" ").first).to eq(user.dossiers.first.id.to_s) - expect(page.all(:css, '#dossiers_list tr')[2].text.split(" ").first).to eq(user.dossiers.second.id.to_s) + expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq(user.dossiers.first.id.to_s) + expect(page.all(:css, '#dossiers-list tr')[2].text.split(" ").first).to eq(user.dossiers.second.id.to_s) visit "/users/dossiers?dossiers_smart_listing[sort][id]=desc" - expect(page.all(:css, '#dossiers_list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id + 50).to_s) - expect(page.all(:css, '#dossiers_list tr')[2].text.split(" ").first).to eq((user.dossiers.first.id + 49).to_s) + expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id + 50).to_s) + expect(page.all(:css, '#dossiers-list tr')[2].text.split(" ").first).to eq((user.dossiers.first.id + 49).to_s) visit "/users/dossiers?dossiers_smart_listing[sort][id]=asc" - expect(page.all(:css, '#dossiers_list tr')[1].text.split(" ").first).to eq(user.dossiers.first.id.to_s) - expect(page.all(:css, '#dossiers_list tr')[2].text.split(" ").first).to eq(user.dossiers.second.id.to_s) + expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq(user.dossiers.first.id.to_s) + expect(page.all(:css, '#dossiers-list tr')[2].text.split(" ").first).to eq(user.dossiers.second.id.to_s) end scenario 'Using pagination' do visit "/users/dossiers?dossiers_smart_listing[sort][id]=asc" - expect(page.all(:css, '#dossiers_list tr')[1].text.split(" ").first).to eq(user.dossiers.first.id.to_s) + expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq(user.dossiers.first.id.to_s) page.find('.next_page a').trigger('click') wait_for_ajax - expect(page.all(:css, '#dossiers_list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id + 10).to_s) + expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id + 10).to_s) page.find('.next_page a').trigger('click') wait_for_ajax - expect(page.all(:css, '#dossiers_list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id + 20).to_s) + expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id + 20).to_s) page.find('.prev a').trigger('click') wait_for_ajax page.find('.prev a').trigger('click') wait_for_ajax - expect(page.all(:css, '#dossiers_list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id).to_s) + expect(page.all(:css, '#dossiers-list tr')[1].text.split(" ").first).to eq((user.dossiers.first.id).to_s) end end diff --git a/spec/features/users/drawing_a_zone_with_freedraw_spec.rb b/spec/features/users/drawing_a_zone_with_freedraw_spec.rb index 57633a08b..1ecc5a0ee 100644 --- a/spec/features/users/drawing_a_zone_with_freedraw_spec.rb +++ b/spec/features/users/drawing_a_zone_with_freedraw_spec.rb @@ -12,11 +12,11 @@ feature 'drawing a zone with freedraw' do end scenario 'he is redirected to login page' do - expect(page).to have_css('#login_user') + expect(page).to have_css('#login-user') end scenario 'he logs in and he is redirected to carte page', vcr: { cassette_name: 'drawing_a_zone_with_freedraw_redirected_to_carte_page' } do - within('#new_user') do + within('#new-user') do page.find_by_id('user_email').set user.email page.find_by_id('user_password').set user.password page.click_on 'Se connecter' @@ -45,7 +45,7 @@ feature 'drawing a zone with freedraw' do let(:module_api_carto) { create(:module_api_carto) } scenario 'he is redirect to user dossiers index' do - expect(page).to have_css('#users_index') + expect(page).to have_css('#users-index') end scenario 'alert message is present' do diff --git a/spec/features/users/list_dossiers_spec.rb b/spec/features/users/list_dossiers_spec.rb index 1ae783994..7419a03d4 100644 --- a/spec/features/users/list_dossiers_spec.rb +++ b/spec/features/users/list_dossiers_spec.rb @@ -12,7 +12,7 @@ feature 'user access to the list of his dossier' do last_updated_dossier.procedure.update_column(:libelle, 'PLIP') visit new_user_session_path - within('#new_user') do + within('#new-user') do page.find_by_id('user_email').set user.email page.find_by_id('user_password').set user.password page.click_on 'Se connecter' @@ -36,7 +36,7 @@ feature 'user access to the list of his dossier' do page.find("#tr_dossier_#{dossier1.id}").click end scenario 'user is redirected to dossier page' do - expect(page).to have_css('#users_recapitulatif_dossier_show') + expect(page).to have_css('#users-recapitulatif-dossier-show') end end end diff --git a/spec/features/users/onglets_link_spec.rb b/spec/features/users/onglets_link_spec.rb index 7454df1e4..a3fef2dc3 100644 --- a/spec/features/users/onglets_link_spec.rb +++ b/spec/features/users/onglets_link_spec.rb @@ -27,7 +27,7 @@ feature 'on click on tabs button' do end scenario 'it redirect to users dossier termine' do - expect(page).to have_css('#users_index') + expect(page).to have_css('#users-index') end end @@ -38,7 +38,7 @@ feature 'on click on tabs button' do end scenario 'it redirect to users dossier termine' do - expect(page).to have_css('#users_index') + expect(page).to have_css('#users-index') end end @@ -49,7 +49,7 @@ feature 'on click on tabs button' do end scenario 'it redirect to users dossier termine' do - expect(page).to have_css('#users_index') + expect(page).to have_css('#users-index') end end @@ -60,7 +60,7 @@ feature 'on click on tabs button' do end scenario 'it redirect to users dossier invites' do - expect(page).to have_css('#users_index') + expect(page).to have_css('#users-index') end end end diff --git a/spec/features/users/start_demande_spec.rb b/spec/features/users/start_demande_spec.rb index e3b8014b0..a908412a8 100644 --- a/spec/features/users/start_demande_spec.rb +++ b/spec/features/users/start_demande_spec.rb @@ -11,11 +11,11 @@ feature 'user arrive on siret page' do visit new_users_dossiers_path(procedure_id: procedure.id) end scenario 'he is redirected to login page' do - expect(page).to have_css('#login_user') + expect(page).to have_css('#login-user') end context 'when he enter login information' do before do - within('#new_user') do + within('#new-user') do page.find_by_id('user_email').set user.email page.find_by_id('user_password').set user.password page.click_on 'Se connecter' @@ -35,12 +35,12 @@ feature 'user arrive on siret page' do stub_request(:get, "https://api-dev.apientreprise.fr/v1/associations/#{siret}?token=#{SIADETOKEN}") .to_return(status: 404, body: '') - page.find_by_id('dossier_siret').set siret + page.find_by_id('dossier-siret').set siret page.click_on 'Valider' end scenario 'he is redirected to recap info entreprise page' do wait_for_ajax - expect(page).to have_css('#recap_info_entreprise') + expect(page).to have_css('#recap-info-entreprise') end end end diff --git a/spec/views/backoffice/dossiers/show.html.html_spec.rb b/spec/views/backoffice/dossiers/show.html.html_spec.rb index 4003a65ef..865cb28ef 100644 --- a/spec/views/backoffice/dossiers/show.html.html_spec.rb +++ b/spec/views/backoffice/dossiers/show.html.html_spec.rb @@ -20,7 +20,7 @@ describe 'backoffice/dossiers/show.html.haml', type: :view do it 'button Modifier les document est present' do expect(rendered).not_to have_content('Modifier les documents') - expect(rendered).not_to have_css('#UploadPJmodal') + expect(rendered).not_to have_css('#upload-pj-modal') end it 'enterprise informations are present' do @@ -28,7 +28,7 @@ describe 'backoffice/dossiers/show.html.haml', type: :view do end it 'dossier informations are present' do - expect(rendered).to have_selector('#infos_dossier') + expect(rendered).to have_selector('#infos-dossiers') end context 'edit link are present' do diff --git a/spec/views/users/recapitulatif/show.html.haml_spec.rb b/spec/views/users/recapitulatif/show.html.haml_spec.rb index 3503fad53..ce0e52275 100644 --- a/spec/views/users/recapitulatif/show.html.haml_spec.rb +++ b/spec/views/users/recapitulatif/show.html.haml_spec.rb @@ -17,7 +17,7 @@ describe 'users/recapitulatif/show.html.haml', type: :view do end it 'la section infos dossier est présente' do - expect(rendered).to have_selector('#infos_dossier') + expect(rendered).to have_selector('#infos-dossiers') end it 'le flux de commentaire est présent' do @@ -73,7 +73,7 @@ describe 'users/recapitulatif/show.html.haml', type: :view do it 'button Modifier les document est present' do expect(rendered).to have_content('Modifier les documents') - expect(rendered).to have_css('#UploadPJmodal') + expect(rendered).to have_css('#upload-pj-modal') end end diff --git a/spec/views/users/sessions/new.html.haml_spec.rb b/spec/views/users/sessions/new.html.haml_spec.rb index 6e1dbeec9..cc7880f45 100644 --- a/spec/views/users/sessions/new.html.haml_spec.rb +++ b/spec/views/users/sessions/new.html.haml_spec.rb @@ -18,8 +18,8 @@ describe 'users/sessions/new.html.haml', type: :view do render end - it { expect(rendered).to have_selector('#form_login #logo_procedure') } - it { expect(rendered).to have_selector('#form_login #titre_procedure') } + it { expect(rendered).to have_selector('#form-login #logo_procedure') } + it { expect(rendered).to have_selector('#form-login #titre-procedure') } it { expect(rendered).to have_content(dossier.procedure.libelle) } it { expect(rendered).to have_content(dossier.procedure.description) } end @@ -29,6 +29,6 @@ describe 'users/sessions/new.html.haml', type: :view do render end - it { expect(rendered).to have_selector('#form_login #logo_tps') } + it { expect(rendered).to have_selector('#form-login #logo_tps') } end end diff --git a/spec/views/users/siret/index.html.haml_spec.rb b/spec/views/users/siret/index.html.haml_spec.rb index 49de45ecc..e489bec08 100644 --- a/spec/views/users/siret/index.html.haml_spec.rb +++ b/spec/views/users/siret/index.html.haml_spec.rb @@ -21,7 +21,7 @@ describe 'users/siret/index.html.haml', type: :view do end it 'le titre de la procédure' do - expect(rendered).to have_selector('#titre_procedure') + expect(rendered).to have_selector('#titre-procedure') end context 'stockage de l\'ID de la procédure dans un champs hidden' do From 5d4dcf8ec775b5549581a561031db157b2c82eba Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 19 Apr 2017 11:35:34 +0200 Subject: [PATCH 053/102] Don't use line blocks --- app/assets/stylesheets/pieces_justificatives_fields.scss | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pieces_justificatives_fields.scss b/app/assets/stylesheets/pieces_justificatives_fields.scss index 7cf6d8719..144c0fbe2 100644 --- a/app/assets/stylesheets/pieces_justificatives_fields.scss +++ b/app/assets/stylesheets/pieces_justificatives_fields.scss @@ -1,3 +1,5 @@ .pieces-justificatives-fields { - .form-inline > .form-group { vertical-align: top; } + .form-inline > .form-group { + vertical-align: top; + } } From d8cc41140ba24c3d008a53f9ae9684bcfee55482 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 14:40:39 +0200 Subject: [PATCH 054/102] Remove an unexpected blank line --- app/assets/stylesheets/application.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 135e0a776..6e074f1ba 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -212,7 +212,6 @@ div.pagination { font-size: 16px !important; margin-right: 0px !important; } - } .no-padding { From 5937e2a35fa7ada120931d66727d24e08b535cda Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 16:31:05 +0200 Subject: [PATCH 055/102] Add the scss_lint gem --- Gemfile | 1 + Gemfile.lock | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/Gemfile b/Gemfile index 24f75ba73..945efbb3a 100644 --- a/Gemfile +++ b/Gemfile @@ -124,6 +124,7 @@ group :development do gem 'rack-handlers' gem 'xray-rails' gem 'haml-lint' + gem 'scss_lint', require: false end group :development, :test do diff --git a/Gemfile.lock b/Gemfile.lock index b6a8ceacf..d2da50210 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -550,6 +550,9 @@ GEM scenic (1.3.0) activerecord (>= 4.0.0) railties (>= 4.0.0) + scss_lint (0.53.0) + rake (>= 0.9, < 13) + sass (~> 3.4.20) sdoc (0.4.2) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) @@ -715,6 +718,7 @@ DEPENDENCIES rspec-rails (~> 3.0) sass-rails (~> 5.0) scenic + scss_lint sdoc (~> 0.4.0) select2-rails sentry-raven From 525d23528d5966858a5d5e50f0e490318c4a5c30 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 12 Apr 2017 14:56:32 +0200 Subject: [PATCH 056/102] Add .scss-lint.yml --- .scss-lint.yml | 256 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 .scss-lint.yml diff --git a/.scss-lint.yml b/.scss-lint.yml new file mode 100644 index 000000000..918c14c70 --- /dev/null +++ b/.scss-lint.yml @@ -0,0 +1,256 @@ +linters: + BangFormat: + enabled: true + space_before_bang: true + space_after_bang: false + + BemDepth: + enabled: false + max_elements: 1 + + BorderZero: + enabled: true + convention: none + + # To enable later + ChainedClasses: + enabled: false + + ColorKeyword: + enabled: true + + # To enable later + ColorVariable: + enabled: false + + Comment: + enabled: true + style: silent + + DebugStatement: + enabled: true + + DeclarationOrder: + enabled: true + + DisableLinterReason: + enabled: false + + DuplicateProperty: + enabled: true + + ElsePlacement: + enabled: true + style: same_line + + EmptyLineBetweenBlocks: + enabled: true + ignore_single_line_blocks: false + + EmptyRule: + enabled: true + + ExtendDirective: + enabled: false + + FinalNewline: + enabled: true + present: true + + HexLength: + enabled: true + style: long + + HexNotation: + enabled: true + style: uppercase + + HexValidation: + enabled: true + + # To enable later + IdSelector: + enabled: false + + # To enable later + ImportantRule: + enabled: false + + ImportPath: + enabled: false + leading_underscore: false + filename_extension: false + + Indentation: + enabled: true + allow_non_nested_indentation: false + character: space + width: 2 + + LeadingZero: + enabled: true + style: include_zero + + MergeableSelector: + enabled: false + force_nesting: true + + NameFormat: + enabled: true + allow_leading_underscore: false + convention: hyphenated_lowercase + + # To enable later + NestingDepth: + enabled: false + max_depth: 3 + ignore_parent_selectors: false + + # To enable later + PlaceholderInExtend: + enabled: false + + PrivateNamingConvention: + enabled: false + prefix: _ + + PropertyCount: + enabled: false + include_nested: false + max_properties: 10 + + PropertySortOrder: + enabled: false + ignore_unspecified: false + min_properties: 2 + separate_groups: false + + PropertySpelling: + enabled: true + extra_properties: [] + disabled_properties: [] + + # To enable later + PropertyUnits: + enabled: false + global: [ + 'ch', 'em', 'ex', 'rem', # Font-relative lengths + 'cm', 'in', 'mm', 'pc', 'pt', 'px', 'q', # Absolute lengths + 'vh', 'vw', 'vmin', 'vmax', # Viewport-percentage lengths + 'deg', 'grad', 'rad', 'turn', # Angle + 'ms', 's', # Duration + 'Hz', 'kHz', # Frequency + 'dpi', 'dpcm', 'dppx', # Resolution + '%'] # Other + properties: {} + + PseudoElement: + enabled: true + + # To enable later + QualifyingElement: + enabled: false + allow_element_with_attribute: false + allow_element_with_class: false + allow_element_with_id: false + + # To enable later + SelectorDepth: + enabled: false + max_depth: 3 + + SelectorFormat: + enabled: true + convention: hyphenated_lowercase + + Shorthand: + enabled: false + allowed_shorthands: [1, 2, 3, 4] + + SingleLinePerProperty: + enabled: true + allow_single_line_rule_sets: false + + SingleLinePerSelector: + enabled: true + + SpaceAfterComma: + enabled: true + style: one_space + + SpaceAfterComment: + enabled: true + style: one_space + allow_empty_comments: true + + SpaceAfterPropertyColon: + enabled: true + style: one_space + + SpaceAfterPropertyName: + enabled: true + + SpaceAfterVariableColon: + enabled: true + style: one_space + + SpaceAfterVariableName: + enabled: true + + SpaceAroundOperator: + enabled: true + style: one_space + + SpaceBeforeBrace: + enabled: true + style: space + allow_single_line_padding: false + + SpaceBetweenParens: + enabled: true + spaces: 0 + + StringQuotes: + enabled: true + style: double_quotes + + TrailingSemicolon: + enabled: true + + TrailingWhitespace: + enabled: true + + TrailingZero: + enabled: true + + # To enable later + TransitionAll: + enabled: false + + UnnecessaryMantissa: + enabled: true + + UnnecessaryParentReference: + enabled: true + + UrlFormat: + enabled: true + + UrlQuotes: + enabled: true + + VariableForProperty: + enabled: false + properties: [] + + VendorPrefix: + enabled: true + identifier_list: base + additional_identifiers: [] + excluded_identifiers: [] + + ZeroUnit: + enabled: false + + Compass::*: + enabled: false From 301f12618b071df321f67d8b233d713c7ad1668c Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 11 Apr 2017 17:20:23 +0200 Subject: [PATCH 057/102] Add scss-lint to .circleci/config.yml --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6d340f0ef..90725ad32 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -56,6 +56,9 @@ jobs: - run: name: Run haml-lint command: bundle exec haml-lint app/views/ + - run: + name: Run scss-lint + command: bundle exec scss-lint app/assets/stylesheets/ - add_ssh_keys: fingerprints: - "0a:67:42:7d:7e:b7:e1:3c:48:8f:bf:68:10:51:a8:44" From 01f894316cd0002c2547465a1894fc749279930a Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 5 Apr 2017 13:46:04 +0200 Subject: [PATCH 058/102] Rename _variables.scss to _constants.scss --- app/assets/stylesheets/{_variables.scss => _constants.scss} | 2 +- app/assets/stylesheets/_turbolinks.scss | 2 +- app/assets/stylesheets/application.scss | 2 +- app/assets/stylesheets/default_data_block.scss | 2 +- app/assets/stylesheets/navbar.scss | 2 +- app/assets/stylesheets/users.scss | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename app/assets/stylesheets/{_variables.scss => _constants.scss} (70%) diff --git a/app/assets/stylesheets/_variables.scss b/app/assets/stylesheets/_constants.scss similarity index 70% rename from app/assets/stylesheets/_variables.scss rename to app/assets/stylesheets/_constants.scss index 701b59ca1..119b9eaea 100644 --- a/app/assets/stylesheets/_variables.scss +++ b/app/assets/stylesheets/_constants.scss @@ -1,5 +1,5 @@ // colors $light-blue: #F2F6FA; -// Bootstrap variables +// Bootstrap constants $font-size-base: 16px; diff --git a/app/assets/stylesheets/_turbolinks.scss b/app/assets/stylesheets/_turbolinks.scss index 3a6401063..436f0541c 100644 --- a/app/assets/stylesheets/_turbolinks.scss +++ b/app/assets/stylesheets/_turbolinks.scss @@ -1,4 +1,4 @@ -@import "variables"; +@import "constants"; .turbolinks-progress-bar { background-color: $light-blue; diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 6e074f1ba..adf15f626 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -22,7 +22,7 @@ // = require select2 // = require select2-bootstrap -@import "variables"; +@import "constants"; @import "bootstrap-sprockets"; @import "bootstrap"; diff --git a/app/assets/stylesheets/default_data_block.scss b/app/assets/stylesheets/default_data_block.scss index 339af02f8..1f37e839f 100644 --- a/app/assets/stylesheets/default_data_block.scss +++ b/app/assets/stylesheets/default_data_block.scss @@ -1,4 +1,4 @@ -@import "variables"; +@import "constants"; .default-data-block { font-family: Arial; diff --git a/app/assets/stylesheets/navbar.scss b/app/assets/stylesheets/navbar.scss index 612532c27..857b64d8f 100644 --- a/app/assets/stylesheets/navbar.scss +++ b/app/assets/stylesheets/navbar.scss @@ -1,4 +1,4 @@ -@import "variables"; +@import "constants"; #header { top: 0; diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss index 393083a74..08f0c5f10 100644 --- a/app/assets/stylesheets/users.scss +++ b/app/assets/stylesheets/users.scss @@ -1,4 +1,4 @@ -@import "variables"; +@import "constants"; #users-index, #admins-index { From 8f2ef4e25459f8dd9ede327ff6f7f0356d3bba36 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:38:26 +0200 Subject: [PATCH 059/102] Add the colors stylesheet --- app/assets/stylesheets/_colors.scss | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 app/assets/stylesheets/_colors.scss diff --git a/app/assets/stylesheets/_colors.scss b/app/assets/stylesheets/_colors.scss new file mode 100644 index 000000000..0d72dde62 --- /dev/null +++ b/app/assets/stylesheets/_colors.scss @@ -0,0 +1,5 @@ +$blue: #4393F3; +$light-blue: rgba(61, 149, 236, 0.8); +$black: #333333; +$grey: #999999; +$light-grey: #F8F8F8; From 40d49aee1fb2fef45f38c691be882b6f059a7b2f Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:37:50 +0200 Subject: [PATCH 060/102] Add the Muli Regular and Bold fonts --- app/assets/fonts/Muli-Bold.woff | Bin 0 -> 43716 bytes app/assets/fonts/Muli-Regular.woff | Bin 0 -> 43636 bytes app/assets/stylesheets/fonts.scss | 13 +++++++++++++ config/application.rb | 2 ++ 4 files changed, 15 insertions(+) create mode 100644 app/assets/fonts/Muli-Bold.woff create mode 100644 app/assets/fonts/Muli-Regular.woff create mode 100644 app/assets/stylesheets/fonts.scss diff --git a/app/assets/fonts/Muli-Bold.woff b/app/assets/fonts/Muli-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..fc7a6fa82b97136d149d5d96113463724b25199e GIT binary patch literal 43716 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/Muli-Regular.woff b/app/assets/fonts/Muli-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..f61ecf83245ef62d6c4a40beac2dee339734684f GIT binary patch literal 43636 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

    enzuRujZ0+8*3jaG)2Rf?yii#&^q^@q7>Z~}GE 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 a-@1XNcOw&n%VyRTHU<|L02>1;5&!@W6soBJ literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/fonts.scss b/app/assets/stylesheets/fonts.scss new file mode 100644 index 000000000..edc222672 --- /dev/null +++ b/app/assets/stylesheets/fonts.scss @@ -0,0 +1,13 @@ +@font-face { + font-family: "Muli"; + src: asset-url("Muli-Regular.woff") format("woff"); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: "Muli"; + src: asset-url("Muli-Bold.woff") format("woff"); + font-weight: bold; + font-style: normal; +} diff --git a/config/application.rb b/config/application.rb index b3c5dc10c..1c82112d2 100644 --- a/config/application.rb +++ b/config/application.rb @@ -23,6 +23,8 @@ module TPS config.autoload_paths += %W(#{config.root}/lib #{config.root}/app/validators #{config.root}/app/facades) config.assets.paths << Rails.root.join('app', 'assets', 'javascript') + config.assets.paths << Rails.root.join('app', 'assets', 'fonts') + config.assets.precompile += %w(.woff) if Rails.env.production? URL = "https://tps.apientreprise.fr/" From 3696d3613a1dd922c20ae1fb9a94b57c33c92d9f Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:38:19 +0200 Subject: [PATCH 061/102] Add the typography stylesheet --- app/assets/stylesheets/_typography.scss | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/assets/stylesheets/_typography.scss diff --git a/app/assets/stylesheets/_typography.scss b/app/assets/stylesheets/_typography.scss new file mode 100644 index 000000000..351aac902 --- /dev/null +++ b/app/assets/stylesheets/_typography.scss @@ -0,0 +1,6 @@ +@import "colors"; + +%new-type { + font-family: "Muli"; + color: $black; +} From 8dcf0af56d12997dbaf0d927630b2369f721102e Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:38:42 +0200 Subject: [PATCH 062/102] Add the mixins stylesheet --- app/assets/stylesheets/_mixins.scss | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 app/assets/stylesheets/_mixins.scss diff --git a/app/assets/stylesheets/_mixins.scss b/app/assets/stylesheets/_mixins.scss new file mode 100644 index 000000000..6e40c4a78 --- /dev/null +++ b/app/assets/stylesheets/_mixins.scss @@ -0,0 +1,9 @@ +@mixin horizontal-padding($value) { + padding-left: $value; + padding-right: $value; +} + +@mixin vertical-padding($value) { + padding-top: $value; + padding-bottom: $value; +} From 5c1aad2e4fec360e36cc3428b778cadc4d123b4d Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:38:50 +0200 Subject: [PATCH 063/102] Add the placeholders stylesheet --- app/assets/stylesheets/_placeholders.scss | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 app/assets/stylesheets/_placeholders.scss diff --git a/app/assets/stylesheets/_placeholders.scss b/app/assets/stylesheets/_placeholders.scss new file mode 100644 index 000000000..71870ccec --- /dev/null +++ b/app/assets/stylesheets/_placeholders.scss @@ -0,0 +1,14 @@ +%horizontal-list { + list-style-type: none; + margin: 0; + padding: 0; + font-size: 0px; +} + +%horizontal-list-item { + display: inline-block; + + &:last-of-type { + margin-right: 0; + } +} From e605be924622a599237526450f01b582408dd602 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:36:06 +0200 Subject: [PATCH 064/102] Add the new_application layout --- app/views/layouts/new_application.html.haml | 35 +++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 app/views/layouts/new_application.html.haml diff --git a/app/views/layouts/new_application.html.haml b/app/views/layouts/new_application.html.haml new file mode 100644 index 000000000..4241c648d --- /dev/null +++ b/app/views/layouts/new_application.html.haml @@ -0,0 +1,35 @@ +%html + %head + %meta{ "http-equiv" => "Content-Type", :content => "text/html; charset=UTF-8" } + %meta{ "http-equiv" => "X-UA-Compatible", :content => "IE=edge"} + %meta{ :name => "turbolinks-cache-control", :content => "no-cache" } + = csrf_meta_tags + = action_cable_meta_tag + + %title + = t("dynamics.page_title") + + = stylesheet_link_tag "application", :media => "all", "data-turbolinks-track" => true + = stylesheet_link_tag "print", :media => "print", "data-turbolinks-track" => true + + %body + = render :partial => "layouts/support_navigator_banner" + = render :partial => "layouts/ie_lt_10" + #beta{class:(Rails.env == "production" ? "" : "beta_staging")} + - if Rails.env == "production" + Beta + - else + Env Test + + = render partial: "layouts/flash_messages" + = yield + + = render :partial => "layouts/switch_devise_profile_module" + = render :partial => "layouts/notifications_alert" + + = render partial: "layouts/google_analytics" + + = javascript_include_tag "application", "data-turbolinks-track" => true + - if Rails.env == "test" + %script{ :type => "text/javascript"} + (typeof jQuery !== "undefined") && (jQuery.fx.off = true); From 336e6120a689c0b864a868dc70f95e4c6ffe1aa0 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:37:16 +0200 Subject: [PATCH 065/102] Add the new header --- app/assets/images/header/logo-tps.svg | 1 + app/assets/stylesheets/_constants.scss | 2 + app/assets/stylesheets/header.scss | 53 +++++++++++++++++++++ app/views/layouts/_new_header.haml | 7 +++ app/views/layouts/new_application.html.haml | 1 + 5 files changed, 64 insertions(+) create mode 100644 app/assets/images/header/logo-tps.svg create mode 100644 app/assets/stylesheets/header.scss create mode 100644 app/views/layouts/_new_header.haml diff --git a/app/assets/images/header/logo-tps.svg b/app/assets/images/header/logo-tps.svg new file mode 100644 index 000000000..fe6557db5 --- /dev/null +++ b/app/assets/images/header/logo-tps.svg @@ -0,0 +1 @@ +C03A1FFC-B3DD-48D2-8111-A47EEA63E68F \ No newline at end of file diff --git a/app/assets/stylesheets/_constants.scss b/app/assets/stylesheets/_constants.scss index 119b9eaea..1208ef340 100644 --- a/app/assets/stylesheets/_constants.scss +++ b/app/assets/stylesheets/_constants.scss @@ -3,3 +3,5 @@ $light-blue: #F2F6FA; // Bootstrap constants $font-size-base: 16px; + +$page-width: 1040px; diff --git a/app/assets/stylesheets/header.scss b/app/assets/stylesheets/header.scss new file mode 100644 index 000000000..fdc9e81c8 --- /dev/null +++ b/app/assets/stylesheets/header.scss @@ -0,0 +1,53 @@ +@import "constants"; +@import "colors"; +@import "mixins"; +@import "typography"; + +// FIXME: Rename when the header is generalized +.new-header { + @extend %new-type; + height: 72px; + background-color: #FFFFFF; + // FIXME: Delete when the header is generalized + margin-top: -60px; +} + +.header-inner-content { + width: $page-width; + margin: 0 auto; +} + +.header-logo { + margin-top: 17px; +} + +$header-login-button-height: 36px; +$header-login-button-border-size: 1px; + +.header-login-button { + @include horizontal-padding(16px); + + display: inline-block; + height: $header-login-button-height; + line-height: $header-login-button-height - (2 * $header-login-button-border-size); + border-radius: $header-login-button-height; + border: $header-login-button-border-size solid $blue; + color: $blue; + font-size: 14px; + margin-top: 18px; + + &:hover { + color: #FFFFFF; + text-decoration: none; + background-color: $light-blue; + } + + &:focus { + color: $blue; + text-decoration: none; + } + + &:hover:focus { + color: #FFFFFF; + } +} diff --git a/app/views/layouts/_new_header.haml b/app/views/layouts/_new_header.haml new file mode 100644 index 000000000..1f9049ce7 --- /dev/null +++ b/app/views/layouts/_new_header.haml @@ -0,0 +1,7 @@ +.new-header + .header-inner-content + %img{ src: image_url("header/logo-tps.svg"), class: "header-logo pull-left" } + + = link_to "Connexion", new_user_session_path, :class => "header-login-button pull-right" + + .clear-fix diff --git a/app/views/layouts/new_application.html.haml b/app/views/layouts/new_application.html.haml index 4241c648d..0dbeee052 100644 --- a/app/views/layouts/new_application.html.haml +++ b/app/views/layouts/new_application.html.haml @@ -21,6 +21,7 @@ - else Env Test + = render partial: "layouts/new_header" = render partial: "layouts/flash_messages" = yield From f9b446966032e7770439c785f22b7579ff653476 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:37:37 +0200 Subject: [PATCH 066/102] Add the new footer --- .../images/footer/logo-beta-gouv-fr.svg | 1 + app/assets/images/footer/logo-rf.svg | 1 + app/assets/stylesheets/new_footer.scss | 69 +++++++++++++++++++ app/views/layouts/_new_footer.html.haml | 35 ++++++++++ app/views/layouts/new_application.html.haml | 1 + 5 files changed, 107 insertions(+) create mode 100644 app/assets/images/footer/logo-beta-gouv-fr.svg create mode 100644 app/assets/images/footer/logo-rf.svg create mode 100644 app/assets/stylesheets/new_footer.scss create mode 100644 app/views/layouts/_new_footer.html.haml diff --git a/app/assets/images/footer/logo-beta-gouv-fr.svg b/app/assets/images/footer/logo-beta-gouv-fr.svg new file mode 100644 index 000000000..b393c3d34 --- /dev/null +++ b/app/assets/images/footer/logo-beta-gouv-fr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/footer/logo-rf.svg b/app/assets/images/footer/logo-rf.svg new file mode 100644 index 000000000..283fe4c57 --- /dev/null +++ b/app/assets/images/footer/logo-rf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/stylesheets/new_footer.scss b/app/assets/stylesheets/new_footer.scss new file mode 100644 index 000000000..ffdaa9e6b --- /dev/null +++ b/app/assets/stylesheets/new_footer.scss @@ -0,0 +1,69 @@ +@import "constants"; +@import "mixins"; +@import "placeholders"; +@import "typography"; + +.footer { + @extend %new-type; + @include vertical-padding(72px); + background-color: $light-grey; +} + +.footer-inner-content { + width: $page-width; + margin: 0 auto; +} + +.footer-columns { + @extend %horizontal-list; +} + +$footer-column-width: 320px; +$footer-column-count: 3; + +.footer-column { + @extend %horizontal-list-item; + width: $footer-column-width; + margin-right: calc((#{$page-width} - (#{$footer-column-width} * #{$footer-column-count})) / (#{$footer-column-count} - 1)); + font-size: 14px; + vertical-align: top; +} + +.footer-logos, +.footer-links { + list-style-type: none; + padding: 0; + margin: 0; +} + +.footer-link { + margin-bottom: 14px; + + &:last-of-type { + margin-bottom: 0; + } +} + +.footer-logo:hover { + opacity: 0.8; +} + +.footer-logo-rf { + width: 75px; + margin-bottom: 14px; +} + +.footer-logo-beta-gouv-fr { + width: 190px; +} + +.footer-link a { + color: $black; + text-decoration: none; + + &:hover, + &:focus { + color: $blue; + text-decoration: none; + } +} diff --git a/app/views/layouts/_new_footer.html.haml b/app/views/layouts/_new_footer.html.haml new file mode 100644 index 000000000..806541020 --- /dev/null +++ b/app/views/layouts/_new_footer.html.haml @@ -0,0 +1,35 @@ +.footer + .footer-inner-content + %ul.footer-columns + %li.footer-column + %ul.footer-logos + %li + = link_to image_tag("footer/logo-rf.svg", + :class => "footer-logo footer-logo-rf"), + "http://www.gouvernement.fr/" + %li + = link_to image_tag("footer/logo-beta-gouv-fr.svg", + :class => "footer-logo footer-logo-beta-gouv-fr"), + "https://beta.gouv.fr/" + + %li.footer-column + %ul.footer-links + %li.footer-link + = link_to "SGMAP", "http://www.modernisation.gouv.fr/le-sgmap", :class => "footer-link" + %li.footer-link + = link_to "Nouveautés", "https://github.com/sgmap/tps/releases", :class => "footer-link" + %li.footer-link + = link_to "Statistiques", stats_path, :class => "footer-link" + %li.footer-link + = link_to "Accès ancienne plateforme de test", "https://tps-dev.apientreprise.fr/", :class => "footer-link" + + %li.footer-column + %ul.footer-links + %li.footer-link + = link_to "Contact", + "mailto:#{t('dynamics.contact_email')}", + :class => "footer-link" + %li.footer-link + = link_to "Mentions légales", cgu_path, :class => "footer-link" + %li.footer-link + = link_to "CGU", cgu_path, :class => "footer-link" diff --git a/app/views/layouts/new_application.html.haml b/app/views/layouts/new_application.html.haml index 0dbeee052..7cb12b8ca 100644 --- a/app/views/layouts/new_application.html.haml +++ b/app/views/layouts/new_application.html.haml @@ -28,6 +28,7 @@ = render :partial => "layouts/switch_devise_profile_module" = render :partial => "layouts/notifications_alert" + = render partial: "layouts/new_footer" = render partial: "layouts/google_analytics" = javascript_include_tag "application", "data-turbolinks-track" => true From e504531ca0f4421636651a3ff7a24cef0f2a620f Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:41:13 +0200 Subject: [PATCH 067/102] Use the new_application layout for the landing page --- app/controllers/root_controller.rb | 2 +- app/views/layouts/new_application.html.haml | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb index 61500da6b..ec123d601 100644 --- a/app/controllers/root_controller.rb +++ b/app/controllers/root_controller.rb @@ -39,6 +39,6 @@ class RootController < ApplicationController @demo_environment_host = "https://tps-dev.apientreprise.fr" unless Rails.env.development? - render 'landing' + render 'landing', :layout => 'new_application' end end diff --git a/app/views/layouts/new_application.html.haml b/app/views/layouts/new_application.html.haml index 7cb12b8ca..9908098f3 100644 --- a/app/views/layouts/new_application.html.haml +++ b/app/views/layouts/new_application.html.haml @@ -1,7 +1,7 @@ %html %head %meta{ "http-equiv" => "Content-Type", :content => "text/html; charset=UTF-8" } - %meta{ "http-equiv" => "X-UA-Compatible", :content => "IE=edge"} + %meta{ "http-equiv" => "X-UA-Compatible", :content => "IE=edge" } %meta{ :name => "turbolinks-cache-control", :content => "no-cache" } = csrf_meta_tags = action_cable_meta_tag @@ -9,13 +9,17 @@ %title = t("dynamics.page_title") + = favicon_link_tag(image_url("favicons/16x16.png"), type: "image/png", sizes: "16x16") + = favicon_link_tag(image_url("favicons/32x32.png"), type: "image/png", sizes: "32x32") + = favicon_link_tag(image_url("favicons/96x96.png"), type: "image/png", sizes: "96x96") + = stylesheet_link_tag "application", :media => "all", "data-turbolinks-track" => true = stylesheet_link_tag "print", :media => "print", "data-turbolinks-track" => true %body = render :partial => "layouts/support_navigator_banner" = render :partial => "layouts/ie_lt_10" - #beta{class:(Rails.env == "production" ? "" : "beta_staging")} + #beta{ class:(Rails.env == "production" ? "" : "beta_staging") } - if Rails.env == "production" Beta - else @@ -33,5 +37,5 @@ = javascript_include_tag "application", "data-turbolinks-track" => true - if Rails.env == "test" - %script{ :type => "text/javascript"} + %script{ :type => "text/javascript" } (typeof jQuery !== "undefined") && (jQuery.fx.off = true); From 663cd1836439ffe0e42476915d0b1c6773cf2631 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Mon, 17 Apr 2017 15:03:23 +0200 Subject: [PATCH 068/102] =?UTF-8?q?Change=20the=20landing=20page,=20add=20?= =?UTF-8?q?the=20=E2=80=9CHero=E2=80=9D=20part?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/images/etapes/complet_2.png | Bin 10529 -> 0 bytes app/assets/images/etapes/create_1.png | Bin 10944 -> 0 bytes app/assets/images/etapes/message_3.png | Bin 11215 -> 0 bytes app/assets/images/etapes/shared_4.png | Bin 8773 -> 0 bytes .../images/landing/hero/dematerialiser.svg | 1 + app/assets/images/landing_background.png | Bin 38938 -> 0 bytes app/assets/stylesheets/landing.scss | 102 +++++++++--------- app/views/root/landing.html.haml | 98 +++-------------- spec/controllers/root_controller_spec.rb | 28 +---- spec/features/admin/connection_spec.rb | 2 +- 10 files changed, 72 insertions(+), 159 deletions(-) delete mode 100644 app/assets/images/etapes/complet_2.png delete mode 100644 app/assets/images/etapes/create_1.png delete mode 100644 app/assets/images/etapes/message_3.png delete mode 100644 app/assets/images/etapes/shared_4.png create mode 100755 app/assets/images/landing/hero/dematerialiser.svg delete mode 100644 app/assets/images/landing_background.png diff --git a/app/assets/images/etapes/complet_2.png b/app/assets/images/etapes/complet_2.png deleted file mode 100644 index 1482924090ac4d5c7a31acaf42ee5aff203f5f00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10529 zcmV++Dc;tJP)AqZ2vEdi!pM%zP^5adwbJmkS3-`niK$h zhDZJqW`5A+bdb$v0rO5Un;B;hXR?ldr6J3W`S5aX-;kGQnguK@N$lkDR`mq}jsHYM ze_@KGiPiZ$`fsWB`8pkTJC9I|R4}BR8N&du85nK_odCp;%pYD#pnh0hkJ`3A$0}sO z`v}=sa#U5hgAEN03nRA2I40K7=hoHL?1HYh$Ve3C4=vs;IGzC-UVkd zsXWx!*cfGsq@ff0`12S94I%L=`Z!EqPj|B0)LXHzx-&Bi0|3_2Hr!Q`lP5Y}HzDR{n(tQABga zjA!VW!651aNA)%=)YjH^?R1d{pW`(JeHKdu2ooVCtX7bfS{hq!oAU7ktPToI=|;dX z-ek4u!kZBB%B#DktVF;xGeBUqMSw6dV6cQ4mTaIeooYb%OQ+K@xUfTBQpjqgkj{(H zn8?Be8$x3d($6p|zcppN1`aLv8f^qfh{nbS7GnX3vIvb2f$7xH*hrO5r$Iu%hOkjE z7`%AW!N4nrUB)>E5U)v~NSe6R-QCR+*ruzlLVa(yAzJx=Ck+TSH8tx*BG`2ChRo4Z zZ*MOl4GatjMbh}Dnoo*Hgd~K=QMj=?){E zx?Io0>!0FYEdzzs8}2!iMtIlVOpm;sMoXXDL3gd#Nxs?^1p_2Q_yS;C$ff6*;a{FH zFt9jk2%l$=7coi(fI)!ZY44|l*-rYj)ZgDnO-;=ZgM5B$i1L24IoKg`l+@RERP?C8 zjyr0&q$&*0I6kD%(l+~PDx|KyWAt*moo!SDAy zjJ*m&?I}<&sANzuR0Ku_28X$n;^W??gK24$7@t5#va@N&wr#X~Z!+!J`7tFXZlNs+ z8!10Ok4h@c6wh^b@7Yc98{eVi)Pq#*aZ%jbw`uS0-DI)ZMU-y+=p#x_PNDa=Y^Ex& zpOQALqtw(C+O#Q-cJA6mnVA`swtp{eV*4ieZ>ged8Rz453v`|Y+kh*(%hGB5-h>&WA>i)DP6nFN)Sm3f%Ku%EVV-$U8iIb<#?rh@!@@>W;V{?z?cR8q?M z9BOQCp@!OOI+B%1c{y3+uc;;8a6?&H*;G(aK1D(TwA&gMQ z&+@LFK=t6X84O0HA;DlsBL)M&)7RI>_xJK>>E_YYEu*HBM^9@oh!F>MAfs#s*rj6t zgHCK&0ML08v0UwI7JayFV!(j-gtyAWBejxTZZ~;-)ns>6io06EqtjhgMSh=$N3)eW zyL%&G7=AJk<=6w-KJMGxx$$0kfY5}10kUBzX)%#_uP8Z5*iZ|$24T2i29K@tZZ`57sfi8BDpo6Y8&(Ik%t$b(>yLUKx99co zFdA2fJ#>P=P*+zgZe(#`KAEi!+IJw6KH9pA%;pMq2lp{0v)h?YMO^N5JIT!Nm6MlG zmE19D2U6LK$e{|0o$`yyC^IXU-O6p0n2^NvY%^Li=xS@Mp&XM`Fsx`c(B!F!f#b(G zpwcL#y_H=(=^Vb+)zd|79j(;f*(%3idkbIdq|TlW3bwV#wVvLdnI##lCnCcf8-mOG z-dG}yztsnxX)xdqhM{<}582IbjZ5|SZ*s=8C$n_w`2tU?mL#`@IL20~g|+MkQ9 zFiBu=u=`k6VV0m$d082imRhK=sGRZ&3MnW1FdfM)D0+UZ?+rRU?dN91KtgCq{5%V?C7>7jo3Fh)Rk|$ZoHs(lRqk z28#g<9-yA8JYN2TJ@`T!03p#nkGqPmR|#YB2_PpkJ=ogH_x6Jj=u*PFV-AEVl<)8B z$2;H}@yWGkx8`~Iy*Z=LKPJjk);A#*sG|Zu#BJQ2r-kN zSMBpkFv@1L^T_rh@+Njgds`a?TUtV^h4>ndpq}2|8Dl^i$zqXN%{xzHGRnVDznUiE zIO$| zKSuA2k29PUrpBC1?})*``yvBYwMHjFGW7QLu$y>1HOEQgKNc&ot&!UVag|Smc|{WmH^TN`-}mY%>(`kpaPV+#WA^k|<)C6EIu(;lv8=R%-o?9XS`%E z+6`4zt~ZC-1K~+DJYe!%%gCzg2?c`^zMwyh7hy-GsQ`u{7sI+`!HZ8k3!l$RjaWPz z3QS2Xp|P=vsS%!q#2FeI>ak1>=W@M{UC#RY2Fz_>h7;#vaMsq=$WEnxZf7Qe0pHHR zQpO=S&LUhnRl$H*0>FwDP+0v0HG*}H8gv3fp$dFnFVusmjVhN@>U%x7hOn{(qd>y^ zdIk$(5}5vOW?&tgVPLR^0#J*>z`&#C0n4ZwpZvuwFcxcS{E!;>b^%rflbelAmwX<; zMpmW$fUrV5Y$r7)c~CeV!O$mQXpjjgx7!6Zfmula1L^|mWe_AX zQ6L%c*FI>Nk7y{y#i^zy0)Zwva^wi5>`$Wu>Dg3RR3ZyB@;T^qFfD`fc}lylw^u|x ze;xpH5h!P}vB%+%k6HwpTOwc>77S+CQYVba8h^DmJe4E^{%Gu3#B3xpzE~!w3X3bK zh$pS`I2vgWt#raJD{(bTN=opDu_|bWyC`-8Y#|ttFe-gs#3!n$sksS8V+0IBp&wiO z<3bjn*F#fJG8jQ|9J*fiC;I#dBsE~!ykW<7AND><%plkj#Fjh&WN;x%6Kn~-Uye*I z*zAf9jesFUGLV1+`8XHPRGwbLkxevb6&T<=$R-<}>YeN2hHVir%ycmPwTX?duR>>x z&sWgR0*2lQ7$yb`u0|Tr&-fU>+%k5L0wMZn6OZB_I&4-ja!h3ZBN!Z5yErN^K>uTl zU3*)QIy*Y4tqluPG8qE1&=XQ++dqoHd|IJSir*y6qTxm`>hC_`t;$2tOR zv$RQlepVY6*GT(vPYV;C+swGHT}D@@(py{l|?2fJeS zF_B0YyPe%R*QnJ5I;e{~x5n?KYPR}4RW4cD=CD^%mD`2TDfUoG1kuS}f}Onuca=}} zIMmkFW5*EJb7P+aJP-*wm6cVB`NSShiB?v7-LkJj!q+ZDE8SR9FZ(+E z_^1X`u&o_S?B!WL&R3xgmz&FK*kh@aIzEp_-l?%UfV~{t2JZJ_`94-^OM6a-0}FWJ z?O?_g2JUHt!RBs|NQy`XcNGl3G4jnJe6!kYY*@E_)6^PheE;yyjg<9q{5a4i%1hZo zUG2e9fdNb2Fo)o;@nHi97Pr7Plv&E=rUuL_03_1+X0w&*nHkWX*h>izxR`hr4u2%> z!!OP9(M|A{EEQHTUFvu^Z?8m~jUn)O{FtwhISeP)FD)&Roy&C%O;b!wG(b(rBH)4p zA5qq>O=IR+HdE%#4dg02e4DAQp*kmJ{WFxhVa1p!CGJ@|l=L!n1e-<$21FDg9gg$f z$v(s86_9@P3xqWc$PX}Sxf1T_(|e@eF}bE?O8rcFKU`O19b;Q#NgaL1D8<`C`+Y&$ z=V=j22Jtmq2O*!~Z{@#z!vbh>22n^4Vw=C!Drmn80=*$mRqv45>32fJO_3LjXf-GfkI- zZT_oQuQq^Ts-}su8CFmR+l(enUTf|h2s|kefR?jWGUzA=shYq%26kg1%_zwLw1=F9 zY2y+K2=O|WZKcY;F&UHj@UEvYB|7>>W7Jg<@sFe68&i&&b3)QlRT zXlGIhk}jRqR(E@l#v1XccbC(?_0Pik);^kGiV4qeh{3a^uMaSd8VK=15?jjK6W>1M zhd>V|$^)i7sV)^ud2eE9AU0C3syE_s$@r>NPN*L3n@( zM_eDZO&33?$_H(ZcE5ktkYKPJ-hE37i^Ay-hFH?Ld%f4D^CV+-3vEYsL$s=aJ-(z8 zhXH~14<@XnL%g&g{avQS7wHgFT0$(Bq3#$Ykg6a4JF@=p`l&zvXEvKZV-P{pk5t?W z`d3ieyDw39N07!V)jCUHH;khy1Ihc!d0JvDr6;{8$L()DLrJeZNgHAxrFAjCp!k;` zrw>*?Mf-R}XKs0k!4a#VJk7{)2n@+_&yYED$3fF@iGvy4YCuj;Qt|pccj_u?ZKxj9 z3=$(4Wvt=2{OF0NEQ^xIOLD3=zzj`GWGRsJ0=>WbH}upaKcYKszMj5u^_S@je|rhd zn>U~4%$-XYUwjdL`HNqm8?XBsJ@Ai<>9uDbrai0%0iFX1XeZo`2q&!Dooid=f!+H9V$vqVncKjcls(Cw}G-z z0Kv?R6%gEa&#iR%rJtv{bE0U@oH;aiZZt(jMKc)Y(Y)w+6vZ@`^8m)|IddtRL2|>j z*U$^Ux=;SjL+`51p>ZNefT0G-N_bgVUH$1lHGp3#IWVma#~6?y?g5ebEU_)b$K^08 zxie0WFgQRmniBx(u}g-7%os?7Wxu$WzI6Ge%-|?tcr=*LG#|uyIWpttfiyoq8ub_$ zxF?Dw$qlsS_fLkT1lvoW#y|9fC2Q9%(@0Y8#~T9171Lu6Q-4A?>Ij}dw~`Gc85t|p z6;x||^lfVFWSDm!X@6nl?p?ov?!RXdMMp)+h@UqfOr8g(DHtx$peh zbLlHzx}4rv{s<(EN`YbB?xrT+$bJdeV>$9Qphr6q$I*A-pwSY?8#V+G&l^|R3_%)f z3A=VuUa#R8elMOYN7c_WyDhI&}&op{gzYy$8jV7y$OUT5l+@lP?39D6mJB? z3ii?8q1wt~s;{zAU6q9zs;qo&CZz_?AR#YQf%CAu67oWN{|L!gUyge2t{A$$o_j2s zH#}eOvGM&Ds&kc7?yfk@&kWfgDWV!)phtgpH*`N3c}j|6kX(7irSyeMFJ|d64?q#n zD9sPQN7}sl$}h6Y_%$6&j13QDaULquXU+f7NU@*`URGgxQ%2J$dSWb#^8cWVF1&!Em8sDSLh50Dv@%u1{@shdO|>Pvc@VupUxZ;9bwUb2 zRfGdb0K*dEd|GnLw=s~RDvb7nT+95!YsBf#MhpZsBoA`HL!`qfY=#2@2Gw1$6s-4Y z9FPX4(DFCkSBZS+lK_31$6m`J^Ejfe+&h@(y9uee#tC;Ztj};QnN`TmH~byVW@ba* zV|1&x0B}S{hv=O1X3?*HdMEYQ9;Ty}yJ+!E*U~xXo=;J8RWhLdf^aZI&zJk>vSAtX zUk`A=YE_uw=qyTm%`}=+p1CyzVr5LmTzrgJ;K4c{X~Opk7;GSX+#BC$#CIJuk8eC9 zFQ5Jm27~xe7Z$DJl!4@4P0iIqgCRX>6|H>Yr|d2=BjFVc z+5!rK1q&9?Raad_H{5Uo-FVY?>Cp%8rH=d!)Kd~qzkli{^yae<(Za7^#f(<_A_@Rd za412_h?lYO@2;VJanFmfsx!$MAFdw#uikR!{S~5Nh+~g7@B=l07iy{Vk|r<|YY#zA zrxVPV^P-|6bSxN%jz>r1BNAXB^2!t~1494++zTe*Hygopw1aXm8}}fOZ%5ca;Rj$-);m0@-i?Me|I5N00Th1htNpA z;DQV2#v5;>?|=XMv~=lGx?{-_df=abKuy{2P)~6JmG0n~R|Z9L+MzG9Xn(?7&EXj6c@B5Gr;|T^Z7@Y_vfeGkLBLg7;zz}pg zmS&L4xNB z8JF2N`&}CJIT2If{0D3PoBsBaOPKj{X})1J0}S8%<~Qk{d+re++;-b-0*0jw49lKZ zskbbVJO|#O+KjiU;qW{3<}(k{9e;lv0HN^+0f8RX)0j1THvQ}ecOaGl8%Ba}*dsI6 zU&;SWhAfGDe%!zSCg$hogTNq+W-M7p9*jW8BQG7T=efDL7|mdi)&)ax4pQl0YzOyi zJIHGp7;SteK!kho3{?x-E>skNs&!GW=OCQpeuHEXFc>9+=^v~}xN`uWd)PKy^WrX@@6;E3l6>a9qiy3Dt!k%7=r0JV`oCEHigg{)R) zBT^Y1rQkBqe6bs@|Hjo~r(k2X$DF&yG#;s{B;!{QGw=#@VZ>O#fKUCan!t!eXBHF` zAP+SGW+0Ez2e9Be@)&_C2~Y-=p*kMd!8iqwv95}Fl}2ix7{$ES1xP@69vF?fC^Je1 zJ(uU|J8Nq8hl3%L?S=omAMRunj74=11q_#6b{XA%`|b4WC!eIu%uE5;vSt56i*8*^ zaW6eiz2+ne99c&#IqRvrIG)wUCTh!zqg`)3No!X;B=Z;13W&eOE001UVob1 z-F50gj6GqR^T>|3`w*}g2gv}VP&*xB7>vOv2Qxux4C)95Ahb+%KR^V=;0TFUsXc-=l+kLdXuJA6qbgA~F)SDk^DN`Nciv3rpFbO;SdBgf z18fD61`pi#03{`Drq^D3jlRcVi23zH)Ki*3-9_=#nzw`o=Cm6&GhQi zKY<-G2r?mUo7K|Al=QnNDd4aC|EBRwZH>-LHGs5#ZS>0r|Am6N>scCXq^_cPNCp4_ z#QBYEPrOUzJ70zbKv#B%_yuYpQneOgvlF zj@k@OekcC^a4;}DtMb_3g`cfbr z!a~m@1_QpO2=RhN7aL>IJAQ( z=}aU?QO3h+Or{DDVonzfs*ANlLF(J%9E?`GLG?SB zuIdF$17p-3RM!!C00~SS$^}LHDA#t>%fNkTAMNTp0aRc#@^}`2qj?34sxc!N!qfx; zcbj<$+vhL3kmdmppp%Tfi!Qu~Zu;)u)2?;T!WLja#FHa=4FhQBihtoMZ-2WT0gY4xAPjTzD5E=a72fzI>5P(UJ&#(n5w=$L^qBgbyYRQ z4CdjQwgZM5)sCtplq0WY00+RJY6j0U8l^_kScwq~2NQ;vo8YkUZyx>;bo)tj2@DF5 zOfp4r`8@j9AKp&Eyf^_vj~I&p#HOJo17E*u(G4sSW{Z2dZQHhAnkFM*(gV>+-D@Er z(Di-BfI&SARRMYq=BNr#&qCcnonz2vXk>9H z7ZlG2AdIR7b;90N)e`CsCmFOKw!gKEzJB$U0tlJDR{KFnRxX7^J;x(rANyyHJ|+pX zyTo`52ZP2OZpW_D*c!$!1@cGOiV0%n7hp*qKbdsQ;vexvKC(g*5EV-i|l15fG+ zsW%a*afbz+gk;g`i?s4_p1GVm2a`!BNr)(2s~|I*pTGD*%1m6&!6mjI1Q6kB0+OTV z(Cc(LFMxUUvB%ysO@&nJD8FKVeC*&7u$4IKN~cq)2@NA_BoIdsbT&Fz8KN#D%G7I6 zZvmu}NJdcMT+7t{z)|BEAXQD;4$5^pTqn2i>-#$5_1jMXgO&~Xt9eb33<*PnK_{&c zjnvsoorV_D38(oX>G0i!U!}UkZ^57((wjgOa#PHMbpL(#uQN@hSrSu(CJ!c)X%Ex z$Bop@1sF81?}eXI)G#;R3w8_M3!ubxl;fuhXh6Z>WFQQ`h#1@Cw!gWIZoTPxVR%$D z0I(pWE^uxD$p7ONPQQ8RPDlX;!G;hOtf#Jmbv5nQ{j*F{Il0Soz5+3cISlnK4sa|Y z$ZA5t(Am)e9Sp{!li?9)9-|G0AM#Kc7=g%x;8h?-0UeF}XbE-(+C^LNIF#^9GkOgp z9usO%9Uw02z`Nlb_rmVc`%q>GN4rL}6(Efz#9m%w`ry5H@N_iqnwmZP#J&iFF^P2x zsB_f$G4X4hjmlS- zJw%Icx{jB=T_Co?Ty`&`VMt=N^H;8>N{5|@e@o0XT~na4@^3PdUg<-}Kssdb7eZXc zX;f`105Cvuu6e($(0I+54?B*L(9W>uO1_ic)A;Tv)4Yz<>`lM)w0LP z>v0pOb4+JLDo%YbK3P8kg4Mc))lxH;j0U!DEx`2^a{b`D*qt3i*1QAwA+&bW*_0}a z({4J*c7*6tY^;fZ;eXq^mewZ1C^`$>h>APuKk2d-cP{+}g8xA1wh^T(Td)h25=~pB zV$@2D)-oZfrYTLDDM@M*LZnXO1NtBoMAz4Q?&QLRVZf9@>C7BBG-*Q~&HcW)kMEwV z?CCS9B8&Ek-X_crYZOh4xjSow4a7(93$Gt`rN9NTDsR_Oq^Rk8cMm3r1p{&KRyk9V zw)rq)cVlS`p(lI^Cw)BuM$8yAOUsm;jAI;FD4X1udib?@!-xuOyK-q`@zF6pyoR9t z-OAxM4n1iuKYJPy7!TF5vOi=lbriu{;q@G!1TvEdLG}6xieZGtN%R-;9+w2&c4mPS zbL}fe)PWGR&SQ7Q!AvIpzR@>zs{8^sA*I7iP;vP&TKUJtH;B>iU{0wP3yiy3Nie_b%6`DwU_IV?t@RE>0MP`Q7IiTKp8$|pt61$ z$B=tF-W}Nq+V!nlM0Cc8G1y6}&t-E`=03};?SvDD>&gq{x(!aaIiQlOKVigp-yhhh zE4lQq{dRp+L^xxd9JrqD+qL0p_QlVS3scfax{9!r|Ium`gG38mUeGk1~`dwdN z0Iv;MKp1F_MM%rJuP_WP(k6z>B65E#FA&}m(5mQ34PnR8|_r10gifiP9`5x-OA zx=jBeRnJOy8;DyA36$qdiVp)y`MJ0}Lp%95+g!CAA)<3ejQyJ8KfgzXSJPB_o1)rUdS$PY jzjpBD(`6znRFS|R3s`?%ilM-%00000NkvXXu0mjf{nW+r diff --git a/app/assets/images/etapes/create_1.png b/app/assets/images/etapes/create_1.png deleted file mode 100644 index cbc61e88e163bb969bf97d5dc05aa7f049771e74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10944 zcmV;xDnHeUP)lI^zn^j{2$?3?#Rq?;1R@gYqi>!sFKgj(=U_BV0wBQk;w=G zfdD2ZCgAgF@Oc$@HG!tMp%R+vVMLjx!t3?YwqE%CeuTqe#A2~PB9XW}m&+YkDwVzh z;0?sn_`H2FJUn(OYGD%@vPra~3$c8^(jJmb79pgdRpLdfkr0?NB7 zWoX$wPNGp*SR|4V;_(^e^SLc#b$$ilrM(qLUkpzsQ~qT#<6F4${S#iOs)sAju579} z%~{Fv>6bXxJIWmESt$0hbxyYsi`T0m6b>StP8oVdKN`SWxrynEq4PY_G|L|*v%h6B z5`kCK;BkwmRq>2b#gG8hJt|ybY(ccF{DrNAV|%&GsXVqkkHS!%uZK}p1;Jnd)U4F0 z$yx{Ch3)q{`eJyRuIqoBnTZ+H)(eyE7M0)9yn8t90Zw7H6dJ?gnT&*x&1OTUX?}`@ z-50~&@e=B&4RD)GH&%#%;QT&8<%Gg(EkI!TT; zvd_}qI9L$eZ0NfF9m3Tux^`gGEPpZ*3BlvGn}fax_6|)xJdI|=>+_;e$gSbGv3;hQ zs8*}r3$X*q-LChrF9t?*w&mM~2NbY7g*%oHcQJ7D@H_Uwd%EIA?pp~(VHBiO=_@)N z^y;W1iJFK1^5`HD((Q|((cSjf_I}X$ud*eF*7`5chd@HghUl=7(GirfGgex|XGa*+P&@ z6{%F3NcHIu>2wzo^2lL3#vq{B1Ny)2{m2qS zRaH6aO5A%*|S$sfT!AoKwKZ6hh({VBMf3;c-+%z})BZP$rg#tQ1 zs6Fd5P&07&p58<|&qKO2OAK>ht57E_Eu;T?Fuys8e5j-t*fKZ=0ITAaJ{F7K^nezQm z%Q#0VV=T@0^MPXUIR^<_^&#@PZ1!)2Yj4=Ajd@^7G#b&xTm|Q_G${sY8KfA-(FVt)h9x!=Evy4O0O>(~8R1$CnOO*ad)UveaHf4Ra8q!W`!HPV`xcHE z9mg74K74eHgz$Y_to|N{j0CWDxZGyt^LdI+wig-}LdW`fgtlh8*mg~iSZi4aDL{E$ z?TJAOVrnYt;by)Q&BQZ;fdC)0qhesoaLCXEF4um9^F9B?y6s6^r2HLM(DK1lPF8}p zD`3NL2^$HKGP+3Z<%J+iQ^K)(vRlXTyGl5c@+^o};yHYWj*~oPqS7;t9jnMDLJFa6 zF-SC3VejN;+x9?`Pkgg%9_$`#`(oHIQo?Vq&EuzMo{ForZ{nzX{*G&W-^LG5KL=ks zWd<8ZbsV&@g$qFG15s3UJNhk`)n7o=PRDtltip<1tFcgny9M-w30Xs(=1u^I-L zDHEHfYF%YBo#(Q!A;rmQN16%w>d)JSgP|ff_w87Qmo9SBHpEcIZ>~<^Gl#ixiTVd@ z_J0MJ`u>jZpA*IxjtS%79c8MR60QhTaPO3XO+g(4!3qWfIyMD(xojUY zfP)G)6BnozX_g(9;Uu??Yo=;8(e83Bo#WDwX?G?&Y#HQe>wGr*Pr@}HGSiZDI(dT} z(cEz{jFM%zI*!jA5yL5C=V8;tS8=-M0{r-*42dC#L&#L~Q+o4c6>8Rmr-4exQYeiU zOvH)?Vx<}+(|YLkSauv^}(r^I)s znYbp2kFWRQA2(<5uUn(|*XvlqFa{XFE^&~p;Zb#y4H)2toB*yhYnKk-Lqpj zcvL5saM3d7sd5cTy(ZFfy&0X$YVgjQSTAp68!Rs|IN<@cg+k#^gzJIGOcS|W@o$P^ zi=Z1~5MDM$zD^a0l0ZJSgLVZif;eVh42#0no*amkRwJuh&WnsjCoA%+X_k5Ek{DWh z_~f#1yhucaJK=I$K&3_Ki$Np2nhO3P>Y^S2W3U; zi$3wfn`jGZVftd={Zh%K!z<~q3^eQa4tbL9HWS6>JR>W_5<^R$eQSn`jkIqWmICj` zU(DsXunURd@%%2@GchntF6tszD4{p?E9MtNk#UsSEEbVuiYu%G$p}w!sZ?4`xFj-T z!5`R`qiwq`2Fb9j@C8_?Vw=T8l$x*uL7Yk&>jzhsWl#u@oNwVCLn4*n13#jrWuQT> z1J*>C9*JSSv;f^De{~$MWzsM5R&YzCf}6t?+!U!gxG~HaxM`Bt zms_l-^01xf^k(7`Z&g^P!NQ6agU3D2)BEe(R5V$JT%qtsc31XL3>39Y;`2uatZ?;4 zT0V4V2|v4d+7iPdqwF>=VRNVoC2b&(GX?p2GqZACoiGrjybYH#HOez4LEGeOxO>Ww zK8_VC208F$3ILwdB!+l=W}LlKy|oNU3RL+iU$zFX97^r^&n}rEF>s(t+=v@V47~q1 z31Tc$BPg}PT!>csBe?Jetbw*SMsyHesM>SdG2sz>@p_>Sk$&VK6Y%SV$N!ufxbgCc| z*Dz707h*6P*U(cj@G*D>_w|HJ&Zho?(uhH5y%B@`y2wxIwt^Ud%IVfZ(<>kQAT|ui zv5qodw7c-RSPXI??ApQJiGf>#cs#BXE*JmF=Vv!cuarjg z%+D}L3^xa>nqmxtjdjh@Nqe3JuP53Qfm5I-x+}P9(!>=Jg3_xZwXSnf&}hB~gT~!&<_QXY@u4 zZA_wR8%N=aGC4f`dl{GJr+czJkVd^;ObeAj-L{3Av8*EeFWj`^qL^ z{z)`bjLB(N*+jIMMAK6-WV6|~TVZQ%GdlAXbhjmj$`bty|F|WK&mQ5&rw^ULrw{Yt zQ->0V`0(?~rb#5iQN*zX5ADx>1j%@YF&R2`4eoSJrtGPtykU7I{ka;ZiuER{S)6$hOcFDF!cDhRPB= zkYW-IJDWIVet&HOUpg)*J&^n{4e~Tr;meuWm2Qw?H#Fy~R=PVSsafgHltGws9c@=@ zLTqbrfNOzCH06iH11ZHI)0UQDZjQuYLR$0o>&+v^HY5@sCJ$ug&#LBy=GEH5vM!ni z--Lg!qL!aKQp}NHaU8b0(uhrnG7+^b7OhgOp~^RjFfF#kO|d-9 zyOSTLw1|BBQ&Zk3mmMLl(!xxSffhzu#4p%ylSBUE-Qr7qd zL5ndC?5gH54Nc?-E|+lGbg7QJW2VD{$*h&`=$NRa0fO`0WMG>645o8fo}-x%axlsA z4&Qzi?%#ZF+jX{uxOdapnAmmyCtR~Lk&U;UxeB+Qy{>I;IcqiUy66ZLvdJY!EkAR( zAFH>P2r+Ns#}`aDnhD{SJzJrQ36ycQzk;g+RV%fja$0vyK*y!Na>GR}SZC*3zB<~y zcBdGQCJS}$L=|WIsyL??(78_6Dz@{?AqEqB{>+Mwd#^a2?)RGZ>+PI%xao|8;MsQl zr(M~^srG8HX6`yx4}*Zo{H%9%xgvShKyv(OHKW?z`$l zy5H+NQg1h(wHC_u8$avHC8kbzD8#@fdezoE{(f^7f4eD-zuuI=-)_v{@09L$Pmb0L zM+|>l4mKcogi(%`H z)MuE9ZoK8JZi!(|ieX-t>juk|OLVLsA!JO#qCi+<5{TkFlsNjiWLL91zV!UH9!k&G z+dDDXR-wsq@#{5-q1s(BoVgm>&`s}gipLhgN>6xCP>)Tb; z)jcztPM-JK+qxt8WcV4);KWd^k#`b4>?j0qx)Xn8o0$pfKs!|A=XdvrH0+b{?R40o zJD=9Vupp7a8uphRng&Emmn`Acx<#0^or0OcCBrik8x_H~uKwW>k*+zhAINM*6p>*; z)eJl0&tKqaX=(D>Yp=<~i4&QuX~TKj_ZNIJgh_n#bD|5P|Ku!_&rSUv&0r1%=r9=) zAj5{Wva|d$Gc)DYS6_9JVaNUj-)9&vN$NAQ;teu*ik79-5O^{oz?NN9GgvPNW+vzr ze0-ej?xh)U9yQ>UIXkLK;qmZieZ{JobDWBe5WA9@_{BE%>yXgR5#Ii!&=7n>ZIH-7 zz-g@fIRE=^6&??N>Nizgm-ya`ZjI1!GcoH$CBvE>&rdLPtOEO($`0X9ZmzG9r1xK@ z;|75Y#r(UO&ch{DR;-DxnfT zcv(b0U!?GO_ydZTXXM39(-DOVvSYSLwTYP-pA$+w+ZAZKL^WG=EVk)n#G|5cv3x&y z4Bof3(Kbd{%lyN`mz(%g@1Y2%0GaX2VIx&xnx3=n2mD^S4J!^ox(k)QJ0JQrJBb`TRrj z;j53!_u8YA-+NBU5n-fkXXMyNhS^g_%hIGTL`41__@$uwk}r2KW9Nja*Qd2npOp=j z#Uk!cFn35hsL!EmFjp;_E3<>8Ic+qc0*#-cS|Iuv`QX*ZRmYmRZ6YKvZQDDK^cX;zwHjG-q7^eGbIvR$ovqvUAS)(X9ntC9=+6eP zqfB!Mp~8%CNN~-C17-hx_L3gmz0$pVcj?h1M7-V*B|}f?8PZd{iXNJW7~Q(}kPs!w zDaRcl&)k2F^M5AHG@rxbL}-9Oog~~DWwE+?bM2;)3Xg$5%}`aEe|PLo?Kp-3SKI@Y zI7ZYL((PEBN_s`RK<5BXZ;pc0o!1O;Di}1vsC%xIgZAG?1?+VM9)j={p&*1U2$i0| z@}VIdr^MhKuWFK0ce(D6DgcGCL2x2e78x!+A5FV|i;KtjA;r^ojUMaU2#)Cds}p-y=( z-!Y+~&UszC^^n63+F#xrdk31vv_PxF?scUr-&c6tXqGV)EnScTd#n-JcDw;e>vqa` zUqePd?OtIM5Ef+d+vk_JeQaBv%XOWt*=EW(rUP(a2ei0H-+n-txK$ybu}EKW{<$i| z?%LZi1pvXi1&>+Ko^NHY{ekkBj{Vffcx&99YBC}uCg9o>e1)-+_VpB^j{7S-ZZyjn zYHF&EAe?NCU@Es=h;$QTypGY|m9iDtQn7Nml&@SSmAb81xl|05tC~RG!4lE|^MJeq zJHIV(U(dFdE?g4$cuTKZ=E~dk?VMaaf0>jQESA)-rZ7Jfus!BDrr{a6@5T$T{U*$S z@G40TIdC7@cb|T$J+H4}gX ze@y+Zi0RE3pW5y4VoQibk6~E0JNzn?G=%j71;G+kKyQw{OZxWdEg>eRF%`}H2lgd@{JPZFY&cut z@rNZ^V8hzVbK+)BpaRrj2SyH%!E9HAR8yiodf3C za;$T1Q{I-cuPx1IxY(l2*f(2E$T_DRBi&Tk*n8{UIEIiTB*ce*|F?_Wf5S-GQkEi{ zS9~Rd&Nxo~{hzMl?O~dM<9oFvLr5s+>qx{aVGmxX0jp^Iiwb^R`;@%akz=mVL;0;$~f_uBjo!j zXoql{NtUFKUX|L~O~VzQK(ItWRIe?&fM^(T?2ZP0FcaL+`tsFcKLpC!Ly(`JkMNyz zR#p}bivVeOr=j&*+z8Ogn^3F_fj|JxMMx`Gu0-h6Lpj2B&LO{S*)l0EF6P{3WZ*dR zoXfpfIm_Tk+jY4|h(n(H<5;fCKFZJ>rWyF(-DDt7#~5_xiI@N-fQ=q}J-K)9-g4S$ zr^)c)!)3&X5i)exFuCrkOJ&Wxccnf%N)~>hGp|aD*;AfGt2o2Zo>qsMjHZzYWbihT z;`PyYND|JZUYlT9;liXfbn=dV3;TCJF8H!2{DEXbiii37Y+!Ynq08Ga|4BTo<^P*{>}r zu%M4CrVuV4zV@W--M_yIzlVgndNX7=;e-?9!V52Sh%k8YV22DNlo-pteMK4;&5%{G zZ%SFxJ5rhQuDmt+78!ch@esn|5s<*Pz}erWTQ|A!(xFZ)10ROqTb({5qws7Eme?xv zT??ltIZNW64jLH{VtRTyKtS|nmaIE@1VO`-r=cyKnwm;)MnHBf0woPhJGkrNe5;4N zl_6;NH6an_at$*JRxc(BqS~>PTN;q&e3xc`49(31wmahC8&&YW7y>Z!&|e91&N=7E z8*jWJpMLtO+uoLhhU>dJtYGM4w5O) zJtPfFqh;OvNwR*yWU0%JRI@Q%Hl|IHuikz{CXT_EC6RgC$x6A2SP?|HV55EP|pLa0;!_QNsv^UXCzp+0N6lW$l&LmF~t z$tzD>j~~)RGJ{jMnx%dc{n8`q)aHGt@cbGq@vB%<^5cURKq7b%3^PIRGgWKO8)^2_ zTTLCCKVf_*9%eH=78flj(u)ZV!ndAUWS@R zh87OwT*#mi$NzSL49*Y`fti_r2ug?%4gtYPF8I&O=`0u z(F_m)Xnvad6EkJ;m(QaC2y1J7&B@S5oyhM#n#zs+-86k?&4l51%jbQQH+#y{LGc+( zSg2VOFl4ZOkiiH;!{gjp-iCGL5fD9>{bow2$4r3R1ks}rIC-mwdTk`bxt695h~ysS zu+Pj6*W}t}cFbp3QW)Y`$te5=Z+9s0E*sD4>#|gJm&z@B9w6qLbNjKwh;@kVI^rBHLx`kM%qH>m>a9p z4UTKYfz&+n6658J6OUGP-mTd%&=BHPhp$f`88qNLSrPLl+Q9J%HfBsy!B1162O>kH zLxzz9d}P2+IPky&X|Golp7z2L?S_c_XWr-UG!oE=aS_5j=ieF`EbQwB0%1#on>iqD zy%%7w5vq;#QQd5T4OK0~jPTfJ^&n8U*)fwuIe9CC9FW1x4A*lzrEXZP#7%~{r~q>l z8Ww)+w#%{Yesc**3gApKd9}Q!+;rIxsnS>iWT49r?02S54IM^0A`x39?BVZ+WBk=;aZQk zcRxV}D{J}w2I358hN!?~ut_VTkv4m2)6foV!YS0J9nL)QNGVTw8;3IBXo4u@^srmx z+H0?EAWE$8bOx5_G)k9eJmi=OU}SKueyg%Hk zd~4-~0Oz?)4us&N;f_h;et}&VKYW9Ce0 zdTKb**6%x8dn}$lq>Z>vZEd=d!EK-2WT4Tl%x#~|)&~tX%!Le=xBHquf4+sexi9<{ z?#m%1`zbHTFA({~$dGT^ajVf;9+Uh0tx+=YjFTOKdqW^VFQ2&}?IOs(bcNGnw~j;$ zC<&(ekfD=S8IzX;6oW!2mpY0ky(vGXW% zg`*4HW}y{AJfq9y$I2~N4%O-CQ0cD2LVGR(m@~<`1&-OA|Ftyy_^oU%jFpDs)VhX> zg~KhnxI>b`P?DQ<+YieA7+c;xbsQ^lWq0_MG^ee3P` z3O#gq8G<9pYUjfamlb?>^5-q;zHAwzzRQ8`q2mru22feB^h(}IO~aral0JA@3bNy+ zI5)!~1|V(ulH5%9K6l=K+gVUgt7$_KdEj?0pv>}y!bQov355>Owx_?ERz&fHb&Td; z8-1HxrW0Dn9&w2DMl*Q5I;+`N@(c3e*;VfL-Kod`*8fy=>by_ib{=WtVHTF&e-9>& zQjC__lg7B<%1?Ihw|%Z-*gE+g1*4lV7RRw|kL*ut`2r1|mt^?)wbnW7#fRm^CvKBx zM?D~`R~1T4Z7qcO{Z2~;P+wowH|K}lV-P48#2H?r7sqT_^bhb>z$ zhgip><}B{an!%0VRu<)sPx<66aVEH?h6Q@+Xt#oe@7>Q}0y+#Y_g<0l18-J2SK;|z zz!Lv6G}hK0y)@LL1htP0LCt;wBgW3}B)0w{?=gaw%#4}E%2r|n#Rfg8LGh1FsUzMLYeC38hKAFS|fPgr6Hfc$mCPpcoziTjB452#JEtENtO zTIbOHyd_ipIEZ`-YW4Dr@-18H&+s29?53I_us^Z3XvLii<39YESNGvlSa{doykf7? z0YP)-+z3{E+;bC=(RlaM=>reZ2zhDm;41cKEP*>BZUf2bzTjOpRHV@ol6)4u)xbi4Wn}J0IC+Z?22+ zTcpZ1kfR6O??M99iS4IO!1OaOUtgT`xfJJS6;^LpbDN0t=>P%tkRizUV|`UszjYNw zmliEcpRy$R%XNH9A?4GzbXxf(-w0*uSS5;Lvcg9c(*Dr>lrzKXb6k_&dqGk@eoa!p zo+j$pN?}f7-A}7?KdRZd_G%t=7m+{h3TgsNrtE&&(P+5BJ`jUd%$_f^} zq@QB?a7A|FycJn-r3G1Wb@|!x4f$CKjbKG)e0gzhdRqC4>@O-;=f16hpnEs1uNc}` iQ+2qAcunxTBK{vlSfcl3AH*;K0000e)}7r@E@TdZ-?$KhJ*O-S0Vv zQ)jQW*V=2?>j;M#?l4R4yL0){b)D_U^^~f|h`M9ZFkhUXV`g*2S#waW7hD}84y-0d z&9E9G{eo;W*ydon8XLsPs(DQft4=>^@v8TnvACPV48kFf>wdrT_zm4%=WXxnJGX1F zd`1X*65{d#3^x(X48#zG;jRdvm;vG-9v?Lv1|neb8Z!lSV=kAwzpbg^{`t-I_q}z_ z*^iubl2oS|U_av4=bvwV;v4fcI}Kip564; zHQT!`uT<05sFD*WI02B1=zzFLNeqj#JDvj)2`|Equ=purm}QKF2oR+QKqgfpOMsf8 zX68kfw>0K&IQ5vhKltdGXKtTnfW3g3$rtW@{8dkG-1@$rQu$AVYSBA~$S(73oYi9{ zF-Ao8Qv{I#WNaTWEcP-c$c{0hR#dI#y!++C8BO0l=h9dI^m36f%>cWI`!-nJZ&xjU z=gQ4n{-#n*U*f$W;xZx}|4K?E~UGt5}m(op!qd8aM@`umnH?VDzR3Gno`ZH?c3 zc=bn~+t&Fp)iBG8gOSCW;G6+6+&^exHXci07^!M+L!o%x=?muk%g0}RR{JyqM65L{ zUiX{(KKh4E+y95E&P<#~1T0&0;lzO$W(T?EGDAc%-Gh-S2{1E)T3>z6f9}eptMZV5x>L<`NSW+X?x$@SAO>wpSju0AKDTiuJHf$r?-E3V`tBM^3G$s zMC@sp83y;9xAd6H{^sSUY&|3;z&-2NFZjpr|MK3=|3!SCU}8*;X-I5NIPdP2&pq_9 z|G4XnLrwzR@Wjefe){O@|G;dKL*mRgM3~f(GYta-K{13>ZLqbm{@vgBvx}A;5)$Am z4?X#+pFXns9>W%ifC)$zik$@05CmdC3WJF9E)A?_(F;wR-I> z-btN^UCUD+quQVN8x`mAo9zB2U$O32Ng}gM1Pmb4`{T3-L$GNn0hlS6fD!w)!&nJ|WO<5! z7a@f3wlDnPwp%us)g2Hs@IU_0(fo~j{_`$VJ6&W4zlN}WRGOBNJoE>RMX>Dq}`)~i`HJ2PG(tF5-gD?N~Ee4JkF*5(KDGc;sA%JE6 z007k#ATo*}$W{~Xal(JrYIe`tk8FAD^2;v|>;V!EAks9DByRuC{t3-e!)!lCBn2=K zacEkjVfEuQ_H^JIbEpX+k5WxOKWpZ!U%Fy(V;(vh8ykB+`q7V8$iOW`9BK?;s!?<7 zd(WDU=vJFh0LlT23Q(pZz^{^w}>x(^3QJEr;)*g!w`~*PY}V> zvRRJ-4lyuMAPdRLn6RAyWZ69XB84on<&WNfnGnI<><*?GK*rb;vV({f42yjaP7o2q zJcfWNf?^hlZ;ZCf%`k*1hX{6n&0%+Vg-|kGk68Q`BuN0UT7`0F2c?Z0==sA+dY^ro z-qlah|H698-CbCyAuhq?a)`@z1|bgFiSNQ}FWJMGW`L<6e&$&)%mn8XLbXcwibvV_ zi)F0;?ibl`(^uK_qi?b8)*IPA^xKA?+`v;`{~V8f;h%W&y3eupmp^3t6OT~t>cCJ$ zJTCFz93nEVBTM#>ni9_!gad`-@G_+U5uEej9KFx2pyPqNNVjYNHE=mZ3;<$i8Vy*r z0%i=XUq}DiXYsi_zM+Z2tT{9txtPXu-7AG(Xa<@cg#4ZKI3Wc&LvW*KQFAUMQ(3`qO?sP*;G|LjU|IebGSx%wix z=2nWc=8|t|Ay=%!aMb#HDR*q+*h{V;*Vu&Vp_AvBFbN)crw;#`gqB#z>eGL=x}`5D2Ay zbg-ZDwypF%w-Pgn(nQcuqj|~6__}&bm54*10nE&O`qQ6&(tAG-SY+cQDyr)JS6_Yg zhdGdl2`8caU&OzK!PQR<6W(y3h6x}bv18~Mz3UJxlO>syKrtNRzyvUdGcbv)BH)0w zlh4HG^H`c$i1?Eyt(Y3~FSwY7`3ta+5^?COfNy^Do5h}jv)phTNs&|h7Q4wUKX9-#fdT30`txA(B6y_c;+-&;HS=<4oc`?l?v8aOZmCyx5M z9CK$jaP<5ZPCj-nM=zSiK&i?<{`)=j_mvPAeGCUaxoVmL!~#+%kTlN()_{N-Sha=) zrKP2T8Ldq$IX25a!QxD>4AQk_1DIiAn0XQpO^roxE{iNDo<| zHL-nwFMa7tjn27QX4VYUt7;y|B}w8!2x3DZuEoqOh)C+38*ZvvbXM%`2gH-}M%#=AFv9>;L5&PxWVv`PO$ES%*lPWzyTT;+9hC6LPS46s0wcE_v&1@U6 z4cOwG+X!qu%>4k0hCpu45#Ycnsn%#{ZH8h4 znKYUDp#ER~^A~10iL|lz(D)dzaP{6?` zh7lqVg)O}m%wXQk299kNHfk39H4Yr67l8(s&h6uM^Oa*RIgM*?xQk-mgM|spiV1*u z5(f=ALo6fZcu8h>rBo`jV0Hul&$~{eW%d^Sc~d=|X&qvUARyCLzT6gq zE_v07-2KqAG&R&=3TBFsj9+k04DX;QfJ~CaAyBELT>8pmSaL)g)GEwMDs-gvI1U)5 z89+p+1))227%6qdJjWe98|OS=h&W^_QhF5z2dlj5^rJ{qrKUnj69n65wT`a2=9*a| zasek6my`ebgAR#-E*j!M+^ixkV84m0EiGw`Q5f6X-(MH(aV#oUO@5*h{Yxt@jr2s z7M?YT=L(2Wt)$%f;B#m#<%z*2HdY()63^klVwwTea3X9eC-es)gus`-cPCpmci;+n zL_DBlZT21g0|G{DA`p{Aal&;!ewc@!*@#PEL$w|`xLm-~Tf+pQlsX>i^{6B~vt}C~ z`M+=C16RC~SDbMy^$kUEf&~RrFh>R$m*o?k9PA^$Wv+pzfYN z%q-4!W3W^i`n{Lc&u!!G2iNlTWe@RJ|8xs)`yW5x=HEPxSisdc^Np^hY^*fk%s7ZJ zEdfA4AebOcZMY-{&V#|T>$mdE+KqTgXlf`>$mb9zG}Ps(R>}O!kJ{h>XqTwUAQ3U=bua1dHX>Jazd3NzOA^ zNvW^T(biH=T2ltgDShQCg<_t$t&P-DB^cBd6Y@Ea^8kVdrGCK?kS-Q4gmS8~fW z@8FitUC9qW_YPjNcrIxO7!CvshneB?Ia*IRG3E{IJo0B|hfJXsmzrF}0fVupFq??} zhRf$^IqhYbfS^FYFoYcCT8*zQyLU*>ucnp;@`=YM!t-0Y`0O|CWW|~-#A2pT zTBYgOrL-M)G8R%yb;_R0%ntDOaPf;dU=Yl9joMi^i@nK2gRM%-($i=`KY8cy4q=@v z^*b^E1|qY--D9OgyHNyEZXnMook&Iq*65H4H<{As(FDRsAOz z3URN#rYW_7ZYq5Pi1T9}GOJc6G@NiMsq^$c{(F*2i8Kho0*M#AIGh6!!&Ing0E1l4 zfe1}6Ig^Fw{V|p#^laRKh_N#inwrTsGy^!Hm`zxG z(g-+_jzq*7oKFy^7><39=!6jiVndh=;yk9xh6nCt?SKA`u61kBG|p<(v9D$k!DFZi z_ynm|$$R0o=by#wS#50C(m`kUAf>W^6K2#GIdc9CX3Z#a`~54~($PnI?|nS?`+HGU zz$R5!NwLW66Ha2ug>PWa(i733J6|l4J-z_WC-_9hF!NMk?3+#<;#`MZ@$H{IrEn7H zezgik00Sn?r8C3{X}QeuZ+(>)?!OaL1#vskp$-wnOhyer(7?a_ulI4)yDp}uvyXvN zO0C>S80@5&PiURdKu=FUuYS*$ShuMi7w>_9Ov(TPrXv~3FS+z`PJGj4k%$wAj72P7 zD;PHA)xR~WCFdNVm}O?FH+g%aW+Gx3Zuf2=hS{E%f;Y=LlW{I4JpA3Sv;N-O5$6%_ z#~FM;Vlw~_0+Q)t0Mc5(Cyv(ECfeE@RxO}|G7|FZ=md+CL7c+`B-;H5z}UBvo5YNw z_?uQMJiY8YxLm@CZ@df*RVJ$KoH40Qxp^HF+8PR|LC;_XF%aj7K#>lI6EzG$*%cVE zne3PKt4nfheE5Dg-1A$UOD3qOomJeDjKdLZM097f5Kw`jSWrw2fPSioEoD~lN# z0x}XakWApaR1rYDN9yYF#YXZoXHjfz zBj40YuC5VZ$m8;P3Pb%ewfX&Ywj`FXi;Ny`S2{Pog29X^l`RQ!5Qn8|b6f z+l^HQur$SL)k$UG)|F2|k^|cZ1+P_iP@ziHdn6*P?dal1E7sCitbITb+hJB z*EXAcQ%hVYIK(Ac_J3OAs3R9~&Ka*n+wTDz1RN$t8k7fDcCo3ejIURgG&RzHg7ePEk2H!PKxMAG@y+x?HT zse1r#`#_Zl1T6BMU?`$6-mTpIR8Mr`bdvXQLY+s@F@!Z7)D>`T3lLd^3GD0zs1}s4?ir?PhKPAg z6o9a8J^f41!kTAd8lvg}6flQbAm>&aM48jl2&P!w(WE}1 zP}|INo1Wvr)ji~WRAmSN0T2ZhL2PU#u~Y-j0)~tdzhmtL&?G^oP(Z49ya~QMNPgpU zl$&ONfXL{H;+*m1=61FZmT(?$QG%Obxa~xPxlcsElu2P=ktAIMC6+z?9Jj4`fyXy( z$9Vx`pTJ^?F4S=KjVwI(Lc|HC0TBfW8H1ROjuslIf=hC=)Yl^>s3;Yg%ZeKx<$>$( zCJh22sDzOVExN2_gmkeVNiIrcc#Ul=EURD!OpTpyfHOhkxFn^4%uK~)nN9{dpW}`- zn|OL_H;GFki3Je@)9nDxln&y>lR>gU#t@q8ax7}9NA}^)_>8EAnGF|aXq>wcO#_%> z3YdVA5#KEKBPy{VXUWyA)S9gJQ8jf4Rz!o_L1t!9kMxItud^ffs;`cOdgCS;kw~ zL@5jwui5#inM|eEL`H~gW1d|w1wp8$fj2Hanll#8rWQgBs6|?#>j50fCiXx$dFNQM zwUZw`y(V*MicBHlv(T?O5Mb_0UqQZU2AJ){17_n&uEzR0daGrg@93gh3*=i`nfu0z z@!~O45aY0cWYyA-X>De1LwzP4Pz3PiR{=QZ{0m@UyHBLPa+S^9{c-FZ=+su`8u?5E ze$GN>opdHAsD`?1#=0);YELNUix-jI&aNut@`!_q1_p*1079h% z1P(`-IdVzD&sVMEk&W9(oQD{%0H{x76@dG}6|a9Du|YF-3qh5W=FjA^la2+G*rqn) zEqc2s%$-l$@h71n1rq?o35bAzI5%0YSS%O;4(O|-Adq%-VnU*8GfM8wSGu|3h>c_-8-3CLs%p-8LoEQ;*-*z_t@#ChhQeE~_a z3CuutkP--*Dj;Mxns@;#2z`|*!6Y*lj6)t~V;&a6nAKFIsVD+$PI@5*uznye4~q%+F00vu#0;RfKUSrCmhFXDysZnq?^AMD82S08Z}{+-_R|&u;JJ z*Q?ecBALD>AlNAT(;yy;#IxwC-NA1YYxj}a&_+*ZCu#@fSC7j`$&|9itB2>G&Ax%Lzq!EW7Axm$IlZ^VDr{H(=L+-!;vl<)jQZr>Y;Y9Gx zp=zW-Nj0G6u*eLx5Qdwof=FD@5C2XugLq5T;qyp?W~LuPUtb@6o!yax9EPGHC8RNq z4{Uwp0ZJVmR0m3^>WC^*4TLl$qy|7RLj$B~V4zlEpi)ItVnE1o2qTVNKrK3XfLhH^ zRi5t|prceFi)6dBc?P3Zz?c5ywH<2u=$_@7!BMlCdHvF(dHo5CX>BNws?kzk4_tf4=!N*4!>o#+2zE$H0X3tkkmof^j^K}n#&1S_9U(wV zU15kGNAcRBcKfp%cxZjx>i~c)zwVMt28nP)i1ABy6H)9B2ZWAoYh-b269u0KgF?=8 z^o$mcZJj||T@ehta~#pqIP_Z+^P3t*Za=4?Fm!!0N4GZOoyQRJCLGn+$SI5F(@-p8 zW+XnxOXknztN#6|O1GG{iJ1B^K>O+)9+89ILsN#g159iTp+ zV?j$JvzwX-aY47+FKjad$a3c}8Ff61Q7ec8v$!C1aV-#lxR6BH{K5I)er&T+TQ-p>dd)62R$+R=~>_mM1b4+EEYdN!)C;U~07*`x?=7Mon(mDFfW}&PyJ@?3=ed>AgF}G<)~%K1C)0 zK!om&PBdg2G_#j5D$eKWUi$|Io_z-K4l}@_cyk6A$e66)*cHm<66IQzLaso6r9!Dv z&D^NAcMQ_HrI_~~RUK}V&HngJk|ZPjeGP-_cd0_i%$Y~rU`E#--v--*NCqH6PiNPd z9m??_;&XJbT}^r29}w?>ELRV$fz<$;G_$CquMYst0+F3xFGejd`5ShL0j|5`tU*(~9t`%V(uM4PjypoNQe~j0dz=S}redhFb@>CB z2F8Oa@m#z|{%VJ*&kc7!5`lL@yP8jScIDwPU- zr83S511+r}4wJAqi`dB|z(hnIzGkW*GI0pr69511R*|UhzvE47g4&JjKK4kYR;$&h z`vDm*(xGgB;$bXQ$CWS=QbH}=d1-h7ObBU8cYg^nqcXFNknGKS1`RXAdyjLD-9lsl z=iHQ+h>`3Y!G5*u9dCSWx2uG?ocvE99i^ss#SS(jtLOo08k=SPtYH{k?d?>{<#9`^ zh;#I9Tsv&{n{#9)p~Y{(LO^RZG7gZPCQ^3v^kQj^O4}?#k|2{*pPFD^VevCbJR-ZT z`XU2lgA2lBknH)gUgq%0HpGeoAnHE5M|A?1z4Oh_{^_@Va(&|bRig*u9d|?);uRY=qIhq?v9>N@TX#Qwy#t7hW`K@oR-n}i0+^F%C1f#BiCmgV5M%t; z0Xo1K7%Wk)1$<*OnlB(~S)GE65HTxw^iZ3`V+B@_W5)M}VXWP%70gt2L48UpP-eaxHLO0BMemaQA{f8zL3wDl}WT2ppsCYe*`x7sQ8ST zdK6JmZd&&4OCQ|pQnB?5>i$=GOZjbr9ElmSlSPXl7#^Zssv~0Bp=wC1y=P*?y*D@! zHgxw=SIAMR8nsjr*>Mf1m>Dj~(YoYBW-MMx-<*k5&r}_i`c{^laT+0R-muA5A_kTuh;v|ynIJ?6n7N9x@OM*EEBL#w zd)>fg-~QQ$#O&vj*{cSbYgV9RV359=GP5oL1v9}ik7GR7II69M(=R-mhhNytVE;g* z*ce1cP)yxqw#6SgsDq!z$&^bh~y(pxXP{+1s)?=IV=)Kmiz8!ou~ z`xmxy>G4NWA%J9MR-A!%30wOHhZ9OR_Vn`o`yR&-+(b!lfGNyuP5A8jvzgi8L4oG_ zY;&u4Fav{EEpDPE=lO59Zl+qzBui9Lw0HL~dqx|jN`--*VR4R&i%he4W>8K!x}MLy zVF87_2h}WiKr^)<*p@uFJ+s|gibXaL_M=+E`+OY6iQh#m#EBpi*g7IB=g#(5PkFKE zVy^g6Gwa!@%U5K?v6CvKrrfe(E%$ENMs_UT)IoQ-%x8XfC;#*NxAK)+@1$=y2S9e3 z^Q@_I>iiar(SE7R}0GYGe>Z99`W#^w!r?nbAgPd)LVB zS`Cp)R@cav#5b;ceP*W~_X)FKms@Yf#z{Z&WqgU$iSGR8F@ihZG zFqeQR^XJZnfqqu4Se-FRW=&x#{O`BS;Vq}lfFKMGrrh~N2itnfcs$kA*w~xw(aS@f zI66vYw$+U0);7$H+N_1>ocRb~am_Vu70lSTQ4v-5e}3@x*Z*Jpv`qDD|Mu!HC*J?{ z_*G>LHKUMAIA{J$jwm_+ftDb*&qPo)E;(f; zZ#k(I3znHZ$e1!|DvC45|9AIhR&5=`xv>mDs#LnWC=FJ2VCc*@aMdekbN;b2FjJO4 z+s7S`canJGX@Ylq9!zo~I5AWWhf&Mb(X;RvOcLVu^hwARC4%G0nY9^bFZ=w*O8b-n zF24BU!shksA8^i{J`qQm2{j8?rg7te(M~xN2bP_cI5*rT+u*^l2hHygN;M)-1P3Dn z7^*3tWxD(NaE?)lC6);mTy*s!LaK&j50DkEvOO71iz+36NL(8UX{8*k zB?XgRp+2=fIT)Qng+eq}O$A(v!vPLZ48Zoh z_KzS~jCDY^K0*}3XTR?hLI~*KB_i9LX@hdB4#b1yCw3O@sqF^Py`h{@QRL74~` zExt^4sH|;!SrJ>vVB>meB@TG0RHD1PXWV-l771=Ut^6HD4SR~wqa=}G4Vyfv1mM~g zD^`4zJ%q3qc<+1P`~F-mcU>lm4=soY{r&xH-@g4I`1^NHhr}`eMN?DLo0lzH77hpl z0KD&g@B1h3{oezJECaN+w{xf98{hcGKd9<=*e{qyB>q}e zePbm4fq!e*MHgN4-ZV|Wvt!=dH1^3}gY{{ezIKTC+YXx7#$A5-<>AO9k9H~tP_z7e*4?st~u!58~B;ed`7?i^{-zQLiozK+&hiEO+0;0RnNcew%gVn zv@ebn5gTHH57uh6tEW^AOykisP0t?^`x_34H-}z-{q>&?A^f?Bl-OHL9&{p!Yr3m0CXs{bG&DbtvYDVGChX2d_l8Gy_}_}{8}4zQXD zFfH-znjv%goL~LwSI-`nuaE!Q*S_{pb93{VX7>3Pt2CIvI(j^WaL$mf|HO6IT~}j2 z!m*!m%{A8y3^BsTRP}V=jxp82Uqs$L5gAa`j}I;M&Kh#=Jiq}!!T~^(22TSQ{^ei( z<=dQd*NDiX7m-sZsOk-7_K!ole#21XK*4c`9~eJIBjcF2)P&Fn{J_SvD?{ul=lgo6-Q zU3FD1P1Cm~N%DT+HGmwvet?OY)XcU4*O}Q@Ci3J>Gr;6oN5^>Y|58NW4a|>&eb73B zM5L;!zcRBQBuVn)U;gr!6?TGY6)<^RVGZ!9n{U4PABP6>Jm=h{-up{|B?pnH?*@Js zLik0YP`G6%V%J3mrWs(0at?sIV*Bqy*27Ce2$v*Da-oQv12pZe$li_X+s*8O5W)kh zddJL}Gk+iR@(wu&hXID9ga6&{es{8nywuFjG_we#@3EGt8_-L>fh;5JIQ}asatp&ieZLY={AB t-uqITrsX6_O3u07TCLU{_4i?o{~v+ENCc*U6Gi|4002ovPDHLkV1g+;dJF&n diff --git a/app/assets/images/etapes/shared_4.png b/app/assets/images/etapes/shared_4.png deleted file mode 100644 index 6fcdee93856d5896c9aa4513b071c81ea2f55d52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8773 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 diff --git a/app/assets/images/landing/hero/dematerialiser.svg b/app/assets/images/landing/hero/dematerialiser.svg new file mode 100755 index 000000000..8398e066f --- /dev/null +++ b/app/assets/images/landing/hero/dematerialiser.svg @@ -0,0 +1 @@ +0EA652BC-3A4A-4613-BA33-535DF72E7337 \ No newline at end of file diff --git a/app/assets/images/landing_background.png b/app/assets/images/landing_background.png deleted file mode 100644 index 5e4169f673e39810375caff077dd3eb08045a166..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38938 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 diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index de55f5732..63cc9df32 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -1,58 +1,64 @@ -#logo-tps { - width: 200px; +@import "constants"; +@import "colors"; +@import "mixins"; +@import "placeholders"; +@import "typography"; + +.landing { + @extend %new-type; + background-color: #FFFFFF; } -#landing { - background-image: image-url("landing_background.png"); - background-attachment: fixed; - background-size: 130% auto; - background-position: top center; - background-repeat: no-repeat; - - h5 { - color: #808080; - } - - .logos { - width: 150px; - } - - #title { - padding-bottom: 2%; - padding-top: 1%; - color: #FFFFFF; - text-shadow: 0px 0px 10px rgb(0, 0, 0); - - h2 { - font-size: 35px; - } - - .btn { - text-shadow: none; - } - } +.landing-panel { + @include vertical-padding(60px); } -.background-tps { - background-color: #668AEA; +.landing-panel-inner-content { + width: $page-width; + margin: 0 auto; +} + +.hero-tagline { + width: 500px; + font-size: 30px; + margin-bottom: 0px; +} + +.hero-tagline-em { + color: $blue; + font-size: 36px; + font-style: normal; + font-weight: bold; +} + +.hero-text { + width: 500px; +} + +.hero-illustration { + width: 500px; +} + +.hero-button { + @include horizontal-padding(30px); + + display: inline-block; + height: 60px; + line-height: 60px; + border-radius: 60px; + background-color: $blue; color: #FFFFFF; -} + font-size: 24px; + margin-top: 30px; -#landing-body { - .split-hr-left { - margin-left: auto; - margin-right: auto; - - margin-top: 40px; - margin-bottom: 20px; - - border-color: #808080; - width: 40%; + &:hover { + color: #FFFFFF; + text-decoration: none; + background-color: $light-blue; } - #etapes, - #request-access { - margin-top: 20px; - margin-bottom: 20px; + &:focus { + color: #FFFFFF; + text-decoration: none; } } diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml index f41400e64..1bce47c14 100644 --- a/app/views/root/landing.html.haml +++ b/app/views/root/landing.html.haml @@ -1,87 +1,17 @@ -#landing.max-size - #title - .center - = image_tag 'logos/logo-tps.png', id: 'logo-tps' - %h1.center - TéléProcédure Simplifiée +.landing + .landing-panel.hero-panel + .landing-panel-inner-content + .hero-text.pull-left + %p.hero-tagline + %em.hero-tagline-em Dématérialisez + %br + vos démarches administratives en quelques minutes - .row - .col-md-8.col-md-push-2.center - %h3 - Dématérialisez n'importe quelle démarche administrative en quelques minutes, - avec un outil - %strong - gratuit, simple, collaboratif et sûr + = link_to "Demander une démo", + "mailto:#{t("dynamics.contact_email")}?subject=Demande de démo TPS", + :class => "hero-button" - %p.mt-1 Vous êtes intéressés ? - %p= link_to 'Programmer une démo', "mailto:#{t('dynamics.contact_email')}?subject=Demande de démo TPS", target: '_blank', class: 'btn btn-danger btn-lg' + .hero-illustration.pull-right + %img{ :src => image_url("landing/hero/dematerialiser.svg") } -#landing-body.max-size - .row#etapes.center - #create_1.col-lg-3.col-md-3.col-sm-3.col-xs-3 - %img{ src: image_url('etapes/create_1.png') } - %br - %h4 Administration - %h3.text-info Je construis ma démarche 100% en ligne - #complet_2.col-lg-3.col-md-3.col-sm-3.col-xs-3 - %img{ src: image_url('etapes/complet_2.png') } - %br - %h4 Usager - %h3.text-success Je remplis un dossier de manière simplifiée - #message_3.col-lg-3.col-md-3.col-sm-3.col-xs-3 - %img{ src: image_url('etapes/message_3.png') } - %br - %h4 Usager - %h3.text-warning Je dialogue avec mon administration en ligne - #shared_4.col-lg-3.col-md-3.col-sm-3.col-xs-3 - %img{ src: image_url('etapes/shared_4.png') } - %br - %h4 Usager et Administrations - %h3.text-danger - J'invite des partenaires à co-construire le dossier - - .split-hr-left - - .row.demo_account.center - .col-md-4.col-lg-4 - %h3.text-primary Acteurs publics - %h4 Créez des démarches en ligne simplifiées et sécurisées. - = link_to 'Démonstration', "#{@demo_environment_host}/administrateurs/sign_in/demo", { class: 'btn btn-lg btn-primary' } - - .col-md-4.col-lg-4 - %h3.text-warning Agents et services - %h4 Accompagnez et co-traitez les projets avec les usagers. - = link_to 'Démonstration', "#{@demo_environment_host}/gestionnaires/sign_in/demo", { class: 'btn btn-lg btn-warning' } - - .col-md-4.col-lg-4 - %h3.text-success Usagers - %h4 Profitez de démarches simplifiées et d’échanges continus avec les services traitants. - = link_to 'Démonstration', "#{@demo_environment_host}/users/sign_in/demo", { class: 'btn btn-lg btn-success' } - - .split-hr-left - - .center - .row - #utilisateurs.col-xs-12.col-sm-12.col-md-12.col-lg-12 - %h4 Ils nous font confiance - - Conseil Regional Ile de France, Politique de la ville du Pas de Calais (ensemble des administrations et collectivités territoriales concernées), DRIEA Ile de France - %br - Préfecture de la Martinique, DRIEE Ile de France, Ministère de l'Environnement, de l'Energie et de la Mer, MEEM, CCI Normandie, DGE, Assemblée permanente des chambres de métiers et de l'artisanat - - %br - .row - #partenaires.col-xs-12.col-sm-12.col-md-12.col-lg-12 - %h4 Ils travaillent avec nous - - Insee, Infogreffe, Ministère de la Ville, de la Jeunesse et des Sports, IGN, DGFIP, CGET, France Connect, Open Streetmap, la BAN, api.gouv.fr, Euroquity - BPI, FNTP, Qualibat - - .split-hr-left - - #request-access.row.center - .col-xs-12.col-sm-12.col-md-12.col-lg-12 - %h3 Envie de commencer à créer votre démarche ? - - = link_to 'Demander un accès administrateur', 'https://tps.apientreprise.fr/users/dossiers/new?procedure_id=31', { class: 'btn btn-lg background-tps', target: '_blank' } - - .split-hr-left + .clearfix diff --git a/spec/controllers/root_controller_spec.rb b/spec/controllers/root_controller_spec.rb index 94e83fe2f..474f03dfd 100644 --- a/spec/controllers/root_controller_spec.rb +++ b/spec/controllers/root_controller_spec.rb @@ -33,7 +33,7 @@ describe RootController, type: :controller do subject end - it { expect(response.body).to have_css('#landing') } + it { expect(response.body).to have_css('.landing') } end end @@ -55,31 +55,7 @@ describe RootController, type: :controller do subject end - it { expect(response.body).to have_css('#landing') } - - end - - context 'environment is not development' do - render_views - - before do - Rails.env.stub(:development? => false) - subject - end - - it { expect(response.body).to have_link('Démonstration', href: "https://tps-dev.apientreprise.fr#{ users_sign_in_demo_path }") } - - end - - context 'environment is development' do - render_views - - before do - Rails.env.stub(:development? => true) - subject - end - - it { expect(response.body).to have_link('Démonstration', href: users_sign_in_demo_path) } + it { expect(response.body).to have_css('.landing') } end diff --git a/spec/features/admin/connection_spec.rb b/spec/features/admin/connection_spec.rb index 9915669c1..3966641c9 100644 --- a/spec/features/admin/connection_spec.rb +++ b/spec/features/admin/connection_spec.rb @@ -36,7 +36,7 @@ feature 'Administrator connection' do page.find_by_id('sign-out').find('a.fa-sign-out').click end scenario 'admin is redireted to home page' do - expect(page).to have_css('#landing') + expect(page).to have_css('.landing') end end context 'when clicking on profile' do From 58a7f399c058dc4358c2c6c630a7d4545d2bb111 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:41:49 +0200 Subject: [PATCH 069/102] =?UTF-8?q?Add=20the=20=E2=80=9CFeatures=E2=80=9D?= =?UTF-8?q?=20part=20of=20the=20landing=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/landing/features/collaborer.svg | 1 + app/assets/images/landing/features/creer.svg | 1 + app/assets/images/landing/features/gerer.svg | 1 + app/assets/stylesheets/landing.scss | 46 +++++++++++++++++++ app/views/root/landing.html.haml | 30 ++++++++++++ 5 files changed, 79 insertions(+) create mode 100755 app/assets/images/landing/features/collaborer.svg create mode 100755 app/assets/images/landing/features/creer.svg create mode 100755 app/assets/images/landing/features/gerer.svg diff --git a/app/assets/images/landing/features/collaborer.svg b/app/assets/images/landing/features/collaborer.svg new file mode 100755 index 000000000..f5fe6cf85 --- /dev/null +++ b/app/assets/images/landing/features/collaborer.svg @@ -0,0 +1 @@ +08D2E231-4C84-4B79-AC9D-982A43B5F62D \ No newline at end of file diff --git a/app/assets/images/landing/features/creer.svg b/app/assets/images/landing/features/creer.svg new file mode 100755 index 000000000..fc7082a93 --- /dev/null +++ b/app/assets/images/landing/features/creer.svg @@ -0,0 +1 @@ +BB9A4BB9-1A5D-4E79-92B9-D2AF8B16FCF3 \ No newline at end of file diff --git a/app/assets/images/landing/features/gerer.svg b/app/assets/images/landing/features/gerer.svg new file mode 100755 index 000000000..6372bf120 --- /dev/null +++ b/app/assets/images/landing/features/gerer.svg @@ -0,0 +1 @@ +48989501-DD47-4082-8A9E-1AFAB7A24CFE \ No newline at end of file diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 63cc9df32..86ad4c7ff 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -62,3 +62,49 @@ text-decoration: none; } } + +.landing-panel-title { + font-size: 30px; + font-weight: normal; + text-align: center; + margin-bottom: 40px; + margin-top: 0; +} + +.features-panel { + background-color: $blue; +} + +.features-panel-title { + color: #FFFFFF; +} + +.features { + @extend %horizontal-list; +} + +$feature-width: 320px; +$features-count: 3; + +.feature { + @extend %horizontal-list-item; + width: $feature-width; + margin-right: calc((#{$page-width} - (#{$feature-width} * #{$features-count})) / (#{$features-count} - 1)); +} + +.feature-text { + text-align: center; + color: #FFFFFF; + font-size: 20px; +} + +.feature-text-em { + font-weight: bold; + font-style: normal; +} + +.feature-image { + display: block; + margin: 0 auto; + margin-bottom: 24px; +} diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml index 1bce47c14..e16c8f5a9 100644 --- a/app/views/root/landing.html.haml +++ b/app/views/root/landing.html.haml @@ -15,3 +15,33 @@ %img{ :src => image_url("landing/hero/dematerialiser.svg") } .clearfix + + .landing-panel.features-panel + .landing-panel-inner-content + %h2.landing-panel-title.features-panel-title Un outil dédié aux organismes publics + + %ul.features + %li.feature + %img.feature-image{ :src => image_url("landing/features/creer.svg") } + %p.feature-text + %em.feature-text-em Créer + %br + des procédures en ligne + %br + en toute simplicité + %li.feature + %img.feature-image{ :src => image_url("landing/features/gerer.svg") } + %p.feature-text + %em.feature-text-em Gérer + %br + les demandes des usagers
 + %br + sur la plateforme + %li.feature + %img.feature-image{ :src => image_url("landing/features/collaborer.svg") } + %p.feature-text + %em.feature-text-em Collaborer + %br + pour instruire les demandes
 + %br + à plusieurs From 4b2baa25b7945c523c6c6cf8cf698338d28441ac Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:41:37 +0200 Subject: [PATCH 070/102] =?UTF-8?q?Add=20the=20=E2=80=9CTestimonials?= =?UTF-8?q?=E2=80=9D=20part=20of=20the=20landing=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../landing/testimonials/quotation-mark.svg | 1 + app/assets/stylesheets/landing.scss | 35 +++++++++++++++++++ app/views/root/landing.html.haml | 29 +++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 app/assets/images/landing/testimonials/quotation-mark.svg diff --git a/app/assets/images/landing/testimonials/quotation-mark.svg b/app/assets/images/landing/testimonials/quotation-mark.svg new file mode 100644 index 000000000..7c49b4e05 --- /dev/null +++ b/app/assets/images/landing/testimonials/quotation-mark.svg @@ -0,0 +1 @@ +Slice \ No newline at end of file diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 86ad4c7ff..93300e50e 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -108,3 +108,38 @@ $features-count: 3; margin: 0 auto; margin-bottom: 24px; } + +.quotes { + @extend %horizontal-list; +} + +$quote-width: 500px; +$quote-count: 2; + +.quote { + @extend %horizontal-list-item; + width: $quote-width; + margin-right: calc((#{$page-width} - (#{$quote-width} * #{$quote-count}))/ (#{$quote-count} - 1)); + background-color: #FFFFFF; + box-shadow: 0 4px 16px 0 rgba(153, 153, 153, 0.2); + padding: 24px; +} + +.quote-quotation-mark { + margin-top: 12px; +} + +.quote-content { + font-size: 18px; + width: 388px; + margin-bottom: 24px; +} + +.quote-author { + font-size: 14px; + margin-left: 64px; +} + +.quote-author-name { + font-weight: bold; +} diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml index e16c8f5a9..ad1a4fc52 100644 --- a/app/views/root/landing.html.haml +++ b/app/views/root/landing.html.haml @@ -45,3 +45,32 @@ pour instruire les demandes
 %br à plusieurs + + .landing-panel + .landing-panel-inner-content + %h2.landing-panel-title Ce que les utilisateurs pensent du service + + %ul.quotes + %li.quote + %img.quote-quotation-mark.pull-left{ :src => image_url("landing/testimonials/quotation-mark.svg") } + %p.quote-content.pull-right + TPS c’est surtout l’assurance d’un dialogue en toute fluidité et en toute transparence entre les porteurs de projet et l’administration. Un service qui garantit une économie de temps et beaucoup moins de manipulations des dossiers. + .clearfix + + %p.quote-author.pull-left + %span.quote-author-name Nadja Briki + %br + Déléguée de la Préfète du Pas-de-Calais + .clearfix + + %li.quote + %img.quote-quotation-mark.pull-left{ :src => image_url("landing/testimonials/quotation-mark.svg") } + %p.quote-content.pull-right + TPS est un outil de dématérialisation adapté au dépôt de dossiers de demande d’inscription au registre des transporteurs routiers en Ile-de-France. Les échanges avec les usagers sont facilités, ce qui permet de réduire les délais d’instructions et de gagner en efficacité. + .clearfix + + %p.quote-author.pull-left + %span.quote-author-name Elodie Le Rhun + %br + Chef de bureau, DRIEA Ile-de-France + .clearfix From f604ccb7d6166b81a24380ff7d3957996a839879 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:44:41 +0200 Subject: [PATCH 071/102] =?UTF-8?q?Add=20the=20=E2=80=9CNumbers=E2=80=9D?= =?UTF-8?q?=20part=20of=20the=20landing=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/stylesheets/landing.scss | 29 +++++++++++++++++++++++++++++ app/views/root/landing.html.haml | 27 +++++++++++++++++++++++++++ config/environments/production.rb | 2 +- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 93300e50e..8d5cbae04 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -143,3 +143,32 @@ $quote-count: 2; .quote-author-name { font-weight: bold; } + +.numbers-panel { + background-color: $light-grey; +} + +.numbers { + @extend %horizontal-list; +} + +$number-width: 320px; +$number-count: 3; + +.number { + @extend %horizontal-list-item; + width: $number-width; + margin-right: calc((#{$page-width} - (#{$number-width} * #{$number-count}))/ (#{$number-count} - 1)); + text-align: center; +} + +.number-value { + color: $blue; + font-weight: bold; + font-size: 36px; +} + +.number-label { + font-weight: bold; + font-size: 20px; +} diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml index ad1a4fc52..fcba3b858 100644 --- a/app/views/root/landing.html.haml +++ b/app/views/root/landing.html.haml @@ -74,3 +74,30 @@ %br Chef de bureau, DRIEA Ile-de-France .clearfix + + - cache "numbers-panel", :expires_in => 3.hours do + .landing-panel.numbers-panel + .landing-panel-inner-content + %h2.landing-panel-title TPS en chiffres + %ul.numbers + %li.number + .number-value + = number_with_delimiter(Procedure.where(:published => true).count, :locale => :fr) + .number-label< + procédures + %br<> + dématérialisées + %li.number + .number-value + = number_with_delimiter(Dossier.where.not(:state => :draft).count, :locale => :fr) + .number-label< + dossiers + %br<> + déposés + %li.number + .number-value + = "#{number_with_delimiter(50, :locale => :fr)} %" + .number-label< + de réduction + %br<> + des délais de traitement diff --git a/config/environments/production.rb b/config/environments/production.rb index 79e0eed48..60eaafedd 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -55,7 +55,7 @@ Rails.application.configure do # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) # Use a different cache store in production. - # config.cache_store = :mem_cache_store + config.cache_store = :memory_store # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.action_controller.asset_host = 'http://assets.example.com' From 663b5567667be3d9baa9af84820907e2a76230fa Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:41:28 +0200 Subject: [PATCH 072/102] =?UTF-8?q?Add=20the=20=E2=80=9CUsers=E2=80=9D=20p?= =?UTF-8?q?art=20of=20the=20landing=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/images/landing/users/cci.jpg | Bin 0 -> 11850 bytes .../landing/users/chambres-de-metiers.jpg | Bin 0 -> 21236 bytes app/assets/images/landing/users/driea-idf.jpg | Bin 0 -> 19549 bytes .../landing/users/ministere-environnement.jpg | Bin 0 -> 17071 bytes .../images/landing/users/region-idf.jpg | Bin 0 -> 14687 bytes app/assets/stylesheets/landing.scss | 21 ++++++++++++++++++ app/views/root/landing.html.haml | 21 ++++++++++++++++++ 7 files changed, 42 insertions(+) create mode 100644 app/assets/images/landing/users/cci.jpg create mode 100644 app/assets/images/landing/users/chambres-de-metiers.jpg create mode 100644 app/assets/images/landing/users/driea-idf.jpg create mode 100644 app/assets/images/landing/users/ministere-environnement.jpg create mode 100644 app/assets/images/landing/users/region-idf.jpg diff --git a/app/assets/images/landing/users/cci.jpg b/app/assets/images/landing/users/cci.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c4a9e379498cb6d1434af8ee2d40fd06d2248bb GIT binary patch literal 11850 zcmaKSbyOTp)9)^eTX1)`;O;E0!6jI5cZU$%-3h_neen?7-90!7?oPPm`JVT?_uN0; znsa)jduFQYbXEVVt6rC0HvwpJQnFG2AP@imz8!$qRY36D-G2z`?E(twt$l0$hd@xE zH+pNJ{}Kr1AA(raGZc@jlroR#+taNnbNt@TY#E-Ny)|=CL`t9Zm`~8s5+eezGAG3p;xqf>-rWo;yD!l@5Bq>;2 zPbH;exm=EY7~^Ms4$E90&+@-H&3tq&H6-b@reSX+Od(yKpuII&?rE&D{ZgS=6u5JD z1#S?@S|P+ZDVY?%X>KY=uu)D1G$Tz9?;it}j2!kV03X79M2 z@_&=;zmUjZ4Zf-9uLA!c6~e+n!@z@}fC&F+5DM+Te1Yb2i0IQ>|Krgr7(wAmqVR3b zco{nSAU&MLw59#zY7A7=Urf|{r{8a9ZqtM&)M0EAaM66VI{y+;(8{Zd9YA@gWS6=2 zeBm+EJR*jk`?!s{cSBvwUtRDRymVn;eR#H79lx7p|CHK~tqpzgkQyhL5?Na>VxSlJmc5&aeuJM)J#7At2{aR*Ot zw=e=SN@PDAnf$&ccpLi_#VJ{^9iJ(c`x+j*&Dz=DvVEP@nba_LlN0~oA>Q!{u>Zm0 z>)N@^rMUHBwQ;eHhpp-HC+o#Fo4s4{)D>HxJo855Wr@8ZL_|u2A1kLq7yqX>bDR9n z5R-9hS!4?fxRs|08zh(FTBiGE`7=S;K|6*I=-+R-Nz66VcnDFYqmBh6tY zitEg#iN0QcE zeF-QfWm7-gcfze8ZHMQpiaQKWO{oRhGr>C+1f&B`avloB)x$W)8A_OyeDJGBynTl8MxQ z(^|)YX)<2rG{r}V5oeMfBcHiLiorr6a-|2+s_OF2vezkdtgQ}dcVBLN@ykLb5}Ry)m>`wpV=!^#69no`uSrP)UeUqLmd^H7--C<8>ORK(Ja{ zHustBLU2c=IwgA7h*393@8hI715IC!Dy>ChneRTF zeGh~mJhdvjlYybF0b(?p~zRB2P9VYs(wvPAg`7^HD2;>_o|v9&RqfauV##bPDB zz%WyUDflZhi)(bpec{3Hl02Py-hk9Gb~fP50ktGw+DF1ywLK(vB!SZEdC z=E)u~;el7<_jXsKwFAch~BZjY;=Zk?Ls;8ejfU*BM8X`ne^4nDI=qsQ}{7C$sv zz5NlqGz}7;c)zcW6^u4b_*jN7x4?P0%bu<7$R2h1Y+W<^k>|qb9E(%^6~NKNJKSJHGMBd&6G>yv-s-w{`K1>D7Pjt~ zm`PqC^kwzZto^?CeqK{i00~O@iQq?sl?D6}!c$>(L;CFP1BwlNy7}klPnQpQGMA6@ zs0bB-6e&hB%Y6fUhGy1~V@wKNx3+54(19JR2I@xlm_C`5n;7wE$`YdX6=CuPqtKnK zo+Acr<_o~uvoOMvqt0FNa9kko(gJ{4fKf`jz~xd+257fkp%1cjXx~1u8jJo+8M4>% zk}_KBQrJgWlSnLDcUhw{vBJPj>(-0wN{XrCKREbVLdbe&6cX4Ehk#%0!>$_KwDitt zT#vC*yZjcbU~d=3kq0+78fsdj)7pymd}RNlYkFle)eCc99l}v~y%zj{_vS-sEw_T2 zCjWiSV3D@M@al?Z8L=(8TjOJvv(tbUIoIg8*Rt+prP+_9YW8L#msl%nX}NB&P8YER zMQ6!sYQOH+#{%qH{95UZueI9Z4kfa31}v*2)-%^-V`|HeC8N<*O4zyF$-i9cCVpTU z5Si)OWq$%dz+oWqv2bZLc_k6bW=bX%0z<=h_VHi9J;#CBi7x7YGN%2a-i5tqZQL-e zoSog>)t;VvvKMNp>9V&XsG{)~n2G%q^4|1V)!15Kru4e!ajRl$fNCD)dt=U5!cmhZ zxlFLM^T`AI`m@oqbH9G|_$*CMS`ezvZJ~4M&!6X0QyCdXrJi;9A3eLUuAKP2zgtZw z%&MS`H@kZ>B?_h{FDHDmCWHzX7bmV+@iOHqxADo0r?SV=3M9s%C6b89ct5P@*H}q# z+7%qFH}&V(dHEf&N!ZGibIhmk2My$5I~W8;rIq=%%7#{_mFp#K%m60%nWu#fjdW=> z1oL4=)9+C~6f*eR;Yz58DYQ!(!q%7A!Hdo7nsRG$q{d8mYfFf@o>oMu3=&=_$vfeq z6+7nBVM`jAn>dxM4h`q~MEiGhI0l?TOz1TQopP!X=G%7b zosF>47vVKOtJn6R^1AoNq1Q@SEGL-T)N<2cFkSP`B2%6;qlgtQ8g@ITD4WO)ZZTN5 zgG`O`O19zBi9_!2P04~|&^`h1fx!eAOZh`KBTQw5GQ;Wx6M`K#7^Ymtt@=F|AZRKP zkL7uJm9mBbb1Cautg=Hn<^0)-n-Q##`~q$D)_lJ5vEqvBM0tVL-t{>((g zM8}3gdk)2C#Kz&`cXgwySK+evhnJEYX5p5Mj`nCAL4I)kLJJaqI4+@aB3G@HmyP10 z1(45lyL!pemtSK?e?|~O0hG%wEJ9=> z_@U3;v?fWzhRRt<4|xSBrj#=3k|%d+MXTTc{*CHAnCoulJAX^TX8MlQw(ltFG3%r_ zjB$OtY&5$o$E|3reqD~s(CyGpnL*K+A3`L*7eSP{)%@e9;Tv`kLIXen-(rL}?2icd z4|V`TfdJ6x80462VptUHDn@8d0eLW#U{zymQE?MT=b+$(S(m`Xr2M+>e_;fs2-HiS zSo!{^&yih(9|mHgGrmaVq<9pxXk4+$Vb>kSP2z27NbM$CQ<$_ois$i%{>F_b%sfRSn5o9RV1`! zf{GmUychV?AYW%jivX1!szCe*u*RF!>qkxMLPjjNI5BxYk#Q-ltlyy!moih}0?|V+ zw@UG}hF003vLB4!DDFGLLq&Lj@&;5x+xkW;w-Y?QB7oRgZZ_LJ1+QU zM5MK86`aW3c}W7>vCnQR>eo?VFU7HR@h+XUirg80o~TQA?Ht!PA?AP?c+IjR`(q@+ z1G>(Xcc5vP>h@itgD4 zX6nm+Y16<+JCG7{(Tm@-EI6Y+a7JrsepSb|b%Dl&conSv_!DQbV-dme0z=n@m=GXk zrmOv=Y$sEfk9y`~n_)NdeSMmp^@iViEnfj2s0Zt23q|Oit;Ce0gM68FdpQ4$u14lL zN*yghM9R=KX4MxVAfZ|wheWTGjIA4)D0-}gEV^%XVh5(GT%U0r`N022la@l{nq^N4i-yDp#ky%O^+Ltzz3xQDR?#hy^ou9=#n!shb?kE+* zFa8W1+&UK3NnF`wrt10?{q5;+gEIqvg>$xwsBK4+|FU|TW9h3sP{uBq$MqMS%3xX* z8NptIRm+r~c&Y#WuGHtpDHJPw^>`Ep~-wcW&z6z`U%Pg^Pae5a!Q!*8adieF+M3j%!TKuE^0&ju(uxVBjuWEF$pB7= z^@YKoGF|;Ed2tXa<&y@96T^`HuAv*E?t)Fv!j4#t6u9Idl(RzcL4b!N^G*WXD&n#< zD8-#sVr)mki9w%P>43=z;s~i|HqXLukwfjDB%}Wll_Ha{3O?&u&8fW%J!Jt3hxKfP zcCNA445x&3C(lvOa6Bc^8RxzX!@|5jnC>3BoGbq@k`uo0ix$s<(J3vN?cx}g&m3~0 zu%vUdvQh@Q!#e|}oLPx`pz!~J$ zT{_1g70HS%y33%eoh{8fn<#T#;p3UlBqRq={NO;8Xk{SI#II!%MivzBrG{Kl5W`eR z60Ff7kI}HnEMw4u&CisODqc#&lOmBvDLLT?$g@Mk1w{>>`SYB`7(9kRJLS@9j&v4h zVDTUn@H^g5EOR*^O7<~kTF*}6b1|WJOrQS@PdDbMThr*Hr&IN={>$Y19a*-$QsnKD z=2%%yTJlt44)6?7s9GtB!IC;Y=gTnG357RlKm{DK%uT2wv#{F|Eh&3TMPP&8&Ur7o zz@IC`mZS*sIX6=m2syv40kUggjBl|MmGm5%Rat z5tGI6io0TNtDoDCX^0Pc9yW+7nV57R_9b0f6ab?|QQS3ANVtu9?S$bv_!M^+`DmVx z5@+yU;Un7(6M~Ffi(Y}EtkX}M)}8M#aOd!d+!TJvr(5vMaTXf|u`3PL+Yg$@q5GN! z0+M*F1K%W0xmt>;VN26PDF#$lARs@_jXKB&$@O##1Fs79}wgw*2+I z6U*0%1@|+n+PGT+PW^EbjE*7Y-`()=dW$5#b^$Aw!n1I_I;xt+Atnk?nuI1mwelA7 z*x2|@+AzQ>=xg;d%BVT1p*rD&-N#mD-PB;l{axAL#q11ypG*^{&oi}k?qq_iIW0W* zim*YaM)l84f%%fQO75VXylHCL$!}$!|>?|gfgjwJY5H=V&=}TfZ_qW-B@t* zRrNd1cS1MZBkPEsJtnC^WAD9NG1ScIE0cw>&L-w^eoV*URs{4dlMt-2iL3<2&-2JT zR<|vkQAJ=>4YOi)SeiaUOcpdaD(4P1MRIV0P5f>srI07m#eY3k+qYF3&S`)ZJ%=)+ z-zj?{7$SN^V+%$cn{xK8oRD*vr;2i2DAHW9!!By!Pn35F!>OO3OQh?HC`-@gbmmHO5Eiw|*E@YCqwXhR;*5n9Ni329^S8k;( zlE6SxiYsXhkp9}~o~6k{RTTY>lX~VmAFPl~i5Ln`LiCK2n;OW)yt@|$Um+6F6Hvu0 z+Er?}^ZX3Frw4MIpwAmhI`VR-Kkq=Df_(&cZa>tGw0Q^X;Ek;h_x+h9DiEh{z#-S_ zDJxZ6XTYZ_C_Sa#bunihc#5DV3b+ZRAoxfZ+yJXuH2>b2(Y)3O4eBzu-Fe*Q3Jws- zJ(Ki~m(if(U_DR^GhiM|v7FaAPFs(Pn@Pd?^7w$a{{%L8-SXIb~8z-6;?{6O{ca6=O7P7clkQgQ?9o6svdE z9aX9U{Iqem?2+{W0+I?p&VC9QXVxAa_0(u>F>qEZnV|iH>6PceaFlF7R#E`1h4Hw0 z5tKKog&HtDLRq@@!aI{k@Q2m*%jl5^8Q$2kv}qOWgo#K;+TGEmi{~A`XEGhLWu-VF z4Y2DIi%dZLcWvb8ggX9S>DAan(9zjgu~DO}zp+qXkKAFFD@Cxv7C(%;3@h#efq7z) zR0`Jk&rn}ZN5;UQ6+%`~qjycbxa4NgQ29?Tak94sf!%~>!jmr9eN~JHe4Cw!B}na@ z+biZs^0hi+pEz&8danQko#-~pLx-`#u2WQSUq-�hp^1F`?88`qz5f(_=QnCE)Jc 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 NMm#?5{PB5R{y*psUrqo3 literal 0 HcmV?d00001 diff --git a/app/assets/images/landing/users/chambres-de-metiers.jpg b/app/assets/images/landing/users/chambres-de-metiers.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e7338b04b70bfedfe5c1c60b656199ac959342b8 GIT binary patch literal 21236 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 C(K8$X literal 0 HcmV?d00001 diff --git a/app/assets/images/landing/users/driea-idf.jpg b/app/assets/images/landing/users/driea-idf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df9a361eabe1fd5156b737aa68dd641ac95b10d1 GIT binary patch literal 19549 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 z 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/landing/users/region-idf.jpg b/app/assets/images/landing/users/region-idf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..052dcdf7a99fd60067d3a75ab42a38a66e2d4b0a GIT binary patch literal 14687 zcmaL81CV4*(>B~=+ctM>?%1|%?s&(xZQC|>JUg~++dKSc@B4Y)_z?e>-BDeqsygDF zs>qu@ayWo0{m402L39)ihl(J801U73edj- z0``wU{1wRmk-z``8Vv>l0tNvF3iiMB{Lhg8cjdDWfCLH11iXL%ApwAqfIyIdJ_i5< zUpEL0^7Z|?&;JMnBsdf_C>Rhh49Mpy0P^o+0039p|LOfde?WA)tuIfXUlM9vbTz>Y zOZjk6;{hOe+m~VYM2)XM#^5_%?naM1D)9PLf2ZgGpBK0%!%&oF;P_h|PLxgZ)?FyA zcG!>CkRSzxztfRjjVoDfq7tca4b^;r#>qJ8{k%ocp>~I**H~kkvSb~4R6rxXBrd8L{)+=rWz01Z%x=w>_wUNCkihM}v=bC{69Qt6($;8Ff*41X6I{nGTDo*Dj z0)1q0Y6sjfO(K#1&?3aT@v@6pkgApv)#3;`_qdt9B~#8^#MVW{Re;rLiU_u8orbeR z41=d3X8SFz=rVf@jA#boG9{~{+X?H~ZC?7j1CK^umdwXhzrjti2*vMb*07sx?R3ZZ z|8rLVd+qbJM0j5-@U=c)^50ef5ct;y00jnt`e%WF5&x&-|E^d~)i_TbDJ|2a>8o1G z1jPXm_}~=TCuf`Pz`M@mbX|^O`ZWJU2%mdxlRM4tUS{=~X`n+(b ze3)Mlj3KF=T0RX4<`rIghmN?twQm`FlqYY^VM$!L|Hd|QiM~JHI*gvFIP8`R5xPk} znM=to*^MsSg{zah`*G<}ccH_We(OXwo26X!kdc1=IKgPV?EW#QTKnSiD`M4M3oBFa z1~rE5=}0U3C4Dg1M{T^A3|UYBIV{khm<-v=b6gsU&nRMfvBB<_c=+_S+2WmT&@6Oarf$30tNa)AW#SpXo$bPAV9#N zVBko|C;(J6A|?o85=KOHQf3xbCqg!53VrUZ70lbj3T%}PmKaR8I#C1*w%Mv=0xipmViVfCbabDVI4 znz9a>nQ`O76ym|SKN1Kx&xA3rmjY<<$ z8#Or*aPp;*WO9%Gq3Vkt%JCCmwP%gfcse~vW}vb8W9NT5!E=f z?}Mm}u1cxusDbwe$TzNaO?DN3ptpPiemckODb}MU#zpo#cKmdHOV|7aVB_bmDDN@k z&#kO5IP5X97iJcRQ~DdKvs(wQqtb~{cFj7pdurv~Otz*iB`shPAN!iebH_yjo6l-}`=FiM61@q*TmQc;ielN&mgj59E; z;s6s0v0|#ZgO^8%IHp)B9iC`3^P+~6rHvlGv{!ajw1}LO5ovG9w-4JnW(}su(H@Jr z{laY?L(0N7y=QS=-FZ-qMek$MXw!oEIiyY=Xx^uJ%Xp)i4s*@nY&s zy**vK>i#^n=ecRZT{l|ktsd&pp*pDJglcht#`^0t?1WN4+0#N5%Pj*s*V*^d#%4Jh z^Sszp<>6Ms0+%T-DSXaZ$~Do|*)f%F*SI7pwjkZb8Su@7oC6Lk`zHSgov68}C>wzs zZ*rkY%|&^A6IYkci_;zdM|^9fNXmYB`ojgpQ)tcwOgRlx-wV6z2^BhDAzenG7L>-O zx?f#S2C!E9x+va{Wtxr*a*IXcpN&|sUfxK=yrZkFqV-w$ka)H6YPRPEh}zyPZZb*h zu+_`=zv*H$qPHpt^6P}-+=q_C;?)t2xoVAMZe@P@tM|t9K^su`ja0wBR`@EaDamZ% zYZi1&)}2P$N~__YZq$t*OxuUbfwU^BOk84Nz4*&5D)>0_fowb^n-Z1d?C`szk8H{+ zLOVrk3}Qh?KSfc9=%}EKe7B0+6B_PFF5Fzdxqo(A76}p_%KRzWL!2M0gLC)$qoT%q zD|7IjnX55eWTv=Fn7zdL zYRaOY&7d=YbGcW?dyzBf_xj!yS6^N3GfRLvi2E9O#y5+7 z!!&Kxik79Rb&jJKyz_(V^adUk&ykS^;(p{0{i4c`wMcW`So`I=(iJf(k7;(7>ZJ3L z@+U65=$V>AXZ$I`K5kOkxGfHEYq&>F_G}MGUOTf71SVK(W+U7r6cd5Q!*`G>$RVeW}#q1@9)G-A4Qty}~rHmFR8s zW9El4OsW;MROSrlgqjm$t&o0jhB}L|A!np_#&XPRd&^06{b*&MguNCD?W@HbL`-zBDMD|Gtp zP*YW^2&_gwr`8>&iNwt}B&=O=`_(}NT}I_V%;X;J;MZbjy3t?Yo45LVKkkbXXW`4G zSDzwdjM#xj*gW!QQ+8kzI9?aCCx6l1$1xZvyzlYke`8q!CWik^>dH#g8!!#zV~7L|aygSo{V@03j84c+9OWU0VpaCwSf z!SN|5<_)wGXD3;{Vrw52&ixK7Y8MAgjC--dQN!YbKA)=|mvZ^d7TQ69jja#)T?!fc5VY4-h*is*x)+AxtqjQNduaM&lJZJhm z*c_u>A0D(IB!Um`AhxdQXmiTfmnW0=+;x#eqZa-8&I|Tor5-NDb|anPDqcMy*3OOLB*yD*UOds+sRtKhEWnEy z78= zcWg7aQU$V7<}+cQkN&X$9TR+T;1;-Vx9@5!yK9}5gYKaauhy6M{4?nM6@Q}xoGsKE zg(sCo_=hUyyI0t(fyLPTcB`UpxAqVvaL_P^0*J^tHKq1`g6ev92W7iLi>9G#>MexpM)2kI{0bAb zq4c=e^Yu9VS%|X4S_(!KXL@x5 z(>}DZws!;#mCOy|aLxF%opYjiAl3a{@P{Cy5CSSFz>KLdg?E&6E$kJbw)X*>^7de(j^LkK?xVq3l(gFta2ifiZ} zif}U{AR_&peHY$C1V1^_xmt3Ep{dX=TOn+)GL_jYikQ>XWav)gkaLq?I9YbHUQ?z$^s=y>lF)-26HtGt_HA5`95@cfCBI6i zheb+F>|51#QuEIFxhX7jtRshdFIJQylDQ4v@l$s}=b)nkSbCRPSZRFss@%hrr!QQC z>o6liSuAifKZSMDS&zK<58tFC zEDrBLMyXHKh($wMi7Ru)=F0>@4LA&%A41F?>$#<-(&yIHzfRKx74BU=;Q>GH$m4&(lR=(a02rRE{ zET@vSLkh;bwkunPkPpq$W2au#d@*wfg|vTzLAU4*hR3x zS#TIffHrZ{aCYrL?1wA;jh?wZP6tPOZ0hM?>g9-Te2y!+LMWJ?OvWiP&L7~J9$hm~ zR+X&z*9!7BGs%oI`!vy+!Cfwz)fpI(Tvb~dd+fe})0`U4B^_bM5)FC5A)~rYpfgoj;n@8-kG**s#Wp2s zsGZtio4O5fSOQ{_b-Gms9c`+$Q}eUsh% z;wdjDWJ5<}N200IzckrM#3!qQF!I4vn{2HLLDRpY)Uji>XefLlq)yfsdZwCpNcqZ< zN84b`gOAIP9pUQaKf{5V zEzx<&%ZMf%>zSq(?#0g59lgyj5(k17Grd*OqN=fyDiO#=wCt4Uz0%;G7z>$M^9Mt!OxNmx=Cr^a%|MXB#U!CVDu3Fe}A3nTH^Y0$Ypz zd-l_1F!cVd)?mFj9lne7NAj`Uj?(PjrgE5y@q9v8v|K4Y_%@mEX&HsDnKz2-c*yc- ziRAMES{{?uhuzoDTJnBg>!$jpytvy?#Z-?jf+}(oH@72~gpKTp{*ThlLmO~Ij1%O~ zNUc^9S4v%Tj4+_Kw)(#VbSP?{Q!f;f!rZj$cCpJ+>qgq=!O4?4QgfnSn4udetCZ!s7M>iOWV2nXS7a_udoDzC@ z4TZ@dbB94QBqWG~&Qc@Zg09vV6I$GUTPSi&j=5$NoUb2hYvttQwy}va&HY(1```%D zeUdKq6*Gu9|8Qqg#EcLM9EFTUxz!^^T=LB1h9EfH8MadA7PogZTcwM~{UfNp%y#h* zP6+I$K}gb*V~d{JP0(Z}j)<(~i=6`PoFQs00$l&Rh{erg}az|r`0Eja~$%QKFcgB z-!NP%zkR72rv%r1-}1E)nS!Q_^|f+kzC$-TMI*M1O^@{&!d;*B_wIFqFW95}7xw-^ zz5gBd5bgcq@@5Db?CN@NuKx%1h&}{l$S_wsWagIrYaD(#jyWNB;Mj_SOnb$O1De$Q zHRK{P*>adpl@O~+ef=wQK#e~Epmrf=B&SKVMi7fKnKm}YDozkjWtfYDO)mXK4dE_7 z2vqtYAsbn;b^3JHFn|4?W=8xq!`wC!Wec^g9k*9xuUo_dLtX_%W;5EJeovQ*d=2W+ z+moyb5K)D8g6s&Keb&(3(X%dn&5rT`@*5zk`8K7;oAL57UHCNTd-`-dQ9dtYo(XEG zxt4jYqO?Qno;BwSBl|(%k;V=Y z`Sk_va=oo+?LHbedQVIYtu!`);a#W0G5JqGV_+Y|Xb>ZcXGZvfCgF~04-{u5J^(Vi zJ$<|!Dz}q8yaAw9ucSiMqyo(bN!R1lZt0j%34BVUJ842Stwfl&tiau2U2HaTh4<(_ zfiIG*&a3(D!iXDLodqW*%hCa>Ec$Kd%2G9!WwB9~sIEroF6LueZZ8T8w|^;w*^yl@ z!dj(GV?cmykE#?j^DsW}kyv_O0GJyxwOg*$T@~fpL27o-GF(1@GB8(3$X?ZXpHgq1 z5m)w1M>p-GzRmP>M_{#`Y<}Nhdr9>Gf~H1N6)%2Ck6#>6|3jW=!%s$~A|KROUbS#4 z&+@jHOjGrj3E4sFk5%l|WMI;+dVRmK7b*@i|NZgwR@(@H`{~C0NinWa=m9I#4W?SI z0uMiL{Tt4ybpuK=+a`{0fc=S8T{>^OkEI=SWcU?0yX$?4$$(lHVXKhL^X|Vy8wh_vZ%uqHdv}mt_6vglNYgD6SRAlL+H$KlV3MDKZ zx=)P?V8JRX?K8g)R?)|+%3u~`>c}l{HhE0o0u*>-Z|}6nh6*u|77of32A|?jIXA|Y zCJ)6E(6OicT2`S`kH3N%^^y2Jrt-{|JUa+z$+x|UTzd$hs9UTe;b&}`au6{w!Yjf! z#0As6=ETRh&ro`}IjE!Bk&UXHRFeH`@<*Mt42sYxhy7Q`zAYqUIUVChC{@U zOUNSAH4KXyap`E5i{IgTHi*{xFstw7b-^Ho$|F%X>&?@PBVRc1^Q0#M$d9QcQtgj+ zsNgWLlE3wXxKWn?JiYQciuDkFlIUcOMXH$ghu(ai-P%t|h`^%_Jdd5s^X#-!$SK*a zj@5*GQbk28#q;BLA^K_h!F|MwqhRU7GdI8uu59{1e;Qa4v=-8+0xHe%M7IB+mvAHd z$aMZNAUq>nE7dUaM@%H_!SJIbFDSbn9DmtRY}kvEF2&K;)SZu1D!@7uU%d;tjkUXb zJQrF(Th2W~w}p-$`Vst$**2IoTMOjXQJMc_TDpQXeP6Btwt%yi|kw|B&-L@&OCuCEk3 zt<$Ju4}GC&%Zy+;NG_%qA0=Kn^r+d#`9gUbq_0T-7xxGb2KFBk;EP5A0|x*>pduon zp|h|eqhK)D5fYIx%m0J)Uqiuw-U4t;a6>8^+(9jGDhPQtU+dIdHz?N#jY>(hh`JZZ z=s42v3SHc0xj|_WTAo}^os(}+sqRqZaQ9`V4S=d9P+eqvPiQRBDWq47&`IWFteJK} zs3U73^$d(Xi+9La%>Rt|EP?2{2>HlD_ZW*r8AtHblC2?{o2j*aJeok*$5r-p7H#Y` z=7rnri?8&d@vi|9X{k2l+s0i`v)L)WQk;C#9hE9m6*-BDg&D8vRIA*l*A#AF39S+F zJ(U#{rhIj{ANO-4iGktF&D-R1a?&Z3SGP|vhG@RL#Zh@$&n>&kTxqPIOJJ;{iBk5` z6tQ>33zgftjg@t;Nom3FM6oeb?}BB5owhfcw9bK6L2KQ(5; zPUMd<>@p*AUm;T2Sx9ZYjWuGZ;vmK`RP`DlrH?-xa&Mz5l!{C)Xx#~<^~N94^BOIw z**lQ3%ReF{34pIkyt3bqk-((R0*+&v4wT(eoJ&^AAwz2oolPTaRbAR4IZE+=zI>e} zu}B(lvY&w$8GZZ~!`f1bdfB#ZHNl4DY4bX8^GZ|g(mpb*L;KXYAdwy5G^?EE9$;Lj zS?TI>>z-5~9u88BZ|NVhK@c@_EvnFN(?8=bNMrY%aKWJ}mq{*q)!u&HA&_#pn7}xi zb<2|%%5Q0f7Ih`Ec{4tVMDi2B=VPXq_LpK~``Sc*$s$NF;D5-XzdScE5(x5_lZ1$( zU;s)?!t`Y_)G<5c_3oewei;sqz5)Ll4!}U*d_W($?a6Wwbd()WxCzvJOl*T&g1#ON zDEmQ@rkXyH*u`W&m%Jbv5Ph=JH(8$QAi0YD7-O}skv!6Dc#(>KYf;X!dT2}{{7 za9@%FFJJ7GjQAD)hy|wkWYnv0^Btz%>6|`yj|WP1J`LA}-D`aTZU(HgnIPvf zWSDofNFo@fItNN*gSe;@_?*BF)4wd7*m53fsMRV}G@Trg?2;7dQ1#DFQ75Z%c?+?^ z24>Rc3&}S6t&MF&_2Vj2LjHMp>SoZ?)c@{IFhCIZ?=$0q=CuF$lko)wZJ`!`H(kX^;XL3RJ#`}7}(Hf2kTMFM3J zGtHX`bg3-t$Rwf!>psu9vHGByP`2H3SDZMy6FfauY1XCYz3?)-?5mBRV)@^Jl&*#6 zxn8K?+w;Z<>MP#s(>?*_8FyacRRqm*m!W08F6FC;mt@R^%190udRD(#H0hn}G`M%( zIb18wF(?4cF-|(lo^r<1-Z<9~Hm?(A^rL9>&7j8J(jN_Krf-}wH(Dotk? zEXE=q)zF+I`mIN0t`hfog{B_p9avA>S zFMRFC|7=Ata8L+f5J&(J8zMR;5*o%=kc-96_a89(B89<#J^}h|vxEKcMc?46$g3Vo z^OoP1LOSc`#xC7X)Qi$!EzQ)^@qgTrEtxE{d9!f-d7eJnxke5e`?#!oy?dB6yT@0o zqTVT=(fyNo1|u`039R~{(Ifz^WRqfGO(N1UXn;5O{Q7v=HYpR>$USei)a440RXSV= z%|IV_8~6kqt*P;#A?T&+cbZFmKNV-ioa5quagNr&%PilC233d}w4*!2909w|H2Mu3wmuChTCPQfxrMUxpy}@@n2=MhVEQxBF%j~07up*KEHG4fyf}MA;oX$+d z*6Qn+^+EjfK8We3|``4gagfzfuFpYp=~hz%wKuW#Mi z)#N@3oFRDe+Apd{2^Ud|gQ3qM_c68A?c`9Yi|2{F-h#whn0AL8lL*ma5O%JQ{HI?#>1`gL z*GSM%z;DUHc8T)=O7+gs1iJztipbj?t+NP~B7h$+N||3Q>6zBXfD0N_k=6!b^Qkj< z%i=iR%wtk4@0`d{Dp_5bto@%w)G+dvyhy-FsIS*NuUmXz7FxMn=soe06;r%ltUVR- z_vyV&;-JB7ytRA*@iUhfJZ=^c$B+WPS6$^g?#&%B5!j!TkOm0^#^vR)`>up_Jci;*agas2wO#3p(2#9Wpr^MLVcve{14L0&`8 zQp=xbf^29FS~D7zLLg{4K? z9MQ&5i-(N=Y?d??^rOnSr--HZ&(jYA$pkmg_z1?-!z2Cki$V>SM#9K=U*UruXn#kR z*$AA)%*-PZc>GhEHbc~NOvQqHx9IPIp8$ln#HX!_>-^@dG+yR*^$VO@o-*o{a|oM6 z4${&fm)}X`+eN|l9^W7^LU*(T6j7hs6db|R3?TaHshgyjV_dVo*^t>>h1xWs+AIFl z(Zd$h_?w5ai)jSAo7s7K@;jC7G8hMp)ZckbvVOfvJpM5Fdyr>G&Miw!r`}NY(a9`| z>1NdKm`Vlgp=*LbiRQW{xnwYc-GJ-j)CU!s<2oN=$*=7X7S)MOV?3$h8xF{4C94Km zc1#5h*H}^e4b+n6YBnfd)C0!x+lsCT^Bv7JDupa}AwK)j{Glxm>%2H9>ZwphiB|O% zE5uA{a4|2>0zTfHr+4}~!DSr|Y+zznhho*HG;xI~&g0Co=1N>YQ&Tatn=24GFRomM zjWxl=>@grAX8ekJ`d-l_;PR$(eVpQVzthQM~L4l=Jf)4E7&&@wo1PGa5!*O23*R$Xh7 zJ&}R}LkUF$AUYlFh~93QG)MGbOe#%DwsyDvSj1~xDhlR_VuHcRnxwZv-Hq-Yo2C(I zengeti}GMdcYlS4J1r(R8j7=UoqQ%C%+>!*G8t=Q6QA6BA~7M9IHdDuj!4yyEJbmf zVrhHef^1$dt(uQ7Yjw72aWda2?Xwk9zOLGVA37u#-;Y^<6U%XZXP25!1X4YR3V8$(T6!S*DOX!QH5e z5af$YH0mT$@?z@I6@!Ih#`XXJsN1IR?_gQIi)A1^(1=MS=kanvaOguXvT25rb@T`P zkiX~j(6Whq0$^?Uy~Q!!N=72F3{&a1#Ns# zOkr{lU@t>`&yZ!q<(PNmGWenp$-hPGO*>bLKznSkZX7SZmBmhD?8R#?aWI#9uc-l*bI z0y21f!6-uYA;$4Q^_lJFCPcbIp?rN@++G_LnTRtPVVC&LZ`&@7lVN(W%}7swh@l9< z?SIcx(wP7pfJ+$z8VF^lk-@>=E}d~=1K*x;Z@;9BDk zaEeWrtQ#KUF01_XS%9n4pGeBl)rL?QmxHP5%i}B!MtIC);;qSXG* z*8L;)2; z;yb$-n~B5qkuxVD9^F_B=5PEIg*hwR&rI%l{l?d&Z58OabIT z&!UfO@$)+%ahFETb#jE0c|yQ3Z~GwTPAKGxBq@gyI5lq;YvHwL4;w94NxCbKM5nR- zh;FV4WKWJOIDUh@N{B20$1MUkwU;6YeyS1p=(Hw?!fWdQRE2Y3%$$pcA^NfNbSMGt z3(vJr$k`2K>We%=K~Scco5AQC%9gKw-UwTac_!4}pP0bwbOeFAOU!#t=}uz#l&DRM zOQaUqr;D=nF65+GbK1fuL;~n0vGM!f8}w=Q`v98>Cr*vg&cZCYYkmOfz;n4a!B2(nUo=zJUVA zM>0Hu?2|A>zqLw~5l!el7+Vhgfn&AaAl`6cbRmkW7(f>63ymPR zP>Hb1SHHh!0cpNzMlN%v*;6zuUFF9AEfT7g10waEdDehe-;QY5kz|0w2nR_4IglD? zp`UFhV|v=tFq>mh{TrizB+i)U{q}EvryZNTR9aE?uJ7CN&`F}cI)XVIiR<{|VHR4p zO3@SKo}hDa*L55MGOSeI*Gu@38MW&&4SaPu?;oFl^S=xd71Gynhp$5nK%ifa_P-v@ z-`5}FU*`OaK_aZ1xn{8I{SR^e6WR=m!rkI6$8UoSP02OeU=T~6 z*iQ5RovFx>ZS_6pj$b{trd%tC&7G>n=DXU3f-iDf*K+j2%hYa6D2mM{HnqGda@n|W zwqck#xe|TkoDqhG2q6FsN7T&0zcVNzm8=~c`qxuw!UhUDld}GA;*(9veGFgH*CuIn z;F7fQUO6WzU?u||E}7K!;p7q`&&Z^@z z9b}=6mi*%VSo(e>uWU;amVf~3pQ-0_gMiEA_qGXVWf|@bzT0?&4G#RrE!IR8TTEjQ zC7RZWU_&F`RY=j3h8w+-oif*L@d{jIfkAT7`rPP%F-s!KAuJ5HMhMH)C(2cs4~vw* zu`nU+Da9Zbvfz$7xK(PoZ$B-ot3N?F&?w!XKlU@Q%q(5py6F z0ATQombD^gA#rYIgq7!NKYoAOtjUiqYS`ja)Q+Sfa|Iq{q92XY(I3Y&640Q24K#lr zjq+JyCS9>t6cK8Kk45_c_!7eP2n{a@cYinq<>!`WlvcO361Z_tB*q{fHn##T7N zBLh*W)Mnl+xbT(I2X^<5eqj;mycIgo!6@GeT`u5140hN*ro6vSpxol=64Up~kuq$P zQ~0H$LF2^n;69kU#0MHqbfpx*hQ)z3OH44TBZqo8>Y?R#$fl)krSmWZRiW$FV5f%I zbR~6{8>7nvaNrgGSySd->^P*jE*OHP>uX3zXRDK$WvXgGV$0RS?-RczeaXLF0u^rG zNN35WO1O2Z3b998`O$KwN?t?+Sw50&RK_3Xs>6}?_E=R)J;(IJ;od;gPGm#Z$;{mk z!>IC`C8)IUbC=|Zdl-dNU|3#2X)B@jz*b{oDWPyn2aWuJhZVW-cw4@no$z^FLOM-t zY$Py61v5+ES!?WtJ$y=T-B2Gy2W>gTg)c2q=nnN=T0}@(cR5MCKOxWHVS%W06b{2m zYW{BkgkeE0!wBhCmPuY&S=kGP#*3Lm*}|fCgZT6W<|1ubfji}_jfB>zll>b~p|S-U z8un1!y@+U>gn)vA!h6uaD*c~i7*N2!@wNY2wDx|8gmHOa3hi6hJG1lO@EYHjRm&hd zTT8XjMqWZvfM|ex&x7CUJ*D0ZfR?91TbtUpF9onwqjagZ;4; zj|>yR`K^@<`Kr($xq$oQvWMi1$f_j_Vn*a{{7HC(yAk`(wDq8LCr@3a5n?l%7I?4` zsGmX`l7#&umMqdmQ1YDog3oC)_kG%djx&}y>dw#zF=E&S07!jN>zIL3BEtO^@NIO! z(De}Xs^q})(!3FJwf#{vq%lzm$L?=XhG^T$)euh-goAV2F_S-ALWGiM#-}0&>$xfd)JIdA_;{_{XMH3-Hw_>ONAyf0;;C7DM;lojG8ZXLr?5(tfFWNEW<(@bICX5Zf7b}5MT4fz!Hpb&7qA@`wOiB1B zhsQfqDswRKIU4*keF>Q2Bk(?vz=8b|2boQez$^q^h_^I^&0f{E!||VzO2P#(ee9N8 zP6w-7K_-#|xfJ$bUu_`#`|MlSYp$YiLUOoSd(G3UdFW(GIUM;6KHYqgXC{&K{D{xJ z^~F7|p~~i3!)Ck*GT@2k*)i}wa$EZaFm@oi@Dd9~SLg#Ky@A~NlRD#0L!hc`^vQl( zu8peXS&&v?9(IiIdhm#e)+rg45O}~jr2-kUvUi^ViI46rU@8d!+}H8HO~*Dk%?#Gd zP3LfKCzg7AU!Dxi1?lIXx>wl$#C des délais de traitement + + .landing-panel.users-panel + .landing-panel-inner-content + %h2.landing-panel-title Ils nous font confiance + + %ul.users + %li.user + %a{ :href => "http://www.developpement-durable.gouv.fr/", :target => "_blank " } + %img.user-image{ :src => image_url("landing/users/ministere-environnement.jpg") } + %li.user + %a{ :href => "https://www.iledefrance.fr/", :target => "_blank " } + %img.user-image{ :src => image_url("landing/users/region-idf.jpg") } + %li.user + %a{ :href => "http://www.artisanat.fr/", :target => "_blank " } + %img.user-image{ :src => image_url("landing/users/chambres-de-metiers.jpg") } + %li.user + %a{ :href => "http://www.cci.fr/", :target => "_blank " } + %img.user-image{ :src => image_url("landing/users/cci.jpg") } + %li.user + %a{ :href => "http://www.driea.ile-de-france.developpement-durable.gouv.fr/", :target => "_blank " } + %img.user-image{ :src => image_url("landing/users/driea-idf.jpg") } From 0ddd7ae639ce4312450e6af5ba191ae1e7708a57 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 4 Apr 2017 14:45:13 +0200 Subject: [PATCH 073/102] =?UTF-8?q?Add=20the=20=E2=80=9CCTA=E2=80=9D=20par?= =?UTF-8?q?t=20of=20the=20landing=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/stylesheets/landing.scss | 43 +++++++++++++++++++++++++++++ app/views/root/landing.html.haml | 10 +++++++ 2 files changed, 53 insertions(+) diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index b1c0640cb..26a7e7a83 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -193,3 +193,46 @@ $images-count: 5; .user-image { width: $image-width; } + +.cta-panel { + background-color: $blue; + color: #FFFFFF; +} + +.cta-panel-title { + font-size: 24px; + font-weight: bold; + margin-top: 0; +} + +.cta-panel-explanation { + font-size: 24px; + margin-bottom: 0; +} + +$cta-panel-button-height: 60px; +$cta-panel-button-border-size: 2px; + +.cta-panel-button { + @include horizontal-padding(30px); + + display: inline-block; + height: $cta-panel-button-height; + line-height: $cta-panel-button-height - (2 * $cta-panel-button-border-size); + border-radius: $cta-panel-button-height; + border: $cta-panel-button-border-size solid #FFFFFF; + color: #FFFFFF; + font-size: 24px; + margin-top: 5px; + + &:hover { + color: #FFFFFF; + text-decoration: none; + background-color: rgba(255, 255, 255, 0.2); + } + + &:focus { + color: #FFFFFF; + text-decoration: none; + } +} diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml index dd6ab74cb..ad9539c42 100644 --- a/app/views/root/landing.html.haml +++ b/app/views/root/landing.html.haml @@ -122,3 +122,13 @@ %li.user %a{ :href => "http://www.driea.ile-de-france.developpement-durable.gouv.fr/", :target => "_blank " } %img.user-image{ :src => image_url("landing/users/driea-idf.jpg") } + + .landing-panel.cta-panel + .landing-panel-inner-content + = link_to "Demander une démo", + "mailto:#{t('dynamics.contact_email')}?subject=Demande de démo TPS", + :class => "cta-panel-button pull-right" + %h1.cta-panel-title.pull-left Commencez à dématerialiser vos démarches + %p.cta-panel-explanation.pull-left Nous vous accompagnons dans la prise en main de l’outil + .clearfix + From 1a628dc42c4fa00813729f0f2320b0995c1440b5 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Tue, 11 Apr 2017 17:56:11 +0200 Subject: [PATCH 074/102] Remove DossierListFacade dependency --- app/controllers/users/dossiers_controller.rb | 28 ++++++---- app/facades/dossiers_list_facades.rb | 52 ------------------- ...l_users_dossierscontroller_index.html.haml | 20 +++---- .../dossiers/_state_description.html.haml | 2 +- app/views/users/dossiers/index.html.haml | 2 +- 5 files changed, 31 insertions(+), 73 deletions(-) diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 4eade942c..6edec7153 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -10,19 +10,29 @@ class Users::DossiersController < UsersController end def index - cookies[:liste] = param_liste + set_liste - @dossiers_list_facade = DossiersListFacades.new current_user, param_liste + @user_dossiers = current_user.dossiers - unless DossiersListUserService.dossiers_liste_libelle.include?(param_liste) - cookies[:liste] = 'a_traiter' + @dossiers_filtered = case @liste + when 'brouillon' + @user_dossiers.brouillon + when 'a_traiter' + @user_dossiers.en_construction + when 'en_instruction' + @user_dossiers.en_instruction + when 'termine' + @user_dossiers.termine + when 'invite' + current_user.invites + else return redirect_to users_dossiers_path end @dossiers = smart_listing_create :dossiers, - @dossiers_list_facade.dossiers_to_display, - partial: "users/dossiers/list", - array: true + @dossiers_filtered, + partial: "users/dossiers/list", + array: true end def commencer @@ -223,7 +233,7 @@ class Users::DossiersController < UsersController DossierFacades.new id, current_user.email end - def param_liste - @liste ||= params[:liste] || cookies[:liste] || 'a_traiter' + def set_liste + @liste ||= params[:liste] || 'a_traiter' end end diff --git a/app/facades/dossiers_list_facades.rb b/app/facades/dossiers_list_facades.rb index 52e5672ea..63b7dc60c 100644 --- a/app/facades/dossiers_list_facades.rb +++ b/app/facades/dossiers_list_facades.rb @@ -63,70 +63,18 @@ class DossiersListFacades preference_list_dossiers_filter.where(table: :champs).where.not(filter: '').size == 0 end - def all_state_class - (@liste == 'all_state' ? 'active' : '') - end - - def brouillon_class - (@liste == 'brouillon' ? 'active' : '') - end - - def en_construction_class - (@liste == 'a_traiter' ? 'active' : '') - end - - def valides_class - (@liste == 'valides' ? 'active' : '') - end - - def en_instruction_class - (@liste == 'en_instruction' ? 'active' : '') - end - - def termine_class - (@liste == 'termine' ? 'active' : '') - end - - def invite_class - (@liste == 'invite' ? 'active' : '') - end - def all_state_total service.all_state.count end - def brouillon_total - service.brouillon.count - end - def nouveaux_total service.nouveaux.count end - def en_construction_total - service.en_construction.count - end - - def valides_total - service.valides.count - end - - def en_instruction_total - service.en_instruction.count - end - - def termine_total - service.termine.count - end - def suivi_total service.suivi.count end - def invite_total - service.invite.count - end - def filter_url @procedure.nil? ? backoffice_dossiers_filter_path(liste: liste) : backoffice_dossiers_procedure_filter_path(id: @procedure.id, liste: liste) end diff --git a/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml b/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml index 3e0bebb2f..0b95d9465 100644 --- a/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml +++ b/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml @@ -12,34 +12,34 @@ #procedure-list - unless current_user.dossiers.count == 0 %a{ :href => "#{url_for users_dossiers_path(liste: 'brouillon')}", 'data-toggle' => :tooltip, title: 'Les dossiers jamais proposés à la relecture.' } - .procedure-list-element{ class: @dossiers_list_facade.brouillon_class, id: 'brouillon' } + .procedure_list_element{ class: ('active' if @liste == 'brouillon'), id: 'brouillon' } Brouillons .badge.progress-bar-default - = @dossiers_list_facade.brouillon_total + = @user_dossiers.brouillon.count %a{ :href => "#{url_for users_dossiers_path(liste: 'a_traiter')}", 'data-toggle' => :tooltip, title: 'Les dossiers qui requièrent une action de votre part.' } - .procedure-list-element{ class: @dossiers_list_facade.en_construction_class, id: 'a_traiter' } + .procedure-list-element{ class: ('active' if @liste == 'a_traiter'), id: 'a_traiter' } En construction .badge.progress-bar-danger - = @dossiers_list_facade.en_construction_total + = @user_dossiers.en_construction.count %a{ :href => "#{url_for users_dossiers_path(liste: 'en_instruction')}", 'data-toggle' => :tooltip, title: 'Les dossiers en cours d\'examen par l\'administration compétante.' } - .procedure-list-element{ class: @dossiers_list_facade.en_instruction_class, id: 'en_instruction' } + .procedure_list_element{ class: ('active' if @liste == 'en_instruction'), id: 'en_instruction' } En instruction .badge.progress-bar-default - = @dossiers_list_facade.en_instruction_total + = @user_dossiers.en_instruction.count %a{ :href => "#{url_for users_dossiers_path(liste: 'termine')}", 'data-toggle' => :tooltip, title: 'Les dossiers cloturés qui peuvent être "Accepté", "Refusé" ou "Sans suite".' } - .procedure-list-element{ class: @dossiers_list_facade.termine_class, id: 'termine' } + .procedure_list_element{ class: ('active' if @liste == 'termine'), id: 'termine' } Terminé .badge.progress-bar-success - = @dossiers_list_facade.termine_total + = @user_dossiers.termine.count %a{ :href => "#{url_for users_dossiers_path(liste: 'invite')}" } - .procedure-list-element{ class: @dossiers_list_facade.invite_class, id: 'invite' } + .procedure_list_element{ class: ('active' if @liste == 'invite'), id: 'invite' } Invitation .badge.progress-bar-warning - = @dossiers_list_facade.invite_total + = current_user.invites.count .split-hr-left diff --git a/app/views/users/dossiers/_state_description.html.haml b/app/views/users/dossiers/_state_description.html.haml index 27674ad2b..da1abe824 100644 --- a/app/views/users/dossiers/_state_description.html.haml +++ b/app/views/users/dossiers/_state_description.html.haml @@ -5,7 +5,7 @@ .col-md-1.col-lg-1.col-sm-1.col-xs-1 .fa.fa-info-circle.text-info{ style: 'font-size: 2em; margin-top: 20%;' } .col-xs-11 - - case dossiers_list_facade.liste + - case liste - when 'brouillon' Les dossiers présents dans cette liste %b diff --git a/app/views/users/dossiers/index.html.haml b/app/views/users/dossiers/index.html.haml index 0c0de17f4..77f085261 100644 --- a/app/views/users/dossiers/index.html.haml +++ b/app/views/users/dossiers/index.html.haml @@ -12,4 +12,4 @@ .body = smart_listing_render :dossiers - = render partial: 'state_description', locals: { dossiers_list_facade: @dossiers_list_facade } + = render partial: 'state_description', locals: { liste: @liste } From 21a2a5402b1f4709bc77df494727a2bd7adef583 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Thu, 20 Apr 2017 10:55:54 +0200 Subject: [PATCH 075/102] Remove unused service --- app/controllers/users/dossiers_controller.rb | 6 +-- app/facades/dossiers_list_facades.rb | 14 +------ app/models/dossier.rb | 1 + app/services/dossiers_list_user_service.rb | 43 -------------------- 4 files changed, 3 insertions(+), 61 deletions(-) delete mode 100644 app/services/dossiers_list_user_service.rb diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 6edec7153..313037fed 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -10,7 +10,7 @@ class Users::DossiersController < UsersController end def index - set_liste + @liste ||= params[:liste] || 'a_traiter' @user_dossiers = current_user.dossiers @@ -232,8 +232,4 @@ class Users::DossiersController < UsersController def facade id = params[:id] DossierFacades.new id, current_user.email end - - def set_liste - @liste ||= params[:liste] || 'a_traiter' - end end diff --git a/app/facades/dossiers_list_facades.rb b/app/facades/dossiers_list_facades.rb index 63b7dc60c..016d007d8 100644 --- a/app/facades/dossiers_list_facades.rb +++ b/app/facades/dossiers_list_facades.rb @@ -10,11 +10,7 @@ class DossiersListFacades end def service - if gestionnaire? - @service ||= DossiersListGestionnaireService.new @current_devise_profil, @liste, @procedure - elsif user? - @service ||= DossiersListUserService.new @current_devise_profil, @liste - end + @service ||= DossiersListGestionnaireService.new @current_devise_profil, @liste, @procedure end def total_dossier @@ -81,14 +77,6 @@ class DossiersListFacades private - def gestionnaire? - @current_devise_profil.class == Gestionnaire - end - - def user? - @current_devise_profil.class == User - end - def base_url liste @procedure.nil? ? backoffice_dossiers_path(liste: liste) : backoffice_dossiers_procedure_path(id: @procedure.id, liste: liste) end diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 731320a5f..f22deacda 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -200,6 +200,7 @@ class Dossier < ActiveRecord::Base end scope :archived, -> { where(archived: true) } + scope :not_archived, -> { where(archived: false) } scope :downloadable, -> { all_state } diff --git a/app/services/dossiers_list_user_service.rb b/app/services/dossiers_list_user_service.rb deleted file mode 100644 index 24ec93b0f..000000000 --- a/app/services/dossiers_list_user_service.rb +++ /dev/null @@ -1,43 +0,0 @@ -class DossiersListUserService - def initialize current_devise_profil, liste - @current_devise_profil = current_devise_profil - @liste = liste - end - - def dossiers_to_display - {'brouillon' => brouillon, - 'a_traiter' => en_construction, - 'en_instruction' => en_instruction, - 'termine' => termine, - 'invite' => invite, - 'all_state' => all_state}[@liste] - end - - def self.dossiers_liste_libelle - ['brouillon', 'a_traiter', 'en_instruction', 'termine', 'invite', 'all_state'] - end - - def all_state - @all_state ||= @current_devise_profil.dossiers.all_state - end - - def brouillon - @brouillon ||= @current_devise_profil.dossiers.brouillon - end - - def en_construction - @en_construction ||= @current_devise_profil.dossiers.en_construction - end - - def invite - @invite ||= @current_devise_profil.invites - end - - def en_instruction - @en_instruction ||= @current_devise_profil.dossiers.en_instruction - end - - def termine - @termine ||= @current_devise_profil.dossiers.termine - end -end From 688a3d8f31ba4771f1fca9a2449f3b5481a515b2 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Wed, 12 Apr 2017 10:28:22 +0200 Subject: [PATCH 076/102] Define .brouillon as a scope and remove archived=false filter --- app/controllers/users/dossiers_controller.rb | 2 +- app/models/dossier.rb | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 313037fed..73e856c00 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -16,7 +16,7 @@ class Users::DossiersController < UsersController @dossiers_filtered = case @liste when 'brouillon' - @user_dossiers.brouillon + @user_dossiers.brouillon.order_by_updated_at when 'a_traiter' @user_dossiers.en_construction when 'en_instruction' diff --git a/app/models/dossier.rb b/app/models/dossier.rb index f22deacda..80d067cef 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -157,18 +157,18 @@ class Dossier < ActiveRecord::Base state end - def brouillon? - BROUILLON.include?(state) - end - def self.all_state order = 'ASC' where(state: ALL_STATE, archived: false).order("updated_at #{order}") end - def self.brouillon order = 'ASC' - where(state: BROUILLON, archived: false).order("updated_at #{order}") + def brouillon? + BROUILLON.include?(state) end + scope :brouillon, -> { where(state: BROUILLON) } + + scope :order_by_updated_at, -> (order = :desc) { order(updated_at: order) } + def self.nouveaux order = 'ASC' where(state: NOUVEAUX, archived: false).order("updated_at #{order}") end From 7a9fd77af077088d0815626af1770a40264a5922 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Wed, 12 Apr 2017 11:18:28 +0200 Subject: [PATCH 077/102] Remove archived=false filter from en_construction scope (Fix : archived dossier is not shown to user) --- app/controllers/users/dossiers_controller.rb | 2 +- app/models/dossier.rb | 2 +- ...el_users_dossierscontroller_index.html.haml | 8 ++++---- spec/factories/dossier.rb | 8 ++++++++ spec/factories/procedure.rb | 2 +- spec/features/users/list_dossiers_spec.rb | 18 +++++++++++------- .../concern/mail_template_concern_spec.rb | 2 +- 7 files changed, 27 insertions(+), 15 deletions(-) diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 73e856c00..9db4e35c1 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -18,7 +18,7 @@ class Users::DossiersController < UsersController when 'brouillon' @user_dossiers.brouillon.order_by_updated_at when 'a_traiter' - @user_dossiers.en_construction + @user_dossiers.en_construction.order_by_updated_at when 'en_instruction' @user_dossiers.en_instruction when 'termine' diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 80d067cef..f563ffcac 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -181,7 +181,7 @@ class Dossier < ActiveRecord::Base where(state: WAITING_FOR_USER, archived: false).order("updated_at #{order}") end - scope :en_construction, -> { where(state: EN_CONSTRUCTION, archived: false).order(updated_at: :asc) } + scope :en_construction, -> { where(state: EN_CONSTRUCTION) } def self.ouvert order = 'ASC' where(state: OUVERT, archived: false).order("updated_at #{order}") diff --git a/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml b/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml index 0b95d9465..70c8fb208 100644 --- a/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml +++ b/app/views/layouts/left_panels/_left_panel_users_dossierscontroller_index.html.haml @@ -12,7 +12,7 @@ #procedure-list - unless current_user.dossiers.count == 0 %a{ :href => "#{url_for users_dossiers_path(liste: 'brouillon')}", 'data-toggle' => :tooltip, title: 'Les dossiers jamais proposés à la relecture.' } - .procedure_list_element{ class: ('active' if @liste == 'brouillon'), id: 'brouillon' } + .procedure-list-element{ class: ('active' if @liste == 'brouillon'), id: 'brouillon' } Brouillons .badge.progress-bar-default = @user_dossiers.brouillon.count @@ -24,19 +24,19 @@ = @user_dossiers.en_construction.count %a{ :href => "#{url_for users_dossiers_path(liste: 'en_instruction')}", 'data-toggle' => :tooltip, title: 'Les dossiers en cours d\'examen par l\'administration compétante.' } - .procedure_list_element{ class: ('active' if @liste == 'en_instruction'), id: 'en_instruction' } + .procedure-list-element{ class: ('active' if @liste == 'en_instruction'), id: 'en_instruction' } En instruction .badge.progress-bar-default = @user_dossiers.en_instruction.count %a{ :href => "#{url_for users_dossiers_path(liste: 'termine')}", 'data-toggle' => :tooltip, title: 'Les dossiers cloturés qui peuvent être "Accepté", "Refusé" ou "Sans suite".' } - .procedure_list_element{ class: ('active' if @liste == 'termine'), id: 'termine' } + .procedure-list-element{ class: ('active' if @liste == 'termine'), id: 'termine' } Terminé .badge.progress-bar-success = @user_dossiers.termine.count %a{ :href => "#{url_for users_dossiers_path(liste: 'invite')}" } - .procedure_list_element{ class: ('active' if @liste == 'invite'), id: 'invite' } + .procedure-list-element{ class: ('active' if @liste == 'invite'), id: 'invite' } Invitation .badge.progress-bar-warning = current_user.invites.count diff --git a/spec/factories/dossier.rb b/spec/factories/dossier.rb index 05e70525c..a58e28bb0 100644 --- a/spec/factories/dossier.rb +++ b/spec/factories/dossier.rb @@ -47,6 +47,14 @@ FactoryGirl.define do end end + trait :archived do + archived true + end + + trait :not_archived do + archived false + end + trait :replied do state 'replied' end diff --git a/spec/factories/procedure.rb b/spec/factories/procedure.rb index 30da5d76d..b8e4d5e15 100644 --- a/spec/factories/procedure.rb +++ b/spec/factories/procedure.rb @@ -2,7 +2,7 @@ FactoryGirl.define do sequence(:published_path) { |n| "fake_path#{n}" } factory :procedure do lien_demarche 'http://localhost' - libelle 'Demande de subvention' + sequence(:libelle) { |n| "Procedure #{n}" } description "Demande de subvention à l'intention des associations" organisation "Orga SGMAP" direction "direction SGMAP" diff --git a/spec/features/users/list_dossiers_spec.rb b/spec/features/users/list_dossiers_spec.rb index 7419a03d4..7a5236f12 100644 --- a/spec/features/users/list_dossiers_spec.rb +++ b/spec/features/users/list_dossiers_spec.rb @@ -1,15 +1,14 @@ require 'spec_helper' -feature 'user access to the list of his dossier' do +describe 'user access to the list of his dossier' do let(:user) { create(:user) } let!(:last_updated_dossier) { create(:dossier, :with_entreprise, user: user, state: 'replied')} let!(:dossier1) { create(:dossier, :with_entreprise, user: user, state: 'replied') } let!(:dossier2) { create(:dossier, :with_entreprise) } + let!(:dossier_archived) { create(:dossier, :with_entreprise, user: user, state: 'replied') } before do - dossier1.update_column(:updated_at, "19/07/2052 15:35".to_time) - dossier1.procedure.update_column(:libelle, 'PLOP') - last_updated_dossier.procedure.update_column(:libelle, 'PLIP') + last_updated_dossier.update_column(:updated_at, "19/07/2052 15:35".to_time) visit new_user_session_path within('#new-user') do @@ -18,16 +17,21 @@ feature 'user access to the list of his dossier' do page.click_on 'Se connecter' end end - scenario 'the list of dossier is displayed' do + + it 'the list of dossier is displayed' do expect(page).to have_content(dossier1.procedure.libelle) expect(page).not_to have_content(dossier2.procedure.libelle) end - scenario 'the list must be order by last updated' do + it 'the list must be order by last updated' do expect(page.body).to match(/#{last_updated_dossier.procedure.libelle}.*#{dossier1.procedure.libelle}/m) end - scenario 'the state of dossier is displayed' do + it 'should list archived dossier' do + expect(page).to have_content(dossier_archived.procedure.libelle) + end + + it 'the state of dossier is displayed' do expect(page).to have_css("#dossier_#{dossier1.id}_state") end diff --git a/spec/models/concern/mail_template_concern_spec.rb b/spec/models/concern/mail_template_concern_spec.rb index b82d78117..96f997ff4 100644 --- a/spec/models/concern/mail_template_concern_spec.rb +++ b/spec/models/concern/mail_template_concern_spec.rb @@ -8,7 +8,7 @@ describe MailTemplateConcern do it 'works' do initiated_mail.object = '[TPS] --numero_dossier-- --libelle_procedure-- --lien_dossier--' expected = - "[TPS] #{dossier.id} Demande de subvention " + + "[TPS] #{dossier.id} #{dossier.procedure.libelle} " + "http://localhost:3000/users/dossiers/#{dossier.id}/recapitulatif" expect(initiated_mail.object_for_dossier(dossier)).to eq(expected) From 320ff4839f545c4b16095c448d4fb42e55bc9ee5 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Wed, 12 Apr 2017 14:38:01 +0200 Subject: [PATCH 078/102] Define .en_instruction as a scope and remove archived=false filter --- app/controllers/users/dossiers_controller.rb | 2 +- app/models/dossier.rb | 4 +-- spec/models/dossier_spec.rb | 38 +++++++++++--------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 9db4e35c1..1ac98809d 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -20,7 +20,7 @@ class Users::DossiersController < UsersController when 'a_traiter' @user_dossiers.en_construction.order_by_updated_at when 'en_instruction' - @user_dossiers.en_instruction + @user_dossiers.en_instruction.order_by_updated_at when 'termine' @user_dossiers.termine when 'invite' diff --git a/app/models/dossier.rb b/app/models/dossier.rb index f563ffcac..3842a1c48 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -191,9 +191,7 @@ class Dossier < ActiveRecord::Base where(state: A_INSTRUIRE, archived: false).order("updated_at #{order}") end - def self.en_instruction order = 'ASC' - where(state: EN_INSTRUCTION, archived: false).order("updated_at #{order}") - end + scope :en_instruction, -> { where(state: EN_INSTRUCTION) } def self.termine order = 'ASC' where(state: TERMINE, archived: false).order("updated_at #{order}") diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 37ca54b3a..754d7e3ed 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -418,23 +418,23 @@ describe Dossier do let(:procedure_admin) { create(:procedure, administrateur: admin) } let(:procedure_admin_2) { create(:procedure, administrateur: admin_2) } + let!(:dossier) { create(:dossier, procedure: procedure_admin, state: 'draft') } + let!(:dossier2) { create(:dossier, procedure: procedure_admin, state: 'initiated') } #nouveaux + let!(:dossier3) { create(:dossier, procedure: procedure_admin, state: 'initiated') } #nouveaux + let!(:dossier4) { create(:dossier, procedure: procedure_admin, state: 'replied') } #en_attente + let!(:dossier5) { create(:dossier, procedure: procedure_admin, state: 'updated') } #a_traiter + let!(:dossier6) { create(:dossier, procedure: procedure_admin, state: 'received') } #a_instruire + let!(:dossier7) { create(:dossier, procedure: procedure_admin, state: 'received') } #a_instruire + let!(:dossier8) { create(:dossier, procedure: procedure_admin, state: 'closed') } #termine + let!(:dossier9) { create(:dossier, procedure: procedure_admin, state: 'refused') } #termine + let!(:dossier10) { create(:dossier, procedure: procedure_admin, state: 'without_continuation') } #termine + let!(:dossier11) { create(:dossier, procedure: procedure_admin_2, state: 'closed') } #termine + let!(:dossier12) { create(:dossier, procedure: procedure_admin, state: 'initiated', archived: true) } #a_traiter #archived + let!(:dossier13) { create(:dossier, procedure: procedure_admin, state: 'replied', archived: true) } #en_attente #archived + let!(:dossier14) { create(:dossier, procedure: procedure_admin, state: 'closed', archived: true) } #termine #archived + before do create :assign_to, gestionnaire: gestionnaire, procedure: procedure_admin - - create(:dossier, procedure: procedure_admin, state: 'draft') - create(:dossier, procedure: procedure_admin, state: 'initiated') #nouveaux - create(:dossier, procedure: procedure_admin, state: 'initiated') #nouveaux - create(:dossier, procedure: procedure_admin, state: 'replied') #en_attente - create(:dossier, procedure: procedure_admin, state: 'updated') #a_traiter - create(:dossier, procedure: procedure_admin, state: 'received') #a_instruire - create(:dossier, procedure: procedure_admin, state: 'received') #a_instruire - create(:dossier, procedure: procedure_admin, state: 'closed') #termine - create(:dossier, procedure: procedure_admin, state: 'refused') #termine - create(:dossier, procedure: procedure_admin, state: 'without_continuation') #termine - create(:dossier, procedure: procedure_admin_2, state: 'closed') #termine - create(:dossier, procedure: procedure_admin, state: 'initiated', archived: true) #a_traiter #archived - create(:dossier, procedure: procedure_admin, state: 'replied', archived: true) #en_attente #archived - create(:dossier, procedure: procedure_admin, state: 'closed', archived: true) #termine #archived end describe '#nouveaux' do @@ -466,8 +466,14 @@ describe Dossier do it { expect(subject.size).to eq(3) } end - end + describe '#en_instruction' do + subject { gestionnaire.dossiers.en_instruction } + + it { expect(subject.size).to eq(2) } + it { expect(subject).to include(dossier6, dossier7) } + end + end end describe '#cerfa_available?' do From 762a11fc6f406bee7fb2801d6f01830932213238 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Wed, 12 Apr 2017 14:48:44 +0200 Subject: [PATCH 079/102] Define .termine as a scope and remove archived=false filter --- app/controllers/users/dossiers_controller.rb | 2 +- app/models/dossier.rb | 4 +-- .../dossiers_list_gestionnaire_service.rb | 2 +- spec/models/dossier_spec.rb | 12 ------- ...dossiers_list_gestionnaire_service_spec.rb | 32 +++++++++++++++++++ 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 1ac98809d..4b3abf481 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -22,7 +22,7 @@ class Users::DossiersController < UsersController when 'en_instruction' @user_dossiers.en_instruction.order_by_updated_at when 'termine' - @user_dossiers.termine + @user_dossiers.termine.order_by_updated_at when 'invite' current_user.invites else diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 3842a1c48..907fe7323 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -193,9 +193,7 @@ class Dossier < ActiveRecord::Base scope :en_instruction, -> { where(state: EN_INSTRUCTION) } - def self.termine order = 'ASC' - where(state: TERMINE, archived: false).order("updated_at #{order}") - end + scope :termine, -> { where(state: TERMINE) } scope :archived, -> { where(archived: true) } scope :not_archived, -> { where(archived: false) } diff --git a/app/services/dossiers_list_gestionnaire_service.rb b/app/services/dossiers_list_gestionnaire_service.rb index 93a1a4dc0..a53c35b4c 100644 --- a/app/services/dossiers_list_gestionnaire_service.rb +++ b/app/services/dossiers_list_gestionnaire_service.rb @@ -45,7 +45,7 @@ class DossiersListGestionnaireService end def termine - @termine ||= filter_dossiers.termine + @termine ||= filter_dossiers.termine.not_archived end def filter_dossiers diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index 754d7e3ed..fea8e1363 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -455,18 +455,6 @@ describe Dossier do it { expect(subject.size).to eq(1) } end - describe '#a_instruire' do - subject { gestionnaire.dossiers.a_instruire } - - it { expect(subject.size).to eq(2) } - end - - describe '#termine' do - subject { gestionnaire.dossiers.termine } - - it { expect(subject.size).to eq(3) } - end - describe '#en_instruction' do subject { gestionnaire.dossiers.en_instruction } diff --git a/spec/services/dossiers_list_gestionnaire_service_spec.rb b/spec/services/dossiers_list_gestionnaire_service_spec.rb index e568ae0da..d45293868 100644 --- a/spec/services/dossiers_list_gestionnaire_service_spec.rb +++ b/spec/services/dossiers_list_gestionnaire_service_spec.rb @@ -345,4 +345,36 @@ describe DossiersListGestionnaireService do end end end + + describe 'state filter methods' do + let!(:procedure) { create :procedure } + let!(:dossier) { create(:dossier, procedure: procedure, state: 'draft') } + let!(:dossier2) { create(:dossier, procedure: procedure, state: 'initiated') } #nouveaux + let!(:dossier3) { create(:dossier, procedure: procedure, state: 'initiated') } #nouveaux + let!(:dossier4) { create(:dossier, procedure: procedure, state: 'replied') } #en_attente + let!(:dossier5) { create(:dossier, procedure: procedure, state: 'updated') } #a_traiter + let!(:dossier6) { create(:dossier, procedure: procedure, state: 'received') } #a_instruire + let!(:dossier7) { create(:dossier, procedure: procedure, state: 'received') } #a_instruire + let!(:dossier8) { create(:dossier, procedure: procedure, state: 'closed') } #termine + let!(:dossier9) { create(:dossier, procedure: procedure, state: 'refused') } #termine + let!(:dossier10) { create(:dossier, procedure: procedure, state: 'without_continuation') } #termine + let!(:dossier11) { create(:dossier, procedure: procedure, state: 'closed') } #termine + let!(:dossier12) { create(:dossier, procedure: procedure, state: 'initiated', archived: true) } #a_traiter #archived + let!(:dossier13) { create(:dossier, procedure: procedure, state: 'replied', archived: true) } #en_attente #archived + let!(:dossier14) { create(:dossier, procedure: procedure, state: 'closed', archived: true) } #termine #archived + + describe '#termine' do + subject { DossiersListGestionnaireService.new(gestionnaire, liste, procedure).termine } + + it { expect(subject.size).to eq(4) } + it { expect(subject).to include(dossier8, dossier9, dossier10, dossier11) } + end + + describe '#a_instruire' do + subject { DossiersListGestionnaireService.new(gestionnaire, liste, procedure).a_instruire } + + it { expect(subject.size).to eq(2) } + it { expect(subject).to include(dossier6, dossier7) } + end + end end From 0c10c3e9bec083659371b2d303faaab7e6dad6ef Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Wed, 12 Apr 2017 15:17:20 +0200 Subject: [PATCH 080/102] Improve tests predictability --- spec/facades/dossiers_list_facades_spec.rb | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/spec/facades/dossiers_list_facades_spec.rb b/spec/facades/dossiers_list_facades_spec.rb index 455550a4a..8713df086 100644 --- a/spec/facades/dossiers_list_facades_spec.rb +++ b/spec/facades/dossiers_list_facades_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' describe DossiersListFacades do let(:gestionnaire) { create :gestionnaire } - let(:procedure) { create :procedure } - let(:procedure_2) { create :procedure, libelle: 'plop' } + let(:procedure) { create :procedure, libelle: 'Ma procédure' } + let(:procedure_2) { create :procedure, libelle: 'Ma seconde procédure' } let!(:preference) { create :preference_list_dossier, gestionnaire: gestionnaire, @@ -48,14 +48,8 @@ describe DossiersListFacades do it { expect(subject.size).to eq 2 } - it { expect(subject.first[:id]).to eq procedure.id } - it { expect(subject.first[:libelle]).to eq procedure.libelle } - it { expect(subject.first[:unread_notifications]).to eq 0 } - - - it { expect(subject.last[:id]).to eq procedure_2.id } - it { expect(subject.last[:libelle]).to eq procedure_2.libelle } - it { expect(subject.last[:unread_notifications]).to eq 0 } + it { expect(subject.first).to eq({ id: procedure.id, libelle: procedure.libelle, unread_notifications: 0 }) } + it { expect(subject.last).to eq({ id: procedure_2.id, libelle: procedure_2.libelle, unread_notifications: 0 }) } end describe '#active_filter?' do From d87989622ca7e66738afc7bb96128141aa055fe9 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 14 Apr 2017 17:05:38 +0200 Subject: [PATCH 081/102] Remove useless code --- app/controllers/api/v1/dossiers_controller.rb | 13 ++----------- app/controllers/api/v1/procedures_controller.rb | 4 ---- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/app/controllers/api/v1/dossiers_controller.rb b/app/controllers/api/v1/dossiers_controller.rb index 0cf231f7b..9f5ae7672 100644 --- a/app/controllers/api/v1/dossiers_controller.rb +++ b/app/controllers/api/v1/dossiers_controller.rb @@ -6,10 +6,6 @@ class API::V1::DossiersController < APIController error code: 401, desc: "Non authorisé" error code: 404, desc: "Procédure inconnue" - description <<-EOS - Plop - EOS - meta champs: { } @@ -18,7 +14,7 @@ class API::V1::DossiersController < APIController dossiers = procedure.dossiers.where.not(state: :draft).paginate(page: params[:page]) render json: {dossiers: dossiers.map{|dossier| DossiersSerializer.new(dossier)}, pagination: pagination(dossiers)}, status: 200 - rescue ActiveRecord::RecordNotFound => e + rescue ActiveRecord::RecordNotFound render json: {}, status: 404 end @@ -29,10 +25,6 @@ class API::V1::DossiersController < APIController error code: 401, desc: "Non authorisé" error code: 404, desc: "Procédure ou dossier inconnu" - description <<-EOS - Plop - EOS - meta champs: { } @@ -43,9 +35,8 @@ class API::V1::DossiersController < APIController respond_to do |format| format.json { render json: {dossier: DossierSerializer.new(dossier).as_json}, status: 200 } - format.csv { render csv: dossier.as_csv, status: 200 } end - rescue ActiveRecord::RecordNotFound => e + rescue ActiveRecord::RecordNotFound render json: {}, status: 404 end diff --git a/app/controllers/api/v1/procedures_controller.rb b/app/controllers/api/v1/procedures_controller.rb index bc712abb0..b8a9fbdaa 100644 --- a/app/controllers/api/v1/procedures_controller.rb +++ b/app/controllers/api/v1/procedures_controller.rb @@ -5,10 +5,6 @@ class API::V1::ProceduresController < APIController error code: 401, desc: "Non authorisé" error code: 404, desc: "Procédure inconnue" - description <<-EOS - Plop - EOS - meta champs: { } From 822c7cdd96380a45f760cc7c55eec77b56894ea3 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 14 Apr 2017 17:38:08 +0200 Subject: [PATCH 082/102] Add human version translation for state --- app/controllers/api/v1/dossiers_controller.rb | 4 ++-- app/models/dossier.rb | 1 - app/serializers/dossier_serializer.rb | 7 ++++++- doc/apipie_examples.json | 4 +++- spec/controllers/api/v1/dossiers_controller_spec.rb | 2 +- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/controllers/api/v1/dossiers_controller.rb b/app/controllers/api/v1/dossiers_controller.rb index 9f5ae7672..e77e11351 100644 --- a/app/controllers/api/v1/dossiers_controller.rb +++ b/app/controllers/api/v1/dossiers_controller.rb @@ -13,7 +13,7 @@ class API::V1::DossiersController < APIController procedure = current_administrateur.procedures.find(params[:procedure_id]) dossiers = procedure.dossiers.where.not(state: :draft).paginate(page: params[:page]) - render json: {dossiers: dossiers.map{|dossier| DossiersSerializer.new(dossier)}, pagination: pagination(dossiers)}, status: 200 + render json: { dossiers: dossiers.map{ |dossier| DossiersSerializer.new(dossier) }, pagination: pagination(dossiers) }, status: 200 rescue ActiveRecord::RecordNotFound render json: {}, status: 404 end @@ -34,7 +34,7 @@ class API::V1::DossiersController < APIController dossier = procedure.dossiers.find(params[:id]) respond_to do |format| - format.json { render json: {dossier: DossierSerializer.new(dossier).as_json}, status: 200 } + format.json { render json: { dossier: DossierSerializer.new(dossier).as_json }, status: 200 } end rescue ActiveRecord::RecordNotFound render json: {}, status: 404 diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 907fe7323..5fc523452 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -292,5 +292,4 @@ class Dossier < ActiveRecord::Base def serialize_value_for_export(value) value.nil? || value.kind_of?(Time) ? value : value.to_s end - end diff --git a/app/serializers/dossier_serializer.rb b/app/serializers/dossier_serializer.rb index eb074761b..41336c6cf 100644 --- a/app/serializers/dossier_serializer.rb +++ b/app/serializers/dossier_serializer.rb @@ -4,7 +4,8 @@ class DossierSerializer < ActiveModel::Serializer :updated_at, :archived, :mandataire_social, - :state + :state, + :simplified_state has_one :entreprise has_one :etablissement @@ -14,4 +15,8 @@ class DossierSerializer < ActiveModel::Serializer has_many :champs_private has_many :pieces_justificatives has_many :types_de_piece_justificative + + def simplified_state + object.decorate.display_state + end end diff --git a/doc/apipie_examples.json b/doc/apipie_examples.json index e14456d96..285fa49e3 100644 --- a/doc/apipie_examples.json +++ b/doc/apipie_examples.json @@ -45,6 +45,8 @@ "updated_at": "2008-09-01T08:05:00.000Z", "archived": false, "mandataire_social": false, + "state": "updated", + "simplified_state": "En construction", "entreprise": { "siren": "440117620", "capital_social": 537100000, @@ -174,4 +176,4 @@ "recorded": true } ] -} \ No newline at end of file +} diff --git a/spec/controllers/api/v1/dossiers_controller_spec.rb b/spec/controllers/api/v1/dossiers_controller_spec.rb index 463a644c1..67a4688f5 100644 --- a/spec/controllers/api/v1/dossiers_controller_spec.rb +++ b/spec/controllers/api/v1/dossiers_controller_spec.rb @@ -115,7 +115,7 @@ describe API::V1::DossiersController do let!(:dossier) { Timecop.freeze(date_creation) { create(:dossier, :with_entreprise, procedure: procedure) } } let(:dossier_id) { dossier.id } let(:body) { JSON.parse(retour.body, symbolize_names: true) } - let(:field_list) { [:id, :created_at, :updated_at, :archived, :mandataire_social, :entreprise, :etablissement, :cerfa, :types_de_piece_justificative, :pieces_justificatives, :champs, :champs_private, :commentaires, :state] } + let(:field_list) { [:id, :created_at, :updated_at, :archived, :mandataire_social, :entreprise, :etablissement, :cerfa, :types_de_piece_justificative, :pieces_justificatives, :champs, :champs_private, :commentaires, :state, :simplified_state] } subject { body[:dossier] } it 'return REST code 200', :show_in_doc do From bf67b3f7ad2f8be6cad68e38457088054d20edf6 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 14 Apr 2017 17:48:13 +0200 Subject: [PATCH 083/102] Add dossier workflow dates to the API --- app/serializers/dossier_serializer.rb | 5 ++++- doc/apipie_examples.json | 3 +++ spec/controllers/api/v1/dossiers_controller_spec.rb | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/serializers/dossier_serializer.rb b/app/serializers/dossier_serializer.rb index 41336c6cf..207225ad5 100644 --- a/app/serializers/dossier_serializer.rb +++ b/app/serializers/dossier_serializer.rb @@ -5,7 +5,10 @@ class DossierSerializer < ActiveModel::Serializer :archived, :mandataire_social, :state, - :simplified_state + :simplified_state, + :initiated_at, + :received_at, + :processed_at has_one :entreprise has_one :etablissement diff --git a/doc/apipie_examples.json b/doc/apipie_examples.json index 285fa49e3..839b58095 100644 --- a/doc/apipie_examples.json +++ b/doc/apipie_examples.json @@ -47,6 +47,9 @@ "mandataire_social": false, "state": "updated", "simplified_state": "En construction", + "initiated_at": "2017-04-11T12:00:12.000Z", + "received_at": null, + "processed_at": null, "entreprise": { "siren": "440117620", "capital_social": 537100000, diff --git a/spec/controllers/api/v1/dossiers_controller_spec.rb b/spec/controllers/api/v1/dossiers_controller_spec.rb index 67a4688f5..e1d2dcc6d 100644 --- a/spec/controllers/api/v1/dossiers_controller_spec.rb +++ b/spec/controllers/api/v1/dossiers_controller_spec.rb @@ -115,7 +115,7 @@ describe API::V1::DossiersController do let!(:dossier) { Timecop.freeze(date_creation) { create(:dossier, :with_entreprise, procedure: procedure) } } let(:dossier_id) { dossier.id } let(:body) { JSON.parse(retour.body, symbolize_names: true) } - let(:field_list) { [:id, :created_at, :updated_at, :archived, :mandataire_social, :entreprise, :etablissement, :cerfa, :types_de_piece_justificative, :pieces_justificatives, :champs, :champs_private, :commentaires, :state, :simplified_state] } + let(:field_list) { [:id, :created_at, :updated_at, :archived, :mandataire_social, :entreprise, :etablissement, :cerfa, :types_de_piece_justificative, :pieces_justificatives, :champs, :champs_private, :commentaires, :state, :simplified_state, :initiated_at, :processed_at, :received_at] } subject { body[:dossier] } it 'return REST code 200', :show_in_doc do From 40d897f538e319d40ac523ee8e45c02d9e4c093b Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 14 Apr 2017 18:10:39 +0200 Subject: [PATCH 084/102] Add accompagnateurs emails in API --- app/models/dossier.rb | 4 +-- app/serializers/dossier_serializer.rb | 7 +++- .../dossier_table_export_serializer.rb | 6 +++- doc/apipie_examples.json | 3 ++ .../api/v1/dossiers_controller_spec.rb | 2 +- spec/models/dossier_spec.rb | 36 +------------------ .../dossier_table_export_serializer_spec.rb | 34 ++++++++++++++++++ 7 files changed, 52 insertions(+), 40 deletions(-) create mode 100644 spec/serializers/dossier_table_export_serializer_spec.rb diff --git a/app/models/dossier.rb b/app/models/dossier.rb index 5fc523452..fd1ea248f 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -246,8 +246,8 @@ class Dossier < ActiveRecord::Base return headers end - def followers_gestionnaires_emails - follows.includes(:gestionnaire).map { |f| f.gestionnaire }.pluck(:email).join(' ') + def followers_gestionnaires + follows.includes(:gestionnaire).map(&:gestionnaire) end def reset! diff --git a/app/serializers/dossier_serializer.rb b/app/serializers/dossier_serializer.rb index 207225ad5..f02c44115 100644 --- a/app/serializers/dossier_serializer.rb +++ b/app/serializers/dossier_serializer.rb @@ -8,7 +8,8 @@ class DossierSerializer < ActiveModel::Serializer :simplified_state, :initiated_at, :received_at, - :processed_at + :processed_at, + :accompagnateurs has_one :entreprise has_one :etablissement @@ -22,4 +23,8 @@ class DossierSerializer < ActiveModel::Serializer def simplified_state object.decorate.display_state end + + def accompagnateurs + object.followers_gestionnaires.pluck(:email) + end end diff --git a/app/serializers/dossier_table_export_serializer.rb b/app/serializers/dossier_table_export_serializer.rb index 9ed5dce82..3bd4ba52a 100644 --- a/app/serializers/dossier_table_export_serializer.rb +++ b/app/serializers/dossier_table_export_serializer.rb @@ -9,7 +9,7 @@ class DossierTableExportSerializer < ActiveModel::Serializer :received_at, :processed_at - attribute :followers_gestionnaires_emails, key: :emails_accompagnateurs + attribute :emails_accompagnateurs attributes :individual_gender, :individual_prenom, @@ -31,4 +31,8 @@ class DossierTableExportSerializer < ActiveModel::Serializer def individual_gender object.individual.try(:gender) end + + def emails_accompagnateurs + object.followers_gestionnaires.pluck(:email).join(' ') + end end diff --git a/doc/apipie_examples.json b/doc/apipie_examples.json index 839b58095..f1c906a0e 100644 --- a/doc/apipie_examples.json +++ b/doc/apipie_examples.json @@ -50,6 +50,9 @@ "initiated_at": "2017-04-11T12:00:12.000Z", "received_at": null, "processed_at": null, + "accompagnateurs": [ + "gestionnaire@apientreprise.fr" + ], "entreprise": { "siren": "440117620", "capital_social": 537100000, diff --git a/spec/controllers/api/v1/dossiers_controller_spec.rb b/spec/controllers/api/v1/dossiers_controller_spec.rb index e1d2dcc6d..3f55ce128 100644 --- a/spec/controllers/api/v1/dossiers_controller_spec.rb +++ b/spec/controllers/api/v1/dossiers_controller_spec.rb @@ -115,7 +115,7 @@ describe API::V1::DossiersController do let!(:dossier) { Timecop.freeze(date_creation) { create(:dossier, :with_entreprise, procedure: procedure) } } let(:dossier_id) { dossier.id } let(:body) { JSON.parse(retour.body, symbolize_names: true) } - let(:field_list) { [:id, :created_at, :updated_at, :archived, :mandataire_social, :entreprise, :etablissement, :cerfa, :types_de_piece_justificative, :pieces_justificatives, :champs, :champs_private, :commentaires, :state, :simplified_state, :initiated_at, :processed_at, :received_at] } + let(:field_list) { [:id, :created_at, :updated_at, :archived, :mandataire_social, :entreprise, :etablissement, :cerfa, :types_de_piece_justificative, :pieces_justificatives, :champs, :champs_private, :commentaires, :state, :simplified_state, :initiated_at, :processed_at, :received_at, :accompagnateurs] } subject { body[:dossier] } it 'return REST code 200', :show_in_doc do diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index fea8e1363..ba1dcef8d 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -572,7 +572,7 @@ describe Dossier do it { expect(subject[6]).to eq(date1) } it { expect(subject[7]).to eq(date2) } it { expect(subject[8]).to eq(date3) } - it { expect(subject[9]).to eq(dossier.followers_gestionnaires_emails) } + it { expect(subject[9]).to be_a_kind_of(String) } it { expect(subject[10]).to be_nil } it { expect(subject[11]).to be_nil } it { expect(subject[12]).to be_nil } @@ -809,40 +809,6 @@ describe Dossier do end end - describe '#followers_gestionnaires_emails' do - - context 'when there is no follower' do - let(:dossier) { create(:dossier, follows: []) } - - subject { dossier.followers_gestionnaires_emails } - - it { is_expected.to eq "" } - end - - let(:gestionnaire) { create(:gestionnaire) } - let(:follow) { create(:follow, gestionnaire: gestionnaire) } - - context 'when there is 1 follower' do - let(:dossier) { create(:dossier, follows: [follow]) } - - subject { dossier.followers_gestionnaires_emails } - - it { is_expected.to eq gestionnaire.email } - end - - let(:gestionnaire2) { create :gestionnaire} - let(:follow2) { create(:follow, gestionnaire: gestionnaire2) } - - context 'when there is 2 followers' do - let(:dossier) { create(:dossier, follows: [follow, follow2]) } - - subject { dossier.followers_gestionnaires_emails } - - it { is_expected.to eq "#{gestionnaire.email} #{gestionnaire2.email}" } - end - - end - describe '#update_state_dates' do let(:state) { 'draft' } let(:dossier) { create(:dossier, state: state) } diff --git a/spec/serializers/dossier_table_export_serializer_spec.rb b/spec/serializers/dossier_table_export_serializer_spec.rb new file mode 100644 index 000000000..3373ecbed --- /dev/null +++ b/spec/serializers/dossier_table_export_serializer_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe DossierTableExportSerializer do + + describe '#emails_accompagnateurs' do + + let(:gestionnaire){ create(:gestionnaire) } + let(:follow) { create(:follow, gestionnaire: gestionnaire) } + + subject { DossierTableExportSerializer.new(dossier).emails_accompagnateurs } + + context 'when there is no accompagnateurs' do + let(:dossier) { create(:dossier, follows: []) } + + it { is_expected.to eq('') } + end + + context 'when there one accompagnateur' do + let(:dossier) { create(:dossier, follows: [follow]) } + + it { is_expected.to eq(gestionnaire.email) } + end + + context 'when there is 2 followers' do + let(:gestionnaire2) { create :gestionnaire} + let(:follow2) { create(:follow, gestionnaire: gestionnaire2) } + let(:dossier) { create(:dossier, follows: [follow, follow2]) } + + it { is_expected.to eq "#{gestionnaire.email} #{gestionnaire2.email}" } + end + + end + +end From 757af12d424bb98c887e29dd15ff80443754d5b2 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 14 Apr 2017 18:20:14 +0200 Subject: [PATCH 085/102] Add invites to API --- app/models/dossier.rb | 1 + app/serializers/dossier_serializer.rb | 7 ++++++- doc/apipie_examples.json | 3 +++ spec/controllers/api/v1/dossiers_controller_spec.rb | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/models/dossier.rb b/app/models/dossier.rb index fd1ea248f..f98e4e4c9 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -22,6 +22,7 @@ class Dossier < ActiveRecord::Base has_many :commentaires, dependent: :destroy has_many :invites, dependent: :destroy has_many :invites_user, class_name: 'InviteUser', dependent: :destroy + has_many :invites_gestionnaires, class_name: 'InviteGestionnaire', dependent: :destroy has_many :follows has_many :notifications, dependent: :destroy diff --git a/app/serializers/dossier_serializer.rb b/app/serializers/dossier_serializer.rb index f02c44115..73b7dcc8c 100644 --- a/app/serializers/dossier_serializer.rb +++ b/app/serializers/dossier_serializer.rb @@ -9,7 +9,8 @@ class DossierSerializer < ActiveModel::Serializer :initiated_at, :received_at, :processed_at, - :accompagnateurs + :accompagnateurs, + :invites has_one :entreprise has_one :etablissement @@ -27,4 +28,8 @@ class DossierSerializer < ActiveModel::Serializer def accompagnateurs object.followers_gestionnaires.pluck(:email) end + + def invites + object.invites_gestionnaires.pluck(:email) + end end diff --git a/doc/apipie_examples.json b/doc/apipie_examples.json index f1c906a0e..7010bc322 100644 --- a/doc/apipie_examples.json +++ b/doc/apipie_examples.json @@ -53,6 +53,9 @@ "accompagnateurs": [ "gestionnaire@apientreprise.fr" ], + "invites": [ + "nom@domaine.fr" + ], "entreprise": { "siren": "440117620", "capital_social": 537100000, diff --git a/spec/controllers/api/v1/dossiers_controller_spec.rb b/spec/controllers/api/v1/dossiers_controller_spec.rb index 3f55ce128..be00999ee 100644 --- a/spec/controllers/api/v1/dossiers_controller_spec.rb +++ b/spec/controllers/api/v1/dossiers_controller_spec.rb @@ -115,7 +115,7 @@ describe API::V1::DossiersController do let!(:dossier) { Timecop.freeze(date_creation) { create(:dossier, :with_entreprise, procedure: procedure) } } let(:dossier_id) { dossier.id } let(:body) { JSON.parse(retour.body, symbolize_names: true) } - let(:field_list) { [:id, :created_at, :updated_at, :archived, :mandataire_social, :entreprise, :etablissement, :cerfa, :types_de_piece_justificative, :pieces_justificatives, :champs, :champs_private, :commentaires, :state, :simplified_state, :initiated_at, :processed_at, :received_at, :accompagnateurs] } + let(:field_list) { [:id, :created_at, :updated_at, :archived, :mandataire_social, :entreprise, :etablissement, :cerfa, :types_de_piece_justificative, :pieces_justificatives, :champs, :champs_private, :commentaires, :state, :simplified_state, :initiated_at, :processed_at, :received_at, :accompagnateurs, :invites] } subject { body[:dossier] } it 'return REST code 200', :show_in_doc do From 03761c11365b39a899b9e752d900290928fba59d Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Thu, 20 Apr 2017 17:20:05 +0200 Subject: [PATCH 086/102] =?UTF-8?q?Change=20the=20testimonials=E2=80=99=20?= =?UTF-8?q?order?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/root/landing.html.haml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml index ad9539c42..2b872a4e6 100644 --- a/app/views/root/landing.html.haml +++ b/app/views/root/landing.html.haml @@ -51,18 +51,6 @@ %h2.landing-panel-title Ce que les utilisateurs pensent du service %ul.quotes - %li.quote - %img.quote-quotation-mark.pull-left{ :src => image_url("landing/testimonials/quotation-mark.svg") } - %p.quote-content.pull-right - TPS c’est surtout l’assurance d’un dialogue en toute fluidité et en toute transparence entre les porteurs de projet et l’administration. Un service qui garantit une économie de temps et beaucoup moins de manipulations des dossiers. - .clearfix - - %p.quote-author.pull-left - %span.quote-author-name Nadja Briki - %br - Déléguée de la Préfète du Pas-de-Calais - .clearfix - %li.quote %img.quote-quotation-mark.pull-left{ :src => image_url("landing/testimonials/quotation-mark.svg") } %p.quote-content.pull-right @@ -75,6 +63,18 @@ Chef de bureau, DRIEA Ile-de-France .clearfix + %li.quote + %img.quote-quotation-mark.pull-left{ :src => image_url("landing/testimonials/quotation-mark.svg") } + %p.quote-content.pull-right + TPS c’est surtout l’assurance d’un dialogue en toute fluidité et en toute transparence entre les porteurs de projet et l’administration. Un service qui garantit une économie de temps et beaucoup moins de manipulations des dossiers. + .clearfix + + %p.quote-author.pull-left + %span.quote-author-name Nadja Briki + %br + Déléguée de la Préfète du Pas-de-Calais + .clearfix + - cache "numbers-panel", :expires_in => 3.hours do .landing-panel.numbers-panel .landing-panel-inner-content From 595ea9bb37a4841aef075e485035072d068b8156 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Thu, 20 Apr 2017 17:20:32 +0200 Subject: [PATCH 087/102] =?UTF-8?q?Add=20a=20=E2=80=9CCall=20Us=E2=80=9D?= =?UTF-8?q?=20CTA=20on=20the=20landing=20page?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/stylesheets/landing.scss | 20 +++++++++++++++++--- app/views/root/landing.html.haml | 17 ++++++++++++----- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/landing.scss b/app/assets/stylesheets/landing.scss index 26a7e7a83..bc8481080 100644 --- a/app/assets/stylesheets/landing.scss +++ b/app/assets/stylesheets/landing.scss @@ -63,6 +63,13 @@ } } +.hero-phone-cta { + color: $grey; + text-align: center; + width: 293px; + margin-top: 12px; +} + .landing-panel-title { font-size: 30px; font-weight: normal; @@ -202,7 +209,7 @@ $images-count: 5; .cta-panel-title { font-size: 24px; font-weight: bold; - margin-top: 0; + margin-top: 13px; } .cta-panel-explanation { @@ -216,14 +223,13 @@ $cta-panel-button-border-size: 2px; .cta-panel-button { @include horizontal-padding(30px); - display: inline-block; + display: block; height: $cta-panel-button-height; line-height: $cta-panel-button-height - (2 * $cta-panel-button-border-size); border-radius: $cta-panel-button-height; border: $cta-panel-button-border-size solid #FFFFFF; color: #FFFFFF; font-size: 24px; - margin-top: 5px; &:hover { color: #FFFFFF; @@ -236,3 +242,11 @@ $cta-panel-button-border-size: 2px; text-decoration: none; } } + +.cta-panel-phone-cta { + color: rgba(255, 255, 255, 0.9); + text-align: center; + width: 293px; + margin-top: 12px; + margin-bottom: 0; +} diff --git a/app/views/root/landing.html.haml b/app/views/root/landing.html.haml index 2b872a4e6..f49b66bb7 100644 --- a/app/views/root/landing.html.haml +++ b/app/views/root/landing.html.haml @@ -11,6 +11,9 @@ "mailto:#{t("dynamics.contact_email")}?subject=Demande de démo TPS", :class => "hero-button" + %p.hero-phone-cta + ou nous appeler au 01 40 15 68 49 + .hero-illustration.pull-right %img{ :src => image_url("landing/hero/dematerialiser.svg") } @@ -125,10 +128,14 @@ .landing-panel.cta-panel .landing-panel-inner-content - = link_to "Demander une démo", - "mailto:#{t('dynamics.contact_email')}?subject=Demande de démo TPS", - :class => "cta-panel-button pull-right" - %h1.cta-panel-title.pull-left Commencez à dématerialiser vos démarches - %p.cta-panel-explanation.pull-left Nous vous accompagnons dans la prise en main de l’outil + .pull-right + = link_to "Demander une démo", + "mailto:#{t('dynamics.contact_email')}?subject=Demande de démo TPS", + :class => "cta-panel-button" + %p.cta-panel-phone-cta + ou nous appeler au 01 40 15 68 49 + .pull-left + %h1.cta-panel-title Commencez à dématerialiser vos démarches + %p.cta-panel-explanation Nous vous accompagnons dans la prise en main de l’outil .clearfix From 887512c26c294df7bf5e962c23b2d161e9a980d5 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 14 Apr 2017 11:34:53 +0200 Subject: [PATCH 088/102] Procedure path can contain dashes and can be longer --- .../javascripts/admin_procedures_modal.js | 2 +- app/models/procedure.rb | 2 +- app/models/procedure_path.rb | 2 +- .../admin/procedures/_modal_publish.html.haml | 4 ++-- config/locales/models/procedure_path/fr.yml | 8 ++++++++ ...1_remove_field_limit_for_procedure_paths.rb | 5 +++++ db/schema.rb | 4 ++-- spec/features/admin/procedure_creation_spec.rb | 2 +- spec/models/procedure_path_spec.rb | 18 +++++++++++++++--- spec/models/procedure_spec.rb | 8 ++++++++ 10 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 config/locales/models/procedure_path/fr.yml create mode 100644 db/migrate/20170414095411_remove_field_limit_for_procedure_paths.rb diff --git a/app/assets/javascripts/admin_procedures_modal.js b/app/assets/javascripts/admin_procedures_modal.js index 342cc64f5..edbb6f538 100644 --- a/app/assets/javascripts/admin_procedures_modal.js +++ b/app/assets/javascripts/admin_procedures_modal.js @@ -52,7 +52,7 @@ function path_validation(el) { } function validatePath(path) { - var re = /^[a-z0-9_]{3,30}$/; + var re = /^[a-z0-9_\-]{3,50}$/; return re.test(path); } diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 3d4edf63f..7d3624dca 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -53,7 +53,7 @@ class Procedure < ActiveRecord::Base end def default_path - libelle.downcase.gsub(/[^a-z0-9\-_]/, "_").gsub(/_*$/, '').gsub(/_+/, '_') + libelle.parameterize.first(50) end def types_de_champ_ordered diff --git a/app/models/procedure_path.rb b/app/models/procedure_path.rb index e68942ff1..98fd4e3d1 100644 --- a/app/models/procedure_path.rb +++ b/app/models/procedure_path.rb @@ -1,5 +1,5 @@ class ProcedurePath < ActiveRecord::Base - validates :path, procedure_path_format: true, presence: true, allow_blank: false, allow_nil: false + validates :path, format: { with: /\A[a-z0-9_\-]{3,50}\z/ }, presence: true, allow_blank: false, allow_nil: false validates :administrateur_id, presence: true, allow_blank: false, allow_nil: false validates :procedure_id, presence: true, allow_blank: false, allow_nil: false diff --git a/app/views/admin/procedures/_modal_publish.html.haml b/app/views/admin/procedures/_modal_publish.html.haml index b5c282d34..14fb1c234 100644 --- a/app/views/admin/procedures/_modal_publish.html.haml +++ b/app/views/admin/procedures/_modal_publish.html.haml @@ -28,7 +28,7 @@ id: 'procedure_path', placeholder: 'Chemin vers la procédure', class: 'form-control', - maxlength: 30, + maxlength: 50, style: 'width: 300px; display: inline;') #path-messages #path_is_mine.text-warning.center.message @@ -40,7 +40,7 @@ %br Vous ne pouvez pas l'utiliser car il appartient à un autre administrateur. #path_is_invalid.text-danger.center.message - Ce lien n'est pas valide. Il doit comporter au moins 3 caractères et seuls les caractères a-z, 0-9 et '_' sont autorisés. + = t('activerecord.errors.models.procedure_path.attributes.path.format') .modal-footer = submit_tag "#{@procedure.archived? ? 'Réactiver' : 'Publier'}", class: %w(btn btn btn-success), id: 'publish', diff --git a/config/locales/models/procedure_path/fr.yml b/config/locales/models/procedure_path/fr.yml new file mode 100644 index 000000000..a17306b90 --- /dev/null +++ b/config/locales/models/procedure_path/fr.yml @@ -0,0 +1,8 @@ +fr: + activerecord: + errors: + models: + procedure_path: + attributes: + path: + format: Ce lien n'est pas valide. Il doit comporter au moins 3 caractères, au plus 50 caractères et seuls les caractères a-z, 0-9, '_' et '-' sont autorisés. diff --git a/db/migrate/20170414095411_remove_field_limit_for_procedure_paths.rb b/db/migrate/20170414095411_remove_field_limit_for_procedure_paths.rb new file mode 100644 index 000000000..9de4f3a0b --- /dev/null +++ b/db/migrate/20170414095411_remove_field_limit_for_procedure_paths.rb @@ -0,0 +1,5 @@ +class RemoveFieldLimitForProcedurePaths < ActiveRecord::Migration[5.0] + def change + change_column :procedure_paths, :path, :string, limit: nil, null: true, unique: true, index: true + end +end diff --git a/db/schema.rb b/db/schema.rb index e390453da..140dccaf6 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: 20170328142700) do +ActiveRecord::Schema.define(version: 20170414095411) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -319,7 +319,7 @@ ActiveRecord::Schema.define(version: 20170328142700) do end create_table "procedure_paths", force: :cascade do |t| - t.string "path", limit: 30 + t.string "path" t.integer "procedure_id" t.integer "administrateur_id" t.index ["path"], name: "index_procedure_paths_on_path", using: :btree diff --git a/spec/features/admin/procedure_creation_spec.rb b/spec/features/admin/procedure_creation_spec.rb index fbf76005a..8e14bd43a 100644 --- a/spec/features/admin/procedure_creation_spec.rb +++ b/spec/features/admin/procedure_creation_spec.rb @@ -92,7 +92,7 @@ feature 'As an administrateur I wanna create a new procedure', js: true do expect(page).to have_selector('#publish-procedure', visible: true) page.find_by_id('publish-procedure').click - expect(page.find_by_id('procedure_path')['value']).to eq('libelle_de_la_procedure') + expect(page.find_by_id('procedure_path')['value']).to eq('libelle-de-la-procedure') page.find_by_id('publish').click expect(page).to have_selector('.procedure-lien') end diff --git a/spec/models/procedure_path_spec.rb b/spec/models/procedure_path_spec.rb index fa7ceb7d4..dfb268291 100644 --- a/spec/models/procedure_path_spec.rb +++ b/spec/models/procedure_path_spec.rb @@ -24,14 +24,26 @@ describe ProcedurePath do let(:path) { '' } it { expect{procedure_path}.to raise_error ActiveRecord::RecordInvalid } end - context 'when path is invalid' do + context 'when path contains spaces' do let(:path) { 'Demande de subvention' } it { expect{procedure_path}.to raise_error ActiveRecord::RecordInvalid } end - context 'when path is valid' do - let(:path) { 'ma_super_procedure' } + context 'when path contains alphanumerics and underscores' do + let(:path) { 'ma_super_procedure_1' } it { expect{procedure_path}.not_to raise_error } end + context 'when path contains dashes' do + let(:path) { 'ma-super-procedure' } + it { expect{procedure_path}.not_to raise_error } + end + context 'when path is too long' do + let(:path) { 'ma-super-procedure-12345678901234567890123456789012345678901234567890' } + it { expect{procedure_path}.to raise_error ActiveRecord::RecordInvalid } + end + context 'when path is too short' do + let(:path) { 'pr' } + it { expect{procedure_path}.to raise_error ActiveRecord::RecordInvalid } + end end end diff --git a/spec/models/procedure_spec.rb b/spec/models/procedure_spec.rb index 6c4b16ba6..7a5717d99 100644 --- a/spec/models/procedure_spec.rb +++ b/spec/models/procedure_spec.rb @@ -284,4 +284,12 @@ describe Procedure do it_behaves_like "export is empty" end end + + describe '#default_path' do + let(:procedure){ create(:procedure, libelle: 'A long libelle with àccênts, blabla coucou hello un deux trois voila') } + + subject { procedure.default_path } + + it { is_expected.to eq('a-long-libelle-with-accents-blabla-coucou-hello-un') } + end end From ad4bd87b1faadd876c15fcb1341757ae92b4faf3 Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Fri, 21 Apr 2017 17:02:37 +0200 Subject: [PATCH 089/102] Remove unused pending tests, and enable old tests disabled for sqlite --- spec/features/users/dossier_index_spec.rb | 2 +- spec/services/notification_service_spec.rb | 4 ---- spec/services/render_partial_service_spec.rb | 4 ---- spec/views/users/recapitulatif/show.html.haml_spec.rb | 6 ------ 4 files changed, 1 insertion(+), 15 deletions(-) diff --git a/spec/features/users/dossier_index_spec.rb b/spec/features/users/dossier_index_spec.rb index 9db5bd1e3..913efcf79 100644 --- a/spec/features/users/dossier_index_spec.rb +++ b/spec/features/users/dossier_index_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -xfeature 'As a User I want to sort and paginate dossiers', js: true do +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) } diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb index df7fe448b..6a6cc4762 100644 --- a/spec/services/notification_service_spec.rb +++ b/spec/services/notification_service_spec.rb @@ -22,8 +22,4 @@ describe NotificationService do end end end - - describe 'text_for_notif' do - pending - end end diff --git a/spec/services/render_partial_service_spec.rb b/spec/services/render_partial_service_spec.rb index ea94d3d5a..a8eee209c 100644 --- a/spec/services/render_partial_service_spec.rb +++ b/spec/services/render_partial_service_spec.rb @@ -16,8 +16,4 @@ describe RenderPartialService do it { is_expected.to eq 'layouts/left_panels/left_panel_'+controller.to_s.parameterize + '_' + method.to_s } end - - describe 'left_panel_exist?' do - pending - end end diff --git a/spec/views/users/recapitulatif/show.html.haml_spec.rb b/spec/views/users/recapitulatif/show.html.haml_spec.rb index ce0e52275..ccef84120 100644 --- a/spec/views/users/recapitulatif/show.html.haml_spec.rb +++ b/spec/views/users/recapitulatif/show.html.haml_spec.rb @@ -24,12 +24,6 @@ describe 'users/recapitulatif/show.html.haml', type: :view do expect(rendered).to have_selector('#messages') end - it 'le numéro de dossier est présent' do - pending 'move to test layout' - expect(rendered).to have_selector('#dossier_id') - expect(rendered).to have_content(dossier_id) - end - describe 'les liens de modifications' do context 'lien description' do it 'le lien vers description est présent' do From f8cb34a39318033b231fc3926a635ced6e737e91 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 18 Apr 2017 17:19:40 +0200 Subject: [PATCH 090/102] Add some spacing in _dossier_link.html.haml --- app/views/users/description/champs/_dossier_link.html.haml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/users/description/champs/_dossier_link.html.haml b/app/views/users/description/champs/_dossier_link.html.haml index 41d6f0526..1fa87656c 100644 --- a/app/views/users/description/champs/_dossier_link.html.haml +++ b/app/views/users/description/champs/_dossier_link.html.haml @@ -17,5 +17,6 @@ ce dossier répond à la procédure : %br %span.procedureLibelle= procedure_libelle + %p.text-warning{ style: show_warning ? nil : 'display: none;' } ce dossier est inconnu From 8bea7cb610704e13db9336bdc0a4ff75b787f109 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Mon, 24 Apr 2017 10:12:02 +0200 Subject: [PATCH 091/102] Fix a typographic mistake in _dossier_link.html.haml Sentences should start with an uppercase letter --- app/views/users/description/champs/_dossier_link.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/users/description/champs/_dossier_link.html.haml b/app/views/users/description/champs/_dossier_link.html.haml index 1fa87656c..723f6a47a 100644 --- a/app/views/users/description/champs/_dossier_link.html.haml +++ b/app/views/users/description/champs/_dossier_link.html.haml @@ -19,4 +19,4 @@ %span.procedureLibelle= procedure_libelle %p.text-warning{ style: show_warning ? nil : 'display: none;' } - ce dossier est inconnu + Ce dossier est inconnu From 6bb67d639cf403b114e2a6779151ac97aba6946e Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 18 Apr 2017 17:09:22 +0200 Subject: [PATCH 092/102] Use lowercase letters and dashes for CSS classes As enforced by scss-lint --- app/assets/javascripts/new-description.js | 2 +- app/views/users/description/champs/_dossier_link.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/new-description.js b/app/assets/javascripts/new-description.js index 8de71855e..6d56fe939 100644 --- a/app/assets/javascripts/new-description.js +++ b/app/assets/javascripts/new-description.js @@ -5,7 +5,7 @@ }; var showData = function(data) { - $('.dossier-link .procedureLibelle').text(data.procedureLibelle); + $('.dossier-link .procedure-libelle').text(data.procedureLibelle); $('.dossier-link .text-info').show(); $('.dossier-link .text-warning').hide(); }; diff --git a/app/views/users/description/champs/_dossier_link.html.haml b/app/views/users/description/champs/_dossier_link.html.haml index 723f6a47a..23874731f 100644 --- a/app/views/users/description/champs/_dossier_link.html.haml +++ b/app/views/users/description/champs/_dossier_link.html.haml @@ -16,7 +16,7 @@ %p.text-info{ style: show_procedure_libelle ? nil : 'display: none;' } ce dossier répond à la procédure : %br - %span.procedureLibelle= procedure_libelle + %span.procedure-libelle= procedure_libelle %p.text-warning{ style: show_warning ? nil : 'display: none;' } Ce dossier est inconnu From 14b7badfede16a87c781aaab5a314bbdbea9332f Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Thu, 13 Apr 2017 15:42:54 +0200 Subject: [PATCH 093/102] =?UTF-8?q?Eager-load=20the=20dossier=E2=80=99s=20?= =?UTF-8?q?procedure=20when=20possible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users/dossiers_controller.rb | 2 +- app/views/dossiers/_infos_dossier.html.haml | 2 +- app/views/users/description/champs/_dossier_link.html.haml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 4b3abf481..61bf3a0e7 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -165,7 +165,7 @@ class Users::DossiersController < UsersController end def procedure_libelle - dossier = Dossier.find(params[:dossier_id]) + dossier = Dossier.includes(:procedure).find(params[:dossier_id]) render json: { procedureLibelle: dossier.procedure.libelle } rescue ActiveRecord::RecordNotFound render json: {}, status: 404 diff --git a/app/views/dossiers/_infos_dossier.html.haml b/app/views/dossiers/_infos_dossier.html.haml index 00b37b627..090873fea 100644 --- a/app/views/dossiers/_infos_dossier.html.haml +++ b/app/views/dossiers/_infos_dossier.html.haml @@ -39,7 +39,7 @@ .col-xs-5.depositaire-info{ id: "champ-#{champ.id}-value" } - unless champ.decorate.value.blank? - if champ.type_champ == 'dossier_link' - - dossier = Dossier.find_by(id: champ.decorate.value) + - dossier = Dossier.includes(:procedure).find_by(id: champ.decorate.value) - if dossier && gestionnaire_signed_in? = link_to(dossier.procedure.libelle, backoffice_dossier_path(champ.decorate.value), target: '_blank') - else diff --git a/app/views/users/description/champs/_dossier_link.html.haml b/app/views/users/description/champs/_dossier_link.html.haml index 23874731f..d6fc6ff38 100644 --- a/app/views/users/description/champs/_dossier_link.html.haml +++ b/app/views/users/description/champs/_dossier_link.html.haml @@ -1,4 +1,4 @@ -- dossier = Dossier.find_by(id: champ.value) +- dossier = Dossier.includes(:procedure).find_by(id: champ.value) - show_procedure_libelle = dossier ? true : false - show_warning = !show_procedure_libelle && champ.value.present? - procedure_libelle = dossier.nil? ? '' : dossier.procedure.libelle From b34bf4846caf791d3c9d0e6347e3786c1bf8c569 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Thu, 13 Apr 2017 17:22:18 +0200 Subject: [PATCH 094/102] Improve a test title in the _render_list_champs test --- .../description/champs/_render_list_champs.html.haml_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/views/users/description/champs/_render_list_champs.html.haml_spec.rb b/spec/views/users/description/champs/_render_list_champs.html.haml_spec.rb index 17ca6d9d3..b5a74ed58 100644 --- a/spec/views/users/description/champs/_render_list_champs.html.haml_spec.rb +++ b/spec/views/users/description/champs/_render_list_champs.html.haml_spec.rb @@ -33,7 +33,7 @@ describe 'users/description/champs/render_list_champs.html.haml', type: :view do render 'users/description/champs/render_list_champs.html.haml', champs: Champ.all, order_place: 0 end - it 'should render a number input with the right data-attribute' do + it 'should render the _dossier_link partial' do expect(view).to render_template(partial: 'users/description/champs/_dossier_link', locals: { champ: champ }) end From 2b23d0d087c96b61cfc797d15d38d75f04ca11a9 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Mon, 17 Apr 2017 17:20:32 +0200 Subject: [PATCH 095/102] Add a missing feature test for the linked dossier feature --- spec/factories/dossier.rb | 11 +++++++++++ spec/factories/procedure.rb | 8 ++++++++ spec/factories/type_de_champ_public.rb | 5 +++++ spec/features/users/dossier_edition_spec.rb | 16 +++++++++++----- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/spec/factories/dossier.rb b/spec/factories/dossier.rb index a58e28bb0..415e1d58d 100644 --- a/spec/factories/dossier.rb +++ b/spec/factories/dossier.rb @@ -55,6 +55,17 @@ FactoryGirl.define do archived false end + trait :with_dossier_link do + after(:create) do |dossier, _evaluator| + linked_dossier = create(:dossier) + type_de_champ = dossier.procedure.types_de_champ.find { |t| t.type_champ == 'dossier_link' } + champ = dossier.champs.find { |c| c.type_de_champ == type_de_champ } + + champ.value = linked_dossier.id + champ.save! + end + end + trait :replied do state 'replied' end diff --git a/spec/factories/procedure.rb b/spec/factories/procedure.rb index b8e4d5e15..f38629fc7 100644 --- a/spec/factories/procedure.rb +++ b/spec/factories/procedure.rb @@ -61,6 +61,14 @@ FactoryGirl.define do end end + trait :with_dossier_link do + after(:build) do |procedure, _evaluator| + type_de_champ = create(:type_de_champ_public, :type_dossier_link) + + procedure.types_de_champ << type_de_champ + end + end + trait :with_two_type_de_piece_justificative do after(:build) do |procedure, _evaluator| rib = create(:type_de_piece_justificative, :rib, order_place: 1) diff --git a/spec/factories/type_de_champ_public.rb b/spec/factories/type_de_champ_public.rb index 3dad7603b..b1ef85016 100644 --- a/spec/factories/type_de_champ_public.rb +++ b/spec/factories/type_de_champ_public.rb @@ -9,5 +9,10 @@ FactoryGirl.define do trait :checkbox do type_champ 'checkbox' end + + trait :type_dossier_link do + libelle 'Référence autre dossier' + type_champ 'dossier_link' + end end end diff --git a/spec/features/users/dossier_edition_spec.rb b/spec/features/users/dossier_edition_spec.rb index 13bbf29a0..f82d94032 100644 --- a/spec/features/users/dossier_edition_spec.rb +++ b/spec/features/users/dossier_edition_spec.rb @@ -3,8 +3,8 @@ require 'spec_helper' feature 'As a User I want to edit a dossier I own' do let(:user) { create(:user) } - let(:procedure_for_individual) { create(:procedure, :published, :for_individual, :with_type_de_champ, :with_two_type_de_piece_justificative) } - let!(:dossier) { create(:dossier, :with_entreprise, :for_individual, procedure: procedure_for_individual, user: user, autorisation_donnees: true, state: 'initiated') } + let(:procedure_for_individual) { create(:procedure, :published, :for_individual, :with_type_de_champ, :with_two_type_de_piece_justificative, :with_dossier_link) } + let!(:dossier) { create(:dossier, :with_entreprise, :for_individual, :with_dossier_link, procedure: procedure_for_individual, user: user, autorisation_donnees: true, state: 'initiated') } before "Create dossier and visit root path" do login_as user, scope: :user @@ -23,7 +23,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.last.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), only_path: true) page.find_by_id('open-message').click page.execute_script("$('#texte_commentaire').data('wysihtml5').editor.setValue('Contenu du nouveau message')") @@ -34,12 +34,18 @@ feature 'As a User I want to edit a dossier I own' do scenario 'On the same dossier, I want to edit informations', js: true do 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), only_path: true) + + # Linked Dossier + linked_dossier_id = dossier.champs.find { |c| c.type_de_champ.type_champ == 'dossier_link' }.value + linked_dossier = Dossier.find(linked_dossier_id) + expect(page).to have_content(linked_dossier.procedure.libelle) + page.find_by_id('maj_infos').trigger('click') expect(page).to have_current_path(users_dossier_description_path(dossier.id.to_s), only_path: true) - fill_in "champs_#{dossier.champs.first.id.to_s}", with: 'Contenu du champ 1' + fill_in "champs_#{dossier.champs.order(:id).first.id.to_s}", with: 'Contenu du champ 1' page.find_by_id('modification_terminee').click expect(page).to have_current_path(users_dossier_recapitulatif_path(dossier.id.to_s), only_path: true) - expect(page.find("#champ-#{dossier.champs.first.id}-value").text).to eq('Contenu du champ 1') + expect(page.find("#champ-#{dossier.champs.order(:id).first.id}-value").text).to eq('Contenu du champ 1') end end end From b89e59192c3446acb28ce9036215fe1177dbd5a9 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 26 Apr 2017 11:24:37 +0200 Subject: [PATCH 096/102] Add a missing a test for the dossier link field in the form --- .../description/champs/_dossier_link.html.haml_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/views/users/description/champs/_dossier_link.html.haml_spec.rb b/spec/views/users/description/champs/_dossier_link.html.haml_spec.rb index a61f09532..fc8a79850 100644 --- a/spec/views/users/description/champs/_dossier_link.html.haml_spec.rb +++ b/spec/views/users/description/champs/_dossier_link.html.haml_spec.rb @@ -7,6 +7,14 @@ describe 'users/description/champs/dossier_link.html.haml', type: :view do render 'users/description/champs/dossier_link.html.haml', champ: champ end + context 'in all cases' do + let!(:champ) { create(:champ, type_de_champ: type_champ, value: nil) } + + it 'should render an input for the dossier link' do + expect(rendered).to have_css("input[type=number][placeholder=#{champ.libelle}]") + end + end + context 'When no dossier is provided' do let!(:champ) { create(:champ, type_de_champ: type_champ, value: nil) } From 8deef8e8e31c80d5c5a60eb26347095f6ca8e882 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Mon, 17 Apr 2017 17:15:44 +0200 Subject: [PATCH 097/102] [Fix #137] Change the dossier link placeholder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Otherwise we don’t know what to enter (words, numbers…) --- app/views/users/description/champs/_dossier_link.html.haml | 2 +- .../users/description/champs/_dossier_link.html.haml_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/users/description/champs/_dossier_link.html.haml b/app/views/users/description/champs/_dossier_link.html.haml index d6fc6ff38..f874c7e4a 100644 --- a/app/views/users/description/champs/_dossier_link.html.haml +++ b/app/views/users/description/champs/_dossier_link.html.haml @@ -5,7 +5,7 @@ .dossier-link %input.form-control{ name: "champs['#{ champ.id }']", - placeholder: champ.libelle, + placeholder: "Numéro de dossier", id: "champs_#{ champ.id }", value: champ.value, type: 'number', diff --git a/spec/views/users/description/champs/_dossier_link.html.haml_spec.rb b/spec/views/users/description/champs/_dossier_link.html.haml_spec.rb index fc8a79850..970ab4a43 100644 --- a/spec/views/users/description/champs/_dossier_link.html.haml_spec.rb +++ b/spec/views/users/description/champs/_dossier_link.html.haml_spec.rb @@ -11,7 +11,7 @@ describe 'users/description/champs/dossier_link.html.haml', type: :view do let!(:champ) { create(:champ, type_de_champ: type_champ, value: nil) } it 'should render an input for the dossier link' do - expect(rendered).to have_css("input[type=number][placeholder=#{champ.libelle}]") + expect(rendered).to have_css("input[type=number][placeholder='Numéro de dossier']") end end From 7173d359d467c4d352831a864901414f0ced96eb Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 25 Apr 2017 09:47:13 +0200 Subject: [PATCH 098/102] [Fix #132] Show the dossier link in the dossier detail for Users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There’s no reason why they couldn’t easily navigate to it Also improve the typography of a placeholder message --- app/views/dossiers/_infos_dossier.html.haml | 4 ++-- spec/features/users/dossier_edition_spec.rb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/dossiers/_infos_dossier.html.haml b/app/views/dossiers/_infos_dossier.html.haml index 090873fea..dedbd8acf 100644 --- a/app/views/dossiers/_infos_dossier.html.haml +++ b/app/views/dossiers/_infos_dossier.html.haml @@ -40,10 +40,10 @@ - unless champ.decorate.value.blank? - if champ.type_champ == 'dossier_link' - dossier = Dossier.includes(:procedure).find_by(id: champ.decorate.value) - - if dossier && gestionnaire_signed_in? + - if dossier = link_to(dossier.procedure.libelle, backoffice_dossier_path(champ.decorate.value), target: '_blank') - else - = dossier.nil? ? 'pas de dossier associé' : dossier.procedure.libelle + Pas de dossier associé - else = champ.decorate.value.html_safe diff --git a/spec/features/users/dossier_edition_spec.rb b/spec/features/users/dossier_edition_spec.rb index f82d94032..e66483d67 100644 --- a/spec/features/users/dossier_edition_spec.rb +++ b/spec/features/users/dossier_edition_spec.rb @@ -38,7 +38,7 @@ feature 'As a User I want to edit a dossier I own' do # Linked Dossier linked_dossier_id = dossier.champs.find { |c| c.type_de_champ.type_champ == 'dossier_link' }.value linked_dossier = Dossier.find(linked_dossier_id) - expect(page).to have_content(linked_dossier.procedure.libelle) + expect(page).to have_link(linked_dossier.procedure.libelle) page.find_by_id('maj_infos').trigger('click') expect(page).to have_current_path(users_dossier_description_path(dossier.id.to_s), only_path: true) From f5c5ad532d2380afd19095bcdd1415a9fb7b5e59 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Tue, 18 Apr 2017 17:31:01 +0200 Subject: [PATCH 099/102] Add Dossier#text_summary --- app/models/dossier.rb | 22 ++++++++++++++++++++++ spec/models/dossier_spec.rb | 20 ++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/app/models/dossier.rb b/app/models/dossier.rb index f98e4e4c9..17c7bf03e 100644 --- a/app/models/dossier.rb +++ b/app/models/dossier.rb @@ -278,6 +278,28 @@ class Dossier < ActiveRecord::Base !(procedure.archived && draft?) end + def text_summary + if brouillon? + parts = [ + "Dossier en brouillon répondant à la démarche ", + procedure.libelle, + ", gérée par l'organisme ", + procedure.organisation + ] + else + parts = [ + "Dossier déposé le ", + initiated_at.strftime("%d/%m/%Y"), + ", sur la démarche ", + procedure.libelle, + ", gérée par l'organisme ", + procedure.organisation + ] + end + + parts.join + end + private def update_state_dates diff --git a/spec/models/dossier_spec.rb b/spec/models/dossier_spec.rb index ba1dcef8d..576949f7b 100644 --- a/spec/models/dossier_spec.rb +++ b/spec/models/dossier_spec.rb @@ -809,6 +809,26 @@ describe Dossier do end end + describe "#text_summary" do + let(:procedure) { create(:procedure, libelle: "Démarche", organisation: "Organisation") } + + context 'when the dossier has been initiated' do + let(:dossier) { create :dossier, procedure: procedure, state: 'initiated', initiated_at: "31/12/2010".to_date } + + subject { dossier.text_summary } + + it { is_expected.to eq("Dossier déposé le 31/12/2010, sur la démarche Démarche, gérée par l'organisme Organisation") } + end + + context 'when the dossier has not been initiated' do + let(:dossier) { create :dossier, procedure: procedure, state: 'draft' } + + subject { dossier.text_summary } + + it { is_expected.to eq("Dossier en brouillon répondant à la démarche Démarche, gérée par l'organisme Organisation") } + end + end + describe '#update_state_dates' do let(:state) { 'draft' } let(:dossier) { create(:dossier, state: state) } From a6d3ea8536788953f1e1dedefd6f58d779cd7945 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Thu, 13 Apr 2017 15:47:42 +0200 Subject: [PATCH 100/102] [Fix #133] Improve the linked dossier informations displayed --- app/views/dossiers/_infos_dossier.html.haml | 4 +++- spec/features/users/dossier_edition_spec.rb | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/views/dossiers/_infos_dossier.html.haml b/app/views/dossiers/_infos_dossier.html.haml index dedbd8acf..15a1aa744 100644 --- a/app/views/dossiers/_infos_dossier.html.haml +++ b/app/views/dossiers/_infos_dossier.html.haml @@ -41,7 +41,9 @@ - if champ.type_champ == 'dossier_link' - dossier = Dossier.includes(:procedure).find_by(id: champ.decorate.value) - if dossier - = link_to(dossier.procedure.libelle, backoffice_dossier_path(champ.decorate.value), target: '_blank') + = link_to("Dossier #{dossier.id}", backoffice_dossier_path(champ.decorate.value), target: '_blank') + %br + = dossier.text_summary - else Pas de dossier associé - else diff --git a/spec/features/users/dossier_edition_spec.rb b/spec/features/users/dossier_edition_spec.rb index e66483d67..5aca700d9 100644 --- a/spec/features/users/dossier_edition_spec.rb +++ b/spec/features/users/dossier_edition_spec.rb @@ -37,8 +37,7 @@ feature 'As a User I want to edit a dossier I own' do # Linked Dossier linked_dossier_id = dossier.champs.find { |c| c.type_de_champ.type_champ == 'dossier_link' }.value - linked_dossier = Dossier.find(linked_dossier_id) - expect(page).to have_link(linked_dossier.procedure.libelle) + expect(page).to have_link("Dossier #{linked_dossier_id}") page.find_by_id('maj_infos').trigger('click') expect(page).to have_current_path(users_dossier_description_path(dossier.id.to_s), only_path: true) From f58a6266481d2a2981f33ef74b0ba95bc9f8f949 Mon Sep 17 00:00:00 2001 From: gregoirenovel Date: Wed, 26 Apr 2017 16:15:48 +0200 Subject: [PATCH 101/102] [Fix #99] Improve the info message in _dossier_link.html.haml --- app/assets/javascripts/new-description.js | 4 ++-- app/controllers/users/dossiers_controller.rb | 6 +++--- .../description/champs/_dossier_link.html.haml | 14 ++++++-------- config/routes.rb | 2 +- spec/controllers/users/dossiers_controller_spec.rb | 10 +++++----- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/app/assets/javascripts/new-description.js b/app/assets/javascripts/new-description.js index 6d56fe939..3b32782c4 100644 --- a/app/assets/javascripts/new-description.js +++ b/app/assets/javascripts/new-description.js @@ -5,7 +5,7 @@ }; var showData = function(data) { - $('.dossier-link .procedure-libelle').text(data.procedureLibelle); + $('.dossier-link .dossier-text-summary').text(data.textSummary); $('.dossier-link .text-info').show(); $('.dossier-link .text-warning').hide(); }; @@ -18,7 +18,7 @@ var fetchProcedureLibelle = function(e) { var dossierId = $(e.target).val(); if(dossierId) { - $.get('/users/dossiers/' + dossierId + '/procedure_libelle') + $.get('/users/dossiers/' + dossierId + '/text_summary') .done(showData) .fail(showNotFound); } else { diff --git a/app/controllers/users/dossiers_controller.rb b/app/controllers/users/dossiers_controller.rb index 61bf3a0e7..8f42f2581 100644 --- a/app/controllers/users/dossiers_controller.rb +++ b/app/controllers/users/dossiers_controller.rb @@ -164,9 +164,9 @@ class Users::DossiersController < UsersController redirect_to url_for users_dossiers_path end - def procedure_libelle - dossier = Dossier.includes(:procedure).find(params[:dossier_id]) - render json: { procedureLibelle: dossier.procedure.libelle } + def text_summary + dossier = Dossier.find(params[:dossier_id]) + render json: { textSummary: dossier.text_summary } rescue ActiveRecord::RecordNotFound render json: {}, status: 404 end diff --git a/app/views/users/description/champs/_dossier_link.html.haml b/app/views/users/description/champs/_dossier_link.html.haml index f874c7e4a..c29f2745c 100644 --- a/app/views/users/description/champs/_dossier_link.html.haml +++ b/app/views/users/description/champs/_dossier_link.html.haml @@ -1,7 +1,7 @@ -- dossier = Dossier.includes(:procedure).find_by(id: champ.value) -- show_procedure_libelle = dossier ? true : false -- show_warning = !show_procedure_libelle && champ.value.present? -- procedure_libelle = dossier.nil? ? '' : dossier.procedure.libelle +- dossier = Dossier.find_by(id: champ.value) +- show_text_summary = dossier.present? +- show_warning = !show_text_summary && champ.value.present? +- text_summary = dossier.try(:text_summary) .dossier-link %input.form-control{ name: "champs['#{ champ.id }']", @@ -13,10 +13,8 @@ 'data-type' => 'dossier-link' } .help-block - %p.text-info{ style: show_procedure_libelle ? nil : 'display: none;' } - ce dossier répond à la procédure : - %br - %span.procedure-libelle= procedure_libelle + %p.text-info{ style: show_text_summary ? nil : 'display: none;' } + %span.dossier-text-summary= text_summary %p.text-warning{ style: show_warning ? nil : 'display: none;' } Ce dossier est inconnu diff --git a/config/routes.rb b/config/routes.rb index 6f0d9edad..16b0b090a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -95,7 +95,7 @@ Rails.application.routes.draw do post '/siret_informations' => 'dossiers#siret_informations' put '/change_siret' => 'dossiers#change_siret' - get 'procedure_libelle' => 'dossiers#procedure_libelle' + get 'text_summary' => 'dossiers#text_summary' end resource :dossiers end diff --git a/spec/controllers/users/dossiers_controller_spec.rb b/spec/controllers/users/dossiers_controller_spec.rb index 601b243bc..f479f6eb9 100644 --- a/spec/controllers/users/dossiers_controller_spec.rb +++ b/spec/controllers/users/dossiers_controller_spec.rb @@ -554,27 +554,27 @@ describe Users::DossiersController, type: :controller do end end - describe 'Get #procedure_libelle' do + describe 'Get #text_summary' do let!(:dossier) { create(:dossier, procedure: procedure) } context 'when user is connected' do before { sign_in user } context 'when the dossier exist' do - before { get :procedure_libelle, params: { dossier_id: dossier.id } } + before { get :text_summary, params: { dossier_id: dossier.id } } it 'returns the procedure name' do - expect(JSON.parse(response.body)).to eq('procedureLibelle' => procedure.libelle) + expect(JSON.parse(response.body)).to eq("textSummary" => "Dossier en brouillon répondant à la démarche #{procedure.libelle}, gérée par l'organisme #{procedure.organisation}") end end context 'when the dossier does not exist' do - before { get :procedure_libelle, params: { dossier_id: 666 } } + before { get :text_summary, params: { dossier_id: 666 } } it { expect(response.code).to eq('404') } end end context 'when user is not connected' do - before { get :procedure_libelle, params: { dossier_id: dossier.id } } + before { get :text_summary, params: { dossier_id: dossier.id } } it { expect(response.code).to eq('302') } end end From 6ef6a66c3f9d0dc25f133559c29b3bc5cde0c2cf Mon Sep 17 00:00:00 2001 From: Mathieu Magnin Date: Wed, 26 Apr 2017 11:28:58 +0200 Subject: [PATCH 102/102] Remove @facade_data_view from left_panel view --- app/models/gestionnaire.rb | 4 +++ app/models/notification.rb | 10 +----- app/models/procedure.rb | 3 ++ ...koffice_dossierscontroller_index.html.haml | 34 +++++++++---------- spec/models/gestionnaire_spec.rb | 31 +++++++++++++++++ 5 files changed, 56 insertions(+), 26 deletions(-) diff --git a/app/models/gestionnaire.rb b/app/models/gestionnaire.rb index ada358189..d646d7177 100644 --- a/app/models/gestionnaire.rb +++ b/app/models/gestionnaire.rb @@ -98,6 +98,10 @@ class Gestionnaire < ActiveRecord::Base 0 end + def dossiers_with_notifications_count + notifications.pluck(:dossier_id).uniq.count + end + private def valid_couple_table_attr? table, column diff --git a/app/models/notification.rb b/app/models/notification.rb index 2d93de8b3..af36da06e 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -1,8 +1,5 @@ class Notification < ActiveRecord::Base belongs_to :dossier - - # after_save :broadcast_notification - enum type_notif: { commentaire: 'commentaire', cerfa: 'cerfa', @@ -10,10 +7,5 @@ class Notification < ActiveRecord::Base champs: 'champs', submitted: 'submitted' } - - # def broadcast_notification - # ActionCable.server.broadcast 'notifications', - # message: "Dossier nº #{self.dossier.id} : #{self.liste.last}", - # dossier: {id: self.dossier.id} - # end + scope :unread, -> { where(already_read: false) } end diff --git a/app/models/procedure.rb b/app/models/procedure.rb index 7d3624dca..2e910acd3 100644 --- a/app/models/procedure.rb +++ b/app/models/procedure.rb @@ -3,6 +3,7 @@ class Procedure < ActiveRecord::Base has_many :types_de_champ, class_name: 'TypeDeChampPublic', dependent: :destroy has_many :types_de_champ_private, dependent: :destroy has_many :dossiers + has_many :notifications, through: :dossiers has_one :procedure_path, dependent: :destroy @@ -47,6 +48,8 @@ class Procedure < ActiveRecord::Base end scope :not_archived, -> { where(archived: false) } + scope :by_libelle, -> { order(libelle: :asc) } + def path procedure_path.path unless procedure_path.nil? diff --git a/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml b/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml index c990c6836..5d6e6c9d7 100644 --- a/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml +++ b/app/views/layouts/left_panels/_left_panel_backoffice_dossierscontroller_index.html.haml @@ -1,42 +1,42 @@ -%div#first-block +#first-block .dossiers-en-cours - .count= @facade_data_view.total_dossier_follow + .count= current_gestionnaire.dossiers_follow.count .text SUIVIS .nouveaux-dossiers - .count= @facade_data_view.total_new_dossier + .count= current_gestionnaire.dossiers.nouveaux.count .text NOUVEAUX .nouvelles-notifications - .count= @facade_data_view.dossiers_with_unread_notifications.count + .count= current_gestionnaire.dossiers_with_notifications_count .text MODIFIÉS -%div#action-block +#action-block -%div#menu-block +#menu-block .split-hr-left #switch-buttons #switch-procedures.active Procédures #switch-notifications Notifications -%div#infos-block +#infos-block .split-hr-left #procedure-list - - @facade_data_view.gestionnaire_procedures_name_and_id_list.each do |procedure| - - = link_to backoffice_dossiers_procedure_path(procedure[:id]), { title: procedure[:libelle] } do - .procedure-list-element{ class: ('active' if procedure[:id] == @facade_data_view.procedure.id rescue '') } - = truncate(procedure[:libelle], length: 50) - - total_new = @facade_data_view.new_dossier_number procedure[:id] + - current_gestionnaire.procedures.by_libelle.each do |procedure| + = link_to backoffice_dossiers_procedure_path(procedure.id), { title: procedure.libelle } do + .procedure-list-element{ class: ('active' if procedure.id.to_s == params[:id]) } + = procedure.libelle.truncate(50) + - total_new = procedure.dossiers.nouveaux.count - if total_new > 0 .badge.progress-bar-success{ title: 'Nouveaux dossiers' } = total_new - - if procedure[:unread_notifications] > 0 + - unread_notif_count = procedure.notifications.unread.count + - if unread_notif_count > 0 .badge.progress-bar-warning{ title: 'Notifications' } - = procedure[:unread_notifications] + = unread_notif_count #notifications-list.hidden - - if @facade_data_view.dossiers_with_unread_notifications.empty? + - if current_gestionnaire.notifications.empty? .no-notification Aucune notification pour le moment. - else - - @facade_data_view.dossiers_with_unread_notifications.each do |dossier| + - current_gestionnaire.notifications.includes(:dossier).map(&:dossier).uniq.each do |dossier| = link_to backoffice_dossier_path(dossier.id) do .notification .dossier-index= "Dossier nº #{dossier.id}" diff --git a/spec/models/gestionnaire_spec.rb b/spec/models/gestionnaire_spec.rb index 1d1ed1320..a9c88fa92 100644 --- a/spec/models/gestionnaire_spec.rb +++ b/spec/models/gestionnaire_spec.rb @@ -272,6 +272,37 @@ describe Gestionnaire, type: :model do it { is_expected.to be_nil } end end + end + describe '#dossiers_with_notifications_count' do + subject { gestionnaire.dossiers_with_notifications_count } + + context 'when there is no notifications' do + it { is_expected.to eq(0) } + end + + context 'when there is one notification for one dossier' do + let(:notification){ create(:notification, already_read: false) } + let!(:follow){ create(:follow, dossier: notification.dossier, gestionnaire: gestionnaire) } + + it { is_expected.to eq(1) } + end + + context 'when there are many notifications for one dossier' do + let(:notification){ create(:notification, already_read: false) } + let(:notification2){ create(:notification, already_read: false, dossier: notification.dossier) } + let!(:follow){ create(:follow, dossier: notification.dossier, gestionnaire: gestionnaire) } + + it { is_expected.to eq(1) } + end + + context 'when there are many notifications for many dossiers' do + let(:notification){ create(:notification, already_read: false) } + let(:notification2){ create(:notification, already_read: false) } + let!(:follow){ create(:follow, dossier: notification.dossier, gestionnaire: gestionnaire) } + let!(:follow2){ create(:follow, dossier: notification2.dossier, gestionnaire: gestionnaire) } + + it { is_expected.to eq(2) } + end end end