From eb2a7e97c094dd36eae0d1ea98c869ab020589fd Mon Sep 17 00:00:00 2001 From: Adrien Dorsaz Date: Mon, 6 Dec 2021 00:14:20 +0100 Subject: [PATCH] notify node owner for new answer, add all content to dashboard Notify owner of any type of content for new answers (in existing thread or new thread). Add a dashboard showing latest 10 contents published of any type, so the author can follow easily new threads and comments on his/her content. For small screends, the dashboards are scrollable to avoid them to break the application layout. Dashboard titles are aligned with content (aligned on right for numbers and left for the rest). --- app/assets/stylesheets/parts/tables.scss | 15 +++++++++ app/controllers/dashboard_controller.rb | 10 ++++-- app/models/comment.rb | 15 ++++++++- app/models/node.rb | 6 +++- app/views/dashboard/_candidates.html.haml | 19 +++++++++++ app/views/dashboard/_comments.html.haml | 41 ++++++++++++----------- app/views/dashboard/_drafts.html.haml | 6 ++-- app/views/dashboard/_news.html.haml | 18 ---------- app/views/dashboard/_nodes.html.haml | 37 ++++++++++++++++++++ app/views/dashboard/_posts.html.haml | 21 ------------ app/views/dashboard/_trackers.html.haml | 41 +++++++++++++---------- app/views/dashboard/index.html.haml | 4 +-- 12 files changed, 147 insertions(+), 86 deletions(-) create mode 100644 app/views/dashboard/_candidates.html.haml delete mode 100644 app/views/dashboard/_news.html.haml create mode 100644 app/views/dashboard/_nodes.html.haml delete mode 100644 app/views/dashboard/_posts.html.haml diff --git a/app/assets/stylesheets/parts/tables.scss b/app/assets/stylesheets/parts/tables.scss index a8bfbd1e3..eb6671a7d 100644 --- a/app/assets/stylesheets/parts/tables.scss +++ b/app/assets/stylesheets/parts/tables.scss @@ -27,6 +27,9 @@ body#registrations-edit table { td, th { padding: 0.25rem; + &.left { + text-align: left; + } &.date { white-space: nowrap; } @@ -52,3 +55,15 @@ body#registrations-edit td { } } } + +// To build scrollable table, we need to wrap them into a container +.table_container { + max-width: 100%; + overflow-x: auto; + td, + th { + &.number { + white-space: nowrap; + } + } +} diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index bc14cda41..ae93d7678 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -5,12 +5,16 @@ class DashboardController < ApplicationController def index @self_answer = params[:self] == "1" + # News + @candidates = News.where(author_email: current_account.email).candidate + @drafts = News.where(author_email: current_account.email).draft + # Comment threads @comments = current_user.comments.on_dashboard.limit(30) @comments = @comments.where(answered_to_self: false) unless @self_answer - @posts = Node.where(user_id: current_user.id).on_dashboard(Post).limit(10) + # Other nodes + @nodes = Node.where(user_id: current_user.id).on_dashboard([News, Diary, Bookmark, Post, WikiPage]).limit(10) + # Trackers can get very old, so keep them in their own dashboard @trackers = Node.where(user_id: current_user.id).on_dashboard(Tracker).limit(10) - @news = News.where(author_email: current_account.email).candidate - @drafts = News.where(author_email: current_account.email).draft end def answers diff --git a/app/models/comment.rb b/app/models/comment.rb index 32ba6b0d2..bcd0d8e16 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -31,6 +31,11 @@ class Comment < ActiveRecord::Base scope :under, ->(path) { where("materialized_path LIKE ?", "#{path}_%") } scope :published, -> { where(state: 'published') } scope :on_dashboard, -> { published.order(created_at: :desc) } + scope :latest_published, -> { + published. + order(created_at: :desc). + limit(1) + } scope :footer, -> { # MariaDB tries to scan nodes first, which is a very slow, so we add an index hint from("comments USE INDEX (index_comments_on_state_and_created_at)").published. @@ -139,6 +144,14 @@ def notify_parents end end + after_create :notify_node_owner + def notify_node_owner + if user_id != node.user_id + node_owner = node.user.try(:account) + node_owner.notify_answer_on node_id if node_owner + end + end + ### Calculations ### before_validation :default_score, on: :create @@ -155,7 +168,7 @@ def nb_answers self.class.published.under(materialized_path).count end - def last_answer + def latest_answer self.class.published.under(materialized_path).last end diff --git a/app/models/node.rb b/app/models/node.rb index 5b4460f06..5080234e6 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -32,7 +32,7 @@ class Node < ActiveRecord::Base scope :visible, -> { where(public: true) } scope :by_date, -> { order(created_at: :desc) } scope :published_on, ->(d) { where(created_at: (d...d+1.day)) } - scope :on_dashboard, ->(type) { public_listing(type, "created_at") } + scope :on_dashboard, ->(types) { public_listing(types, "created_at") } scope :sitemap, ->(types) { public_listing(types, "id").where("score > 0") } scope :public_listing, ->(types, order) { types.map!(&:to_s) if types.is_a? Array @@ -106,6 +106,10 @@ def threads @threads ||= Threads.all(self.id) end + def latest_answer + comments.latest_published.first + end + ### Readings ### def self.readings_keys_of(account_id) diff --git a/app/views/dashboard/_candidates.html.haml b/app/views/dashboard/_candidates.html.haml new file mode 100644 index 000000000..f188cff67 --- /dev/null +++ b/app/views/dashboard/_candidates.html.haml @@ -0,0 +1,19 @@ +%h2 + Vos dépêches en attente de modération +- if @candidates.empty? + Vous n’avez aucune dépêche en cours de modération +- else + .table_container + %table#my_candidates + %tr + %th.left Section + %th.left Sujet + %th.left Date de soumission + - @candidates.each do |news| + %tr + %td= news.section.title + - if current_account.amr? + %td= link_to news.title, [:moderation, news] + - else + %td= news.title + %td= l news.node.created_at diff --git a/app/views/dashboard/_comments.html.haml b/app/views/dashboard/_comments.html.haml index 3efcaf0ae..cf4c47d83 100644 --- a/app/views/dashboard/_comments.html.haml +++ b/app/views/dashboard/_comments.html.haml @@ -9,24 +9,25 @@ -else = link_to "Inclure les réponses à mes commentaires", self: "1" %br - %table#my_comments - %tr - %th Fil initiateur - %th Sujet du commentaire - %th Date - %th Note - %th Rép. - %th Dernière réponse - - @comments.each do |comment| - - next if comment.node.nil? - - answer = comment.last_answer + .table_container + %table#my_comments %tr - %td #{translate_content_type comment.content_type} : #{link_to_content comment.content} - %td= link_to comment.title, path_for_content(comment.node.content) + "#comment-#{comment.id}" - %td.date= comment.created_at.to_s(:posted) - %td.number= comment.bound_score - %td.number - - if answer && !answer.read_by?(current_account) - = image_tag "/images/icones/comment.png", alt: "Nouveaux commentaires !", class: "thread-new-comments" - = comment.nb_answers - %td.date= answer ? answer.created_at.to_s(:posted) : " " + %th.left Fil initiateur + %th.left Sujet du commentaire + %th.left Date + %th.number Note + %th.number Rép. + %th.left Dernière réponse + - @comments.each do |comment| + - next if comment.node.nil? + - answer = comment.latest_answer + %tr + %td #{translate_content_type comment.content_type} : #{link_to_content comment.content} + %td= link_to comment.title, path_for_content(comment.node.content) + "#comment-#{comment.id}" + %td.date= comment.created_at.to_s(:posted) + %td.number= comment.bound_score + %td.number + - if answer && !answer.read_by?(current_account) + = image_tag "/images/icones/comment.png", alt: "Nouveaux commentaires !", class: "thread-new-comments" + = comment.nb_answers + %td.date= answer ? answer.created_at.to_s(:posted) : " " diff --git a/app/views/dashboard/_drafts.html.haml b/app/views/dashboard/_drafts.html.haml index 4e178bbd3..df84e0f9a 100644 --- a/app/views/dashboard/_drafts.html.haml +++ b/app/views/dashboard/_drafts.html.haml @@ -5,9 +5,9 @@ - else %table#my_drafts %tr - %th Section - %th Sujet - %th Date de création + %th.left Section + %th.left Sujet + %th.left Date de création - @drafts.each do |news| %tr %td= news.section.title diff --git a/app/views/dashboard/_news.html.haml b/app/views/dashboard/_news.html.haml deleted file mode 100644 index 28ca168a4..000000000 --- a/app/views/dashboard/_news.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -%h2 - Vos dépêches en attente de modération -- if @news.empty? - Vous n’avez aucune dépêche en cours de modération -- else - %table#my_news - %tr - %th Section - %th Sujet - %th Date de soumission - - @news.each do |news| - %tr - %td= news.section.title - - if current_account.amr? - %td= link_to news.title, [:moderation, news] - - else - %td= news.title - %td= l news.node.created_at diff --git a/app/views/dashboard/_nodes.html.haml b/app/views/dashboard/_nodes.html.haml new file mode 100644 index 000000000..de608dc20 --- /dev/null +++ b/app/views/dashboard/_nodes.html.haml @@ -0,0 +1,37 @@ +%h2 + Vos derniers contenus publiés +- if contents.empty? + %p + Vous n’avez aucun contenu publié +- else + %p + Ce tableau de bord vous montre vos 10 contenus les plus récemment publiés. + %br + Pour retrouver tous vos contenus, visitez votre profile : #{link_to(current_account.login, current_account.user)}. + .table_container + %table#my_published + %tr + %th.left Type + %th.left Section / Forum + %th.left Sujet + %th.left Date + %th.number Note + %th.number Comm. + %th.left Dernier commentaire + - contents.each do |node| + %tr + %td= translate_content_type node.content_type + %td + - if node.content.is_a? News + = node.content.section.title + - if node.content.is_a? Post + = node.content.forum.title + %td + = link_to_content node.content + %td.date= node.created_at.to_s(:posted) + %td.number= node.score + %td.number + - if node.read_status(current_account).is_a? Integer + = image_tag "/images/icones/comment.png", alt: "Nouveaux commentaires !", class: "thread-new-comments" + = node.comments_count + %td.date= node.latest_answer ? node.latest_answer.created_at.to_s(:posted) : " " diff --git a/app/views/dashboard/_posts.html.haml b/app/views/dashboard/_posts.html.haml deleted file mode 100644 index 9b1b9bcdf..000000000 --- a/app/views/dashboard/_posts.html.haml +++ /dev/null @@ -1,21 +0,0 @@ -%h2 - Vos derniers messages dans les forums -- if @posts.empty? - %p - Vous n’avez posté aucun message dans les forums -- else - %table#my_posts - %tr - %th Forum - %th Sujet - %th Note - %th Nombre de commentaires - %th Date du message - - @posts.each do |node| - - post = node.content - %tr - %td= post.forum.title - %td= link_to post.title, [post.forum, post] - %td.number= node.score - %td.number= node.comments.count - %td.date= post.created_at.to_s(:posted) diff --git a/app/views/dashboard/_trackers.html.haml b/app/views/dashboard/_trackers.html.haml index e99eb872b..6ba1a8442 100644 --- a/app/views/dashboard/_trackers.html.haml +++ b/app/views/dashboard/_trackers.html.haml @@ -4,20 +4,27 @@ %p Vous n’avez posté aucune entrée dans le suivi - else - %table#my_trackers - %tr - %th Catégorie - %th Sujet - %th État - %th Note - %th Nombre de commentaires - %th Date du message - - @trackers.each do |node| - - tracker = node.content - %tr{class: tracker.state} - %td= tracker.category.title - %td= link_to tracker.title, tracker - %td= tracker.state_name - %td.number= node.score - %td.number= node.comments.count - %td.date= tracker.created_at.to_s(:posted) + .table_container + %table#my_trackers + %tr + %th.left Catégorie + %th.left Sujet + %th.left Date + %th.left État + %th.number Note + %th.number Comm. + %th.left Dernier commentaire + - @trackers.each do |node| + - tracker = node.content + - answer = node.latest_answer + %tr{class: tracker.state} + %td= tracker.category.title + %td= link_to tracker.title, tracker + %td.date= tracker.created_at.to_s(:posted) + %td= tracker.state_name + %td.number= node.score + %td.number + - if answer && !answer.read_by?(current_account) + = image_tag "/images/icones/comment.png", alt: "Nouveaux commentaires !", class: "thread-new-comments" + = node.comments.count + %td.date= answer ? answer.created_at.to_s(:posted) : " " diff --git a/app/views/dashboard/index.html.haml b/app/views/dashboard/index.html.haml index 04ddc6a25..f7d64e032 100644 --- a/app/views/dashboard/index.html.haml +++ b/app/views/dashboard/index.html.haml @@ -5,7 +5,7 @@ =h1 "Votre tableau de bord" = render 'drafts' - = render 'news' + = render 'candidates' + = render 'nodes', contents: @nodes = render 'comments' - = render 'posts' = render 'trackers'