diff --git a/app/assets/javascripts/admin/communication/init.js b/app/assets/javascripts/admin/communication/init.js index f584e2b9ca3af3d8b2c1467928f860587797b54c..965aba4c32f01247ac782f09728b7a16c89a92a3 100644 --- a/app/assets/javascripts/admin/communication/init.js +++ b/app/assets/javascripts/admin/communication/init.js @@ -1,5 +1,6 @@ //= require_self //= require ./menu_items +//= require ./posts //= require ./websites window.osuny.communication = {}; diff --git a/app/assets/javascripts/admin/communication/posts.js b/app/assets/javascripts/admin/communication/posts.js new file mode 100644 index 0000000000000000000000000000000000000000..0077d825d72e8b27409f187b639aa5fcd13d8c63 --- /dev/null +++ b/app/assets/javascripts/admin/communication/posts.js @@ -0,0 +1,59 @@ +window.osuny.communication.posts = { + init: function () { + 'use strict'; + var i; + + this.fieldset = document.querySelector('form fieldset.communication_website_post_categories'); + if (this.fieldset === null) { + return; + } + + this.checkboxes = this.fieldset.querySelectorAll('input[type="checkbox"]'); + for (i = 0; i < this.checkboxes.length; i += 1) { + this.checkboxes[i].addEventListener('change', this.onCheckboxChange.bind(this)); + } + }, + + onCheckboxChange: function (event) { + 'use strict'; + var checkbox = event.currentTarget, + parentId = checkbox.dataset.parent, + parentCheckbox; + + if (!checkbox.checked || typeof parentId === 'undefined') { + return; + } + + parentCheckbox = this.fieldset.querySelector('input[type="checkbox"][value="' + parentId + '"]'); + if (parentCheckbox !== null) { + this.triggerCheck(parentCheckbox); + } + }, + + triggerCheck: function (checkbox) { + 'use strict'; + var evt; + checkbox.checked = true; + if (typeof document.createEvent !== 'undefined') { + evt = document.createEvent('HTMLEvents'); + evt.initEvent('change', false, true); + checkbox.dispatchEvent(evt); + } else { + checkbox.fireEvent('onchange'); + } + }, + + invoke: function () { + 'use strict'; + return { + init: this.init.bind(this) + }; + } +}.invoke(); + +window.addEventListener('DOMContentLoaded', function () { + 'use strict'; + if (document.body.classList.contains('posts-new') || document.body.classList.contains('posts-edit')) { + window.osuny.communication.posts.init(); + } +}); diff --git a/app/controllers/admin/communication/websites_controller.rb b/app/controllers/admin/communication/websites_controller.rb index ae9e404eaf9c349002eddf98da1afcc9abee85e9..86f2e8ca80dcdebf0fba1fbc8444f42ba8ff3756 100644 --- a/app/controllers/admin/communication/websites_controller.rb +++ b/app/controllers/admin/communication/websites_controller.rb @@ -71,6 +71,9 @@ class Admin::Communication::WebsitesController < Admin::Communication::Applicati protected def website_params - params.require(:communication_website).permit(:name, :url, :repository, :access_token, :about_type, :about_id) + params.require(:communication_website).permit( + :name, :url, :repository, :access_token, :about_type, :about_id, + :authors_github_directory, :posts_github_directory + ) end end diff --git a/app/models/communication/website.rb b/app/models/communication/website.rb index 15048d7d5e32eeaa48510b9a30b56809409c0fe6..eddce3c46d84d9db90397544b256592a7b67863b 100644 --- a/app/models/communication/website.rb +++ b/app/models/communication/website.rb @@ -2,16 +2,18 @@ # # Table name: communication_websites # -# id :uuid not null, primary key -# about_type :string -# access_token :string -# name :string -# repository :string -# url :string -# created_at :datetime not null -# updated_at :datetime not null -# about_id :uuid -# university_id :uuid not null +# id :uuid not null, primary key +# about_type :string +# access_token :string +# authors_github_directory :string +# name :string +# posts_github_directory :string +# repository :string +# url :string +# created_at :datetime not null +# updated_at :datetime not null +# about_id :uuid +# university_id :uuid not null # # Indexes # diff --git a/app/models/communication/website/author.rb b/app/models/communication/website/author.rb index 65b8783fb19201cfe51698040769b66f6f948f8d..fe7a41c2c5efffa36a59c899f530f0efb003f204 100644 --- a/app/models/communication/website/author.rb +++ b/app/models/communication/website/author.rb @@ -52,7 +52,7 @@ class Communication::Website::Author < ApplicationRecord # Override from WithGithubFiles def github_path_generated - "auteurs/#{slug}.html" + "#{website.authors_github_directory}/#{slug}.html" end def github_manifest diff --git a/app/models/communication/website/category.rb b/app/models/communication/website/category.rb index 11a09fe23f8acaf215e09168c3ad24d861ef2b9c..014bd9ddaf4d74409bd73d779380d2c655221b44 100644 --- a/app/models/communication/website/category.rb +++ b/app/models/communication/website/category.rb @@ -78,7 +78,7 @@ class Communication::Website::Category < ApplicationRecord # Override from WithGithubFiles def github_path_generated - "actualites/#{slug}.html" + "#{website.posts_github_directory}/#{slug}.html" end def github_manifest diff --git a/app/models/concerns/with_tree.rb b/app/models/concerns/with_tree.rb index eb0d0ff76459d32478f457410f55f049ec7c2e2f..7869bb8f0ec083d40fe67f5b618a78f65601227d 100644 --- a/app/models/concerns/with_tree.rb +++ b/app/models/concerns/with_tree.rb @@ -21,7 +21,7 @@ module WithTree def self_and_children(level) elements = [] label = " " * level + self.to_s - elements << { label: label, id: self.id } + elements << { label: label, id: self.id, parent_id: self.parent_id } children.each do |child| elements.concat(child.self_and_children(level + 1)) end diff --git a/app/views/admin/communication/website/authors/jekyll.html.erb b/app/views/admin/communication/website/authors/jekyll.html.erb index 2f36fcfbdfd0f56782760acdd94449e612cd12d2..c0f06a33a4db3c6419776e19eb56559635832d02 100644 --- a/app/views/admin/communication/website/authors/jekyll.html.erb +++ b/app/views/admin/communication/website/authors/jekyll.html.erb @@ -2,7 +2,7 @@ title: "<%= @author.to_s %>" slug: "<%= @author.slug %>" identifier: "<%= @author.id %>" -permalink: "/auteurs/<%= @author.slug %>" +permalink: "/<%= @author.website.authors_github_directory %>/<%= @author.slug %>" first_name: "<%= @author.first_name %>" last_name: "<%= @author.last_name %>" biography: > diff --git a/app/views/admin/communication/website/authors/jekyll_collection.yml.erb b/app/views/admin/communication/website/authors/jekyll_collection.yml.erb index 301ee362ddd7cb4b4fa860c81b2e4625457e6209..f4582d8a12aeb7372274b17e1b11f849ab0190e2 100644 --- a/app/views/admin/communication/website/authors/jekyll_collection.yml.erb +++ b/app/views/admin/communication/website/authors/jekyll_collection.yml.erb @@ -1,3 +1,3 @@ name: "<%= @author.to_s %>" identifier: "<%= @author.id %>" -link: "/auteurs/<%= @author.slug %>" +link: "/<%= @author.website.authors_github_directory %>/<%= @author.slug %>" diff --git a/app/views/admin/communication/website/categories/jekyll.html.erb b/app/views/admin/communication/website/categories/jekyll.html.erb index 5cbc3475a1c27b019780f50d9474629ca38b8504..39e21da3ce6b438882cc4d186f8c21c108ce6c80 100644 --- a/app/views/admin/communication/website/categories/jekyll.html.erb +++ b/app/views/admin/communication/website/categories/jekyll.html.erb @@ -2,7 +2,7 @@ title: "<%= @category.name %>" slug: "<%= @category.slug %>" identifier: "<%= @category.id %>" -permalink: "/actualites/<%= @category.slug %>" +permalink: "/<%= @category.website.posts_github_directory %>/<%= @category.slug %>" parent: "<%= @category.parent_id %>" description: > <%= prepare_for_github @category.description, @category.university %> diff --git a/app/views/admin/communication/website/categories/jekyll_collection.yml.erb b/app/views/admin/communication/website/categories/jekyll_collection.yml.erb index 1d9d99738cbfce7800423ba555a349e368f6a23a..93e6b74fedb399e012f74fc8c189e85b172ae642 100644 --- a/app/views/admin/communication/website/categories/jekyll_collection.yml.erb +++ b/app/views/admin/communication/website/categories/jekyll_collection.yml.erb @@ -1,5 +1,5 @@ name: "<%= @category.name %>" identifier: "<%= @category.id %>" -link: "/actualites/<%= @category.slug %>" +link: "/<%= @category.website.posts_github_directory %>/<%= @category.slug %>" parent: "<%= @category.parent_id %>" position: <%= @category.position %> diff --git a/app/views/admin/communication/website/posts/_form.html.erb b/app/views/admin/communication/website/posts/_form.html.erb index a430c84fc448583e69ce1a12e54ae80be886f60e..fb2f47dfe99a1ce57d8c6041585e462a7040be5f 100644 --- a/app/views/admin/communication/website/posts/_form.html.erb +++ b/app/views/admin/communication/website/posts/_form.html.erb @@ -29,9 +29,11 @@ <%= f.association :author, collection: @website.authors.ordered if @website.authors.any? %> <%= f.association :categories, as: :check_boxes, - collection: @website.list_of_categories, - label_method: ->(p) { sanitize p[:label] }, - value_method: ->(p) { p[:id] } if @website.categories.any? %> + collection: @website.list_of_categories.map { |category| [ + sanitize(category[:label]), + category[:id], + { data: { parent: category[:parent_id] } } + ] } if @website.categories.any? %> </div> </div> <div class="card flex-fill w-100"> diff --git a/app/views/admin/communication/websites/_form.html.erb b/app/views/admin/communication/websites/_form.html.erb index 840edae94fa63fbbd369850f15f00bba3ef38d12..b45fcf6960dfc3319dec4c0dc2ddc3ae4ee71da1 100644 --- a/app/views/admin/communication/websites/_form.html.erb +++ b/app/views/admin/communication/websites/_form.html.erb @@ -37,6 +37,8 @@ <%= f.input :url %> <%= f.input :repository %> <%= f.input :access_token %> + <%= f.input :authors_github_directory %> + <%= f.input :posts_github_directory %> </div> </div> </div> diff --git a/config/locales/communication/en.yml b/config/locales/communication/en.yml index 431f195b2199caa5a1c136dbc2abb9027056d4bd..948fa94b43672e4606d08c22fd6ce1c5ed2e3620 100644 --- a/config/locales/communication/en.yml +++ b/config/locales/communication/en.yml @@ -60,7 +60,9 @@ en: about_Education::School: School website about_Research::Journal: Journal website about_type: About + authors_github_directory: Authors' GitHub directory name: Name + posts_github_directory: Posts' GitHub directory url: URL communication/website/author: biography: Biography diff --git a/config/locales/communication/fr.yml b/config/locales/communication/fr.yml index e28bdc95707514c683cc9a0200821b2890fa717a..1ebadc3aa10266b0c9c0c4f1760c9900eba7a58b 100644 --- a/config/locales/communication/fr.yml +++ b/config/locales/communication/fr.yml @@ -60,7 +60,9 @@ fr: about_Education::School: Site d'école about_Research::Journal: Site de revue scientifique about_type: Sujet du site + authors_github_directory: Dossier GitHub des auteurs name: Nom + posts_github_directory: Dossier GitHub des actualités url: URL communication/website/author: biography: Biographie diff --git a/db/migrate/20211210145958_add_categories_and_authors_github_directories_to_communication_websites.rb b/db/migrate/20211210145958_add_categories_and_authors_github_directories_to_communication_websites.rb new file mode 100644 index 0000000000000000000000000000000000000000..378d79e0c16538078e60db043e47d444a8458b9b --- /dev/null +++ b/db/migrate/20211210145958_add_categories_and_authors_github_directories_to_communication_websites.rb @@ -0,0 +1,6 @@ +class AddCategoriesAndAuthorsGithubDirectoriesToCommunicationWebsites < ActiveRecord::Migration[6.1] + def change + add_column :communication_websites, :authors_github_directory, :string + add_column :communication_websites, :posts_github_directory, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 98bd292dd3d7f73f20dcb93dc2dcc21e28984fa0..51550f05c1e89f48065bd9d81d23556ef307f320 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_12_10_112555) do +ActiveRecord::Schema.define(version: 2021_12_10_145958) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" @@ -334,6 +334,8 @@ ActiveRecord::Schema.define(version: 2021_12_10_112555) do t.string "repository" t.string "about_type" t.uuid "about_id" + t.string "authors_github_directory" + t.string "posts_github_directory" t.index ["about_type", "about_id"], name: "index_communication_websites_on_about" t.index ["university_id"], name: "index_communication_websites_on_university_id" end diff --git a/lib/tasks/app.rake b/lib/tasks/app.rake index d5d196178625107ab6b480803aba6efcd9f03540..ce967d66533e11eab285f2c800d1795a7a3325c0 100644 --- a/lib/tasks/app.rake +++ b/lib/tasks/app.rake @@ -56,6 +56,11 @@ namespace :app do 10.times do Education::Program.find_each { |p| p.update_column :path, "#{p.parent&.path}/#{p.slug}".gsub(/\/+/, '/') } end + + Communication::Website.all.find_each { |website| + website.update_column(:authors_github_directory, "auteurs") if website.authors_github_directory.blank? + website.update_column(:posts_github_directory, "actualites") if website.posts_github_directory.blank? + } end namespace :db do