@@ -80,6 +80,20 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
8080 label = "Funnel name "
8181 />
8282
83+ < div class = "mt-6 flex items-center justify-between gap-4 " >
84+ < span class = "text-sm font-medium text-gray-900 dark:text-gray-100 " >
85+ Allow other steps between funnel steps
86+ </ span >
87+ < div class = "flex items-center gap-3 " >
88+ < . toggle_switch
89+ id = "toggle-strict-order "
90+ id_suffix = "switch "
91+ checked = { ! @ strict_order? }
92+ phx-click = "toggle-strict-order "
93+ />
94+ </ div >
95+ </ div >
96+
8397 < div id = "steps-builder " class = "mt-6 " >
8498 < . label >
8599 Funnel steps
@@ -232,7 +246,16 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
232246 assign ( socket , step_ids: step_ids , selections_made: selections_made , funnel_modified?: true ) }
233247 end
234248
249+ def handle_event ( "toggle-strict-order" , _params , socket ) do
250+ strict_order? = ! socket . assigns . strict_order?
251+ send ( self ( ) , :evaluate_funnel )
252+
253+ { :noreply , assign ( socket , strict_order?: strict_order? ) }
254+ end
255+
235256 def handle_event ( "validate" , % { "funnel" => params } , socket ) do
257+ strict_order? = socket . assigns . strict_order?
258+
236259 steps_from_assigns =
237260 socket . assigns . step_ids
238261 |> Enum . reduce ( [ ] , fn step_id , acc ->
@@ -245,7 +268,8 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
245268 socket . assigns . site
246269 |> Funnels . create_changeset (
247270 params [ "name" ] ,
248- steps_from_assigns
271+ steps_from_assigns ,
272+ strict_order?: strict_order?
249273 )
250274 |> Map . put ( :action , :validate )
251275
@@ -255,17 +279,17 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
255279 def handle_event (
256280 "save" ,
257281 % { "funnel" => params } ,
258- % { assigns: % { site: site , funnel: funnel } } = socket
282+ % { assigns: % { site: site , funnel: funnel , strict_order?: strict_order? } } = socket
259283 ) do
260284 steps = Enum . map ( params [ "steps" ] , fn { _idx , payload } -> payload end )
261285
262286 save_fn =
263287 case funnel do
264288 % Plausible.Funnel { } ->
265- fn -> Funnels . update ( funnel , params [ "name" ] , steps ) end
289+ fn -> Funnels . update ( funnel , params [ "name" ] , steps , strict_order?: strict_order? ) end
266290
267291 nil ->
268- fn -> Funnels . create ( site , params [ "name" ] , steps ) end
292+ fn -> Funnels . create ( site , params [ "name" ] , steps , strict_order?: strict_order? ) end
269293 end
270294
271295 case save_fn . ( ) do
@@ -314,11 +338,13 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
314338 % {
315339 assigns: % {
316340 site: site ,
317- selections_made: selections_made
341+ selections_made: selections_made ,
342+ strict_order?: strict_order?
318343 }
319344 } = socket
320345 ) do
321- with { :ok , { definition , query } } <- build_ephemeral_funnel ( site , selections_made ) ,
346+ with { :ok , { definition , query } } <-
347+ build_ephemeral_funnel ( site , selections_made , strict_order?: strict_order? ) ,
322348 { :ok , funnel } <- Plausible.Stats . funnel ( site , query , definition ) do
323349 assign ( socket , evaluation_result: funnel )
324350 else
@@ -327,7 +353,7 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
327353 end
328354 end
329355
330- defp build_ephemeral_funnel ( site , selections_made ) do
356+ defp build_ephemeral_funnel ( site , selections_made , opts ) do
331357 steps =
332358 selections_made
333359 |> Enum . sort_by ( & elem ( & 1 , 0 ) )
@@ -346,7 +372,8 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
346372 Funnels . ephemeral_definition (
347373 site ,
348374 "Test funnel" ,
349- steps
375+ steps ,
376+ opts
350377 )
351378
352379 query =
@@ -417,7 +444,8 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
417444 funnel
418445 |> Funnels . edit_changeset (
419446 funnel . name ,
420- Enum . map ( funnel . steps , & % { goal_id: & 1 . goal . id } )
447+ Enum . map ( funnel . steps , & % { goal_id: & 1 . goal . id } ) ,
448+ strict_order?: funnel . strict_order
421449 )
422450 |> to_form ( )
423451
@@ -431,6 +459,7 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
431459 socket ,
432460 form: form ,
433461 funnel: funnel ,
462+ strict_order?: funnel . strict_order ,
434463 funnel_modified?: false ,
435464 selections_made: selections_made ,
436465 step_ids: Enum . to_list ( 1 .. Enum . count ( funnel . steps ) )
@@ -446,6 +475,7 @@ defmodule PlausibleWeb.Live.FunnelSettings.Form do
446475 socket ,
447476 form: form ,
448477 funnel: nil ,
478+ strict_order?: false ,
449479 funnel_modified?: false ,
450480 selections_made: Map . new ( ) ,
451481 step_ids: Enum . to_list ( 1 .. Funnel . min_steps ( ) )
0 commit comments