From 3ff0c83485e30763f312c4ac73a51c3ed0ac3dbf Mon Sep 17 00:00:00 2001 From: Nicolas Bouilleaud Date: Fri, 12 Apr 2019 10:43:51 +0200 Subject: [PATCH] Add multi-admin UI refs #1626 --- .../procedure_administrateurs_controller.rb | 47 +++++++++++++++++++ .../_administrateur.html.haml | 13 +++++ .../procedure_administrateurs/create.js.haml | 6 +++ .../procedure_administrateurs/destroy.js.haml | 4 ++ .../procedure_administrateurs/index.html.haml | 26 ++++++++++ config/routes.rb | 2 + 6 files changed, 98 insertions(+) create mode 100644 app/controllers/new_administrateur/procedure_administrateurs_controller.rb create mode 100644 app/views/new_administrateur/procedure_administrateurs/_administrateur.html.haml create mode 100644 app/views/new_administrateur/procedure_administrateurs/create.js.haml create mode 100644 app/views/new_administrateur/procedure_administrateurs/destroy.js.haml create mode 100644 app/views/new_administrateur/procedure_administrateurs/index.html.haml diff --git a/app/controllers/new_administrateur/procedure_administrateurs_controller.rb b/app/controllers/new_administrateur/procedure_administrateurs_controller.rb new file mode 100644 index 000000000..c853afab6 --- /dev/null +++ b/app/controllers/new_administrateur/procedure_administrateurs_controller.rb @@ -0,0 +1,47 @@ +module NewAdministrateur + class ProcedureAdministrateursController < AdministrateurController + before_action :retrieve_procedure + before_action :procedure_locked? + + def index + end + + def create + email = params.require(:administrateur)[:email]&.strip&.downcase + + # Find the admin + administrateur = Administrateur.find_by(email: email) + if administrateur.nil? + flash.alert = "L’administrateur « #{email} » n’existe pas. Invitez-le à demander un compte administrateur à l’addresse #{new_demande_url}." + return + end + + # Prevent duplicates (also enforced in the database in administrateurs_procedures) + if @procedure.administrateurs.include?(administrateur) + flash.alert = "L’administrateur « #{administrateur.email} » est déjà administrateur de « #{@procedure.libelle} »." + return + end + + # Actually add the admin + @procedure.administrateurs << administrateur + @administrateur = administrateur + flash.notice = "L’administrateur « #{administrateur.email} » a été ajouté à la démarche « #{@procedure.libelle} »." + end + + def destroy + administrateur = @procedure.administrateurs.find(params[:id]) + + # Prevent self-removal (Also enforced in the UI) + if administrateur == current_administrateur + flash.error = "Vous ne pouvez pas vous retirez vous-même d’une procédure." + end + + # Actually remove the admin + @procedure.administrateurs.delete(administrateur) + @administrateur = administrateur + flash.notice = "L’administrateur \« #{administrateur.email} » a été retiré de la démarche « #{@procedure.libelle} »." + rescue ActiveRecord::ActiveRecordError => e + flash.alert = e.message + end + end +end diff --git a/app/views/new_administrateur/procedure_administrateurs/_administrateur.html.haml b/app/views/new_administrateur/procedure_administrateurs/_administrateur.html.haml new file mode 100644 index 000000000..65354f432 --- /dev/null +++ b/app/views/new_administrateur/procedure_administrateurs/_administrateur.html.haml @@ -0,0 +1,13 @@ +%tr{ id: "procedure-#{@procedure.id}-administrateur-#{administrateur.id}" } + %td= administrateur.email + %td= administrateur.created_at.strftime('%d/%m/%Y %H:%M') + %td= administrateur.registration_state + %td + - if administrateur == current_administrateur + C’est vous ! + - else + = link_to 'Retirer', + [@procedure, administrateur], + method: :delete, + 'data-confirm': "Retirer « #{administrateur.email} » des administrateurs de « #{@procedure.libelle} » ?", + remote: true diff --git a/app/views/new_administrateur/procedure_administrateurs/create.js.haml b/app/views/new_administrateur/procedure_administrateurs/create.js.haml new file mode 100644 index 000000000..9e4ff843c --- /dev/null +++ b/app/views/new_administrateur/procedure_administrateurs/create.js.haml @@ -0,0 +1,6 @@ += render_flash(sticky: true) +- if @administrateur + = append_to_element("#procedure-#{@procedure.id}-administrateurs", + partial: 'administrateur', + locals: { administrateur: @administrateur }) + document.getElementById('procedure-#{@procedure.id}-new_administrateur').reset() diff --git a/app/views/new_administrateur/procedure_administrateurs/destroy.js.haml b/app/views/new_administrateur/procedure_administrateurs/destroy.js.haml new file mode 100644 index 000000000..b56486490 --- /dev/null +++ b/app/views/new_administrateur/procedure_administrateurs/destroy.js.haml @@ -0,0 +1,4 @@ += render_flash(sticky: true) +- if @administrateur + = remove_element("#procedure-#{@procedure.id}-administrateur-#{@administrateur.id}") + diff --git a/app/views/new_administrateur/procedure_administrateurs/index.html.haml b/app/views/new_administrateur/procedure_administrateurs/index.html.haml new file mode 100644 index 000000000..ca33a48a1 --- /dev/null +++ b/app/views/new_administrateur/procedure_administrateurs/index.html.haml @@ -0,0 +1,26 @@ += render partial: 'new_administrateur/breadcrumbs', + locals: { steps: [link_to('Démarches', admin_procedures_path), + link_to(@procedure.libelle, admin_procedure_path(@procedure)), + 'Administrateurs'], preview: false } + +.container + %h1 Administrateurs de « #{@procedure.libelle} » + %table.table + %thead + %th= 'Adresse email' + %th= 'Enregistré le' + %th= 'État' + %tbody{ id: "procedure-#{@procedure.id}-administrateurs" } + = render partial: 'administrateur', collection: @procedure.administrateurs.order(:email) + %tfoot + %tr + %th{ colspan: 4 } + = form_for @procedure.administrateurs.new, + url: { controller: 'procedure_administrateurs' }, + html: { class: 'form', id: "procedure-#{@procedure.id}-new_administrateur" } , + remote: true do |f| + = f.label :email do + Ajouter un administrateur + %span.notice= "Renseigner l’email d’un administrateur déjà enregistré sur demarches-simplifiees.fr pour lui permettre de modifier « #{@procedure.libelle} »." + = f.email_field :email, placeholder: 'marie.dupont@exemple.fr', required: true + = f.submit 'Ajouter', class: 'button send' diff --git a/config/routes.rb b/config/routes.rb index 33493af6c..3d2d7382b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -374,6 +374,8 @@ Rails.application.routes.draw do get 'annotations' end + resources :administrateurs, controller: 'procedure_administrateurs', only: [:index, :create, :destroy] + resources :types_de_champ, only: [:create, :update, :destroy] do member do patch :move