Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions lib/error_tracker.ex
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,17 @@ defmodule ErrorTracker do
occurrence
end

@doc """
Delete an existing error.

"""
def delete(error) do
with {:ok} <- Repo.delete(error) do
Telemetry.delete_error(error)
{:ok, error}
end
end

@doc """
Marks an error as resolved.

Expand Down
4 changes: 4 additions & 0 deletions lib/error_tracker/repo.ex
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ defmodule ErrorTracker.Repo do
dispatch(:get!, [queryable, id], opts)
end

def delete(changeset, opts \\ []) do
dispatch(:delete, [changeset], opts)
end

def one(queryable, opts \\ []) do
dispatch(:one, [queryable], opts)
end
Expand Down
10 changes: 10 additions & 0 deletions lib/error_tracker/telemetry.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ defmodule ErrorTracker.Telemetry do
* `[:error_tracker, :error, :new]`: is emitted when a new error is stored and
no previous occurrences were known.

* `[:error_tracker, :error, :delete]`: is emitted when an existing error is deleted

* `[:error_tracker, :error, :resolved]`: is emitted when a new error is marked
as resolved on the UI.

Expand All @@ -34,6 +36,7 @@ defmodule ErrorTracker.Telemetry do
| event | measures | metadata |
| --------------------------------------- | -------------- | ------------- |
| `[:error_tracker, :error, :new]` | `:system_time` | `:error` |
| `[:error_tracker, :error, :delete]` | `:system_time` | `:error` |
| `[:error_tracker, :error, :unresolved]` | `:system_time` | `:error` |
| `[:error_tracker, :error, :resolved]` | `:system_time` | `:error` |
| `[:error_tracker, :occurrence, :new]` | `:system_time` | `:occurrence` |
Expand All @@ -46,6 +49,13 @@ defmodule ErrorTracker.Telemetry do
:telemetry.execute([:error_tracker, :error, :new], measurements, metadata)
end

@doc false
def delete_error(error) do
measurements = %{system_time: System.system_time()}
metadata = %{error: error}
:telemetry.execute([:error_tracker, :error, :delete], measurements, metadata)
end

@doc false
def unresolved_error(error) do
measurements = %{system_time: System.system_time()}
Expand Down
2 changes: 1 addition & 1 deletion lib/error_tracker/web/components/core_components.ex
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ defmodule ErrorTracker.Web.CoreComponents do

~H"""
<span
class={["text-sm font-medium me-2 py-1 px-2 rounded-lg ring-1 ring-inset", @color_class]}
class={["text-sm font-medium me-2 py-2 px-3 rounded-lg ring-1 ring-inset", @color_class]}
{@rest}
>
<%= render_slot(@inner_block) %>
Expand Down
10 changes: 10 additions & 0 deletions lib/error_tracker/web/live/dashboard.ex
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,16 @@ defmodule ErrorTracker.Web.Live.Dashboard do
{:noreply, paginate_errors(socket)}
end

@impl Phoenix.LiveView
def handle_event("delete", %{"error_id" => id}, socket) do
error = Repo.get(Error, id)
Repo.delete(error)

{:ok} = ErrorTracker.delete(error)

{:noreply, paginate_errors(socket)}
end

defp paginate_errors(socket) do
%{page: page, search: search} = socket.assigns

Expand Down
52 changes: 32 additions & 20 deletions lib/error_tracker/web/live/dashboard.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@
<table class="w-full text-sm text-left rtl:text-right text-gray-400 table-fixed">
<thead class="text-xs uppercase bg-gray-900">
<tr>
<th scope="col" class="px-4 pr-2 py-3 w-128">Error</th>
<th scope="col" class="px-4 py-3 w-72">Occurrences</th>
<th scope="col" class="px-4 py-3 w-28">Status</th>
<th scope="col" class="px-4 py-3 w-32"></th>
<th scope="col" class="px-4 pr-2 py-3 w-72">Error</th>
<th scope="col" class="px-4 py-3 w-32">Occurrences</th>
<th scope="col" class="px-4 py-3 w-28 text-center">Status</th>
<th scope="col" class="px-4 py-3 w-32 text-center">Actions</th>
</tr>
</thead>
<tbody>
Expand Down Expand Up @@ -80,25 +80,37 @@
<p>Total: <%= @occurrences[error.id] %></p>
</td>
<td class="px-4 py-4">
<.badge :if={error.status == :resolved} color={:green}>Resolved</.badge>
<.badge :if={error.status == :unresolved} color={:red}>Unresolved</.badge>
<div class="flex justify-center">
<.badge :if={error.status == :resolved} color={:green}>Resolved</.badge>
<.badge :if={error.status == :unresolved} color={:red}>Unresolved</.badge>
</div>
</td>
<td class="px-4 py-4 text-center">
<.button
:if={error.status == :unresolved}
phx-click="resolve"
phx-value-error_id={error.id}
>
Resolve
</.button>
<div class="flex justify-between">
<.button
:if={error.status == :unresolved}
phx-click="resolve"
phx-value-error_id={error.id}
>
Resolve
</.button>

