From c33e2e04df39898b74009a53968e26f75c4ce0bf Mon Sep 17 00:00:00 2001
From: pabois <pierreandre.boissinot@noesya.coop>
Date: Thu, 9 Mar 2023 17:59:19 +0100
Subject: [PATCH] wip organizations

---
 .../javascripts/extranet/experiences.js       | 26 ++++++++++++++++++-
 .../alumni/organizations_controller.rb        |  7 -----
 .../extranet/application_controller.rb        | 19 +++++++++++++-
 .../extranet/experiences_controller.rb        |  2 +-
 .../extranet/organizations_controller.rb      | 11 ++++++++
 app/models/university/person/experience.rb    | 11 --------
 app/views/extranet/experiences/_form.html.erb | 12 ++++++---
 .../organizations/search.json.jbuilder        |  0
 config/locales/extranet/en.yml                |  6 +++--
 config/locales/extranet/fr.yml                |  6 +++--
 config/routes/extranet.rb                     | 10 ++++---
 11 files changed, 79 insertions(+), 31 deletions(-)
 create mode 100644 app/controllers/extranet/organizations_controller.rb
 rename app/views/extranet/{alumni => }/organizations/search.json.jbuilder (100%)

diff --git a/app/assets/javascripts/extranet/experiences.js b/app/assets/javascripts/extranet/experiences.js
index f00ced3d8..4246230c0 100644
--- a/app/assets/javascripts/extranet/experiences.js
+++ b/app/assets/javascripts/extranet/experiences.js
@@ -1,18 +1,42 @@
 /*global $ */
 $(function () {
     'use strict';
-    var setAutocompleteTargetValue = function (targetId, value) {
+    var setAutocompleteTargetValue,
+        setAutocompleteNothingFound;
+
+    setAutocompleteTargetValue = function (targetId, value) {
         var targetInput = document.querySelector(targetId);
         if (targetInput) {
             targetInput.value = value;
         }
     };
 
+    setAutocompleteNothingFound = function (target, search) {
+        var defaultText,
+            text;
+        if (target) {
+            defaultText = target.dataset.defaultText;
+            text = defaultText.replaceAll('CHANGEME', search);
+            target.innerHTML = text;
+            target.classList.remove('d-none');
+        }
+    };
+
     $('input.autocomplete')
         .on('input', function ($event) {
             setAutocompleteTargetValue($event.target.dataset.autocompleteTarget, '');
         })
         .on('railsAutocomplete.select', function ($event, data) {
+            var noResultTarget = document.querySelector($event.target.dataset.autocompleteNoResultTarget);
             setAutocompleteTargetValue($event.target.dataset.autocompleteTarget, data.item.id);
+            noResultTarget.classList.add('d-none');
+        })
+        .on('railsAutocomplete.source', function ($event, data) {
+            var noResultTarget = document.querySelector($event.target.dataset.autocompleteNoResultTarget);
+            if (data.length === 0) {
+                setAutocompleteNothingFound(noResultTarget, $event.target.value);
+            } else {
+                noResultTarget.classList.add('d-none');
+            }
         });
 });
diff --git a/app/controllers/extranet/alumni/organizations_controller.rb b/app/controllers/extranet/alumni/organizations_controller.rb
index 2d75beb4b..69c516df4 100644
--- a/app/controllers/extranet/alumni/organizations_controller.rb
+++ b/app/controllers/extranet/alumni/organizations_controller.rb
@@ -12,13 +12,6 @@ class Extranet::Alumni::OrganizationsController < Extranet::Alumni::ApplicationC
     breadcrumb
   end
 
-  def search
-    @term = params[:term].to_s
-    @organizations = current_university.organizations
-                                      .search_by_siren_or_name(@term)
-                                      .ordered
-  end
-
   def show
     @organization = about.university_person_alumni_organizations.find(params[:id])
     breadcrumb
diff --git a/app/controllers/extranet/application_controller.rb b/app/controllers/extranet/application_controller.rb
index a4a673122..e0b98e084 100644
--- a/app/controllers/extranet/application_controller.rb
+++ b/app/controllers/extranet/application_controller.rb
@@ -19,6 +19,23 @@ class Extranet::ApplicationController < ApplicationController
   end
 
   def authorize_extranet_access!
-    raise CanCan::AccessDenied if current_user.visitor? && about.alumni.find_by(id: current_user.person&.id).nil?
+    raise CanCan::AccessDenied unless user_is_authorized?
   end
+
+  def user_is_authorized?
+    user_is_more_than_visitor || user_is_alumnus || user_is_contact
+  end
+
+  def user_is_more_than_visitor
+    !current_user.visitor?
+  end
+
+  def user_is_alumnus
+    about.alumni.find_by(id: current_user.person&.id).present?
+  end
+
+  def user_is_contact
+    current_extranet.connected_persons.find_by(id: current_user.person&.id).present?
+  end
+
 end
diff --git a/app/controllers/extranet/experiences_controller.rb b/app/controllers/extranet/experiences_controller.rb
index 2697cc7f8..b67c95676 100644
--- a/app/controllers/extranet/experiences_controller.rb
+++ b/app/controllers/extranet/experiences_controller.rb
@@ -42,4 +42,4 @@ class Extranet::ExperiencesController < Extranet::ApplicationController
     add_breadcrumb t('extranet.account.my'), account_path
     add_breadcrumb @experience
   end
-end
\ No newline at end of file
+end
diff --git a/app/controllers/extranet/organizations_controller.rb b/app/controllers/extranet/organizations_controller.rb
new file mode 100644
index 000000000..a4db07abd
--- /dev/null
+++ b/app/controllers/extranet/organizations_controller.rb
@@ -0,0 +1,11 @@
+class Extranet::OrganizationsController < Extranet::ApplicationController
+
+  def search
+    @term = params[:term].to_s
+    @organizations = current_university.organizations
+                                      .search_by_siren_or_name(@term)
+                                      .ordered
+  end
+
+
+end
diff --git a/app/models/university/person/experience.rb b/app/models/university/person/experience.rb
index 60c2a4363..0c5359e9e 100644
--- a/app/models/university/person/experience.rb
+++ b/app/models/university/person/experience.rb
@@ -39,8 +39,6 @@ class University::Person::Experience < ApplicationRecord
   # validates_numericality_of :to_year, { greater_than_or_equal_to: :from_year }, allow_nil: true
   validate :to_year, :not_before_from_year
 
-  before_validation :create_organization_if_needed
-
   scope :ordered, -> { order('university_person_experiences.to_year DESC NULLS FIRST, university_person_experiences.from_year') }
   scope :recent, -> {
     where.not(from_year: nil)
@@ -65,13 +63,4 @@ class University::Person::Experience < ApplicationRecord
     end
   end
 
-  def create_organization_if_needed
-    if organization.nil? && organization_name.present?
-      self.organization_name = self.organization_name.strip
-      orga = university.organizations.find_by("name ILIKE ?", organization_name)
-      orga ||= university.organizations.find_by(siren: organization_name)
-      orga ||= university.organizations.create(name: organization_name, created_from_extranet: true)
-      self.organization = orga if orga.persisted?
-    end
-  end
 end
diff --git a/app/views/extranet/experiences/_form.html.erb b/app/views/extranet/experiences/_form.html.erb
index 5ff1f5470..715c58ec7 100644
--- a/app/views/extranet/experiences/_form.html.erb
+++ b/app/views/extranet/experiences/_form.html.erb
@@ -26,18 +26,24 @@
       <%= f.input :organization_name,
                   label: University::Organization.model_name.human,
                   as: :autocomplete,
-                  url: alumni_search_university_organizations_path,
+                  url: search_organizations_path,
                   placeholder: t("extranet.experiences.search_organization"),
                   input_html: {
                     data: {
                       "showNoMatches": "false",
-                      "autocomplete-target": "#university_person_experience_organization_id"
+                      "autocomplete-target": "#university_person_experience_organization_id",
+                      "autocomplete-no-result-target": "#university_person_experience_organization_not_found"
                     },
                     autocomplete: 'off',
                     role: 'presentation'
                   } %>
       <%= f.hidden_field :organization_id %>
+      <div class="<%= 'd-none' unless experience.organization_id.nil? && experience.organization_name.present? %>" id="university_person_experience_organization_not_found" data-default-text="<%= t('extranet.account.experiences.create_new_html', name: 'CHANGEME', url: new_organization_path(name: 'CHANGEME')) %>">
+        <% if experience.organization_id.nil? && experience.organization_name.present? %>
+          <%= t('extranet.account.experiences.create_new_html', name: experience.organization_name, url: new_organization_path(name: experience.organization_name)) %>
+        <% end %>
+      </div>
     </div>
   </div>
   <%= submit f %>
-<% end %>
\ No newline at end of file
+<% end %>
diff --git a/app/views/extranet/alumni/organizations/search.json.jbuilder b/app/views/extranet/organizations/search.json.jbuilder
similarity index 100%
rename from app/views/extranet/alumni/organizations/search.json.jbuilder
rename to app/views/extranet/organizations/search.json.jbuilder
diff --git a/config/locales/extranet/en.yml b/config/locales/extranet/en.yml
index fb877a0b8..5d3698137 100644
--- a/config/locales/extranet/en.yml
+++ b/config/locales/extranet/en.yml
@@ -2,9 +2,11 @@ en:
   extranet:
     features: Features
     account:
-      my: My account
       edit: Edit account
       edit_personal_data: Edit profile
+      experiences:
+        create_new_html: The organization *** doesn't exist, do you want to <a class='btn btn-primary' href='%{url}'>create it</a>?
+      my: My account
       updated: Updated
       logout: Log out
     contacts:
@@ -38,4 +40,4 @@ en:
       updated: Your personal data has been updated!
     posts:
       home: Recent posts
-      read_post: Read post
\ No newline at end of file
+      read_post: Read post
diff --git a/config/locales/extranet/fr.yml b/config/locales/extranet/fr.yml
index 87fcc92b5..a175d7341 100644
--- a/config/locales/extranet/fr.yml
+++ b/config/locales/extranet/fr.yml
@@ -2,9 +2,11 @@ fr:
   extranet:
     features: Fonctionnalités
     account:
-      my: Mon compte
       edit: Modifier mon compte
       edit_personal_data: Modifier mon profil
+      experiences:
+        create_new_html: L'organisation <b>%{name}</b> n'existe pas, souhaitez-vous <a class='btn btn-primary' href='%{url}'>la créer</a> ?
+      my: Mon compte
       updated: Mise à jour effectuée
       logout: Déconnexion
     contacts:
@@ -38,4 +40,4 @@ fr:
       updated: Mise à jour des donnes personnelles effectuée !
     posts:
       home: Actualités récentes
-      read_post: Lire l'article
\ No newline at end of file
+      read_post: Lire l'article
diff --git a/config/routes/extranet.rb b/config/routes/extranet.rb
index 33ef5dcb5..b7e93fbf1 100644
--- a/config/routes/extranet.rb
+++ b/config/routes/extranet.rb
@@ -7,18 +7,22 @@ namespace :contacts do
   get 'search' => 'search#index', as: :search
   root to: 'persons#index'
 end
-namespace :alumni do 
+namespace :alumni do
   get 'cohorts' => 'cohorts#index', as: :education_cohorts
   get 'cohorts/:id' => 'cohorts#show', as: :education_cohort
   get 'organizations' => 'organizations#index', as: :university_organizations
-  get 'organizations/search' => 'organizations#search', as: :search_university_organizations, defaults: { format: 'json' }
-  get 'organizations/:id' => 'organizations#show', as: :university_organization
+  get 'organization/:id' => 'organizations#show', as: :university_organization
   get 'persons' => 'persons#index', as: :university_persons
   get 'persons/:id' => 'persons#show', as: :university_person
   get 'years' => 'academic_years#index', as: :education_academic_years
   get 'years/:id' => 'academic_years#show', as: :education_academic_year
   root to: 'persons#index'
 end
+resources :organizations, except: :destroy do
+  collection do
+    get 'search' => 'organizations#search', as: :search, defaults: { format: 'json' }
+  end
+end
 namespace :posts do
   get ':slug' => 'posts#show', as: :communication_extranet_post
   root to: 'posts#index'
-- 
GitLab