From 0a3b9400a602a8d15055d8eec2b7398ab5cbaab5 Mon Sep 17 00:00:00 2001
From: Arnaud Levy <contact@arnaudlevy.com>
Date: Wed, 27 Jul 2022 16:05:46 +0200
Subject: [PATCH] Fix #490

---
 .../alumni/experiences_controller.rb          |  3 +-
 app/models/university/person/experience.rb    |  1 +
 .../experiences/_experience_fields.html.erb   | 75 ++++++++++---------
 .../alumni/experiences/edit.html.erb          | 32 ++++----
 .../admin/university/alumni/show.html.erb     | 39 ++++++----
 config/locales/university/en.yml              |  6 +-
 config/locales/university/fr.yml              |  6 +-
 7 files changed, 90 insertions(+), 72 deletions(-)

diff --git a/app/controllers/admin/university/alumni/experiences_controller.rb b/app/controllers/admin/university/alumni/experiences_controller.rb
index 29d1689b0..58c683bac 100644
--- a/app/controllers/admin/university/alumni/experiences_controller.rb
+++ b/app/controllers/admin/university/alumni/experiences_controller.rb
@@ -30,7 +30,8 @@ class Admin::University::Alumni::ExperiencesController < Admin::University::Appl
 
   def experiences_params
     params.require(:university_person)
-          .permit(experiences_attributes: [:id, :organization_id, :university_id, :from_year, :to_year, :_destroy])
+          .permit(experiences_attributes: [:id, :organization_id, :university_id, :description, :from_year, :to_year, :_destroy])
+          .merge(university_id: current_university.id)
   end
 
 end
diff --git a/app/models/university/person/experience.rb b/app/models/university/person/experience.rb
index 3cee8c334..4785cae2f 100644
--- a/app/models/university/person/experience.rb
+++ b/app/models/university/person/experience.rb
@@ -26,6 +26,7 @@
 #
 class University::Person::Experience < ApplicationRecord
   include WithUniversity
+
   belongs_to :person
   belongs_to :organization, class_name: "University::Organization"
 
diff --git a/app/views/admin/university/alumni/experiences/_experience_fields.html.erb b/app/views/admin/university/alumni/experiences/_experience_fields.html.erb
index eb6b7bd84..2b431acba 100644
--- a/app/views/admin/university/alumni/experiences/_experience_fields.html.erb
+++ b/app/views/admin/university/alumni/experiences/_experience_fields.html.erb
@@ -1,44 +1,47 @@
-<% include_id ||= false %>
+<%
+include_id ||= false
+hint = can?(:create, University::Organization) ?  t('university.person.experience.no_organization_hint_html', url: new_admin_university_organization_path) :
+                                                  t('university.person.experience.no_organization_hint_no_access_html')
+%>
 <div class="nested-fields">
   <div class="card mb-3">
     <div class="card-body">
-      <div class="row">
-        <div class="col-md-5">
-          <%= f.input        :university_id,
-                             as: :hidden,
-                             input_html: { value: current_university.id },
-                             wrapper: false %>
-          <%= f.association  :organization,
-                             collection: current_university.organizations.ordered,
-                             label: false,
-                             include_blank: t('simple_form.include_blanks.defaults.organization'),
-                             hint: can?(:create, University::Organization) ? t('university.person.experience.no_organization_hint_html', url: new_admin_university_organization_path) :
-                                                                             t('university.person.experience.no_organization_hint_no_access_html'),
-                             required: true,
-                             wrapper: false %>
+      <div class="d-flex">
+        <div class="row flex-fill">
+          <div class="col-md-6 col-xxl-4">
+            <%= f.input       :university_id, 
+                              as: :hidden, 
+                              input_html: { value: current_university.id },
+                              wrapper: false %>
+            <%= f.association :organization,
+                              collection: current_university.organizations.ordered,
+                              include_blank: t('simple_form.include_blanks.defaults.organization'),
+                              hint: hint,
+                              required: true,
+                              wrapper: false %>
+          </div>
+          <div class="col-md-6 col-xxl-4">
+            <%= f.input :description, as: :string %>
+          </div>
+          <div class="col-md-6 col-xxl-2">
+            <%= f.input       :from_year,
+                              as: :select,
+                              collection: ((Time.now.year).downto(1950)),
+                              include_blank: University::Person::Experience.human_attribute_name('from_year'),
+                              wrapper: false %>
+          </div>
+          <div class="col-md-6 col-xxl-2">
+            <%= f.input       :to_year,
+                              as: :select,
+                              collection: ((Time.now.year).downto(1950)),
+                              include_blank: University::Person::Experience.human_attribute_name('to_year'),
+                              wrapper: false %>
+          </div>
         </div>
