update components
This commit is contained in:
		| @@ -1,104 +0,0 @@ | |||||||
| defmodule LokalWeb.Components.Topbar do |  | ||||||
|   @moduledoc """ |  | ||||||
|   Phoenix.Component for rendering an interactive topbar |  | ||||||
|   Assign |  | ||||||
|   """ |  | ||||||
|  |  | ||||||
|   use LokalWeb, :component |  | ||||||
|   alias LokalWeb.PageLive |  | ||||||
|  |  | ||||||
|   def topbar(assigns) do |  | ||||||
|     assigns = |  | ||||||
|       %{results: [], title_content: nil, current_user: nil, flash: nil} |  | ||||||
|       |> Map.merge(assigns) |  | ||||||
|  |  | ||||||
|     ~H""" |  | ||||||
|     <header class="mb-8 px-8 py-4 w-full bg-primary-400"> |  | ||||||
|       <nav role="navigation"> |  | ||||||
|         <div class="flex flex-row justify-between items-center space-x-4"> |  | ||||||
|           <div class="flex flex-row justify-start items-center space-x-2"> |  | ||||||
|             <%= link to: Routes.live_path(LokalWeb.Endpoint, PageLive) do %> |  | ||||||
|               <h1 class="leading-5 text-xl text-white hover:underline"> |  | ||||||
|                 Lokal |  | ||||||
|               </h1> |  | ||||||
|             <% end %> |  | ||||||
|             <%= if @title_content do %> |  | ||||||
|               <span>|</span> |  | ||||||
|               <%= render_slot(@title_content) %> |  | ||||||
|             <% end %> |  | ||||||
|           </div> |  | ||||||
|           <ul class="flex flex-row flex-wrap justify-center items-center |  | ||||||
|             text-lg space-x-4 text-lg text-white"> |  | ||||||
|             <form phx-change="suggest" phx-submit="search"> |  | ||||||
|               <input |  | ||||||
|                 type="text" |  | ||||||
|                 name="q" |  | ||||||
|                 class="input input-primary" |  | ||||||
|                 placeholder="Search" |  | ||||||
|                 list="results" |  | ||||||
|                 autocomplete="off" |  | ||||||
|               /> |  | ||||||
|               <datalist id="results"> |  | ||||||
|                 <%= for {app, _vsn} <- @results do %> |  | ||||||
|                   <option value={app}> |  | ||||||
|                     "> <%= app %> |  | ||||||
|                   </option> |  | ||||||
|                 <% end %> |  | ||||||
|               </datalist> |  | ||||||
|             </form> |  | ||||||
|             <%= if @current_user do %> |  | ||||||
|               <li> |  | ||||||
|                 <%= @current_user.email %> |  | ||||||
|               </li> |  | ||||||
|               <li> |  | ||||||
|                 <%= link("Settings", |  | ||||||
|                   class: "hover:underline", |  | ||||||
|                   to: Routes.user_settings_path(LokalWeb.Endpoint, :edit) |  | ||||||
|                 ) %> |  | ||||||
|               </li> |  | ||||||
|               <li> |  | ||||||
|                 <%= link("Log out", |  | ||||||
|                   class: "hover:underline", |  | ||||||
|                   to: Routes.user_session_path(LokalWeb.Endpoint, :delete), |  | ||||||
|                   method: :delete |  | ||||||
|                 ) %> |  | ||||||
|               </li> |  | ||||||
|               <%= if function_exported?(Routes, :live_dashboard_path, 2) do %> |  | ||||||
|                 <li> |  | ||||||
|                   <%= link("LiveDashboard", |  | ||||||
|                     class: "hover:underline", |  | ||||||
|                     to: Routes.live_dashboard_path(LokalWeb.Endpoint, :home) |  | ||||||
|                   ) %> |  | ||||||
|                 </li> |  | ||||||
|               <% end %> |  | ||||||
|             <% else %> |  | ||||||
|               <li> |  | ||||||
|                 <%= link("Register", |  | ||||||
|                   class: "hover:underline", |  | ||||||
|                   to: Routes.user_registration_path(LokalWeb.Endpoint, :new) |  | ||||||
|                 ) %> |  | ||||||
|               </li> |  | ||||||
|               <li> |  | ||||||
|                 <%= link("Log in", |  | ||||||
|                   class: "hover:underline", |  | ||||||
|                   to: Routes.user_session_path(LokalWeb.Endpoint, :new) |  | ||||||
|                 ) %> |  | ||||||
|               </li> |  | ||||||
|             <% end %> |  | ||||||
|           </ul> |  | ||||||
|         </div> |  | ||||||
|       </nav> |  | ||||||
|       <%= if @flash && @flash |> Map.has_key?(:info) do %> |  | ||||||
|         <p class="alert alert-info" role="alert" phx-click="lv:clear-flash" phx-value-key="info"> |  | ||||||
|           <%= live_flash(@flash, :info) %> |  | ||||||
|         </p> |  | ||||||
|       <% end %> |  | ||||||
|       <%= if @flash && @flash |> Map.has_key?(:error) do %> |  | ||||||
|         <p class="alert alert-danger" role="alert" phx-click="lv:clear-flash" phx-value-key="error"> |  | ||||||
|           <%= live_flash(@flash, :error) %> |  | ||||||
|         </p> |  | ||||||
|       <% end %> |  | ||||||
|     </header> |  | ||||||
|     """ |  | ||||||
|   end |  | ||||||
| end |  | ||||||
							
								
								
									
										106
									
								
								lib/lokal_web/components/topbar.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								lib/lokal_web/components/topbar.ex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,106 @@ | |||||||
