From 59b0e3d87712cffd3aee39b3293ef1e0baeea2b4 Mon Sep 17 00:00:00 2001 From: Jarno Lamberg Date: Sun, 13 Nov 2022 21:20:17 +0100 Subject: [PATCH 1/7] Add a column for the number of attachments in messages --- assets/javascripts/mailcatcher.js.coffee | 1 + lib/mail_catcher/mail.rb | 4 +++- spec/delivery_spec.rb | 7 ++++++- views/index.erb | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/assets/javascripts/mailcatcher.js.coffee b/assets/javascripts/mailcatcher.js.coffee index ec39bf0a..dba734bb 100644 --- a/assets/javascripts/mailcatcher.js.coffee +++ b/assets/javascripts/mailcatcher.js.coffee @@ -186,6 +186,7 @@ class MailCatcher .append($("").text(message.sender or "No sender").toggleClass("blank", !message.sender)) .append($("").text((message.recipients || []).join(", ") or "No receipients").toggleClass("blank", !message.recipients.length)) .append($("").text(message.subject or "No subject").toggleClass("blank", !message.subject)) + .append($("").text(message.attachments_count)) .append($("").text(@formatDate(message.created_at))) .prependTo($("#messages tbody")) @updateMessagesCount() diff --git a/lib/mail_catcher/mail.rb b/lib/mail_catcher/mail.rb index b7415ae2..d7b2437c 100644 --- a/lib/mail_catcher/mail.rb +++ b/lib/mail_catcher/mail.rb @@ -56,9 +56,11 @@ def add_message(message) add_message_part(message_id, cid, part.mime_type || "text/plain", part.attachment? ? 1 : 0, part.filename, part.charset, body, body.length) end + attachments_count = parts.count(&:attachment?) + EventMachine.next_tick do message = MailCatcher::Mail.message message_id - MailCatcher::Bus.push(type: "add", message: message) + MailCatcher::Bus.push(type: "add", message: message.merge("attachments_count" => attachments_count)) end end diff --git a/spec/delivery_spec.rb b/spec/delivery_spec.rb index 1a7b99a3..1055b31d 100644 --- a/spec/delivery_spec.rb +++ b/spec/delivery_spec.rb @@ -23,10 +23,14 @@ def message_subject_element message_row_element.find(:xpath, ".//td[3]") end - def message_received_element + def message_attachments_element message_row_element.find(:xpath, ".//td[4]") end + def message_received_element + message_row_element.find(:xpath, ".//td[5]") + end + def html_tab_element page.find("#message header .format.html a") end @@ -227,6 +231,7 @@ def body_element expect(message_from_element).to have_text(DEFAULT_FROM) expect(message_to_element).to have_text(DEFAULT_TO) expect(message_subject_element).to have_text("Test Attachment Mail") + expect(message_attachments_element.text).to eq("1") expect(Time.parse(message_received_element.text)).to be <= Time.now + 5 message_row_element.click diff --git a/views/index.erb b/views/index.erb index 2cd72c23..45641fd6 100644 --- a/views/index.erb +++ b/views/index.erb @@ -34,6 +34,7 @@ From To Subject + Received From 5699bfb597c445f556e0d2533953ecedbc9b2ac7 Mon Sep 17 00:00:00 2001 From: Jarno Lamberg Date: Sun, 13 Nov 2022 22:10:35 +0100 Subject: [PATCH 2/7] Show empty string instead of zero when message has no attachments --- assets/javascripts/mailcatcher.js.coffee | 2 +- spec/delivery_spec.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/javascripts/mailcatcher.js.coffee b/assets/javascripts/mailcatcher.js.coffee index dba734bb..dc93319e 100644 --- a/assets/javascripts/mailcatcher.js.coffee +++ b/assets/javascripts/mailcatcher.js.coffee @@ -186,7 +186,7 @@ class MailCatcher .append($("").text(message.sender or "No sender").toggleClass("blank", !message.sender)) .append($("").text((message.recipients || []).join(", ") or "No receipients").toggleClass("blank", !message.recipients.length)) .append($("").text(message.subject or "No subject").toggleClass("blank", !message.subject)) - .append($("").text(message.attachments_count)) + .append($("").text(message.attachments_count || "")) .append($("").text(@formatDate(message.created_at))) .prependTo($("#messages tbody")) @updateMessagesCount() diff --git a/spec/delivery_spec.rb b/spec/delivery_spec.rb index 1055b31d..955236b3 100644 --- a/spec/delivery_spec.rb +++ b/spec/delivery_spec.rb @@ -69,6 +69,7 @@ def body_element expect(message_from_element).to have_text(DEFAULT_FROM) expect(message_to_element).to have_text(DEFAULT_TO) expect(message_subject_element).to have_text("Plain mail") + expect(message_attachments_element.text).to eq("") expect(Time.parse(message_received_element.text)).to be <= Time.now + 5 message_row_element.click From 1607a3103dbca05a1a18a2d0365e44cab0deb488 Mon Sep 17 00:00:00 2001 From: Jarno Lamberg Date: Sun, 13 Nov 2022 22:36:03 +0100 Subject: [PATCH 3/7] Show the number of attachments after a page refresh as well --- lib/mail_catcher/mail.rb | 2 +- spec/delivery_spec.rb | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/mail_catcher/mail.rb b/lib/mail_catcher/mail.rb index d7b2437c..5d65b03b 100644 --- a/lib/mail_catcher/mail.rb +++ b/lib/mail_catcher/mail.rb @@ -75,7 +75,7 @@ def latest_created_at end def messages - @messages_query ||= db.prepare "SELECT id, sender, recipients, subject, size, created_at FROM message ORDER BY created_at, id ASC" + @messages_query ||= db.prepare "SELECT id, sender, recipients, subject, size, created_at, (SELECT COUNT(*) FROM message_part WHERE message_id = message.id AND is_attachment = 1) AS attachments_count FROM message ORDER BY created_at, id ASC" @messages_query.execute.map do |row| Hash[row.fields.zip(row)].tap do |message| message["recipients"] &&= JSON.parse(message["recipients"]) diff --git a/spec/delivery_spec.rb b/spec/delivery_spec.rb index 955236b3..b97799dd 100644 --- a/spec/delivery_spec.rb +++ b/spec/delivery_spec.rb @@ -262,6 +262,11 @@ def body_element expect(page).to have_text "Content-Disposition: attachment" # Too hard to add expectations on the transfer encoded attachment contents end + + # Refresh the page + refresh + + expect(message_attachments_element.text).to eq("1") end it "doesn't choke on messages containing dots" do From 2c7844c3055605658778d7f6308e0e3794accc6f Mon Sep 17 00:00:00 2001 From: Jarno Lamberg Date: Sun, 13 Nov 2022 22:49:57 +0100 Subject: [PATCH 4/7] Use paperclip as the number of attachments table header --- views/index.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/index.erb b/views/index.erb index 45641fd6..763a48df 100644 --- a/views/index.erb +++ b/views/index.erb @@ -34,7 +34,7 @@ From To Subject - + 📎 Received From 551cb2cb2df4cda6c5581ad7141f130446ff3513 Mon Sep 17 00:00:00 2001 From: Jarno Lamberg Date: Sun, 13 Nov 2022 23:04:46 +0100 Subject: [PATCH 5/7] Set a width for the column for number of attachments --- assets/stylesheets/mailcatcher.css.sass | 2 ++ views/index.erb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/stylesheets/mailcatcher.css.sass b/assets/stylesheets/mailcatcher.css.sass index 726e8acc..6de5e82e 100644 --- a/assets/stylesheets/mailcatcher.css.sass +++ b/assets/stylesheets/mailcatcher.css.sass @@ -123,6 +123,8 @@ body > header font-weight: bold color: #666 +text-shadow(0 1px 0 white) + &.attachments-header + width: 3em tbody tr cursor: pointer +transition(0.1s ease) diff --git a/views/index.erb b/views/index.erb index 763a48df..faa7f521 100644 --- a/views/index.erb +++ b/views/index.erb @@ -34,7 +34,7 @@ From To Subject - 📎 + 📎 Received From addfdad67108bcc52e1daac3c079392fb8d27816 Mon Sep 17 00:00:00 2001 From: Jarno Lamberg Date: Sun, 13 Nov 2022 23:08:43 +0100 Subject: [PATCH 6/7] Align number of attachments and header --- assets/javascripts/mailcatcher.js.coffee | 2 +- assets/stylesheets/mailcatcher.css.sass | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/javascripts/mailcatcher.js.coffee b/assets/javascripts/mailcatcher.js.coffee index dc93319e..4ad9f26d 100644 --- a/assets/javascripts/mailcatcher.js.coffee +++ b/assets/javascripts/mailcatcher.js.coffee @@ -186,7 +186,7 @@ class MailCatcher .append($("").text(message.sender or "No sender").toggleClass("blank", !message.sender)) .append($("").text((message.recipients || []).join(", ") or "No receipients").toggleClass("blank", !message.recipients.length)) .append($("").text(message.subject or "No subject").toggleClass("blank", !message.subject)) - .append($("").text(message.attachments_count || "")) + .append($("""""").text(message.attachments_count || "")) .append($("").text(@formatDate(message.created_at))) .prependTo($("#messages tbody")) @updateMessagesCount() diff --git a/assets/stylesheets/mailcatcher.css.sass b/assets/stylesheets/mailcatcher.css.sass index 6de5e82e..774c3a57 100644 --- a/assets/stylesheets/mailcatcher.css.sass +++ b/assets/stylesheets/mailcatcher.css.sass @@ -125,6 +125,7 @@ body > header +text-shadow(0 1px 0 white) &.attachments-header width: 3em + text-align: right tbody tr cursor: pointer +transition(0.1s ease) @@ -141,6 +142,8 @@ body > header &.blank color: #666 font-style: italic + &.attachments-count + text-align: right #resizer padding-bottom: 5px cursor: ns-resize From 5e2779e6f1ae85e08409aaa068a8bab1d7ccec4d Mon Sep 17 00:00:00 2001 From: Jarno Lamberg Date: Sun, 13 Nov 2022 23:13:44 +0100 Subject: [PATCH 7/7] Add space between the number of attachments and received datetime --- assets/stylesheets/mailcatcher.css.sass | 2 ++ 1 file changed, 2 insertions(+) diff --git a/assets/stylesheets/mailcatcher.css.sass b/assets/stylesheets/mailcatcher.css.sass index 774c3a57..85f8e087 100644 --- a/assets/stylesheets/mailcatcher.css.sass +++ b/assets/stylesheets/mailcatcher.css.sass @@ -126,6 +126,7 @@ body > header &.attachments-header width: 3em text-align: right + padding-right: 1em tbody tr cursor: pointer +transition(0.1s ease) @@ -144,6 +145,7 @@ body > header font-style: italic &.attachments-count text-align: right + padding-right: 1em #resizer padding-bottom: 5px cursor: ns-resize