<.button
:if={error.status == :resolved}
phx-click="unresolve"
phx-value-error_id={error.id}
>
Unresolve
</.button>
<.button
:if={error.status == :resolved}
phx-click="unresolve"
phx-value-error_id={error.id}
>
Unresolve
</.button>

<button
class="rounded-lg bg-red-400 hover:bg-red-600 py-2 px-4 text-sm text-white active:text-white/80"
phx-click="delete"
phx-value-error_id={error.id}
>
Delete
</button>
</div>
</td>
</tr>
</tbody>
Expand Down
7 changes: 7 additions & 0 deletions lib/error_tracker/web/live/show.ex
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,13 @@ defmodule ErrorTracker.Web.Live.Show do
{:noreply, assign(socket, :error, updated_error)}
end

@impl Phoenix.LiveView
def handle_event("delete", _params, socket) do
error = Repo.get!(Error, socket.assigns.error.id)
{:ok, _} = Repo.delete(error)
{:noreply, redirect(socket, to: dashboard_path(socket))}
end

defp load_related_occurrences(socket) do
current_occurrence = socket.assigns.occurrence
base_query = Ecto.assoc(socket.assigns.error, :occurrences)
Expand Down
10 changes: 10 additions & 0 deletions lib/error_tracker/web/live/show.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -106,5 +106,15 @@
Mark as unresolved
</.button>
</.section>

<.section>
<button
class="phx-submit-loading:opacity-75 rounded-lg bg-red-400 hover:bg-red-600 py-2 px-4 text-sm text-white active:text-white/80"
phx-click="delete"
phx-value-error_id={@error.id}
>
Delete
</button>
</.section>
</div>
</div>
19 changes: 14 additions & 5 deletions priv/static/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -849,6 +849,10 @@ select {
display: inline-block;
}

.inline {
display: inline;
}

.flex {
display: flex;
}
Expand Down Expand Up @@ -1054,6 +1058,11 @@ select {
background-color: rgb(88 28 135 / var(--tw-bg-opacity));
}

.bg-red-400 {
--tw-bg-opacity: 1;
background-color: rgb(248 113 113 / var(--tw-bg-opacity));
}

.bg-red-400\/10 {
background-color: rgb(248 113 113 / 0.1);
}
Expand Down Expand Up @@ -1095,11 +1104,6 @@ select {
padding-right: 1rem;
}

.py-1 {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
}

.py-2 {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
Expand Down Expand Up @@ -1332,6 +1336,11 @@ select {
background-color: rgb(31 41 55 / 0.6);
}

.hover\:bg-red-600:hover {
--tw-bg-opacity: 1;
background-color: rgb(220 38 38 / var(--tw-bg-opacity));
}

.hover\:bg-sky-700:hover {
--tw-bg-opacity: 1;
background-color: rgb(3 105 161 / var(--tw-bg-opacity));
Expand Down
9 changes: 9 additions & 0 deletions test/error_tracker_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,15 @@ defmodule ErrorTrackerTest do
end
end

describe inspect(&ErrorTracker.delete/1) do
test "deletes an exisiting error" do
error = report_error(fn -> raise "This is a test" end)

assert {:ok, deleted_error} = ErrorTracker.delete(error)
assert deleted_error.id == error.id
end
end

describe inspect(&ErrorTracker.resolve/1) do
test "marks the error as resolved" do
%Occurrence{error: error} = report_error(fn -> raise "This is a test" end)
Expand Down