2022-03-28 10:26:35 +13:00
|
|
|
defmodule AshHqWeb.Pages.Docs do
|
2022-08-07 11:22:58 +12:00
|
|
|
@moduledoc "The page for showing documentation"
|
2024-04-03 09:38:44 +13:00
|
|
|
use Phoenix.LiveComponent
|
2022-03-28 10:26:35 +13:00
|
|
|
|
2022-09-13 11:36:28 +12:00
|
|
|
import AshHqWeb.Helpers
|
2023-02-21 18:52:45 +13:00
|
|
|
import AshHqWeb.Tails
|
2022-09-13 11:36:28 +12:00
|
|
|
|
2023-09-28 02:56:53 +13:00
|
|
|
alias AshHqWeb.Components.DocSidebar
|
2022-08-07 11:22:58 +12:00
|
|
|
alias AshHqWeb.DocRoutes
|
|
|
|
alias Phoenix.LiveView.JS
|
2022-06-06 06:03:45 +12:00
|
|
|
require Logger
|
2023-01-19 11:56:07 +13:00
|
|
|
require Ash.Query
|
2022-03-28 10:26:35 +13:00
|
|
|
|
2024-04-03 09:38:44 +13:00
|
|
|
attr(:libraries, :list, default: [])
|
|
|
|
attr(:uri, :string)
|
|
|
|
attr(:params, :map, required: true)
|
2022-08-29 00:42:24 +12:00
|
|
|
|
2022-03-28 10:26:35 +13:00
|
|
|
@spec render(any) :: Phoenix.LiveView.Rendered.t()
|
|
|
|
def render(assigns) do
|
2024-04-03 09:38:44 +13:00
|
|
|
~H"""
|
2022-11-16 14:27:24 +13:00
|
|
|
<div class="flex flex-col xl:flex-row justify-center">
|
2022-12-27 22:31:13 +13:00
|
|
|
<head>
|
|
|
|
<meta property="og:title" content={@title}>
|
|
|
|
<meta property="og:description" content={@description}>
|
|
|
|
</head>
|
2023-02-07 17:29:23 +13:00
|
|
|
<div class="xl:hidden sticky top-20 z-40 h-14 bg-white dark:bg-base-dark-850 flex flex-row justify-start w-full space-x-6 items-center border-b border-base-light-300 dark:border-base-dark-700 py-3">
|
|
|
|
<button phx-click={show_sidebar()}>
|
2024-04-03 09:38:44 +13:00
|
|
|
<span class="hero-bars-3 w-8 h-8 ml-4"/>
|
2022-03-29 11:05:19 +13:00
|
|
|
</button>
|
2022-10-26 17:53:18 +13:00
|
|
|
<button id={"#{@id}-hide"} class="hidden" phx-click={hide_sidebar()} />
|
2022-03-29 11:05:19 +13:00
|
|
|
</div>
|
2022-11-16 14:27:24 +13:00
|
|
|
<span class="grid xl:hidden z-40">
|
|
|
|
<div
|
|
|
|
id="mobile-sidebar-container"
|
2023-02-07 16:54:59 +13:00
|
|
|
class="hidden fixed transition sidebar-container overflow-y-auto z-40 border-r border-b border-base-light-300 dark:border-base-dark-700"
|
2024-04-03 09:38:44 +13:00
|
|
|
phx-click-away={hide_sidebar()}
|
2022-11-16 14:27:24 +13:00
|
|
|
>
|
2024-04-03 09:38:44 +13:00
|
|
|
<.live_component module={DocSidebar}
|
2022-03-30 05:12:28 +13:00
|
|
|
id="mobile-sidebar"
|
2023-02-07 16:54:59 +13:00
|
|
|
class="max-w-sm p-2 pr-4"
|
2022-03-30 05:12:28 +13:00
|
|
|
libraries={@libraries}
|
2023-02-07 06:35:52 +13:00
|
|
|
remove_version={@remove_version}
|
|
|
|
sidebar_data={@sidebar_data}
|
2022-03-30 05:12:28 +13:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</span>
|
2022-11-16 14:27:24 +13:00
|
|
|
<div class="grow w-full flex flex-row max-w-[1800px] justify-between md:space-x-12">
|
2022-11-16 18:29:29 +13:00
|
|
|
<div class="sidebar-container sticky overflow-y-auto overflow-x-hidden shrink-0 top-20 xl:border-r xl:border-b xl:border-base-light-300 xl:dark:border-base-dark-700 lg:pr-2 lg:pt-4">
|
2024-04-03 09:38:44 +13:00
|
|
|
<.live_component module={DocSidebar}
|
2022-09-08 02:48:10 +12:00
|
|
|
id="sidebar"
|
2022-11-16 14:27:24 +13:00
|
|
|
class="hidden xl:block w-80"
|
2022-09-08 02:48:10 +12:00
|
|
|
libraries={@libraries}
|
2023-02-07 06:35:52 +13:00
|
|
|
remove_version={@remove_version}
|
|
|
|
sidebar_data={@sidebar_data}
|
2022-09-08 02:48:10 +12:00
|
|
|
/>
|
|
|
|
</div>
|
2022-03-30 05:12:28 +13:00
|
|
|
<div
|
|
|
|
id="docs-window"
|
2023-02-08 04:04:54 +13:00
|
|
|
:if={@not_found}
|
2023-02-21 18:52:45 +13:00
|
|
|
class="w-full shrink max-w-6xl prose prose-td:pl-0 bg-white dark:bg-base-dark-850 dark:prose-invert md:pr-8 md:mt-4 px-4 md:px-auto mx-auto overflow-x-auto overflow-y-hidden"
|
2023-02-08 04:04:54 +13:00
|
|
|
>
|
|
|
|
<div class="w-full nav-anchor text-black dark:text-white relative py-4 md:py-auto">
|
2023-09-28 02:56:53 +13:00
|
|
|
<p>
|
|
|
|
We couldn't find that page.
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
A lot of our documentation has moved recently, if you can't find it here, look in the <a href="https://hexdocs.pm/ash/using-hexdocs.html">HexDocs</a>
|
|
|
|
</p>
|
2023-02-08 04:04:54 +13:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div
|
|
|
|
id="docs-window"
|
|
|
|
:if={!@not_found}
|
2023-09-28 02:56:53 +13:00
|
|
|
class={classes([
|
|
|
|
"w-full shrink max-w-6xl bg-white dark:bg-base-dark-850 md:pr-8 md:mt-4 px-4 md:px-auto mx-auto overflow-x-auto overflow-y-hidden prose prose-td:pl-0 dark:prose-invert"
|
|
|
|
])}
|
2022-03-30 05:12:28 +13:00
|
|
|
>
|
2022-09-09 15:23:57 +12:00
|
|
|
<div
|
|
|
|
id="module-docs"
|
|
|
|
class="w-full nav-anchor text-black dark:text-white relative py-4 md:py-auto"
|
|
|
|
>
|
2023-09-27 17:23:56 +13:00
|
|
|
<div class="flex flex-col float-right">
|
|
|
|
<.github_guide_link
|
|
|
|
:if={@guide}
|
|
|
|
guide={@guide}
|
|
|
|
library={@library}
|
|
|
|
library_version={@library_version}
|
|
|
|
/>
|
|
|
|
<.hex_guide_link
|
|
|
|
:if={@guide}
|
|
|
|
guide={@guide}
|
|
|
|
library={@library}
|
|
|
|
library_version={@library_version}
|
|
|
|
/>
|
|
|
|
</div>
|
2024-04-03 09:38:44 +13:00
|
|
|
<%= if @docs do %>
|
2023-09-28 02:56:53 +13:00
|
|
|
<.docs docs={@docs} />
|
2024-04-03 09:38:44 +13:00
|
|
|
<% end %>
|
2022-04-01 09:59:53 +13:00
|
|
|
</div>
|
2022-10-23 00:51:22 +13:00
|
|
|
|
2022-11-01 20:20:09 +13:00
|
|
|
<footer class="p-2 sm:justify-center">
|
2022-10-23 00:51:22 +13:00
|
|
|
<div class="md:flex md:justify-around items-center">
|
2024-04-03 09:38:44 +13:00
|
|
|
<.link href="/">
|
2022-10-23 00:51:22 +13:00
|
|
|
<img class="h-6 md:h-10 hidden dark:block" src="/images/ash-framework-dark.png">
|
|
|
|
<img class="h-6 md:h-10 dark:hidden" src="/images/ash-framework-light.png">
|
2024-04-03 09:38:44 +13:00
|
|
|
</.link>
|
2022-10-23 00:51:22 +13:00
|
|
|
<a href="https://github.com/ash-project" class="hover:underline">Source</a>
|
|
|
|
<a href="https://github.com/ash-project/ash_hq/issues/new/choose" class="hover:underline">Report an issue</a>
|
|
|
|
</div>
|
|
|
|
</footer>
|
2022-03-28 10:26:35 +13:00
|
|
|
</div>
|
2023-09-27 19:26:16 +13:00
|
|
|
<!-- empty div to preserve flex row spacing -->
|
|
|
|
<div />
|
2023-02-21 18:52:45 +13:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
"""
|
|
|
|
end
|
|
|
|
|
2023-02-15 15:20:09 +13:00
|
|
|
def github_guide_link(assigns) do
|
2024-04-03 09:38:44 +13:00
|
|
|
~H"""
|
2023-02-15 15:20:09 +13:00
|
|
|
<a
|
|
|
|
href={source_link(@guide, @library, @library_version)}
|
|
|
|
target="_blank"
|
2023-09-27 17:23:56 +13:00
|
|
|
class="no-underline mt-1 ml-2 hidden lg:block"
|
2023-02-15 15:20:09 +13:00
|
|
|
>
|
|
|
|
<svg
|
|
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
|
|
class="w-6 h-6 inline-block mr-1 -mt-1 dark:fill-white fill-base-light-600"
|
|
|
|
viewBox="0 0 24 24"
|
|
|
|
>
|
|
|
|
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
|
|
|
|
</svg>
|
|
|
|
<span class="underline">View this guide on GitHub</span>
|
2024-04-03 09:38:44 +13:00
|
|
|
<span class="hero-link w-6 h-6 inline-block -mt-1"/>
|
2023-02-15 15:20:09 +13:00
|
|
|
</a>
|
|
|
|
"""
|
|
|
|
end
|
|
|
|
|
2023-09-27 17:23:56 +13:00
|
|
|
def hex_guide_link(assigns) do
|
2024-04-03 09:38:44 +13:00
|
|
|
~H"""
|
2023-09-27 17:23:56 +13:00
|
|
|
<a
|
|
|
|
href={hex_link(@guide, @library, @library_version)}
|
|
|
|
target="_blank"
|
|
|
|
class="no-underline mt-1 ml-2 hidden lg:block"
|
|
|
|
>
|
|
|
|
<svg
|
|
|
|
xmlns="http://www.w3.org/2000/svg"
|
|
|
|
fill="none"
|
|
|
|
viewBox="0 0 24 24"
|
|
|
|
stroke-width="1.5"
|
|
|
|
stroke="currentColor"
|
|
|
|
class="w-6 h-6 inline-block mr-1 -mt-1 dark:fill-white fill-base-light-600"
|
|
|
|
>
|
|
|
|
<path
|
|
|
|
stroke-linecap="round"
|
|
|
|
stroke-linejoin="round"
|
|
|
|
d="M12 6.042A8.967 8.967 0 006 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 016 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 016-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0018 18a8.967 8.967 0 00-6 2.292m0-14.25v14.25"
|
|
|
|
/>
|
|
|
|
</svg>
|
|
|
|
<span class="underline">View this guide on Hex</span>
|
2024-04-03 09:38:44 +13:00
|
|
|
<span class="hero-link w-6 h-6 inline-block -mt-1"/>
|
2023-09-27 17:23:56 +13:00
|
|
|
</a>
|
|
|
|
"""
|
|
|
|
end
|
|
|
|
|
2023-01-19 14:23:09 +13:00
|
|
|
def docs(assigns) do
|
2024-04-03 09:38:44 +13:00
|
|
|
~H"""
|
2023-09-28 02:56:53 +13:00
|
|
|
<div id="doc-text">
|
2024-04-03 09:38:44 +13:00
|
|
|
<%= Phoenix.HTML.raw(@docs) %>
|
2023-01-19 14:23:09 +13:00
|
|
|
</div>
|
|
|
|
"""
|
|
|
|
end
|
|
|
|
|
2022-09-13 08:47:14 +12:00
|
|
|
def update(assigns, socket) do
|
2023-09-27 19:26:16 +13:00
|
|
|
if socket.assigns[:loaded_once?] do
|
2023-01-19 11:56:07 +13:00
|
|
|
{:ok, socket |> assign(Map.delete(assigns, :libraries)) |> load_docs()}
|
2022-09-30 05:56:07 +13:00
|
|
|
else
|
|
|
|
{:ok,
|
|
|
|
socket
|
2024-04-03 09:38:44 +13:00
|
|
|
|> assign(not_found: false)
|
2023-01-19 11:56:07 +13:00
|
|
|
|> assign(assigns)
|
|
|
|
|> assign_libraries()
|
|
|
|
|> load_docs()
|
2023-02-07 06:35:52 +13:00
|
|
|
|> assign_sidebar_content()
|
2023-01-19 11:56:07 +13:00
|
|
|
|> assign(:loaded_once?, true)}
|
2022-09-30 05:56:07 +13:00
|
|
|
end
|
2022-09-13 08:47:14 +12:00
|
|
|
end
|
|
|
|
|
2022-08-07 11:22:58 +12:00
|
|
|
def show_sidebar(js \\ %JS{}) do
|
|
|
|
js
|
2022-03-29 11:05:19 +13:00
|
|
|
|> JS.toggle(
|
|
|
|
to: "#mobile-sidebar-container",
|
2022-03-30 05:12:28 +13:00
|
|
|
in: {
|
|
|
|
"transition ease-in duration-100",
|
|
|
|
"opacity-0",
|
|
|
|
"opacity-100"
|
|
|
|
},
|
|
|
|
out: {
|
|
|
|
"transition ease-out duration-75",
|
|
|
|
"opacity-100",
|
|
|
|
"opacity-0"
|
|
|
|
}
|
2022-03-29 11:05:19 +13:00
|
|
|
)
|
2022-03-28 10:26:35 +13:00
|
|
|
end
|
|
|
|
|
2022-10-26 17:28:25 +13:00
|
|
|
def hide_sidebar(js \\ %JS{}) do
|
|
|
|
js
|
|
|
|
|> JS.hide(
|
|
|
|
to: "#mobile-sidebar-container",
|
|
|
|
transition: {
|
|
|
|
"transition ease-out duration-75",
|
|
|
|
"opacity-100",
|
|
|
|
"opacity-0"
|
|
|
|
}
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2023-01-19 11:56:07 +13:00
|
|
|
def assign_libraries(socket) do
|
2022-09-13 12:35:59 +12:00
|
|
|
socket = assign_library(socket)
|
2022-07-15 07:09:04 +12:00
|
|
|
|
2022-09-30 05:56:07 +13:00
|
|
|
guides_query =
|
|
|
|
AshHq.Docs.Guide
|
|
|
|
|> Ash.Query.new()
|
2023-01-19 11:56:07 +13:00
|
|
|
|> load_for_search()
|
2022-09-30 05:56:07 +13:00
|
|
|
|
2022-09-13 08:47:14 +12:00
|
|
|
new_libraries =
|
2023-09-27 19:26:16 +13:00
|
|
|
AshHq.Docs.load!(socket.assigns.libraries, versions: [guides: guides_query])
|
2022-09-13 08:47:14 +12:00
|
|
|
|
2023-01-19 11:56:07 +13:00
|
|
|
assign(socket, :libraries, new_libraries)
|
|
|
|
end
|
|
|
|
|
|
|
|
def load_docs(socket) do
|
2022-09-13 08:47:14 +12:00
|
|
|
socket
|
|
|
|
|> assign_library()
|
|
|
|
|> assign_guide()
|
2022-11-04 05:20:51 +13:00
|
|
|
|> assign_fallback_guide()
|
2022-09-13 08:47:14 +12:00
|
|
|
|> assign_docs()
|
|
|
|
end
|
|
|
|
|
2023-02-07 06:35:52 +13:00
|
|
|
defp assign_sidebar_content(socket) do
|
2023-09-27 17:23:56 +13:00
|
|
|
sidebar_data =
|
|
|
|
guides_by_category_and_library(
|
|
|
|
socket.assigns[:libraries],
|
|
|
|
socket.assigns[:guide]
|
|
|
|
)
|
2023-02-07 06:35:52 +13:00
|
|
|
|
|
|
|
assign(socket, sidebar_libraries: socket.assigns.libraries, sidebar_data: sidebar_data)
|
|
|
|
end
|
|
|
|
|
|
|
|
@start_guides ["Tutorials", "Topics", "How To", "Misc"]
|
|
|
|
|
2023-09-28 02:56:53 +13:00
|
|
|
defp guides_by_category_and_library(libraries, active_guide) do
|
2023-02-07 06:35:52 +13:00
|
|
|
libraries
|
2023-09-27 19:26:16 +13:00
|
|
|
|> Enum.map(fn library ->
|
|
|
|
{library, Enum.at(library.versions, 0)}
|
|
|
|
end)
|
2023-02-07 06:35:52 +13:00
|
|
|
|> Enum.filter(fn {_library, version} -> version != nil end)
|
|
|
|
|> Enum.sort_by(fn {library, _version} -> library.order end)
|
|
|
|
|> Enum.flat_map(fn {library, %{guides: guides}} ->
|
|
|
|
guides
|
|
|
|
|> Enum.sort_by(& &1.order)
|
|
|
|
|> Enum.group_by(& &1.category, fn guide ->
|
|
|
|
%{
|
|
|
|
id: guide.id,
|
|
|
|
name: guide.name,
|
2023-09-27 19:26:16 +13:00
|
|
|
to: DocRoutes.doc_link(guide),
|
2023-02-07 06:35:52 +13:00
|
|
|
active?: active_guide && active_guide.id == guide.id
|
|
|
|
}
|
|
|
|
end)
|
|
|
|
|> Enum.map(fn {category, guides} -> {category, {library.display_name, guides}} end)
|
|
|
|
end)
|
|
|
|
|> Enum.group_by(&elem(&1, 0), &elem(&1, 1))
|
|
|
|
|> partially_alphabetically_sort(@start_guides, [])
|
|
|
|
end
|
|
|
|
|
|
|
|
defp partially_alphabetically_sort(keyed_list, first, last) do
|
|
|
|
{first_items, rest} =
|
|
|
|
Enum.split_with(keyed_list, fn {key, _} ->
|
|
|
|
key in first
|
|
|
|
end)
|
|
|
|
|
|
|
|
{last_items, rest} =
|
|
|
|
Enum.split_with(rest, fn {key, _} ->
|
|
|
|
key in last
|
|
|
|
end)
|
|
|
|
|
|
|
|
first_items
|
|
|
|
|> Enum.sort_by(fn {key, _} ->
|
|
|
|
Enum.find_index(first, &(&1 == key))
|
|
|
|
end)
|
|
|
|
|> Enum.concat(Enum.sort_by(rest, &elem(&1, 0)))
|
|
|
|
|> Enum.concat(
|
|
|
|
Enum.sort_by(last_items, fn {key, _} ->
|
|
|
|
Enum.find_index(last, &(&1 == key))
|
|
|
|
end)
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def slug(string) do
|
|
|
|
string
|
|
|
|
|> String.downcase()
|
|
|
|
|> String.replace(" ", "_")
|
|
|
|
|> String.replace(~r/[^a-z0-9-_]/, "-")
|
|
|
|
end
|
|
|
|
|
2022-11-04 05:20:51 +13:00
|
|
|
defp assign_fallback_guide(socket) do
|
2023-09-28 05:15:45 +13:00
|
|
|
if socket.assigns[:library_version] && !socket.assigns[:guide] do
|
2022-11-04 05:20:51 +13:00
|
|
|
guide =
|
|
|
|
Enum.find(socket.assigns.library_version.guides, fn guide ->
|
|
|
|
guide.default
|
|
|
|
end) ||
|
|
|
|
Enum.find(socket.assigns.library_version.guides, fn guide ->
|
|
|
|
String.contains?(guide.sanitized_name, "started")
|
|
|
|
end) || Enum.at(socket.assigns.library_version.guides, 0)
|
|
|
|
|
2023-01-19 11:56:07 +13:00
|
|
|
guide = guide |> reselect!(:text_html)
|
2022-11-04 05:20:51 +13:00
|
|
|
|
|
|
|
assign(socket, guide: guide)
|
|
|
|
else
|
|
|
|
socket
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-01-19 11:56:07 +13:00
|
|
|
defp reselect!(%resource{} = record, field) do
|
|
|
|
if Ash.Resource.selected?(record, field) do
|
|
|
|
record
|
|
|
|
else
|
|
|
|
# will blow up if pkey is not an id or if its not a docs resource
|
|
|
|
# but w/e
|
|
|
|
value =
|
|
|
|
resource
|
|
|
|
|> Ash.Query.select(field)
|
|
|
|
|> Ash.Query.filter(id == ^record.id)
|
|
|
|
|> AshHq.Docs.read_one!()
|
|
|
|
|> Map.get(field)
|
|
|
|
|
|
|
|
Map.put(record, field, value)
|
|
|
|
end
|
2022-09-13 08:47:14 +12:00
|
|
|
end
|
|
|
|
|
2023-02-21 18:52:45 +13:00
|
|
|
defp reselect!(nil, _), do: nil
|
|
|
|
|
2023-01-19 11:56:07 +13:00
|
|
|
defp reselect_and_get!(record, field) do
|
|
|
|
record
|
|
|
|
|> reselect!(field)
|
|
|
|
|> Map.get(field)
|
2022-09-13 08:47:14 +12:00
|
|
|
end
|
|
|
|
|
2023-01-19 11:56:07 +13:00
|
|
|
defp load_for_search(query) do
|
2022-09-16 10:35:33 +12:00
|
|
|
query
|
2023-01-19 11:56:07 +13:00
|
|
|
|> Ash.Query.load(AshHq.Docs.Extensions.Search.load_for_search(query.resource))
|
|
|
|
|> deselect_doc_attributes()
|
2022-09-13 08:47:14 +12:00
|
|
|
end
|
|
|
|
|
|
|
|
defp deselect_doc_attributes(query) do
|
|
|
|
query.resource
|
|
|
|
|> AshHq.Docs.Extensions.RenderMarkdown.render_attributes()
|
|
|
|
|> Enum.reduce(query, fn {source, target}, query ->
|
|
|
|
Ash.Query.deselect(query, [source, target])
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
defp assign_library(socket) do
|
|
|
|
case Enum.find(
|
|
|
|
socket.assigns.libraries,
|
|
|
|
&(&1.name == socket.assigns.params["library"])
|
|
|
|
) do
|
|
|
|
nil ->
|
2023-02-21 18:52:45 +13:00
|
|
|
library = Enum.find(socket.assigns.libraries, &(&1.name == "ash"))
|
|
|
|
|
2023-02-08 04:04:54 +13:00
|
|
|
assign(socket,
|
|
|
|
not_found: true,
|
2023-02-21 18:52:45 +13:00
|
|
|
library: library,
|
|
|
|
library_version: AshHqWeb.Helpers.latest_version(library)
|
2023-02-08 04:04:54 +13:00
|
|
|
)
|
2022-09-13 08:47:14 +12:00
|
|
|
|
|
|
|
library ->
|
2023-09-27 19:26:16 +13:00
|
|
|
socket
|
|
|
|
|> assign(:library, library)
|
2023-09-28 02:56:53 +13:00
|
|
|
|> assign(:library_version, AshHqWeb.Helpers.latest_version(library))
|
2022-09-13 08:47:14 +12:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
defp assign_guide(socket) do
|
2022-11-03 20:58:14 +13:00
|
|
|
guide_route = socket.assigns[:params]["guide"]
|
|
|
|
|
2022-09-13 08:47:14 +12:00
|
|
|
guide =
|
2022-11-03 20:58:14 +13:00
|
|
|
if guide_route && socket.assigns.library_version do
|
|
|
|
guide_route = Enum.map(List.wrap(guide_route), &String.trim_trailing(&1, ".md"))
|
|
|
|
|
2022-09-13 08:47:14 +12:00
|
|
|
Enum.find(socket.assigns.library_version.guides, fn guide ->
|
2022-11-03 20:58:14 +13:00
|
|
|
matches_path?(guide, guide_route) || matches_name?(guide, guide_route)
|
2022-09-13 08:47:14 +12:00
|
|
|
end)
|
|
|
|
end
|
|
|
|
|
|
|
|
assign(socket, :guide, guide)
|
|
|
|
end
|
|
|
|
|
2022-11-03 20:58:14 +13:00
|
|
|
defp matches_path?(guide, guide_route) do
|
2022-12-15 21:28:03 +13:00
|
|
|
guide.sanitized_route == DocRoutes.sanitize_name(Enum.join(guide_route, "/"), true)
|
2022-11-03 20:58:14 +13:00
|
|
|
end
|
|
|
|
|
2022-12-15 21:28:03 +13:00
|
|
|
defp matches_name?(guide, list) do
|
|
|
|
guide_name = List.last(list)
|
|
|
|
DocRoutes.sanitize_name(guide.name) == DocRoutes.sanitize_name(guide_name)
|
2022-11-03 20:58:14 +13:00
|
|
|
end
|
|
|
|
|
2022-09-13 08:47:14 +12:00
|
|
|
defp assign_docs(socket) do
|
2023-09-29 03:37:07 +13:00
|
|
|
if socket.assigns.guide do
|
2023-09-29 03:44:50 +13:00
|
|
|
send(self(), {:page_title, socket.assigns.guide.name})
|
2023-01-18 17:53:21 +13:00
|
|
|
|
2023-09-29 03:44:50 +13:00
|
|
|
assign(socket,
|
|
|
|
title: "Guide: #{socket.assigns.guide.name}",
|
|
|
|
docs: socket.assigns.guide |> reselect_and_get!(:text_html),
|
|
|
|
description: "Read the \"#{socket.assigns.guide.name}\" guide on Ash HQ"
|
|
|
|
)
|
|
|
|
else
|
|
|
|
assign(socket,
|
|
|
|
docs: "",
|
|
|
|
title: "Ash Framework",
|
|
|
|
description: default_description()
|
|
|
|
)
|
2022-09-13 08:47:14 +12:00
|
|
|
end
|
|
|
|
end
|
2022-11-02 18:29:57 +13:00
|
|
|
|
2022-12-27 22:31:13 +13:00
|
|
|
defp default_description do
|
|
|
|
"A declarative foundation for ambitious Elixir applications. Model your domain, derive the rest."
|
|
|
|
end
|
2022-03-28 10:26:35 +13:00
|
|
|
end
|