-        <div class="col-md-3">
-          <%= f.input        :from_year,
-                             as: :select,
-                             collection: ((Time.now.year).downto(1950)),
-                             label: false,
-                             include_blank: University::Person::Experience.human_attribute_name('from_year'),
-                             required: true,
-                             wrapper: false %>
-        </div>
-        <div class="col-md-3">
-          <%= f.input        :to_year,
-                             as: :select,
-                             collection: ((Time.now.year).downto(1950)),
-                             label: false,
-                             include_blank: University::Person::Experience.human_attribute_name('to_year'),
-                             required: true,
-                             wrapper: false %>
-        </div>
-        <div class="col-md-1 text-end">
+        <div>
           <%= link_to_remove_association '<i class="fas fa-times"></i>'.html_safe,
-                                         f,
-                                         class: 'btn btn-sm btn-danger' %>
+                                        f,
+                                        class: 'btn btn-sm btn-danger' %>
         </div>
       </div>
     </div>
diff --git a/app/views/admin/university/alumni/experiences/edit.html.erb b/app/views/admin/university/alumni/experiences/edit.html.erb
index e21fe1ce8..6e203626c 100644
--- a/app/views/admin/university/alumni/experiences/edit.html.erb
+++ b/app/views/admin/university/alumni/experiences/edit.html.erb
@@ -6,25 +6,21 @@
   <%= f.error_notification %>
   <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
 
-  <div class="row">
-
-    <div class="col-md-2">
-      <%= link_to_add_association t('add'), f, :experiences,
-                                  class: button_classes,
-                                  data: {
-                                    'association-insertion-method': 'append',
-                                    'association-insertion-node':   '#experiences',
-                                  } %>
-
-    </div>
+  <div class="mb-3">
+    <%= link_to_add_association t('add'), 
+                                f, 
+                                :experiences,
+                                class: button_classes,
+                                data: {
+                                  'association-insertion-method': 'append',
+                                  'association-insertion-node':   '#experiences',
+                                } %>
+  </div>
 
-    <div class="col-md-10">
-      <div id="experiences">
-        <%= f.simple_fields_for :experiences, @alumnus.experiences.sort_by(&:from_year).reverse, include_id: false do |experience_f| %>
-          <%= render 'admin/university/alumni/experiences/experience_fields', f: experience_f, include_id: true %>
-        <% end %>
-      </div>
-    </div>
+  <div id="experiences">
+    <%= f.simple_fields_for :experiences, @alumnus.experiences.ordered, include_id: false do |experience_f| %>
+      <%= render 'admin/university/alumni/experiences/experience_fields', f: experience_f, include_id: true %>
+    <% end %>
   </div>
 
   <% content_for :action_bar_right do %>
diff --git a/app/views/admin/university/alumni/show.html.erb b/app/views/admin/university/alumni/show.html.erb
index fe27cf2c6..b87024b41 100644
--- a/app/views/admin/university/alumni/show.html.erb
+++ b/app/views/admin/university/alumni/show.html.erb
@@ -22,23 +22,36 @@
     <div class="card-header">
       <h2 class="card-title mb-0 h5"><%= University::Person::Experience.model_name.human(count: @alumnus.experiences.count) %></h2>
     </div>
