From 7edbd4a422ec6cf1577acd9f3968cbd4574b1e93 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Gaya?= <sebastien.gaya@gmail.com>
Date: Thu, 20 Oct 2022 17:41:57 +0200
Subject: [PATCH] personal data

---
 app/assets/javascripts/admin.js               |  1 +
 app/assets/javascripts/application.js         |  2 +
 .../plugins/summernote-paste.js               |  0
 .../plugins/summernote.js                     |  0
 app/assets/stylesheets/extranet.sass          |  3 +
 .../extranet/account_controller.rb            |  2 +-
 .../extranet/personal_data_controller.rb      | 40 ++++++++++++
 app/models/university/person.rb               |  5 ++
 .../admin/university/people/_form.html.erb    |  1 -
 .../extranet/personal_data/edit.html.erb      | 63 +++++++++++++++++++
 .../extranet/personal_data/show.html.erb      | 56 +++++++++++++++++
 config/locales/extranet/en.yml                |  4 ++
 config/locales/extranet/fr.yml                |  4 ++
 config/navigation.rb                          |  3 +
 config/routes/extranet.rb                     |  9 ++-
 db/schema.rb                                  |  2 +-
 16 files changed, 189 insertions(+), 6 deletions(-)
 rename app/assets/javascripts/{admin => application}/plugins/summernote-paste.js (100%)
 rename app/assets/javascripts/{admin => application}/plugins/summernote.js (100%)
 create mode 100644 app/controllers/extranet/personal_data_controller.rb
 create mode 100644 app/views/extranet/personal_data/edit.html.erb
 create mode 100644 app/views/extranet/personal_data/show.html.erb

diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js
index cd6e7e2d2..78287d1c6 100644
--- a/app/assets/javascripts/admin.js
+++ b/app/assets/javascripts/admin.js
@@ -14,6 +14,7 @@
 //= require cocoon
 //= require_self
 //= require_tree ./admin/commons
+//= require_tree ./application/plugins
 //= require_tree ./admin/plugins
 //= require ./admin/communication/init
 
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 66678c1d2..3dba7831c 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -7,7 +7,9 @@
 //= require jquery-cropper/dist/jquery-cropper
 //= require simple_form_password_with_hints
 //= require simple_form_bs5_file_input
+//= require summernote/summernote-bs5
 //= require gdpr/cookie_consent
+//= require_tree ./application/plugins
 //= require_self
 
 window.osuny = {};
diff --git a/app/assets/javascripts/admin/plugins/summernote-paste.js b/app/assets/javascripts/application/plugins/summernote-paste.js
similarity index 100%
rename from app/assets/javascripts/admin/plugins/summernote-paste.js
rename to app/assets/javascripts/application/plugins/summernote-paste.js
diff --git a/app/assets/javascripts/admin/plugins/summernote.js b/app/assets/javascripts/application/plugins/summernote.js
similarity index 100%
rename from app/assets/javascripts/admin/plugins/summernote.js
rename to app/assets/javascripts/application/plugins/summernote.js
diff --git a/app/assets/stylesheets/extranet.sass b/app/assets/stylesheets/extranet.sass
index a7f67a49f..b3b6e7fd9 100644
--- a/app/assets/stylesheets/extranet.sass
+++ b/app/assets/stylesheets/extranet.sass
@@ -8,6 +8,7 @@
 @import 'bootstrap-print-css/css/bootstrap-print.min'
 @import 'simple_form_password_with_hints'
 @import 'simple_form_bs5_file_input'
+@import 'summernote-bs5'
 @import 'gdpr/cookie_consent'
 @import 'cropperjs/dist/cropper'
 
@@ -17,3 +18,5 @@
 @import 'extranet/_default/layouts/*'
 @import 'extranet/_default/components/*'
 @import 'extranet/_default/pages/*'
+
+@import 'commons/summernote'
diff --git a/app/controllers/extranet/account_controller.rb b/app/controllers/extranet/account_controller.rb
index de4584973..47ded2d77 100644
--- a/app/controllers/extranet/account_controller.rb
+++ b/app/controllers/extranet/account_controller.rb
@@ -4,7 +4,7 @@ class Extranet::AccountController < Extranet::ApplicationController
     @person = current_user.person
     breadcrumb
   end
-  
+
   def edit
     breadcrumb
     add_breadcrumb t('extranet.account.edit')
