Refactored tab layout to grab tabs by name
This commit is contained in:
parent
94c93cc1e8
commit
d7cb6b5471
7 changed files with 30 additions and 23 deletions
|
|
@ -1,20 +1,20 @@
|
||||||
window.setTabIndex = (index) => {
|
window.setTabByName = (tabName) => {
|
||||||
window.location.hash = `tab-${index}`
|
window.location.hash = `tab-${tabName}`
|
||||||
|
|
||||||
return index
|
return tabName
|
||||||
}
|
}
|
||||||
|
|
||||||
// The conditionals and currIndex stuff ensures that
|
// The conditionals and currIndex stuff ensures that
|
||||||
// the tab index is always set to 0 if the hash is empty
|
// the tab index is always set to 0 if the hash is empty
|
||||||
// AND other hash values are ignored
|
// AND other hash values are ignored
|
||||||
window.getTabIndex = (currIndex) => {
|
window.getTabFromHash = (currentTabName, defaultTabName) => {
|
||||||
if (window.location.hash === '' || window.location.hash === '#') {
|
if (window.location.hash === '' || window.location.hash === '#') {
|
||||||
return 0
|
return defaultTabName
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window.location.hash.startsWith('#tab-')) {
|
if (window.location.hash.startsWith('#tab-')) {
|
||||||
return parseInt(window.location.hash.replace('#tab-', ''))
|
return window.location.hash.replace('#tab-', '')
|
||||||
}
|
}
|
||||||
|
|
||||||
return currIndex
|
return currentTabName
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,25 +6,32 @@ defmodule PinchflatWeb.CustomComponents.TabComponents do
|
||||||
Takes a list of tabs and renders them in a tabbed layout.
|
Takes a list of tabs and renders them in a tabbed layout.
|
||||||
"""
|
"""
|
||||||
slot :tab, required: true do
|
slot :tab, required: true do
|
||||||
|
attr :id, :string, required: true
|
||||||
attr :title, :string, required: true
|
attr :title, :string, required: true
|
||||||
end
|
end
|
||||||
|
|
||||||
slot :tab_append, required: false
|
slot :tab_append, required: false
|
||||||
|
|
||||||
def tabbed_layout(assigns) do
|
def tabbed_layout(assigns) do
|
||||||
|
assigns = Map.put(assigns, :first_tab_id, hd(assigns.tab).id)
|
||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<div
|
<div
|
||||||
x-data="{ openTab: getTabIndex(0), activeClasses: 'text-meta-5 border-meta-5', inactiveClasses: 'border-transparent' }"
|
x-data={"{
|
||||||
@hashchange.window="openTab = getTabIndex(openTab)"
|
openTab: getTabFromHash('#{@first_tab_id}', '#{@first_tab_id}'),
|
||||||
|
activeClasses: 'text-meta-5 border-meta-5',
|
||||||
|
inactiveClasses: 'border-transparent'
|
||||||
|
}"}
|
||||||
|
@hashchange.window={"openTab = getTabFromHash(openTab, '#{@first_tab_id}')"}
|
||||||
class="w-full"
|
class="w-full"
|
||||||
>
|
>
|
||||||
<header class="flex flex-col md:flex-row md:justify-between border-b border-strokedark">
|
<header class="flex flex-col md:flex-row md:justify-between border-b border-strokedark">
|
||||||
<div class="flex flex-wrap gap-5 sm:gap-10">
|
<div class="flex flex-wrap gap-5 sm:gap-10">
|
||||||
<a
|
<a
|
||||||
:for={{tab, idx} <- Enum.with_index(@tab)}
|
:for={tab <- @tab}
|
||||||
href="#"
|
href="#"
|
||||||
@click.prevent={"openTab = setTabIndex(#{idx})"}
|
@click.prevent={"openTab = setTabByName('#{tab.id}')"}
|
||||||
x-bind:class={"openTab === #{idx} ? activeClasses : inactiveClasses"}
|
x-bind:class={"openTab === '#{tab.id}' ? activeClasses : inactiveClasses"}
|
||||||
class="border-b-2 py-4 w-full sm:w-fit text-sm font-medium hover:text-meta-5 md:text-base"
|
class="border-b-2 py-4 w-full sm:w-fit text-sm font-medium hover:text-meta-5 md:text-base"
|
||||||
>
|
>
|
||||||
<span class="text-xl"><%= tab.title %></span>
|
<span class="text-xl"><%= tab.title %></span>
|
||||||
|
|
@ -35,7 +42,7 @@ defmodule PinchflatWeb.CustomComponents.TabComponents do
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div class="mt-4 min-h-60">
|
<div class="mt-4 min-h-60">
|
||||||
<div :for={{tab, idx} <- Enum.with_index(@tab)} x-show={"openTab === #{idx}"} class="font-medium leading-relaxed">
|
<div :for={tab <- @tab} x-show={"openTab === '#{tab.id}'"} class="font-medium leading-relaxed">
|
||||||
<%= render_slot(tab) %>
|
<%= render_slot(tab) %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ defmodule PinchflatWeb.CustomComponents.TableComponents do
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr :for={row <- @rows} class="border-b border-boxdark hover:border-strokedark">
|
<tr :for={row <- @rows} class="hover:bg-strokedark">
|
||||||
<td
|
<td
|
||||||
:for={col <- @col}
|
:for={col <- @col}
|
||||||
class={[
|
class={[
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<.actions_dropdown media_item={@media_item} />
|
<.actions_dropdown media_item={@media_item} />
|
||||||
</:tab_append>
|
</:tab_append>
|
||||||
|
|
||||||
<:tab title="Media">
|
<:tab title="Media" id="media">
|
||||||
<div class="flex flex-col gap-10 dark:text-white">
|
<div class="flex flex-col gap-10 dark:text-white">
|
||||||
<%= if media_file_exists?(@media_item) do %>
|
<%= if media_file_exists?(@media_item) do %>
|
||||||
<section class="grid grid-cols-1 xl:grid-cols-2 xl:gap-6 mt-6">
|
<section class="grid grid-cols-1 xl:grid-cols-2 xl:gap-6 mt-6">
|
||||||
|
|
@ -52,7 +52,7 @@
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</:tab>
|
</:tab>
|
||||||
<:tab title="Tasks">
|
<:tab title="Tasks" id="tasks">
|
||||||
<%= if match?([_|_], @media_item.tasks) do %>
|
<%= if match?([_|_], @media_item.tasks) do %>
|
||||||
<.table rows={@media_item.tasks} table_class="text-black dark:text-white">
|
<.table rows={@media_item.tasks} table_class="text-black dark:text-white">
|
||||||
<:col :let={task} label="Worker">
|
<:col :let={task} label="Worker">
|
||||||
|
|
|
||||||
|
|
@ -23,13 +23,13 @@
|
||||||
<.actions_dropdown media_profile={@media_profile} />
|
<.actions_dropdown media_profile={@media_profile} />
|
||||||
</:tab_append>
|
</:tab_append>
|
||||||
|
|
||||||
<:tab title="Media Profile">
|
<:tab title="Media Profile" id="media-profile">
|
||||||
<div class="flex flex-col gap-10 text-white">
|
<div class="flex flex-col gap-10 text-white">
|
||||||
<h3 class="font-bold text-xl mt-6">Raw Attributes</h3>
|
<h3 class="font-bold text-xl mt-6">Raw Attributes</h3>
|
||||||
<.list_items_from_map map={Map.from_struct(@media_profile)} />
|
<.list_items_from_map map={Map.from_struct(@media_profile)} />
|
||||||
</div>
|
</div>
|
||||||
</:tab>
|
</:tab>
|
||||||
<:tab title="Sources">
|
<:tab title="Sources" id="sources">
|
||||||
<.table rows={@sources} table_class="text-black dark:text-white">
|
<.table rows={@sources} table_class="text-black dark:text-white">
|
||||||
<:col :let={source} label="Name">
|
<:col :let={source} label="Name">
|
||||||
<.subtle_link href={~p"/sources/#{source.id}"}>
|
<.subtle_link href={~p"/sources/#{source.id}"}>
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@
|
||||||
</.subtle_link>
|
</.subtle_link>
|
||||||
</:col>
|
</:col>
|
||||||
<:col :let={source} label="Type"><%= source.collection_type %></:col>
|
<:col :let={source} label="Type"><%= source.collection_type %></:col>
|
||||||
<:col :let={source} label="Downloaded"><%= source.downloaded_count %></:col>
|
|
||||||
<:col :let={source} label="Pending"><%= source.pending_count %></:col>
|
<:col :let={source} label="Pending"><%= source.pending_count %></:col>
|
||||||
|
<:col :let={source} label="Downloaded"><%= source.downloaded_count %></:col>
|
||||||
<:col :let={source} label="Retention">
|
<:col :let={source} label="Retention">
|
||||||
<%= if source.retention_period_days && source.retention_period_days > 0 do %>
|
<%= if source.retention_period_days && source.retention_period_days > 0 do %>
|
||||||
<%= source.retention_period_days %> day(s)
|
<%= source.retention_period_days %> day(s)
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
<.actions_dropdown source={@source} conn={@conn} />
|
<.actions_dropdown source={@source} conn={@conn} />
|
||||||
</:tab_append>
|
</:tab_append>
|
||||||
|
|
||||||
<:tab title="Source">
|
<:tab title="Source" id="source">
|
||||||
<div class="flex flex-col gap-10 text-white">
|
<div class="flex flex-col gap-10 text-white">
|
||||||
<h3 class="font-bold text-xl mt-6">Raw Attributes</h3>
|
<h3 class="font-bold text-xl mt-6">Raw Attributes</h3>
|
||||||
<section>
|
<section>
|
||||||
|
|
@ -36,21 +36,21 @@
|
||||||
<.list_items_from_map map={Map.from_struct(@source)} />
|
<.list_items_from_map map={Map.from_struct(@source)} />
|
||||||
</div>
|
</div>
|
||||||
</:tab>
|
</:tab>
|
||||||
<:tab title="Pending Media">
|
<:tab title="Pending Media" id="pending">
|
||||||
<%= live_render(
|
<%= live_render(
|
||||||
@conn,
|
@conn,
|
||||||
Pinchflat.Sources.MediaItemTableLive,
|
Pinchflat.Sources.MediaItemTableLive,
|
||||||
session: %{"source_id" => @source.id, "media_state" => "pending"}
|
session: %{"source_id" => @source.id, "media_state" => "pending"}
|
||||||
) %>
|
) %>
|
||||||
</:tab>
|
</:tab>
|
||||||
<:tab title="Downloaded Media">
|
<:tab title="Downloaded Media" id="downloaded">
|
||||||
<%= live_render(
|
<%= live_render(
|
||||||
@conn,
|
@conn,
|
||||||
Pinchflat.Sources.MediaItemTableLive,
|
Pinchflat.Sources.MediaItemTableLive,
|
||||||
session: %{"source_id" => @source.id, "media_state" => "downloaded"}
|
session: %{"source_id" => @source.id, "media_state" => "downloaded"}
|
||||||
) %>
|
) %>
|
||||||
</:tab>
|
</:tab>
|
||||||
<:tab title="Pending Tasks">
|
<:tab title="Pending Tasks" id="tasks">
|
||||||
<%= if match?([_|_], @pending_tasks) do %>
|
<%= if match?([_|_], @pending_tasks) do %>
|
||||||
<.table rows={@pending_tasks} table_class="text-black dark:text-white">
|
<.table rows={@pending_tasks} table_class="text-black dark:text-white">
|
||||||
<:col :let={task} label="Worker">
|
<:col :let={task} label="Worker">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue