@@ -27,6 +27,7 @@ defmodule LiveDebugger.App.Debugger.CallbackTracing.Web.GlobalTracesLive do
2727 alias LiveDebugger.Structs.LvProcess
2828 alias LiveDebugger.Bus
2929 alias LiveDebugger.App.Debugger.Events.DeadViewModeEntered
30+ alias LiveDebugger.App.Debugger.Web.Components.Pages
3031
3132 @ live_stream_limit 128
3233 @ page_size 25
@@ -35,12 +36,18 @@ defmodule LiveDebugger.App.Debugger.CallbackTracing.Web.GlobalTracesLive do
3536 attr ( :id , :string , required: true )
3637 attr ( :lv_process , LvProcess , required: true )
3738 attr ( :class , :string , default: "" , doc: "CSS class for the container" )
39+ attr ( :url , :string , required: true )
40+ attr ( :inspect_mode? , :boolean , required: true )
41+ attr ( :return_link , :string , required: true )
3842
3943 def live_render ( assigns ) do
4044 session = % {
4145 "id" => assigns . id ,
4246 "lv_process" => assigns . lv_process ,
43- "parent_pid" => self ( )
47+ "url" => assigns . url ,
48+ "parent_pid" => self ( ) ,
49+ "inspect_mode?" => assigns . inspect_mode? ,
50+ "return_link" => assigns . return_link
4451 }
4552
4653 assigns = assign ( assigns , session: session )
@@ -57,7 +64,14 @@ defmodule LiveDebugger.App.Debugger.CallbackTracing.Web.GlobalTracesLive do
5764 @ impl true
5865 def mount (
5966 _params ,
60- % { "parent_pid" => parent_pid , "lv_process" => lv_process , "id" => id } ,
67+ % {
68+ "parent_pid" => parent_pid ,
69+ "lv_process" => lv_process ,
70+ "id" => id ,
71+ "url" => url ,
72+ "inspect_mode?" => inspect_mode? ,
73+ "return_link" => return_link
74+ } ,
6175 socket
6276 ) do
6377 if connected? ( socket ) do
@@ -76,7 +90,10 @@ defmodule LiveDebugger.App.Debugger.CallbackTracing.Web.GlobalTracesLive do
7690 traces_continuation: nil ,
7791 sidebar_hidden?: true ,
7892 trace_search_phrase: "" ,
79- node_id: nil
93+ node_id: nil ,
94+ url: url ,
95+ inspect_mode?: inspect_mode? ,
96+ return_link: return_link
8097 )
8198 |> stream ( :existing_traces , [ ] , reset: true )
8299 |> put_private ( :page_size , @ page_size )
@@ -100,76 +117,84 @@ defmodule LiveDebugger.App.Debugger.CallbackTracing.Web.GlobalTracesLive do
100117 @ impl true
101118 def render ( assigns ) do
102119 ~H"""
103- < div class = "grow p-8 overflow-y-auto scrollbar-main " >
104- < div class = "w-full min-w-[25rem] max-w-screen-2xl mx-auto " >
105- < div class = "flex flex-col gap-1.5 pb-6 px-0.5 " >
106- < . h1 > Global Callback Traces</ . h1 >
107- < span class = "text-secondary-text " >
108- This view lists all callbacks inside debugged LiveView and its LiveComponents
109- </ span >
110- </ div >
111- < div class = "@container/traces w-full min-w-[20rem] flex flex-col pt-2 shadow-custom rounded-sm bg-surface-0-bg border border-default-border " >
112- < div class = "w-full flex justify-between items-center border-b border-default-border pb-2 " >
113- < div class = "ml-2 " >
114- < HookComponents.SearchInput . render
115- disabled? = { @ tracing_started? }
116- trace_search_phrase = { @ trace_search_phrase }
117- />
118- </ div >
119- < div class = "flex gap-2 items-center h-8 px-2 " >
120- < HookComponents.ToggleTracingButton . render
121- tracing_started? = { @ tracing_started? }
122- lv_process_alive? = { @ lv_process . alive? }
123- />
124- <%= if not @ tracing_started? do %>
125- < . global_traces_dropdown_menu class = "@[30rem]/traces:hidden " />
126-
127- < div class = "hidden @[30rem]/traces:flex gap-2 " >
128- < HookComponents.RefreshButton . render display_mode = { :normal } />
129- < HookComponents.ClearButton . render display_mode = { :normal } />
130- </ div >
131- <% end %>
132- </ div >
120+ < div class = "flex flex-col h-full overflow-x-auto w-full " >
121+ < Pages . navbar_menu
122+ url = { @ url }
123+ return_link = { @ return_link }
124+ inspect_mode? = { @ inspect_mode? }
125+ lv_process = { @ lv_process }
126+ />
127+ < div class = "grow p-8 overflow-y-auto scrollbar-main " >
128+ < div class = "w-full min-w-[25rem] max-w-screen-2xl mx-auto " >
129+ < div class = "flex flex-col gap-1.5 pb-6 px-0.5 " >
130+ < . h1 > Global Callback Traces</ . h1 >
131+ < span class = "text-secondary-text " >
132+ This view lists all callbacks inside debugged LiveView and its LiveComponents
133+ </ span >
133134 </ div >
134- < div class = "flex flex-1 overflow-auto rounded-sm bg-surface-0-bg p-4 " >
135- < div class = "w-full h-full flex flex-col gap-4 " >
136- < HookComponents.Stream . render
137- id = { @ id }
138- existing_traces_status = { @ existing_traces_status }
139- existing_traces = { @ streams . existing_traces }
140- >
141- <: trace :let = { { id , trace_display } } >
142- < HookComponents.TraceWrapper . render id = { id } trace_display = { trace_display } >
143- <: label >
144- < . trace_label
145- id = { id <> "-label" }
146- trace_display = { trace_display }
147- search_phrase = { @ trace_search_phrase }
148- short_content_full? = { true }
149- show_subtitle? = { true }
150- />
151- </: label >
152-
153- <: body >
154- < . trace_body
155- id = { id <> "-body" }
156- trace_display = { trace_display }
157- search_phrase = { @ trace_search_phrase }
158- />
159- </: body >
160- </ HookComponents.TraceWrapper . render >
161- </: trace >
162- </ HookComponents.Stream . render >
163- < HookComponents.LoadMoreButton . render
164- :if = { not @ tracing_started? and not @ traces_empty? }
165- traces_continuation = { @ traces_continuation }
166- />
167- < . trace_fullscreen
168- :if = { @ displayed_trace }
169- id = "trace-fullscreen "
170- displayed_trace = { @ displayed_trace }
171- search_phrase = { @ trace_search_phrase }
172- />
135+ < div class = "@container/traces w-full min-w-[20rem] flex flex-col pt-2 shadow-custom rounded-sm bg-surface-0-bg border border-default-border " >
136+ < div class = "w-full flex justify-between items-center border-b border-default-border pb-2 " >
137+ < div class = "ml-2 " >
138+ < HookComponents.SearchInput . render
139+ disabled? = { @ tracing_started? }
140+ trace_search_phrase = { @ trace_search_phrase }
141+ />
142+ </ div >
143+ < div class = "flex gap-2 items-center h-8 px-2 " >
144+ < HookComponents.ToggleTracingButton . render
145+ tracing_started? = { @ tracing_started? }
146+ lv_process_alive? = { @ lv_process . alive? }
147+ />
148+ <%= if not @ tracing_started? do %>
149+ < . global_traces_dropdown_menu class = "@[30rem]/traces:hidden " />
150+
151+ < div class = "hidden @[30rem]/traces:flex gap-2 " >
152+ < HookComponents.RefreshButton . render display_mode = { :normal } />
153+ < HookComponents.ClearButton . render display_mode = { :normal } />
154+ </ div >
155+ <% end %>
156+ </ div >
157+ </ div >
158+ < div class = "flex flex-1 overflow-auto rounded-sm bg-surface-0-bg p-4 " >
159+ < div class = "w-full h-full flex flex-col gap-4 " >
160+ < HookComponents.Stream . render
161+ id = { @ id }
162+ existing_traces_status = { @ existing_traces_status }
163+ existing_traces = { @ streams . existing_traces }
164+ >
165+ <: trace :let = { { id , trace_display } } >
166+ < HookComponents.TraceWrapper . render id = { id } trace_display = { trace_display } >
167+ <: label >
168+ < . trace_label
169+ id = { id <> "-label" }
170+ trace_display = { trace_display }
171+ search_phrase = { @ trace_search_phrase }
172+ short_content_full? = { true }
173+ show_subtitle? = { true }
174+ />
175+ </: label >
176+
177+ <: body >
178+ < . trace_body
179+ id = { id <> "-body" }
180+ trace_display = { trace_display }
181+ search_phrase = { @ trace_search_phrase }
182+ />
183+ </: body >
184+ </ HookComponents.TraceWrapper . render >
185+ </: trace >
186+ </ HookComponents.Stream . render >
187+ < HookComponents.LoadMoreButton . render
188+ :if = { not @ tracing_started? and not @ traces_empty? }
189+ traces_continuation = { @ traces_continuation }
190+ />
191+ < . trace_fullscreen
192+ :if = { @ displayed_trace }
193+ id = "trace-fullscreen "
194+ displayed_trace = { @ displayed_trace }
195+ search_phrase = { @ trace_search_phrase }
196+ />
197+ </ div >
173198 </ div >
174199 </ div >
175200 </ div >
@@ -195,4 +220,13 @@ defmodule LiveDebugger.App.Debugger.CallbackTracing.Web.GlobalTracesLive do
195220 end
196221
197222 def handle_info ( _ , socket ) , do: { :noreply , socket }
223+
224+ @ impl true
225+ def handle_event ( "switch-inspect-mode" , _ , socket ) do
226+ send ( socket . assigns . parent_pid , :switch_inspect_mode )
227+
228+ socket
229+ |> assign ( :inspect_mode? , ! socket . assigns . inspect_mode? )
230+ |> noreply ( )
231+ end
198232end
0 commit comments