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