New bin modal (#997)

* New empty bin modal

* New bin modal

* Smaller buttons

* Conditional rendering improvements
This commit is contained in:
Cristine Guadelupe 2022-02-11 09:49:00 -03:00 committed by GitHub
parent fb0c96fa99
commit 2f9dd73a7b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -36,21 +36,16 @@ defmodule LivebookWeb.SessionLive.BinComponent do
Bin
</h3>
<div class="w-full flex-col space-y-5">
<p class="text-gray-700">
Here you can find all the deleted cells from this notebook session.
<div class="flex justify-between items-center">
<p class="text-gray-700 basis-4/5">
Find all your deleted cells from this notebook session
</p>
<%= if @bin_entries == [] do %>
<div class="p-5 flex space-x-4 items-center border border-gray-200 rounded-lg">
<div>
<.remix_icon icon="windy-line" class="text-gray-400 text-xl" />
</div>
<div class="text-gray-600">
There are currently no cells in the bin.
</div>
</div>
<% else %>
<form phx-change="search" onsubmit="return false" phx-target={@myself}>
<input class="input"
<%= if @bin_entries != [] do %>
<form phx-change="search" onsubmit="return false" phx-target={@myself} class="mt-1 relative">
<span class="absolute inset-y-0 left-0 pl-3 flex items-center">
<.remix_icon icon="search-line" class="align-bottom text-gray-500" />
</span>
<input class="input block w-full pl-10"
type="text"
name="search"
value={@search}
@ -59,32 +54,42 @@ defmodule LivebookWeb.SessionLive.BinComponent do
spellcheck="false"
autofocus />
</form>
<% end %>
</div>
<%= cond do %>
<%= @bin_entries == [] -> %>
<div class="p-5 py-24 flex flex-col gap-3 space-x-4 items-center">
<div>
<.remix_icon icon="delete-bin-6-line" class="text-gray-700 text-xl bg-gray-100 p-3 rounded-full" />
</div>
<div class="w-64 text-gray-600 text-center">
You haven't deleted any cells or sections yet. Once you do, they'll appear here.
</div>
</div>
<% @matching_entries == [] -> %>
<div class="p-5 py-24 flex flex-col gap-3 space-x-4 items-center">
<div>
<.remix_icon icon="file-search-line" class="text-gray-700 text-xl bg-gray-100 p-3 rounded-full" />
</div>
<div class="w-64 text-gray-600 text-center">
We couldn't find any results for your query.
</div>
</div>
<% true -> %>
<div class="flex flex-col space-y-8 min-h-[30rem] pt-3">
<%= for {%{cell: cell} = entry, index} <- Enum.take(@matching_entries, @limit) |> Enum.with_index(1) do %>
<%= for %{cell: cell} = entry <- Enum.take(@matching_entries, @limit) do %>
<div class="flex flex-col space-y-1">
<div class="flex justify-between items-center">
<p class="text-sm text-gray-700">
<%= index %>.
<div class="flex py-1">
<.cell_icon cell_type={Cell.type(cell)}/>
<p class="text-sm text-gray-700 self-center">
<span class="font-semibold"><%= Cell.type(cell) |> Atom.to_string() |> String.capitalize() %></span> cell
deleted from <span class="font-semibold"><%= entry.section_name %></span> section
<span class="font-semibold"><%= format_date_relatively(entry.deleted_at) %></span>
</p>
</div>
<div class="flex justify-end space-x-2">
<span class="tooltip left" data-tooltip="Copy source">
<button class="icon-button"
aria-label="copy source"
phx-click={JS.dispatch("lb:clipcopy", to: "#bin-cell-#{cell.id}-source")}>
<.remix_icon icon="clipboard-line" class="text-lg" />
</button>
</span>
<span class="tooltip left" data-tooltip="Restore">
<button class="icon-button"
aria-label="restore"
phx-click="restore"
phx-value-cell_id={entry.cell.id}
phx-target={@myself}>
<.remix_icon icon="arrow-go-back-line" class="text-lg" />
</button>
<span class="text-sm text-gray-500">
<%= format_date_relatively(entry.deleted_at) %>
</span>
</div>
</div>
@ -92,6 +97,22 @@ defmodule LivebookWeb.SessionLive.BinComponent do
source_id={"bin-cell-#{cell.id}-source"}
language={Cell.type(cell)}
source={cell.source} />
<div class="pt-1 pb-4 border-b border-gray-200">
<button class="button-base button-gray whitespace-nowrap py-1 px-2"
aria-label="restore"
phx-click="restore"
phx-value-cell_id={entry.cell.id}
phx-target={@myself}>
<.remix_icon icon="arrow-go-back-line" class="align-middle mr-1 text-xs" />
<span class="font-normal text-xs">Restore</span>
</button>
<button class="button-base button-gray whitespace-nowrap py-1 px-2"
aria-label="copy source"
phx-click={JS.dispatch("lb:clipcopy", to: "#bin-cell-#{cell.id}-source")}>
<.remix_icon icon="clipboard-line" class="align-middle mr-1 text-xs" />
<span class="font-normal text-xs">Copy source</span>
</button>
</div>
</div>
<% end %>
<%= if length(@matching_entries) > @limit do %>
@ -108,6 +129,33 @@ defmodule LivebookWeb.SessionLive.BinComponent do
"""
end
defp cell_icon(%{cell_type: :elixir} = assigns) do
~H"""
<div class="flex w-6 h-6 bg-purple-100 rounded items-center justify-center mr-1">
<svg width="11" height="15" viewBox="0 0 11 15" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.7784 3.58083C7.4569 5.87527 9.67878 5.70652 10.0618 9.04833C10.1147 12.9425 8.03684
14.27 6.55353 14.6441C4.02227 15.3635 1.7644 14.2813 0.875648 11.8316C-0.83154 7.89408 2.36684
1.41746 4.42502 0.0668945C4.60193 1.32119 5.05745 2.51995 5.75815 3.57521L5.7784 3.58083Z" fill="#663299"/>
</svg>
</div>
"""
end
defp cell_icon(%{cell_type: :markdown} = assigns) do
~H"""
<div class="flex w-6 h-6 bg-blue-100 rounded items-center justify-center mr-1">
<svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.25 0.25H14.75C14.9489 0.25 15.1397 0.329018 15.2803 0.46967C15.421 0.610322 15.5 0.801088
15.5 1V13C15.5 13.1989 15.421 13.3897 15.2803 13.5303C15.1397 13.671 14.9489 13.75 14.75 13.75H1.25C1.05109
13.75 0.860322 13.671 0.71967 13.5303C0.579018 13.3897 0.5 13.1989 0.5 13V1C0.5 0.801088 0.579018 0.610322
0.71967 0.46967C0.860322 0.329018 1.05109 0.25 1.25 0.25ZM4.25 9.625V6.625L5.75 8.125L7.25
6.625V9.625H8.75V4.375H7.25L5.75 5.875L4.25 4.375H2.75V9.625H4.25ZM12.5 7.375V4.375H11V7.375H9.5L11.75
9.625L14 7.375H12.5Z" fill="#3E64FF"/>
</svg>
</div>
"""
end
defp format_date_relatively(date) do
time_words = date |> DateTime.to_naive() |> Livebook.Utils.Time.time_ago_in_words()
time_words <> " ago"