Skip to content

Commit f1b4391

Browse files
zoldarRobertJoonas
andauthored
Use assign instead of assign_async for pages breakdown query result (#5989)
* Use `assign` instead of `assign_async` for pages breakdown query result * fix imported warning * Ensure `handle_params` is triggered only once per navigation event --------- Co-authored-by: Robert Joonas <robertjoonas16@gmail.com>
1 parent 8d57489 commit f1b4391

File tree

5 files changed

+59
-84
lines changed

5 files changed

+59
-84
lines changed

assets/js/liveview/dashboard_root.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,15 @@ function navigateWithLoader(url) {
2121

2222
export default buildHook({
2323
initialize() {
24-
this.url = window.location.href
25-
2624
const portals = document.querySelectorAll('[data-phx-portal]')
2725
this.portalTargets = Array.from(portals, (p) => p.dataset.phxPortal)
26+
this.url = window.location.href
2827

2928
this.addListener('click', document.body, (e) => {
3029
const type = e.target.dataset.type || null
3130

3231
if (type === 'dashboard-link') {
33-
this.url = e.target.href
34-
const uri = new URL(this.url)
32+
const uri = new URL(e.target.href)
3533
// Domain is dropped from URL prefix, because that's what react-dom-router
3634
// expects.
3735
const path = '/' + uri.pathname.split('/').slice(2).join('/')
@@ -42,8 +40,6 @@ export default buildHook({
4240
})
4341
)
4442

45-
navigateWithLoader.bind(this)(this.url)
46-
4743
e.preventDefault()
4844
}
4945
})

lib/plausible_web/live/components/dashboard/imported_data_warnings.ex

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@ defmodule PlausibleWeb.Components.Dashboard.ImportedDataWarnings do
22
@moduledoc false
33

44
use PlausibleWeb, :component
5-
alias Phoenix.LiveView.AsyncResult
65
alias Plausible.Stats.QueryResult
76

87
def unsupported_filters(assigns) do
98
show? =
109
case assigns.query_result do
11-
%AsyncResult{result: %QueryResult{meta: meta}} ->
10+
%QueryResult{meta: meta} ->
1211
meta[:imports_skip_reason] == :unsupported_query
1312

1413
_ ->

lib/plausible_web/live/components/dashboard/report_list.ex

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -30,52 +30,47 @@ defmodule PlausibleWeb.Components.Dashboard.ReportList do
3030
col_min_width: @col_min_width
3131
)
3232

33-
if assigns.query_result.loading || !assigns.query_result.ok? do
34-
~H"""
35-
"""
36-
else
37-
%QueryResult{results: results, meta: meta, query: query} = assigns.query_result.result
38-
39-
assigns =
40-
assign(assigns,
41-
results: results,
42-
metric_keys: query[:metrics],
43-
metric_labels: meta[:metric_labels],
44-
empty?: Enum.empty?(results)
45-
)
46-
47-
~H"""
48-
<.no_data :if={@empty?} min_height={@min_height} data_test_id={@data_test_id} />
49-
50-
<div :if={not @empty?} class="h-full flex flex-col" data-test-id={@data_test_id}>
51-
<div style={"min-height: #{@row_height}px;"}>
52-
<.report_header
53-
key_label={@key_label}
54-
metric_labels={@metric_labels}
55-
col_min_width={@col_min_width}
56-
/>
57-
</div>
33+
%QueryResult{results: results, meta: meta, query: query} = assigns.query_result
5834

59-
<div class="grow" style={"min-height: #{@data_container_height}px;"}>
60-
<.report_row
61-
:for={{item, item_index} <- Enum.with_index(@results)}
62-
link_fn={assigns[:external_link_fn]}
63-
item={item}
64-
item_index={item_index}
65-
item_name={List.first(item.dimensions)}
66-
metrics={Enum.zip(@metric_keys, item.metrics)}
67-
bar_max_value={bar_max_value(@results, @metric_keys)}
68-
site={@site}
69-
params={@params}
70-
dimension={@dimension}
71-
row_height={@row_height}
72-
row_gap_height={@row_gap_height}
73-
col_min_width={@col_min_width}
74-
/>
75-
</div>
35+
assigns =
36+
assign(assigns,
37+
results: results,
38+
metric_keys: query[:metrics],
39+
metric_labels: meta[:metric_labels],
40+
empty?: Enum.empty?(results)
41+
)
42+
43+
~H"""
44+
<.no_data :if={@empty?} min_height={@min_height} data_test_id={@data_test_id} />
45+
46+
<div :if={not @empty?} class="h-full flex flex-col" data-test-id={@data_test_id}>
47+
<div style={"min-height: #{@row_height}px;"}>
48+
<.report_header
49+
key_label={@key_label}
50+
metric_labels={@metric_labels}
51+
col_min_width={@col_min_width}
52+
/>
7653
</div>
77-
"""
78-
end
54+
55+
<div class="grow" style={"min-height: #{@data_container_height}px;"}>
56+
<.report_row
57+
:for={{item, item_index} <- Enum.with_index(@results)}
58+
link_fn={assigns[:external_link_fn]}
59+
item={item}
60+
item_index={item_index}
61+
item_name={List.first(item.dimensions)}
62+
metrics={Enum.zip(@metric_keys, item.metrics)}
63+
bar_max_value={bar_max_value(@results, @metric_keys)}
64+
site={@site}
65+
params={@params}
66+
dimension={@dimension}
67+
row_height={@row_height}
68+
row_gap_height={@row_gap_height}
69+
col_min_width={@col_min_width}
70+
/>
71+
</div>
72+
</div>
73+
"""
7974
end
8075

8176
defp no_data(assigns) do

lib/plausible_web/live/dashboard/pages.ex

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -105,24 +105,22 @@ defmodule PlausibleWeb.Live.Dashboard.Pages do
105105
defp load_stats(socket) do
106106
%{active_tab: active_tab, site: site, params: params} = socket.assigns
107107

108-
assign_async(socket, :query_result, fn ->
109-
metrics = choose_metrics(params)
110-
dimension = get_tab_info(active_tab, :dimension)
111-
112-
params =
113-
params
114-
|> ParsedQueryParams.set(
115-
metrics: metrics,
116-
dimensions: [dimension],
117-
pagination: @pagination
118-
)
108+
metrics = choose_metrics(params)
109+
dimension = get_tab_info(active_tab, :dimension)
110+
111+
params =
112+
params
113+
|> ParsedQueryParams.set(
114+
metrics: metrics,
115+
dimensions: [dimension],
116+
pagination: @pagination
117+
)
119118

120-
query = QueryBuilder.build!(site, params)
119+
query = QueryBuilder.build!(site, params)
121120

122-
%QueryResult{} = query_result = Stats.query(site, query)
121+
%QueryResult{} = query_result = Stats.query(site, query)
123122

124-
{:ok, %{query_result: query_result}}
125-
end)
123+
assign(socket, :query_result, query_result)
126124
end
127125

128126
defp choose_metrics(%ParsedQueryParams{} = params) do

test/plausible_web/live/components/dashboard/report_list_test.exs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ defmodule PlausibleWeb.Components.Dashboard.ReportListTest do
44

55
alias PlausibleWeb.Components.Dashboard.ReportList
66
alias Plausible.Stats.{ParsedQueryParams, QueryResult}
7-
alias Phoenix.LiveView.AsyncResult
87
import Plausible.DashboardTestUtils
98

109
@report_list_selector ~s|[data-test-id="pages-report-list"]|
@@ -23,31 +22,19 @@ defmodule PlausibleWeb.Components.Dashboard.ReportListTest do
2322
{:ok, %{assigns: assigns}}
2423
end
2524

26-
test "renders empty when loading", %{assigns: assigns} do
27-
assigns = Keyword.put(assigns, :query_result, AsyncResult.loading())
28-
assert render_component(&ReportList.report/1, assigns) == ""
29-
end
30-
31-
test "renders empty when result not ok", %{assigns: assigns} do
32-
assigns =
33-
Keyword.put(assigns, :query_result, AsyncResult.failed(AsyncResult.loading(), :some_error))
34-
35-
assert render_component(&ReportList.report/1, assigns) == ""
36-
end
37-
3825
test "item bar width depends on visitors metric", %{assigns: assigns} do
39-
successful_async_result =
40-
AsyncResult.ok(%QueryResult{
26+
query_result =
27+
%QueryResult{
4128
results: [
4229
%{metrics: [100, 60.0], dimensions: ["/a"]},
4330
%{metrics: [70, 40.0], dimensions: ["/b"]},
4431
%{metrics: [30, 20.0], dimensions: ["/c"]}
4532
],
4633
meta: Jason.OrderedObject.new(metric_labels: ["Conversions", "CR"]),
4734
query: Jason.OrderedObject.new(metrics: [:visitors, :conversion_rate])
48-
})
35+
}
4936

50-
assigns = Keyword.put(assigns, :query_result, successful_async_result)
37+
assigns = Keyword.put(assigns, :query_result, query_result)
5138

5239
html = render_component(&ReportList.report/1, assigns)
5340

0 commit comments

Comments
 (0)