diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js index cd6e7e2d284eb0ccd0b317aa0bfe03f33c95bad2..78287d1c61c91076bbcd78c89f0ef865eceebd42 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 66678c1d2bf190af84483be6bf38dfea2ef5e3c5..3dba7831cf39d1cacac76563a98d6a3c3f79bcf5 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 a7f67a49f885fdbc97f2e650b618243bfa92464b..b3b6e7fd9f16685f8ff1857e7ef61dbc19268ca1 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 de458497330aadcfbbc1a04829406014cfa99883..47ded2d779c9b8130fc550c697a9ea505cef683a 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 0000000000000000000000000000000000000000..11c7942b9a8f76fcbfd9b758627cdc7b46e88e07 --- /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 b74f00a392a408651b58a48fc7c5814a4de6bc87..ca6f03bb53cd18eed81fd58c44d6a838fef478df 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 cfc7beed1bcac347f7cba46deba5c7f5cd7f4259..3244a9df718c303227d9b636ca2be56d3dcc2faa 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 0000000000000000000000000000000000000000..cd5d4cdcd0ce15d448f8f04b39400932bb185a2f --- /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 0000000000000000000000000000000000000000..687b93f94eb579ba778dca3356e5ca12f336f77d --- /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 44d243513f633d0754e9d00d4f410cea0dd1eb40..f723b913924a2a14c9cf2771cfa51687cccf2385 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 ad237f29afc03f1e3ee2c6f3f27264a08f1a596d..1f95f17b54ce9530400306f9fd256b4b05962706 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 d134fb412b518c612ca6a9b9ac4caa85df34ea5d..c219ff1dcbe58f55120f3277b79d17225e6d7aef 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 905cf1b2eef45cb2310f08f964e68e03a71fe12b..d4f428f03840211099f49c9ea0f84582f857fbdd 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 0afe11214982c354e9716a90f0165f7d3c0b9d73..35be76a1c3a946de043491d4c0da19d25bbac126 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