Skip to content

Commit d2ac64a

Browse files
committed
Show threads list on messages#show action as well
1 parent de62d13 commit d2ac64a

File tree

5 files changed

+39
-11
lines changed

5 files changed

+39
-11
lines changed

app/controllers/messages_controller.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ def index(list_name: nil, yyyymm: nil, q: nil, page: nil)
2222
def show(list_name:, list_seq:)
2323
@list = List.find_by_name(list_name)
2424
@message = Message.find_by!(list_id: @list, list_seq: list_seq)
25+
26+
# If this is a turbo frame request, just render the message
27+
return if turbo_frame_request?
28+
29+
render_threads yyyymm: @message.published_at.strftime('%Y%m')
2530
end
2631

2732
private

app/javascript/controllers/message_list_controller.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
import { Controller } from "@hotwired/stimulus"
22

33
export default class extends Controller {
4+
connect() {
5+
// Scroll to selected message on page load, with a delay to ensure threads are expanded
6+
setTimeout(() => {
7+
const selected = this.element.querySelector('.message-selected')
8+
if (selected) {
9+
selected.scrollIntoView({behavior: 'smooth', block: 'center'})
10+
}
11+
}, 100)
12+
}
13+
414
select(event) {
515
// Remove highlight from previously selected message
616
const previousSelected = this.element.querySelector('.message-selected')

app/javascript/controllers/thread_controller.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,17 @@ export default class extends Controller {
55
static targets = ["children", "icon"]
66

77
connect() {
8-
// Initially hide children
8+
// Initially hide children unless one is selected
99
if (this.hasChildrenTarget) {
10-
this.childrenTarget.classList.add("hidden")
10+
const hasSelectedChild = this.childrenTarget.querySelector('.message-selected')
11+
if (hasSelectedChild) {
12+
// Keep expanded and rotate icon
13+
if (this.hasIconTarget) {
14+
this.iconTarget.classList.add("rotate-90")
15+
}
16+
} else {
17+
this.childrenTarget.classList.add("hidden")
18+
}
1119
}
1220
}
1321

app/views/messages/_thread.html.erb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<div class="thread-message" style="margin-left: <%= depth * 6 %>px;" <% if (depth == 0) && message.children&.any? %>data-controller="thread"<% end %>>
2+
<% selected = defined?(@message) && @message&.id == message.id %>
23
<% if depth == 0 %>
3-
<%= link_to [list, message], 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 %>
4+
<%= link_to [list, message], 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#{' message-selected' if selected}", data: {turbo_frame: 'message_content', turbo_action: 'advance', action: 'click->message-list#select'} do %>
45
<div class="p-5">
56
<div class="flex items-start justify-between gap-4">
67
<div class="flex-1 min-w-0">
@@ -35,7 +36,7 @@
3536
</div>
3637
<% end %>
3738
<% else %>
38-
<%= link_to [list, message], 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 %>
39+
<%= link_to [list, message], 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#{' message-selected' if selected}", data: {turbo_frame: 'message_content', turbo_action: 'advance', action: 'click->message-list#select'} do %>
3940
<div class="flex items-start gap-2 text-sm">
4041
<svg class="w-4 h-4 text-gray-400 dark:text-gray-500 mt-0.5 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
4142
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 10h10a8 8 0 018 8v2M3 10l6 6m-6-6l6-6"></path>

app/views/messages/index.html.erb

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,18 @@
4242

4343
<div class="col-span-3 overflow-y-auto">
4444
<%= turbo_frame_tag "message_content", class: "block" do %>
45-
<div class="flex items-center justify-center h-full text-gray-400 dark:text-gray-500">
46-
<div class="text-center">
47-
<svg class="w-16 h-16 mx-auto mb-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
48-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
49-
</svg>
50-
<p>Select a message to view</p>
45+
<% if @message %>
46+
<%= render @message %>
47+
<% else %>
48+
<div class="flex items-center justify-center h-full text-gray-400 dark:text-gray-500">
49+
<div class="text-center">
50+
<svg class="w-16 h-16 mx-auto mb-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
51+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
52+
</svg>
53+
<p>Select a message to view</p>
54+
</div>
5155
</div>
52-
</div>
56+
<% end %>
5357
<% end %>
5458
</div>
5559
</div>

0 commit comments

Comments
 (0)