|  | defmodule LokalWeb.Components.Topbar do | ||||||
|  |   @moduledoc """ | ||||||
|  |   Component that renders a topbar with user functions/links | ||||||
|  |   """ | ||||||
|  |  | ||||||
|  |   use LokalWeb, :component | ||||||
|  |  | ||||||
|  |   alias Lokal.Accounts | ||||||
|  |   alias LokalWeb.{Endpoint, PageLive} | ||||||
|  |  | ||||||
|  |   def topbar(assigns) do | ||||||
|  |     assigns = | ||||||
|  |       %{results: [], title_content: nil, flash: nil, current_user: nil} |> Map.merge(assigns) | ||||||
|  |  | ||||||
|  |     ~H""" | ||||||
|  |     <nav role="navigation" class="mb-8 px-8 py-4 w-full bg-primary-400"> | ||||||
|  |       <div class="flex flex-col sm:flex-row justify-between items-center"> | ||||||
|  |         <div class="mb-4 sm:mb-0 sm:mr-8 flex flex-row justify-start items-center space-x-2"> | ||||||
|  |           <%= live_redirect("Lokal", | ||||||
|  |             to: Routes.live_path(Endpoint, PageLive), | ||||||
|  |             class: "mx-2 my-1 leading-5 text-xl text-white hover:underline" | ||||||
|  |           ) %> | ||||||
|  |  | ||||||
|  |           <%= if @title_content do %> | ||||||
|  |             <span class="mx-2 my-1"> | ||||||
|  |               | | ||||||
|  |             </span> | ||||||
|  |             <%= @title_content %> | ||||||
|  |           <% end %> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr class="mb-2 sm:hidden hr-light" /> | ||||||
|  |  | ||||||
|  |         <ul | ||||||
|  |           class="flex flex-row flex-wrap justify-center items-center | ||||||
|  |           text-lg text-white text-ellipsis" | ||||||
|  |         > | ||||||
|  |           <%= if @current_user do %> | ||||||
|  |             <form phx-change="suggest" phx-submit="search"> | ||||||
|  |               <input | ||||||
|  |                 type="text" | ||||||
|  |                 name="q" | ||||||
|  |                 class="input input-primary" | ||||||
|  |                 placeholder="Search" | ||||||
|  |                 list="results" | ||||||
|  |                 autocomplete="off" | ||||||
|  |               /> | ||||||
|  |               <datalist id="results"> | ||||||
|  |                 <%= for {app, _vsn} <- @results do %> | ||||||
|  |                   <option value={app}> | ||||||
|  |                     "> <%= app %> | ||||||
|  |                   </option> | ||||||
|  |                 <% end %> | ||||||
|  |               </datalist> | ||||||
|  |             </form> | ||||||
|  |             <%= if @current_user.role == :admin do %> | ||||||
|  |               <li class="mx-2 my-1"> | ||||||
|  |                 <%= live_redirect(gettext("Invites"), | ||||||
|  |                   to: Routes.invite_index_path(Endpoint, :index), | ||||||
|  |                   class: "text-primary-600 text-white hover:underline" | ||||||
|  |                 ) %> | ||||||
|  |               </li> | ||||||
|  |             <% end %> | ||||||
|  |             <li class="mx-2 my-1"> | ||||||
|  |               <%= live_redirect(@current_user.email, | ||||||
|  |                 to: Routes.user_settings_path(Endpoint, :edit), | ||||||
|  |                 class: "text-primary-600 text-white hover:underline truncate" | ||||||
|  |               ) %> | ||||||
|  |             </li> | ||||||
|  |             <li class="mx-2 my-1"> | ||||||
|  |               <%= link to: Routes.user_session_path(Endpoint, :delete), | ||||||
|  |                    method: :delete, | ||||||
|  |                    data: [confirm: dgettext("prompts", "Are you sure you want to log out?")] do %> | ||||||
|  |                 <i class="fas fa-sign-out-alt"></i> | ||||||
|  |               <% end %> | ||||||
|  |             </li> | ||||||
|  |             <%= if @current_user.role == :admin and function_exported?(Routes, :live_dashboard_path, 2) do %> | ||||||
|  |               <li class="mx-2 my-1"> | ||||||
|  |                 <%= live_redirect to: Routes.live_dashboard_path(Endpoint, :home), | ||||||
|  |                   class: "text-primary-600 text-white hover:underline" do %> | ||||||
|  |                   <i class="fas fa-tachometer-alt"></i> | ||||||
|  |                 <% end %> | ||||||
|  |               </li> | ||||||
|  |             <% end %> | ||||||
|  |           <% else %> | ||||||
|  |             <%= if Accounts.allow_registration?() do %> | ||||||
|  |               <li class="mx-2 my-1"> | ||||||
|  |                 <%= live_redirect(dgettext("actions", "Register"), | ||||||
|  |                   to: Routes.user_registration_path(Endpoint, :new), | ||||||
|  |                   class: "text-primary-600 text-white hover:underline truncate" | ||||||
|  |                 ) %> | ||||||
|  |               </li> | ||||||
|  |             <% end %> | ||||||
|  |             <li class="mx-2 my-1"> | ||||||
|  |               <%= live_redirect(dgettext("actions", "Log in"), | ||||||
|  |                 to: Routes.user_session_path(Endpoint, :new), | ||||||
|  |                 class: "text-primary-600 text-white hover:underline truncate" | ||||||
|  |               ) %> | ||||||
|  |             </li> | ||||||
|  |           <% end %> | ||||||
|  |         </ul> | ||||||
|  |       </div> | ||||||
|  |     </nav> | ||||||
|  |     """ | ||||||
|  |   end | ||||||
|  | end | ||||||
| @@ -4,28 +4,9 @@ defmodule LokalWeb.LiveHelpers do | |||||||
|   """ |   """ | ||||||
|  |  | ||||||
|   import Phoenix.LiveView.Helpers |   import Phoenix.LiveView.Helpers | ||||||
|   import Phoenix.LiveView, only: [assign_new: 3] |   import Phoenix.LiveView | ||||||
|   alias Lokal.Accounts |   alias Lokal.Accounts | ||||||
|  |   alias Phoenix.LiveView.JS | ||||||
|   @doc """ |  | ||||||
|   Renders a component inside the `LokalWeb.ModalComponent` component. |  | ||||||
|  |  | ||||||
|   The rendered modal receives a `:return_to` option to properly update |  | ||||||
|   the URL when the modal is closed. |  | ||||||
|  |  | ||||||
|   ## Examples |  | ||||||
|  |  | ||||||
|       <%= live_modal LokalWeb.TagLive.FormComponent, |  | ||||||
|         id: @tag.id || :new, |  | ||||||
|         action: @live_action, |  | ||||||
|         tag: @tag, |  | ||||||
|         return_to: Routes.tag_index_path(@socket, :index) %> |  | ||||||
|   """ |  | ||||||
|   def live_modal(component, opts) do |  | ||||||
|     path = Keyword.fetch!(opts, :return_to) |  | ||||||
|     modal_opts = [id: :modal, return_to: path, component: component, opts: opts] |  | ||||||
|     live_component(LokalWeb.ModalComponent, modal_opts) |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   def assign_defaults(socket, %{"user_token" => user_token} = _session) do |   def assign_defaults(socket, %{"user_token" => user_token} = _session) do | ||||||
|     socket |     socket | ||||||
| @@ -37,4 +18,78 @@ defmodule LokalWeb.LiveHelpers do | |||||||
|   def assign_defaults(socket, _session) do |   def assign_defaults(socket, _session) do | ||||||
|     socket |     socket | ||||||
|   end |   end | ||||||
|  |  | ||||||
|  |   @doc """ | ||||||
|  |   Renders a live component inside a modal. | ||||||
|  |  | ||||||
|  |   The rendered modal receives a `:return_to` option to properly update | ||||||
|  |   the URL when the modal is closed. | ||||||
|  |  | ||||||
|  |   ## Examples | ||||||
|  |  | ||||||
|  |       <.modal return_to={Routes.<%= schema.singular %>_index_path(Endpoint, :index)}> | ||||||
|  |         <.live_component | ||||||
|  |           module={<%= inspect context.web_module %>.<%= inspect Module.concat(schema.web_namespace, schema.alias) %>Live.FormComponent} | ||||||
|  |           id={@<%= schema.singular %>.id || :new} | ||||||
|  |           title={@page_title} | ||||||
|  |           action={@live_action} | ||||||
|  |           return_to={Routes.<%= schema.singular %>_index_path(Endpoint, :index)} | ||||||
|  |           <%= schema.singular %>: @<%= schema.singular %> | ||||||
|  |         /> | ||||||
|  |       </.modal> | ||||||
|  |   """ | ||||||
|  |   def modal(assigns) do | ||||||
|  |     ~H""" | ||||||
|  |     <%= live_patch to: @return_to, | ||||||
|  |       id: "modal-bg", | ||||||
|  |       class: | ||||||
|  |         "fade-in fixed z-10 left-0 top-0 | ||||||
|  |          w-full h-full overflow-hidden | ||||||
|  |          p-8 flex flex-col justify-center items-center cursor-auto", | ||||||
|  |       style: "background-color: rgba(0,0,0,0.4);", | ||||||
|  |       phx_remove: hide_modal() | ||||||
|  |     do %> | ||||||
|  |       <span class="hidden"></span> | ||||||
|  |     <% end %> | ||||||
|  |  | ||||||
|  |     <div | ||||||
|  |       id="modal" | ||||||
|  |       class="fixed z-10 left-0 top-0 pointer-events-none | ||||||
|  |         w-full h-full overflow-hidden | ||||||
|  |         p-4 sm:p-8 flex flex-col justify-center items-center" | ||||||
|  |     > | ||||||
|  |       <div | ||||||
|  |         id="modal-content" | ||||||
|  |         class="fade-in-scale w-full max-w-3xl relative | ||||||
|  |         pointer-events-auto overflow-hidden | ||||||
|  |         px-8 py-4 sm:py-8 flex flex-col justify-center items-center | ||||||
|  |         flex flex-col justify-start items-center | ||||||
|  |         bg-white border-2 rounded-lg" | ||||||
|  |       > | ||||||
|  |         <%= live_patch to: @return_to, | ||||||
|  |                    id: "close", | ||||||
|  |                    class: | ||||||
|  |                      "absolute top-8 right-10 | ||||||
|  |                       text-gray-500 hover:text-gray-800 | ||||||
|  |                       transition-all duration-500 ease-in-out", | ||||||
|  |                    phx_remove: hide_modal() do %> | ||||||
|  |           <i class="fa-fw fa-lg fas fa-times"></i> | ||||||
|  |         <% end %> | ||||||
|  |  | ||||||
|  |         <div | ||||||
|  |           class="overflow-x-hidden overflow-y-auto w-full p-8 flex flex-col space-y-4 justify-start items-center" | ||||||
|  |         > | ||||||
|  |           <%= render_slot(@inner_block) %> | ||||||
|  |         </div> | ||||||
|  |       </div> | ||||||
|  |     </div> | ||||||
|  |     """ | ||||||
|  |   end | ||||||
|  |  | ||||||
|  |   def hide_modal(js \\ %JS{}) do | ||||||
|  |     js | ||||||
|  |     |> JS.hide(to: "#modal", transition: "fade-out") | ||||||
|  |     |> JS.hide(to: "#modal-bg", transition: "fade-out") | ||||||
|  |     |> JS.hide(to: "#modal-content", transition: "fade-out-scale") | ||||||
|  |   end | ||||||
| end | end | ||||||
|   | |||||||
| @@ -1,30 +0,0 @@ | |||||||
| defmodule LokalWeb.ModalComponent do |  | ||||||
|   @moduledoc """ |  | ||||||
|   Component that provides a floating modal |  | ||||||
|   """ |  | ||||||
|  |  | ||||||
|   use LokalWeb, :live_component |  | ||||||
|  |  | ||||||
|   @impl true |  | ||||||
|   def render(assigns) do |  | ||||||
|     ~L""" |  | ||||||
|     <div id="<%= @id %>" class="phx-modal" |  | ||||||
|       phx-capture-click="close" |  | ||||||
|       phx-window-keydown="close" |  | ||||||
|       phx-key="escape" |  | ||||||
|       phx-target="#<%= @id %>" |  | ||||||
|       phx-page-loading> |  | ||||||
|  |  | ||||||
|       <div class="phx-modal-content"> |  | ||||||
|         <%= live_patch raw("×"), to: @return_to, class: "phx-modal-close" %> |  | ||||||
|         <%= live_component @component, @opts %> |  | ||||||
|       </div> |  | ||||||
|     </div> |  | ||||||
|     """ |  | ||||||
|   end |  | ||||||
|  |  | ||||||
|   @impl true |  | ||||||
|   def handle_event("close", _, socket) do |  | ||||||
|     {:noreply, push_patch(socket, to: socket.assigns.return_to)} |  | ||||||
|   end |  | ||||||
| end |  | ||||||
		Reference in New Issue
	
	Block a user