diff --git a/app/controllers/extranet/personal_data_controller.rb b/app/controllers/extranet/personal_data_controller.rb
new file mode 100644
index 000000000..11c7942b9
--- /dev/null
+++ b/app/controllers/extranet/personal_data_controller.rb
@@ -0,0 +1,40 @@
+class Extranet::PersonalDataController < Extranet::ApplicationController
+  before_action :load_person
+
+  def show
+    # Superadmins don't have a person
+    breadcrumb
+  end
+
+  def edit
+    breadcrumb
+    add_breadcrumb t('extranet.personal_data.edit')
+  end
+
+  def update
+    @person.update person_params
+    redirect_to personal_data_path, notice: t('extranet.personal_data.updated')
+  end
+
+  private
+
+  def load_person
+    @person = current_user.person
+    raise CanCan::AccessDenied if @person.nil?
+  end
+
+  def person_params
+    params.require(:university_person)
+          .permit(
+            :gender, :birthdate, :description_short, :biography,
+            :phone_mobile, :phone_professional, :phone_personal,
+            :address, :zipcode, :city, :country,
+            :url, :linkedin, :twitter
+          )
+  end
+
+  def breadcrumb
+    super
+    add_breadcrumb t('extranet.personal_data.title'), personal_data_path
+  end
+end
diff --git a/app/models/university/person.rb b/app/models/university/person.rb
index b74f00a39..ca6f03bb5 100644
--- a/app/models/university/person.rb
+++ b/app/models/university/person.rb
@@ -213,6 +213,11 @@ class University::Person < ApplicationRecord
     teacher.for_website?(website)
   end
 
+  def full_street_address
+    return nil if [address, zipcode, city].all?(&:blank?)
+    [address, "#{zipcode} #{city} #{country}".strip].join(', ')
+  end
+
   protected
 
   def explicit_blob_ids
diff --git a/app/views/admin/university/people/_form.html.erb b/app/views/admin/university/people/_form.html.erb
index cfc7beed1..3244a9df7 100644
--- a/app/views/admin/university/people/_form.html.erb
+++ b/app/views/admin/university/people/_form.html.erb
@@ -38,7 +38,6 @@
           </h5>
         </div>
         <div class="card-body">
-
           <div class="row">
             <div class="col-md-6">
               <%= f.input :email %>
diff --git a/app/views/extranet/personal_data/edit.html.erb b/app/views/extranet/personal_data/edit.html.erb
new file mode 100644
index 000000000..cd5d4cdcd
--- /dev/null
+++ b/app/views/extranet/personal_data/edit.html.erb
@@ -0,0 +1,63 @@
+<% content_for :title, @person %>
+
+<%= simple_form_for @person, url: personal_data_path do |f| %>
+  <%= f.error_notification %>
+  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
+
+  <h5><%= University::Person.human_attribute_name('essentials') %></h5>
+
+  <div class="row">
+    <div class="col-md-6">
+      <%= f.input :gender, label_method: lambda { |g| t("activerecord.attributes.university/person.genders.#{g[1]}") } %>
+    </div>
+    <div class="col-md-6">
+      <%= f.input :birthdate, discard_year: true, include_blank: true %>
+    </div>
+  </div>
+  <%= f.input :description_short %>
+  <%= f.input :biography, as: :summernote %>
+
+  <h5><%= University::Person.human_attribute_name('contacts') %></h5>
+
+  <div class="row">
+    <div class="col-md-4">
+      <%= f.input :phone_mobile %>
+    </div>
+    <div class="col-md-4">
+      <%= f.input :phone_professional %>
+    </div>
+    <div class="col-md-4">
+      <%= f.input :phone_personal %>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-6">
+      <%= f.input :address %>
+    </div>
+    <div class="col-md-6">
+      <%= f.input :zipcode %>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-6">
+      <%= f.input :city %>
+    </div>
+    <div class="col-md-6">
+      <%= f.input :country, input_html: { class: 'form-select' } %>
+    </div>
+  </div>
+
+  <h5><%= University::Person.human_attribute_name('socials') %></h5>
+
+  <%= f.input :url %>
+  <div class="row">
+    <div class="col-md-6">
+      <%= f.input :linkedin %>
+    </div>
+    <div class="col-md-6">
+      <%= f.input :twitter %>
+    </div>
+  </div>
+
+  <%= submit f %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/extranet/personal_data/show.html.erb b/app/views/extranet/personal_data/show.html.erb
new file mode 100644
index 000000000..687b93f94
--- /dev/null
+++ b/app/views/extranet/personal_data/show.html.erb
@@ -0,0 +1,56 @@
+<% content_for :title, @person %>
+
+<%= render 'extranet/persons/header', person: @person unless @person.nil? %>
+
+<div class="row">
+  <div class="col-md-9">
+    <div class="biography">
+      <p><%= @person&.biography %></p>
+
+      <h5><%= University::Person.human_attribute_name('contacts') %></h5>
+
+      <% [:phone_mobile, :phone_personal, :phone_professional].each do |attribute_name| %>
+        <% next if @person.public_send(attribute_name).blank? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name(attribute_name) %> :</strong>
+          <%= @person.public_send(attribute_name) %>
+        </p>
+      <% end %>
+
+      <% if @person.full_street_address.present? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name("address") %> :</strong>
+          <%= @person.full_street_address %>
+        </p>
+      <% end %>
+
+      <h5><%= University::Person.human_attribute_name('socials') %></h5>
+
+      <% if @person.url.present? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name("url") %> :</strong>
+          <%= link_to @person.url, @person.url %>
+        </p>
+      <% end %>
+
+      <% if @person.linkedin.present? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name("linkedin") %> :</strong>
+          <%= link_to @person.linkedin, @person.linkedin %>
+        </p>
+      <% end %>
+
+      <% if @person.twitter.present? %>
+        <p>
+          <strong><%= University::Person.human_attribute_name("twitter") %> :</strong>
+            <%= link_to @person.twitter, "https://twitter.com/#{@person.twitter}" %>
+        </p>
+      <% end %>
+    </div>
+  </div>
+  <div class="col-md-3">
+    <div class="mb-4">
+      <%= link_to t('extranet.personal_data.edit'), edit_personal_data_path, class: 'btn btn-primary' %>
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/config/locales/extranet/en.yml b/config/locales/extranet/en.yml
index 44d243513..f723b9139 100644
--- a/config/locales/extranet/en.yml
+++ b/config/locales/extranet/en.yml
@@ -17,3 +17,7 @@ en:
     menu: Menu
     organization:
       experiences: Alumni in this organization (%{count})
