defmodule Beacon.LiveAdmin.AdminComponents do @moduledoc """ Provides Admin UI components. This file contains new components and also overrided Core components. """ use Phoenix.Component alias Phoenix.LiveView.JS alias Beacon.LiveAdmin.CoreComponents alias Beacon.LiveAdmin.PageBuilder.Table use Gettext, backend: Beacon.LiveAdmin.Gettext import Beacon.LiveAdmin.Router, only: [beacon_live_admin_path: 3] defdelegate header(assigns), to: CoreComponents defdelegate icon(assigns), to: CoreComponents defdelegate show_modal(assigns), to: CoreComponents defdelegate hide_modal(assigns), to: CoreComponents defdelegate show(selector), to: CoreComponents defdelegate show(js, selector), to: CoreComponents defdelegate hide(selector), to: CoreComponents defdelegate hide(js, selector), to: CoreComponents defdelegate translate_error(error), to: CoreComponents defdelegate translate_errors(errors, field), to: CoreComponents @menu_link_active_class "inline-block p-4 text-blue-600 border-b-2 border-blue-600 rounded-t-lg active" @menu_link_regular_class "inline-block p-4 border-b-2 border-transparent rounded-t-lg hover:text-gray-600 hover:border-gray-300" @doc false attr :socket, :map attr :flash, :map attr :beacon_layout, :map attr :live_action, :atom def layout_header(assigns) do ~H""" <.flash_group flash={@flash} /> """ end @doc false attr :socket, :map attr :site, :atom attr :current_action, :atom attr :layout_id, :string def layout_menu(assigns) do assigns = assign(assigns, active_class: @menu_link_active_class, regular_class: @menu_link_regular_class ) ~H"""
""" end defp layout_menu_items(%{current_action: :new} = assigns) do ~H"""
  • <.link patch={beacon_live_admin_path(@socket, @site, "/layouts/#{@layout_id}")} class={@active_class}>Layout
  • """ end defp layout_menu_items(assigns) do ~H"""
  • <.link patch={beacon_live_admin_path(@socket, @site, "/layouts/#{@layout_id}")} class={if(@current_action == :edit, do: @active_class, else: @regular_class)}>Layout
  • <.link patch={beacon_live_admin_path(@socket, @site, "/layouts/#{@layout_id}/meta_tags")} class={if(@current_action == :meta_tags, do: @active_class, else: @regular_class)}>Meta Tags
  • <.link patch={beacon_live_admin_path(@socket, @site, "/layouts/#{@layout_id}/resource_links")} class={if(@current_action == :resource_links, do: @active_class, else: @regular_class)}> Resource Links
  • <.link patch={beacon_live_admin_path(@socket, @site, "/layouts/#{@layout_id}/revisions")} class={if(@current_action == :revisions, do: @active_class, else: @regular_class)}>Revisions
  • """ end @doc false attr :socket, :map attr :flash, :map attr :page, :any attr :live_action, :atom def page_header(assigns) do ~H""" <.flash_group flash={@flash} /> """ end @doc false attr :socket, :map attr :site, :atom attr :current_action, :atom attr :page_id, :string def page_menu(assigns) do assigns = assign(assigns, active_class: @menu_link_active_class, regular_class: @menu_link_regular_class ) ~H"""
      <%= page_menu_items(assigns) %>
    """ end defp page_menu_items(%{current_action: :new} = assigns) do ~H"""
  • <.link patch={beacon_live_admin_path(@socket, @site, "/pages/#{@page_id}")} class={@active_class}>Page
  • """ end defp page_menu_items(assigns) do ~H"""
  • <.link patch={beacon_live_admin_path(@socket, @site, "/pages/#{@page_id}")} class={if(@current_action == :edit, do: @active_class, else: @regular_class)}>Page
  • <.link patch={beacon_live_admin_path(@socket, @site, "/pages/#{@page_id}/meta_tags")} class={if(@current_action == :meta_tags, do: @active_class, else: @regular_class)}>Meta Tags
  • <.link patch={beacon_live_admin_path(@socket, @site, "/pages/#{@page_id}/schema")} class={if(@current_action == :schema, do: @active_class, else: @regular_class)}>Schema
  • <.link patch={beacon_live_admin_path(@socket, @site, "/pages/#{@page_id}/variants")} class={if(@current_action == :variants, do: @active_class, else: @regular_class)}>Variants
  • <.link patch={beacon_live_admin_path(@socket, @site, "/pages/#{@page_id}/revisions")} class={if(@current_action == :revisions, do: @active_class, else: @regular_class)}>Revisions
  • """ end @doc false attr :socket, :map attr :flash, :map attr :component, :any attr :live_action, :atom def component_header(assigns) do ~H""" <.flash_group flash={@flash} /> """ end @doc false attr :socket, :map attr :site, :atom attr :current_action, :atom attr :component_id, :string def component_menu(assigns) do assigns = assign(assigns, active_class: @menu_link_active_class, regular_class: @menu_link_regular_class ) ~H"""
      <%= component_menu_items(assigns) %>
    """ end defp component_menu_items(%{current_action: :new} = assigns) do ~H"""
  • <.link patch={beacon_live_admin_path(@socket, @site, "/components/#{@component_id}")} class={@active_class}>Component
  • """ end defp component_menu_items(assigns) do ~H"""
  • <.link patch={beacon_live_admin_path(@socket, @site, "/components/#{@component_id}")} class={if(@current_action == :edit, do: @active_class, else: @regular_class)}>Component
  • <.link patch={beacon_live_admin_path(@socket, @site, "/components/#{@component_id}/slots")} class={if(@current_action == :slots, do: @active_class, else: @regular_class)}>Slots
  • """ end @doc """ Renders a thumbnail image. """ attr :source, :string, default: nil def thumbnail(assigns) do ~H""" """ end @doc """ Renders a modal. ## Examples <.modal id="confirm-modal"> This is a modal. JS commands may be passed to the `:on_cancel` to configure the closing/cancel event, for example: <.modal id="confirm" on_cancel={JS.navigate(~p"/posts")}> This is another modal. """ attr :id, :string, required: true attr :show, :boolean, default: false attr :on_cancel, JS, default: %JS{} slot :inner_block, required: true def modal(assigns) do ~H"""