-    <div class="card-body">
-      <ul class="list-unstyled">
-      <% @alumnus.experiences.ordered.each do |experience| %>
-        <% organization = experience.organization %>
-        <li>
-          <%= link_to_if can?(:read, organization), organization, [:admin, organization] %>
-          <%= "(#{experience.from_year} - #{experience.to_year.present? ? experience.to_year : t('today')})" if experience.from_year %>
-        </li>
-      <% end %>
-      </ul>
-    </div>
+    <table class="table">
+      <thead>
+        <tr>
+          <th><%= University::Person::Experience.human_attribute_name('description') %></th>
+          <th><%= University::Person::Experience.human_attribute_name('organization') %></th>
+          <th><%= University::Person::Experience.human_attribute_name('from_year') %></th>
+          <th><%= University::Person::Experience.human_attribute_name('to_year') %></th>
+        </tr>
+      </thead>
+      <tbody>
+        <% @alumnus.experiences.ordered.each do |experience| %>
+          <% organization = experience.organization %>
+          <tr>
+            <td><%= experience.description %></td>
+            <td><%= link_to_if can?(:read, organization), organization, [:admin, organization] %></td>
+            <td><%= experience.from_year %></td>
+            <td><%= experience.to_year %></td>
+          </tr>
+        <% end %>
+      </tbody>
+    </table>
   </div>
 <% end %>
 
 
 <% content_for :action_bar_right do %>
   <%= edit_link @alumnus %>
-  <%= link_to t('university.manage_cohorts'), cohorts_admin_university_alumnus_path(@alumnus), class: button_classes if can?(:update, @alumnus) %>
-  <%= link_to t('university.manage_experiences'), experiences_admin_university_alumnus_path(@alumnus), class: button_classes if can?(:update, @alumnus) %>
+  <%= link_to t('university.manage_cohorts'), 
+              cohorts_admin_university_alumnus_path(@alumnus),
+              class: button_classes if can?(:update, @alumnus) %>
+  <%= link_to t('university.manage_experiences'), experiences_admin_university_alumnus_path(@alumnus), 
+              class: button_classes if can?(:update, @alumnus) %>
 <% end %>
diff --git a/config/locales/university/en.yml b/config/locales/university/en.yml
index 9dd425381..5f5cfdffb 100644
--- a/config/locales/university/en.yml
+++ b/config/locales/university/en.yml
@@ -69,6 +69,8 @@ en:
         user: User
         zipcode: Zipcode
       university/person/experience:
+        description: Description
+        organization: Organization
         from_year: Start year
         to_year: End year
       university/person/involvement:
@@ -170,8 +172,8 @@ en:
     person:
       administrator_roles: Administrator roles
       experience:
-        no_organization_hint_html: "If the organization is not in the list,<br>you can <a href=\"%{url}\">create it</a>"
-        no_organization_hint_no_access_html: "If the organization is not in the list,<br>you should ask to create it"
+        no_organization_hint_html: "If the organization is not in the list, you can <a href=\"%{url}\">create it</a>"
+        no_organization_hint_no_access_html: "If the organization is not in the list, you should ask to create it"
         period: Period
     taught_programs: Taught programs
     sso: SSO
diff --git a/config/locales/university/fr.yml b/config/locales/university/fr.yml
index 372231343..e02d65e3a 100644
--- a/config/locales/university/fr.yml
+++ b/config/locales/university/fr.yml
@@ -69,6 +69,8 @@ fr:
         user: Utilisateur
         zipcode: Code postal
       university/person/experience:
+        description: Description
+        organization: Organisation
         from_year: Année de début
         to_year: Année de fin
       university/person/involvement:
@@ -170,8 +172,8 @@ fr:
     person:
       administrator_roles: Rôles administratifs
       experience:
-        no_organization_hint_html: "Si l'entreprise n'apparait pas dans la liste,<br>vous pouvez la <a href=\"%{url}\">créer</a>"
-        no_organization_hint_no_access_html: "Si l'entreprise n'apparait pas dans la liste,<br>il faut demander à la créer"
+        no_organization_hint_html: "Si l'entreprise n'apparait pas dans la liste, vous pouvez la <a href=\"%{url}\">créer</a>"
+        no_organization_hint_no_access_html: "Si l'entreprise n'apparait pas dans la liste, il faut demander à la créer"
         period: Période
       taught_programs: Formations enseignées
     sso: SSO
-- 
GitLab