+    personal_data:
+      edit: Edit
+      title: My personal data
+      updated: Your personal data has been updated!
diff --git a/config/locales/extranet/fr.yml b/config/locales/extranet/fr.yml
index ad237f29a..1f95f17b5 100644
--- a/config/locales/extranet/fr.yml
+++ b/config/locales/extranet/fr.yml
@@ -17,3 +17,7 @@ fr:
     menu: Menu
     organization:
       experiences: Alumni dans cette organisation (%{count})
+    personal_data:
+      edit: Modifier
+      title: Mes données personnelles
+      updated: Mise à jour des donnes personnelles effectuée !
diff --git a/config/navigation.rb b/config/navigation.rb
index d134fb412..c219ff1dc 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -16,6 +16,9 @@ SimpleNavigation::Configuration.run do |navigation|
     primary.item  :organizations,
                   University::Organization.model_name.human(count: 2),
                   university_organizations_path
+    primary.item  :personal_data,
+                  t('extranet.personal_data.title'),
+                  personal_data_path
     primary.item  :account,
                   t('extranet.account.my'),
                   account_path
diff --git a/config/routes/extranet.rb b/config/routes/extranet.rb
index 905cf1b2e..d4f428f03 100644
--- a/config/routes/extranet.rb
+++ b/config/routes/extranet.rb
@@ -6,10 +6,13 @@ get 'persons' => 'extranet/persons#index', as: :university_persons
 get 'persons/:id' => 'extranet/persons#show', as: :university_person
 get 'years' => 'extranet/academic_years#index', as: :education_academic_years
 get 'years/:id' => 'extranet/academic_years#show', as: :education_academic_year
-get 'account' => 'extranet/account#show', as: :account 
-get 'account/edit' => 'extranet/account#edit', as: :edit_account 
+get 'account' => 'extranet/account#show', as: :account
+get 'account/edit' => 'extranet/account#edit', as: :edit_account
 patch 'account' => 'extranet/account#update'
-scope :account do 
+scope :account do
   resources :experiences, controller: 'extranet/experiences', except: [:index, :show]
 end
+get 'personal_data' => 'extranet/personal_data#show', as: :personal_data
+get 'personal_data/edit' => 'extranet/personal_data#edit', as: :edit_personal_data
+patch 'personal_data' => 'extranet/personal_data#update'
 root to: 'extranet/home#index'
diff --git a/db/schema.rb b/db/schema.rb
index 0afe11214..35be76a1c 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -44,7 +44,7 @@ ActiveRecord::Schema.define(version: 2022_10_20_141837) do
     t.text "metadata"
     t.string "service_name", null: false
     t.bigint "byte_size", null: false
-    t.string "checksum", null: false
+    t.string "checksum"
     t.datetime "created_at", null: false
     t.uuid "university_id"
     t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
-- 
GitLab