diff --git a/config/config.exs b/config/config.exs
index cd6eb52a7..7a6286caf 100644
--- a/config/config.exs
+++ b/config/config.exs
@@ -5,9 +5,7 @@ config :livebook, LivebookWeb.Endpoint,
url: [host: "localhost"],
secret_key_base: "9hHHeOiAA8wrivUfuS//jQMurHxoMYUtF788BQMx2KO7mYUE8rVrGGG09djBNQq7",
pubsub_server: Livebook.PubSub,
- live_view: [signing_salt: "mAPgPEM4"],
- # We are always in debug mode since we are executing code anyway
- debug_errors: true
+ live_view: [signing_salt: "mAPgPEM4"]
# Configures Elixir's Logger
config :logger, :console,
diff --git a/config/dev.exs b/config/dev.exs
index 77e2fea86..2dfb834e8 100644
--- a/config/dev.exs
+++ b/config/dev.exs
@@ -10,6 +10,7 @@ config :livebook, LivebookWeb.Endpoint,
# Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
http: [ip: {127, 0, 0, 1}, port: 4000],
code_reloader: true,
+ debug_errors: true,
check_origin: false,
watchers: [
node: [
diff --git a/lib/livebook_web/live/home_live.ex b/lib/livebook_web/live/home_live.ex
index d72014dae..21511af1a 100644
--- a/lib/livebook_web/live/home_live.ex
+++ b/lib/livebook_web/live/home_live.ex
@@ -17,13 +17,6 @@ defmodule LivebookWeb.HomeLive do
@impl true
def render(assigns) do
~L"""
- <%= if @live_action == :delete_session do %>
- <%= live_modal @socket, LivebookWeb.DeleteSessionComponent,
- id: :delete_session_modal,
- return_to: Routes.home_path(@socket, :page),
- session_summary: @session_summary %>
- <% end %>
-
<%= live_patch to: Routes.home_path(@socket, :page) do %>
@@ -92,7 +85,7 @@ defmodule LivebookWeb.HomeLive do
<% else %>
- <%= live_component @socket, LivebookWeb.SessionsComponent,
+ <%= live_component @socket, LivebookWeb.SessionLive.SessionsComponent,
id: "sessions_list",
session_summaries: @session_summaries %>
<% end %>
@@ -100,6 +93,13 @@ defmodule LivebookWeb.HomeLive do
+
+ <%= if @live_action == :delete_session do %>
+ <%= live_modal @socket, LivebookWeb.SessionLive.DeleteSessionComponent,
+ id: :delete_session_modal,
+ return_to: Routes.home_path(@socket, :page),
+ session_summary: @session_summary %>
+ <% end %>
"""
end
diff --git a/lib/livebook_web/live/delete_session_component.ex b/lib/livebook_web/live/home_live/delete_session_component.ex
similarity index 94%
rename from lib/livebook_web/live/delete_session_component.ex
rename to lib/livebook_web/live/home_live/delete_session_component.ex
index 53ce09ab8..3134614c1 100644
--- a/lib/livebook_web/live/delete_session_component.ex
+++ b/lib/livebook_web/live/home_live/delete_session_component.ex
@@ -1,4 +1,4 @@
-defmodule LivebookWeb.DeleteSessionComponent do
+defmodule LivebookWeb.SessionLive.DeleteSessionComponent do
use LivebookWeb, :live_component
alias Livebook.SessionSupervisor
diff --git a/lib/livebook_web/live/sessions_component.ex b/lib/livebook_web/live/home_live/sessions_component.ex
similarity index 96%
rename from lib/livebook_web/live/sessions_component.ex
rename to lib/livebook_web/live/home_live/sessions_component.ex
index 47c29cc8d..adf81c39f 100644
--- a/lib/livebook_web/live/sessions_component.ex
+++ b/lib/livebook_web/live/home_live/sessions_component.ex
@@ -1,4 +1,4 @@
-defmodule LivebookWeb.SessionsComponent do
+defmodule LivebookWeb.SessionLive.SessionsComponent do
use LivebookWeb, :live_component
@impl true
diff --git a/lib/livebook_web/live/session_live.ex b/lib/livebook_web/live/session_live.ex
index 7d5d1f81c..4d6d1b8ef 100644
--- a/lib/livebook_web/live/session_live.ex
+++ b/lib/livebook_web/live/session_live.ex
@@ -47,30 +47,6 @@ defmodule LivebookWeb.SessionLive do
@impl true
def render(assigns) do
~L"""
- <%= if @live_action == :settings do %>
- <%= live_modal @socket, LivebookWeb.SessionLive.SettingsComponent,
- id: :settings_modal,
- return_to: Routes.session_path(@socket, :page, @session_id),
- tab: @tab,
- session_id: @session_id,
- data_view: @data_view %>
- <% end %>
-
- <%= if @live_action == :shortcuts do %>
- <%= live_modal @socket, LivebookWeb.SessionLive.ShortcutsComponent,
- id: :shortcuts_modal,
- platform: @platform,
- return_to: Routes.session_path(@socket, :page, @session_id) %>
- <% end %>
-
- <%= if @live_action == :cell_settings do %>
- <%= live_modal @socket, LivebookWeb.SessionLive.CellSettingsComponent,
- id: :cell_settings_modal,
- session_id: @session_id,
- cell: @cell,
- return_to: Routes.session_path(@socket, :page, @session_id) %>
- <% end %>
-
<% end %>
<%= for {section_view, index} <- Enum.with_index(@data_view.section_views) do %>
- <%= live_component @socket, LivebookWeb.SectionComponent,
+ <%= live_component @socket, LivebookWeb.SessionLive.SectionComponent,
id: section_view.id,
index: index,
session_id: @session_id,
@@ -157,6 +133,30 @@ defmodule LivebookWeb.SessionLive do
data_view: @data_view %>
+
+ <%= if @live_action == :settings do %>
+ <%= live_modal @socket, LivebookWeb.SessionLive.SettingsComponent,
+ id: :settings_modal,
+ return_to: Routes.session_path(@socket, :page, @session_id),
+ tab: @tab,
+ session_id: @session_id,
+ data_view: @data_view %>
+ <% end %>
+
+ <%= if @live_action == :shortcuts do %>
+ <%= live_modal @socket, LivebookWeb.SessionLive.ShortcutsComponent,
+ id: :shortcuts_modal,
+ platform: @platform,
+ return_to: Routes.session_path(@socket, :page, @session_id) %>
+ <% end %>
+
+ <%= if @live_action == :cell_settings do %>
+ <%= live_modal @socket, LivebookWeb.SessionLive.CellSettingsComponent,
+ id: :cell_settings_modal,
+ session_id: @session_id,
+ cell: @cell,
+ return_to: Routes.session_path(@socket, :page, @session_id) %>
+ <% end %>
"""
end
diff --git a/lib/livebook_web/live/cell_component.ex b/lib/livebook_web/live/session_live/cell_component.ex
similarity index 99%
rename from lib/livebook_web/live/cell_component.ex
rename to lib/livebook_web/live/session_live/cell_component.ex
index 073c44fdb..432ab1f42 100644
--- a/lib/livebook_web/live/cell_component.ex
+++ b/lib/livebook_web/live/session_live/cell_component.ex
@@ -1,4 +1,4 @@
-defmodule LivebookWeb.CellComponent do
+defmodule LivebookWeb.SessionLive.CellComponent do
use LivebookWeb, :live_component
def render(assigns) do
diff --git a/lib/livebook_web/live/insert_buttons_component.ex b/lib/livebook_web/live/session_live/insert_buttons_component.ex
similarity index 94%
rename from lib/livebook_web/live/insert_buttons_component.ex
rename to lib/livebook_web/live/session_live/insert_buttons_component.ex
index 8234f38de..ec3f2e125 100644
--- a/lib/livebook_web/live/insert_buttons_component.ex
+++ b/lib/livebook_web/live/session_live/insert_buttons_component.ex
@@ -1,4 +1,4 @@
-defmodule LivebookWeb.InsertButtonsComponent do
+defmodule LivebookWeb.SessionLive.InsertButtonsComponent do
use LivebookWeb, :live_component
def render(assigns) do
diff --git a/lib/livebook_web/live/section_component.ex b/lib/livebook_web/live/session_live/section_component.ex
similarity index 87%
rename from lib/livebook_web/live/section_component.ex
rename to lib/livebook_web/live/session_live/section_component.ex
index 4a70750af..e774e9616 100644
--- a/lib/livebook_web/live/section_component.ex
+++ b/lib/livebook_web/live/session_live/section_component.ex
@@ -1,4 +1,4 @@
-defmodule LivebookWeb.SectionComponent do
+defmodule LivebookWeb.SessionLive.SectionComponent do
use LivebookWeb, :live_component
def render(assigns) do
@@ -27,18 +27,18 @@ defmodule LivebookWeb.SectionComponent do
<%= for {cell_view, index} <- Enum.with_index(@section_view.cell_views) do %>
- <%= live_component @socket, LivebookWeb.InsertButtonsComponent,
+ <%= live_component @socket, LivebookWeb.SessionLive.InsertButtonsComponent,
id: "#{@section_view.id}:#{index}",
persistent: false,
section_id: @section_view.id,
insert_cell_index: index,
insert_section_index: nil %>
- <%= live_component @socket, LivebookWeb.CellComponent,
+ <%= live_component @socket, LivebookWeb.SessionLive.CellComponent,
id: cell_view.id,
session_id: @session_id,
cell_view: cell_view %>
<% end %>
- <%= live_component @socket, LivebookWeb.InsertButtonsComponent,
+ <%= live_component @socket, LivebookWeb.SessionLive.InsertButtonsComponent,
id: "#{@section_view.id}:last",
persistent: @section_view.cell_views == [],
section_id: @section_view.id,
diff --git a/lib/livebook_web/templates/error/404.html.eex b/lib/livebook_web/templates/error/404.html.eex
new file mode 100644
index 000000000..114a8e116
--- /dev/null
+++ b/lib/livebook_web/templates/error/404.html.eex
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+ <%= live_title_tag "Livebook" %>
+
"/>
+
+
+
+
+
+
+
+
+ No Numbats here!
+
+
+
+
+
diff --git a/lib/livebook_web/templates/error/500.html.eex b/lib/livebook_web/templates/error/500.html.eex
new file mode 100644
index 000000000..70825812b
--- /dev/null
+++ b/lib/livebook_web/templates/error/500.html.eex
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ <%= live_title_tag "Livebook" %>
+
"/>
+
+
+
+
+
+
+
+
+ Something went wrong.
+
+
+ Check out the console for logs for more information.
+
+
+
+
+
diff --git a/lib/livebook_web/views/error_view.ex b/lib/livebook_web/views/error_view.ex
new file mode 100644
index 000000000..787bed1d5
--- /dev/null
+++ b/lib/livebook_web/views/error_view.ex
@@ -0,0 +1,7 @@
+defmodule LivebookWeb.ErrorView do
+ use LivebookWeb, :view
+
+ def template_not_found(_template, assigns) do
+ render("500.html", assigns)
+ end
+end