about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--app/assets/images/comment_add.pngbin0 -> 530 bytes
-rw-r--r--app/assets/images/cross.pngbin0 -> 655 bytes
-rw-r--r--app/assets/javascripts/application.js1
-rw-r--r--app/assets/javascripts/main/comments.coffee14
-rw-r--r--app/assets/stylesheets/main/entries.scss20
-rw-r--r--app/controllers/admin/comments_controller.rb4
-rw-r--r--app/controllers/comments_controller.rb6
-rw-r--r--app/mailers/comment_mailer.rb5
-rw-r--r--app/models/comment.rb3
-rw-r--r--app/views/comment_mailer/reply_comment_email.html.haml14
-rw-r--r--app/views/comment_mailer/reply_comment_email.text.erb19
-rw-r--r--app/views/comments/_comment.html.haml1
-rw-r--r--app/views/comments/_form.html.haml6
-rw-r--r--db/migrate/20231014141657_add_reply_to_comment.rb5
-rw-r--r--db/schema.rb5
15 files changed, 101 insertions, 2 deletions
diff --git a/app/assets/images/comment_add.png b/app/assets/images/comment_add.png new file mode 100644 index 0000000..75e78de --- /dev/null +++ b/app/assets/images/comment_add.png
Binary files differ
diff --git a/app/assets/images/cross.png b/app/assets/images/cross.png new file mode 100644 index 0000000..1514d51 --- /dev/null +++ b/app/assets/images/cross.png
Binary files differ
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index cd58a9c..d8f72b4 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js
@@ -17,3 +17,4 @@
17//= require jquery-ui 17//= require jquery-ui
18//= require js-routes 18//= require js-routes
19//= require_tree ./admin 19//= require_tree ./admin
20//= require_tree ./main
diff --git a/app/assets/javascripts/main/comments.coffee b/app/assets/javascripts/main/comments.coffee new file mode 100644 index 0000000..d33e200 --- /dev/null +++ b/app/assets/javascripts/main/comments.coffee
@@ -0,0 +1,14 @@
1comments_ready = ->
2 $(".comment-reply-to").click ->
3 $("#comment_reply_to_id").val($(this).data("commentId"))
4 $("#comment-reply-msg .comment-reply-author").text($(this).data("commentAuthor"))
5 $("#comment-reply-msg").show()
6 return false
7
8 $(".comment-reply-cancel").click ->
9 $("#comment_reply_to_id").val("")
10 $("#comment-reply-msg").hide()
11 return false
12
13$(document).ready(comments_ready)
14$(document).on('turbolinks:load', comments_ready)
diff --git a/app/assets/stylesheets/main/entries.scss b/app/assets/stylesheets/main/entries.scss index 8d5796f..dd6b248 100644 --- a/app/assets/stylesheets/main/entries.scss +++ b/app/assets/stylesheets/main/entries.scss
@@ -251,9 +251,29 @@
251 float: right; 251 float: right;
252 margin-top: 1em; 252 margin-top: 1em;
253 } 253 }
254
255 .comment-reply-to {
256 float: right;
257 margin-right: 0.5em;
258
259 img {
260 display: block;
261 }
262 }
254} 263}
255 264
256#comment-form { 265#comment-form {
266 #comment-reply-msg {
267 display: none;
268 margin-top: 1em;
269 margin-bottom: 0;
270 margin-left: 0;
271
272 .comment-reply-author {
273 font-weight: bold;
274 }
275 }
276
257 fieldset { 277 fieldset {
258 border: 0; 278 border: 0;
259 279
diff --git a/app/controllers/admin/comments_controller.rb b/app/controllers/admin/comments_controller.rb index ccde3e6..9958232 100644 --- a/app/controllers/admin/comments_controller.rb +++ b/app/controllers/admin/comments_controller.rb
@@ -14,6 +14,10 @@ class Admin::CommentsController < Admin::AdminController
14 @comment.status = :published 14 @comment.status = :published
15 @comment.save! 15 @comment.save!
16 16
17 if @comment.reply_to and @comment.reply_to.email != @comment.blog.user.email and @comment.reply_to.email != current_user.email
18 CommentMailer.with(comment: @comment).reply_comment_email.deliver_later
19 end
20
17 flash.notice = "Comment successfully published." 21 flash.notice = "Comment successfully published."
18 redirect_to pending_admin_comments_url 22 redirect_to pending_admin_comments_url
19 end 23 end
diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index a444dba..2f3117f 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb
@@ -46,6 +46,10 @@ class CommentsController < ApplicationController
46 46
47 if @comment.status == :published 47 if @comment.status == :published
48 CommentMailer.with(comment: @comment).new_comment_email.deliver_later 48 CommentMailer.with(comment: @comment).new_comment_email.deliver_later
49
50 if @comment.reply_to and @comment.reply_to.email != @comment.blog.user.email
51 CommentMailer.with(comment: @comment).reply_comment_email.deliver_later
52 end
49 else 53 else
50 CommentMailer.with(comment: @comment).new_pending_comment_email.deliver_later 54 CommentMailer.with(comment: @comment).new_pending_comment_email.deliver_later
51 end 55 end
@@ -60,6 +64,6 @@ class CommentsController < ApplicationController
60 private 64 private
61 65
62 def comment_params 66 def comment_params
63 params.require(:comment).permit(:username, :email, :website, :body) 67 params.require(:comment).permit(:username, :email, :website, :body, :reply_to_id)
64 end 68 end
65end 69end
diff --git a/app/mailers/comment_mailer.rb b/app/mailers/comment_mailer.rb index aeed1b0..41feede 100644 --- a/app/mailers/comment_mailer.rb +++ b/app/mailers/comment_mailer.rb
@@ -8,4 +8,9 @@ class CommentMailer < ApplicationMailer
8 @comment = params[:comment] 8 @comment = params[:comment]
9 mail(to: @comment.blog.user.email, subject: "[Four Island] Pending comment on #{@comment.blog.title}") 9 mail(to: @comment.blog.user.email, subject: "[Four Island] Pending comment on #{@comment.blog.title}")
10 end 10 end
11
12 def reply_comment_email
13 @comment = params[:comment]
14 mail(to: @comment.reply_to.email, subject: "[Four Island] Reply to your comment on #{@comment.blog.title}")
15 end
11end 16end
diff --git a/app/models/comment.rb b/app/models/comment.rb index 9697100..b85f3b6 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb
@@ -3,6 +3,9 @@ class Comment < ApplicationRecord
3 3
4 belongs_to :blog 4 belongs_to :blog
5 5
6 has_many :replies, class_name: "Comment", foreign_key: "reply_to_id"
7 belongs_to :reply_to, class_name: "Comment", optional: true
8
6 validates :body, presence: true 9 validates :body, presence: true
7 validates :username, presence: true 10 validates :username, presence: true
8 validates :email, presence: true, format: URI::MailTo::EMAIL_REGEXP 11 validates :email, presence: true, format: URI::MailTo::EMAIL_REGEXP
diff --git a/app/views/comment_mailer/reply_comment_email.html.haml b/app/views/comment_mailer/reply_comment_email.html.haml new file mode 100644 index 0000000..22009ee --- /dev/null +++ b/app/views/comment_mailer/reply_comment_email.html.haml
@@ -0,0 +1,14 @@
1%p
2 A reply has been posted to your comment on
3 = succeed "." do
4 = link_to @comment.blog.title, @comment.blog
5 The original comment:
6%blockquote= @comment.reply_to.body
7%p
8 = @comment.username
9 left the following response:
10%blockquote= @comment.body
11%p
12 Posted:
13 = @comment.published_at.strftime("%B #{@comment.published_at.day.ordinalize}, %Y at %-I:%M:%S%P")
14%p= link_to "See the comment on the web", blog_url(@comment.blog, anchor: "comment-#{@comment.id}")
diff --git a/app/views/comment_mailer/reply_comment_email.text.erb b/app/views/comment_mailer/reply_comment_email.text.erb new file mode 100644 index 0000000..bd60692 --- /dev/null +++ b/app/views/comment_mailer/reply_comment_email.text.erb
@@ -0,0 +1,19 @@
1A reply has been posted to your comment on <%= @comment.blog.title %>. The original comment:
2
3---
4
5<%= @comment.reply_to.body %>
6
7---
8
9<%= @comment.username %> posted the following response:
10
11---
12
13<%= @comment.body %>
14
15---
16
17Posted: <%= @comment.published_at.strftime("%B #{@comment.published_at.day.ordinalize}, %Y at %-I:%M:%S%P") %>
18
19See the comment on the web: <%= blog_url(@comment.blog, anchor: "comment-#{@comment.id}") %>
diff --git a/app/views/comments/_comment.html.haml b/app/views/comments/_comment.html.haml index 3ad21e9..225b5d9 100644 --- a/app/views/comments/_comment.html.haml +++ b/app/views/comments/_comment.html.haml
@@ -11,3 +11,4 @@
11 = link_to comment.username, comment.website 11 = link_to comment.username, comment.website
12 on 12 on
13 = comment.published_at.strftime("%B #{comment.published_at.day.ordinalize}, %Y at %-I:%M:%S%P") 13 = comment.published_at.strftime("%B #{comment.published_at.day.ordinalize}, %Y at %-I:%M:%S%P")
14 = link_to (image_tag "comment_add.png"), "#", class: "comment-reply-to", title: "Reply to comment", data: { comment_id: comment.id, comment_author: comment.username }
diff --git a/app/views/comments/_form.html.haml b/app/views/comments/_form.html.haml index f6df807..eb374c7 100644 --- a/app/views/comments/_form.html.haml +++ b/app/views/comments/_form.html.haml
@@ -1,6 +1,12 @@
1= form_for @comment || blog.comments.new, html: { id: "comment-form" } do |f| 1= form_for @comment || blog.comments.new, html: { id: "comment-form" } do |f|
2 = f.hidden_field :reply_to_id
2 %fieldset#comment-body-field 3 %fieldset#comment-body-field
3 %blockquote.bubble.rounded.bottom 4 %blockquote.bubble.rounded.bottom
5 #comment-reply-msg
6 = link_to (image_tag "cross"), "#", class: "comment-reply-cancel"
7 Replying to comment by
8 = succeed ":" do
9 %span.comment-reply-author
4 = f.label :body 10 = f.label :body
5 = f.text_area :body 11 = f.text_area :body
6 %cite.bubble Feel free to post a comment! You may use Markdown. 12 %cite.bubble Feel free to post a comment! You may use Markdown.
diff --git a/db/migrate/20231014141657_add_reply_to_comment.rb b/db/migrate/20231014141657_add_reply_to_comment.rb new file mode 100644 index 0000000..8e7b445 --- /dev/null +++ b/db/migrate/20231014141657_add_reply_to_comment.rb
@@ -0,0 +1,5 @@
1class AddReplyToComment < ActiveRecord::Migration[7.0]
2 def change
3 add_reference :comments, :reply_to, foreign_key: { to_table: :comments }
4 end
5end
diff --git a/db/schema.rb b/db/schema.rb index 56fd9bb..49c7925 100644 --- a/db/schema.rb +++ b/db/schema.rb
@@ -10,7 +10,7 @@
10# 10#
11# It's strongly recommended that you check this file into your version control system. 11# It's strongly recommended that you check this file into your version control system.
12 12
13ActiveRecord::Schema[7.0].define(version: 2023_10_14_140431) do 13ActiveRecord::Schema[7.0].define(version: 2023_10_14_141657) do
14 create_table "audits", force: :cascade do |t| 14 create_table "audits", force: :cascade do |t|
15 t.integer "auditable_id" 15 t.integer "auditable_id"
16 t.string "auditable_type" 16 t.string "auditable_type"
@@ -68,7 +68,9 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_14_140431) do
68 t.datetime "published_at" 68 t.datetime "published_at"
69 t.datetime "created_at", null: false 69 t.datetime "created_at", null: false
70 t.datetime "updated_at", null: false 70 t.datetime "updated_at", null: false
71 t.integer "reply_to_id"
71 t.index ["blog_id"], name: "index_comments_on_blog_id" 72 t.index ["blog_id"], name: "index_comments_on_blog_id"
73 t.index ["reply_to_id"], name: "index_comments_on_reply_to_id"
72 end 74 end
73 75
74 create_table "games", force: :cascade do |t| 76 create_table "games", force: :cascade do |t|
@@ -362,6 +364,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_14_140431) do
362 364
363 add_foreign_key "blogs", "users" 365 add_foreign_key "blogs", "users"
364 add_foreign_key "comments", "blogs" 366 add_foreign_key "comments", "blogs"
367 add_foreign_key "comments", "comments", column: "reply_to_id"
365 add_foreign_key "pokeviewer_items", "pokeviewer_moves", column: "move_id" 368 add_foreign_key "pokeviewer_items", "pokeviewer_moves", column: "move_id"
366 add_foreign_key "pokeviewer_pokedex_entries", "pokeviewer_species", column: "species_id" 369 add_foreign_key "pokeviewer_pokedex_entries", "pokeviewer_species", column: "species_id"
367 add_foreign_key "pokeviewer_pokedex_entries", "pokeviewer_trainers", column: "trainer_id" 370 add_foreign_key "pokeviewer_pokedex_entries", "pokeviewer_trainers", column: "trainer_id"