diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 288b9ab..f6ae8a9 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -13,3 +13,13 @@ *= require_tree . *= require_self */ + +.message-selected { + background-color: oklch(98.5% 0.002 247.839) !important; +} + +@media (prefers-color-scheme: dark) { + .message-selected { + background-color: oklch(40% 0.08 247.839) !important; + } +} diff --git a/app/decorators/message_decorator.rb b/app/decorators/message_decorator.rb index 51f008c..01fad73 100644 --- a/app/decorators/message_decorator.rb +++ b/app/decorators/message_decorator.rb @@ -4,4 +4,12 @@ module MessageDecorator def from super&.gsub(/@[a-zA-Z.\-]+/, '@...') end + + def first_line + body.lines.first&.strip + end + + def published_date + published_at.strftime('%Y/%m/%d') + end end diff --git a/app/javascript/controllers/message_list_controller.js b/app/javascript/controllers/message_list_controller.js new file mode 100644 index 0000000..06c9253 --- /dev/null +++ b/app/javascript/controllers/message_list_controller.js @@ -0,0 +1,17 @@ +import { Controller } from "@hotwired/stimulus" + +export default class extends Controller { + select(event) { + // Remove highlight from previously selected message + const previousSelected = this.element.querySelector('.message-selected') + if (previousSelected) { + previousSelected.classList.remove('message-selected') + } + + // Add highlight to clicked message + const messageElement = event.currentTarget + if (messageElement) { + messageElement.classList.add('message-selected') + } + } +} diff --git a/app/views/messages/_thread.html.erb b/app/views/messages/_thread.html.erb index 1655865..64c8f5e 100644 --- a/app/views/messages/_thread.html.erb +++ b/app/views/messages/_thread.html.erb @@ -1,6 +1,6 @@
data-controller="thread"<% end %>> <% if depth == 0 %> -
+ <%= link_to "/#{list.name}/#{message.list_seq}", class: 'message-item block bg-white dark:bg-gray-800 rounded-lg shadow-md border border-gray-200 dark:border-gray-700 overflow-hidden hover:shadow-lg transition-shadow', data: {turbo_frame: 'message_content', turbo_action: 'advance', action: 'click->message-list#select'} do %>
@@ -10,10 +10,12 @@ <% end %> - [#<%= message.list_seq %>] - <%= link_to without_list_prefix(message.subject), "/#{list.name}/#{message.list_seq}", data: {turbo_frame: 'message_content'} %> + [#<%= message.list_seq %>] <%= without_list_prefix(message.subject) %> — <%= message.from %> + <% if message.body.present? %> +

<%= message.first_line %>

+ <% end %>
@@ -21,25 +23,35 @@ <%= count = message.count_recursively %> <%= count == 1 ? 'message' : 'messages' %> + + + + + <%= message.published_date %> +
-
+ <% end %> <% else %> -
+ <%= link_to "/#{list.name}/#{message.list_seq}", class: 'message-item block py-2 border-l-2 border-gray-200 dark:border-gray-700 pl-4 hover:border-red-400 dark:hover:border-red-500 transition-colors', data: {turbo_frame: 'message_content', turbo_action: 'advance', action: 'click->message-list#select'} do %>
- <%= link_to "/#{list.name}/#{message.list_seq}", class: 'text-gray-900 dark:text-gray-100 hover:text-red-600 dark:hover:text-red-400 transition-colors', data: {turbo_frame: 'message_content'} do %> + [#<%= message.list_seq %>] <%= without_list_prefix(message.subject) %> - <% end %> + — <%= message.from %> + <%= message.published_date %> + <% if message.body.present? %> +

<%= message.first_line %>

+ <% end %>
-
+ <% end %> <% end %> <% if message.children&.any? %> diff --git a/app/views/messages/index.html.erb b/app/views/messages/index.html.erb index 7990fe0..e5b2ecb 100644 --- a/app/views/messages/index.html.erb +++ b/app/views/messages/index.html.erb @@ -11,7 +11,7 @@

Mailing list archive

-
+
<%= render partial: 'thread', collection: @messages, as: :message, locals: {list: @list, depth: 0} %>
diff --git a/test/fixtures/messages.yml b/test/fixtures/messages.yml index 426b835..853db18 100644 --- a/test/fixtures/messages.yml +++ b/test/fixtures/messages.yml @@ -6,6 +6,7 @@ message1: body: Body1 list_id: 1 list_seq: 123 + published_at: 1995-12-21 05:44:05 message2: subject: Mail2 @@ -13,3 +14,4 @@ message2: body: Body2 list_id: 2 list_seq: 234 + published_at: 1997-07-28 14:51:40