use slugs
This commit is contained in:
		| @@ -44,7 +44,7 @@ defmodule MemexWeb.Components.ContextsTableComponent do | ||||
|       end | ||||
|  | ||||
|     columns = [ | ||||
|       %{label: gettext("title"), key: :title}, | ||||
|       %{label: gettext("slug"), key: :slug}, | ||||
|       %{label: gettext("content"), key: :content}, | ||||
|       %{label: gettext("tags"), key: :tags}, | ||||
|       %{label: gettext("visibility"), key: :visibility} | ||||
| @@ -89,20 +89,20 @@ defmodule MemexWeb.Components.ContextsTableComponent do | ||||
|  | ||||
|   @spec get_value_for_key(atom(), Context.t(), additional_data :: map()) :: | ||||
|           any() | {any(), Rendered.t()} | ||||
|   defp get_value_for_key(:title, %{id: id, title: title}, _additional_data) do | ||||
|     assigns = %{id: id, title: title} | ||||
|   defp get_value_for_key(:slug, %{slug: slug}, _additional_data) do | ||||
|     assigns = %{slug: slug} | ||||
|  | ||||
|     title_block = ~H""" | ||||
|     slug_block = ~H""" | ||||
|     <.link | ||||
|       navigate={Routes.context_show_path(Endpoint, :show, @id)} | ||||
|       navigate={Routes.context_show_path(Endpoint, :show, @slug)} | ||||
|       class="link" | ||||
|       data-qa={"context-show-#{@id}"} | ||||
|       data-qa={"context-show-#{@slug}"} | ||||
|     > | ||||
|       <%= @title %> | ||||
|       <%= @slug %> | ||||
|     </.link> | ||||
|     """ | ||||
|  | ||||
|     {title, title_block} | ||||
|     {slug, slug_block} | ||||
|   end | ||||
|  | ||||
|   defp get_value_for_key(:content, %{content: content}, _additional_data) do | ||||
|   | ||||
| @@ -44,7 +44,7 @@ defmodule MemexWeb.Components.NotesTableComponent do | ||||
|       end | ||||
|  | ||||
|     columns = [ | ||||
|       %{label: gettext("title"), key: :title}, | ||||
|       %{label: gettext("slug"), key: :slug}, | ||||
|       %{label: gettext("content"), key: :content}, | ||||
|       %{label: gettext("tags"), key: :tags}, | ||||
|       %{label: gettext("visibility"), key: :visibility} | ||||
| @@ -89,20 +89,20 @@ defmodule MemexWeb.Components.NotesTableComponent do | ||||
|  | ||||
|   @spec get_value_for_key(atom(), Note.t(), additional_data :: map()) :: | ||||
|           any() | {any(), Rendered.t()} | ||||
|   defp get_value_for_key(:title, %{id: id, title: title}, _additional_data) do | ||||
|     assigns = %{id: id, title: title} | ||||
|   defp get_value_for_key(:slug, %{slug: slug}, _additional_data) do | ||||
|     assigns = %{slug: slug} | ||||
|  | ||||
|     title_block = ~H""" | ||||
|     slug_block = ~H""" | ||||
|     <.link | ||||
|       navigate={Routes.note_show_path(Endpoint, :show, @id)} | ||||
|       navigate={Routes.note_show_path(Endpoint, :show, @slug)} | ||||
|       class="link" | ||||
|       data-qa={"note-show-#{@id}"} | ||||
|       data-qa={"note-show-#{@slug}"} | ||||
|     > | ||||
|       <%= @title %> | ||||
|       <%= @slug %> | ||||
|     </.link> | ||||
|     """ | ||||
|  | ||||
|     {title, title_block} | ||||
|     {slug, slug_block} | ||||
|   end | ||||
|  | ||||
|   defp get_value_for_key(:content, %{content: content}, _additional_data) do | ||||
|   | ||||
| @@ -44,7 +44,7 @@ defmodule MemexWeb.Components.PipelinesTableComponent do | ||||
|       end | ||||
|  | ||||
|     columns = [ | ||||
|       %{label: gettext("title"), key: :title}, | ||||
|       %{label: gettext("slug"), key: :slug}, | ||||
|       %{label: gettext("description"), key: :description}, | ||||
|       %{label: gettext("tags"), key: :tags}, | ||||
|       %{label: gettext("visibility"), key: :visibility} | ||||
| @@ -89,20 +89,20 @@ defmodule MemexWeb.Components.PipelinesTableComponent do | ||||
|  | ||||
|   @spec get_value_for_key(atom(), Pipeline.t(), additional_data :: map()) :: | ||||
|           any() | {any(), Rendered.t()} | ||||
|   defp get_value_for_key(:title, %{id: id, title: title}, _additional_data) do | ||||
|     assigns = %{id: id, title: title} | ||||
|   defp get_value_for_key(:slug, %{slug: slug}, _additional_data) do | ||||
|     assigns = %{slug: slug} | ||||
|  | ||||
|     title_block = ~H""" | ||||
|     slug_block = ~H""" | ||||
|     <.link | ||||
|       navigate={Routes.pipeline_show_path(Endpoint, :show, @id)} | ||||
|       navigate={Routes.pipeline_show_path(Endpoint, :show, @slug)} | ||||
|       class="link" | ||||
|       data-qa={"pipeline-show-#{@id}"} | ||||
|       data-qa={"pipeline-show-#{@slug}"} | ||||
|     > | ||||
|       <%= @title %> | ||||
|       <%= @slug %> | ||||
|     </.link> | ||||
|     """ | ||||
|  | ||||
|     {title, title_block} | ||||
|     {slug, slug_block} | ||||
|   end | ||||
|  | ||||
|   defp get_value_for_key(:description, %{description: description}, _additional_data) do | ||||
|   | ||||
| @@ -38,10 +38,10 @@ defmodule MemexWeb.ContextLive.FormComponent do | ||||
|          context_params | ||||
|        ) do | ||||
|     case Contexts.update_context(context, context_params, current_user) do | ||||
|       {:ok, %{title: title}} -> | ||||
|       {:ok, %{slug: slug}} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, gettext("%{title} saved", title: title)) | ||||
|          |> put_flash(:info, gettext("%{slug} saved", slug: slug)) | ||||
|          |> push_navigate(to: return_to)} | ||||
|  | ||||
|       {:error, %Ecto.Changeset{} = changeset} -> | ||||
| @@ -55,10 +55,10 @@ defmodule MemexWeb.ContextLive.FormComponent do | ||||
|          context_params | ||||
|        ) do | ||||
|     case Contexts.create_context(context_params, current_user) do | ||||
|       {:ok, %{title: title}} -> | ||||
|       {:ok, %{slug: slug}} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, gettext("%{title} created", title: title)) | ||||
|          |> put_flash(:info, gettext("%{slug} created", slug: slug)) | ||||
|          |> push_navigate(to: return_to)} | ||||
|  | ||||
|       {:error, %Ecto.Changeset{} = changeset} -> | ||||
|   | ||||
| @@ -9,11 +9,11 @@ | ||||
|     phx-debounce="300" | ||||
|     class="flex flex-col justify-start items-stretch space-y-4" | ||||
|   > | ||||
|     <%= text_input(f, :title, | ||||
|     <%= text_input(f, :slug, | ||||
|       class: "input input-primary", | ||||
|       placeholder: gettext("title") | ||||
|       placeholder: gettext("slug") | ||||
|     ) %> | ||||
|     <%= error_tag(f, :title) %> | ||||
|     <%= error_tag(f, :slug) %> | ||||
|  | ||||
|     <%= textarea(f, :content, | ||||
|       id: "context-form-content", | ||||
|   | ||||
| @@ -16,11 +16,11 @@ defmodule MemexWeb.ContextLive.Index do | ||||
|     {:noreply, apply_action(socket, live_action, params)} | ||||
|   end | ||||
|  | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do | ||||
|     %{title: title} = context = Contexts.get_context!(id, current_user) | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"slug" => slug}) do | ||||
|     %{slug: slug} = context = Contexts.get_context_by_slug(slug, current_user) | ||||
|  | ||||
|     socket | ||||
|     |> assign(page_title: gettext("edit %{title}", title: title)) | ||||
|     |> assign(page_title: gettext("edit %{slug}", slug: slug)) | ||||
|     |> assign(context: context) | ||||
|   end | ||||
|  | ||||
| @@ -49,12 +49,12 @@ defmodule MemexWeb.ContextLive.Index do | ||||
|   @impl true | ||||
|   def handle_event("delete", %{"id" => id}, %{assigns: %{current_user: current_user}} = socket) do | ||||
|     context = Contexts.get_context!(id, current_user) | ||||
|     {:ok, %{title: title}} = Contexts.delete_context(context, current_user) | ||||
|     {:ok, %{slug: slug}} = Contexts.delete_context(context, current_user) | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
|       |> assign(contexts: Contexts.list_contexts(current_user)) | ||||
|       |> put_flash(:info, gettext("%{title} deleted", title: title)) | ||||
|       |> put_flash(:info, gettext("%{slug} deleted", slug: slug)) | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|   | ||||
| @@ -32,7 +32,7 @@ | ||||
|       <:actions :let={context}> | ||||
|         <%= if is_owner?(context, @current_user) do %> | ||||
|           <.link | ||||
|             patch={Routes.context_index_path(@socket, :edit, context)} | ||||
|             patch={Routes.context_index_path(@socket, :edit, context.slug)} | ||||
|             data-qa={"context-edit-#{context.id}"} | ||||
|           > | ||||
|             <%= dgettext("actions", "edit") %> | ||||
|   | ||||
| @@ -10,11 +10,15 @@ defmodule MemexWeb.ContextLive.Show do | ||||
|  | ||||
|   @impl true | ||||
|   def handle_params( | ||||
|         %{"id" => id}, | ||||
|         %{"slug" => slug}, | ||||
|         _, | ||||
|         %{assigns: %{live_action: live_action, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     context = Contexts.get_context!(id, current_user) | ||||
|     context = | ||||
|       case Contexts.get_context_by_slug(slug, current_user) do | ||||
|         nil -> raise MemexWeb.NotFoundError, gettext("%{slug} could not be found", slug: slug) | ||||
|         context -> context | ||||
|       end | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
| @@ -30,18 +34,18 @@ defmodule MemexWeb.ContextLive.Show do | ||||
|         _params, | ||||
|         %{assigns: %{context: context, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     {:ok, %{title: title}} = Contexts.delete_context(context, current_user) | ||||
|     {:ok, %{slug: slug}} = Contexts.delete_context(context, current_user) | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
|       |> put_flash(:info, gettext("%{title} deleted", title: title)) | ||||
|       |> put_flash(:info, gettext("%{slug} deleted", slug: slug)) | ||||
|       |> push_navigate(to: Routes.context_index_path(Endpoint, :index)) | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   defp page_title(:show, %{title: title}), do: title | ||||
|   defp page_title(:edit, %{title: title}), do: gettext("edit %{title}", title: title) | ||||
|   defp page_title(:show, %{slug: slug}), do: slug | ||||
|   defp page_title(:edit, %{slug: slug}), do: gettext("edit %{slug}", slug: slug) | ||||
|  | ||||
|   @spec is_owner_or_admin?(Context.t(), User.t()) :: boolean() | ||||
|   defp is_owner_or_admin?(%{user_id: user_id}, %{id: user_id}), do: true | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <div class="mx-auto flex flex-col justify-center items-stretch space-y-4 max-w-3xl"> | ||||
|   <h1 class="text-xl"> | ||||
|     <%= @context.title %> | ||||
|     <%= @context.slug %> | ||||
|   </h1> | ||||
|  | ||||
|   <p><%= if @context.tags, do: @context.tags |> Enum.join(", ") %></p> | ||||
| @@ -23,7 +23,10 @@ | ||||
|       <%= dgettext("actions", "back") %> | ||||
|     </.link> | ||||
|     <%= if is_owner?(@context, @current_user) do %> | ||||
|       <.link class="btn btn-primary" patch={Routes.context_show_path(@socket, :edit, @context)}> | ||||
|       <.link | ||||
|         class="btn btn-primary" | ||||
|         patch={Routes.context_show_path(@socket, :edit, @context.slug)} | ||||
|       > | ||||
|         <%= dgettext("actions", "edit") %> | ||||
|       </.link> | ||||
|     <% end %> | ||||
| @@ -42,7 +45,7 @@ | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:edit] do %> | ||||
|   <.modal return_to={Routes.context_show_path(@socket, :show, @context)}> | ||||
|   <.modal return_to={Routes.context_show_path(@socket, :show, @context.slug)}> | ||||
|     <.live_component | ||||
|       module={MemexWeb.ContextLive.FormComponent} | ||||
|       id={@context.id} | ||||
| @@ -50,7 +53,7 @@ | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       context={@context} | ||||
|       return_to={Routes.context_show_path(@socket, :show, @context)} | ||||
|       return_to={Routes.context_show_path(@socket, :show, @context.slug)} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
|   | ||||
| @@ -37,10 +37,10 @@ defmodule MemexWeb.NoteLive.FormComponent do | ||||
|          note_params | ||||
|        ) do | ||||
|     case Notes.update_note(note, note_params, current_user) do | ||||
|       {:ok, %{title: title}} -> | ||||
|       {:ok, %{slug: slug}} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, gettext("%{title} saved", title: title)) | ||||
|          |> put_flash(:info, gettext("%{slug} saved", slug: slug)) | ||||
|          |> push_navigate(to: return_to)} | ||||
|  | ||||
|       {:error, %Ecto.Changeset{} = changeset} -> | ||||
| @@ -54,10 +54,10 @@ defmodule MemexWeb.NoteLive.FormComponent do | ||||
|          note_params | ||||
|        ) do | ||||
|     case Notes.create_note(note_params, current_user) do | ||||
|       {:ok, %{title: title}} -> | ||||
|       {:ok, %{slug: slug}} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, gettext("%{title} created", title: title)) | ||||
|          |> put_flash(:info, gettext("%{slug} created", slug: slug)) | ||||
|          |> push_navigate(to: return_to)} | ||||
|  | ||||
|       {:error, %Ecto.Changeset{} = changeset} -> | ||||
|   | ||||
| @@ -9,11 +9,11 @@ | ||||
|     phx-debounce="300" | ||||
|     class="flex flex-col justify-start items-stretch space-y-4" | ||||
|   > | ||||
|     <%= text_input(f, :title, | ||||
|     <%= text_input(f, :slug, | ||||
|       class: "input input-primary", | ||||
|       placeholder: gettext("title") | ||||
|       placeholder: gettext("slug") | ||||
|     ) %> | ||||
|     <%= error_tag(f, :title) %> | ||||
|     <%= error_tag(f, :slug) %> | ||||
|  | ||||
|     <%= textarea(f, :content, | ||||
|       id: "note-form-content", | ||||
|   | ||||
| @@ -16,11 +16,11 @@ defmodule MemexWeb.NoteLive.Index do | ||||
|     {:noreply, apply_action(socket, live_action, params)} | ||||
|   end | ||||
|  | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do | ||||
|     %{title: title} = note = Notes.get_note!(id, current_user) | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"slug" => slug}) do | ||||
|     %{slug: slug} = note = Notes.get_note_by_slug(slug, current_user) | ||||
|  | ||||
|     socket | ||||
|     |> assign(page_title: gettext("edit %{title}", title: title)) | ||||
|     |> assign(page_title: gettext("edit %{slug}", slug: slug)) | ||||
|     |> assign(note: note) | ||||
|   end | ||||
|  | ||||
| @@ -49,12 +49,12 @@ defmodule MemexWeb.NoteLive.Index do | ||||
|   @impl true | ||||
|   def handle_event("delete", %{"id" => id}, %{assigns: %{current_user: current_user}} = socket) do | ||||
|     note = Notes.get_note!(id, current_user) | ||||
|     {:ok, %{title: title}} = Notes.delete_note(note, current_user) | ||||
|     {:ok, %{slug: slug}} = Notes.delete_note(note, current_user) | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
|       |> assign(notes: Notes.list_notes(current_user)) | ||||
|       |> put_flash(:info, gettext("%{title} deleted", title: title)) | ||||
|       |> put_flash(:info, gettext("%{slug} deleted", slug: slug)) | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|   | ||||
| @@ -32,7 +32,7 @@ | ||||
|       <:actions :let={note}> | ||||
|         <%= if is_owner?(note, @current_user) do %> | ||||
|           <.link | ||||
|             patch={Routes.note_index_path(@socket, :edit, note)} | ||||
|             patch={Routes.note_index_path(@socket, :edit, note.slug)} | ||||
|             data-qa={"note-edit-#{note.id}"} | ||||
|           > | ||||
|             <%= dgettext("actions", "edit") %> | ||||
|   | ||||
| @@ -10,11 +10,15 @@ defmodule MemexWeb.NoteLive.Show do | ||||
|  | ||||
|   @impl true | ||||
|   def handle_params( | ||||
|         %{"id" => id}, | ||||
|         %{"slug" => slug}, | ||||
|         _, | ||||
|         %{assigns: %{live_action: live_action, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     note = Notes.get_note!(id, current_user) | ||||
|     note = | ||||
|       case Notes.get_note_by_slug(slug, current_user) do | ||||
|         nil -> raise MemexWeb.NotFoundError, gettext("%{slug} could not be found", slug: slug) | ||||
|         note -> note | ||||
|       end | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
| @@ -30,18 +34,18 @@ defmodule MemexWeb.NoteLive.Show do | ||||
|         _params, | ||||
|         %{assigns: %{note: note, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     {:ok, %{title: title}} = Notes.delete_note(note, current_user) | ||||
|     {:ok, %{slug: slug}} = Notes.delete_note(note, current_user) | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
|       |> put_flash(:info, gettext("%{title} deleted", title: title)) | ||||
|       |> put_flash(:info, gettext("%{slug} deleted", slug: slug)) | ||||
|       |> push_navigate(to: Routes.note_index_path(Endpoint, :index)) | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   defp page_title(:show, %{title: title}), do: title | ||||
|   defp page_title(:edit, %{title: title}), do: gettext("edit %{title}", title: title) | ||||
|   defp page_title(:show, %{slug: slug}), do: slug | ||||
|   defp page_title(:edit, %{slug: slug}), do: gettext("edit %{slug}", slug: slug) | ||||
|  | ||||
|   @spec is_owner_or_admin?(Note.t(), User.t()) :: boolean() | ||||
|   defp is_owner_or_admin?(%{user_id: user_id}, %{id: user_id}), do: true | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <div class="mx-auto flex flex-col justify-center items-stretch space-y-4 max-w-3xl"> | ||||
|   <h1 class="text-xl"> | ||||
|     <%= @note.title %> | ||||
|     <%= @note.slug %> | ||||
|   </h1> | ||||
|  | ||||
|   <p><%= if @note.tags, do: @note.tags |> Enum.join(", ") %></p> | ||||
| @@ -23,7 +23,7 @@ | ||||
|       <%= dgettext("actions", "back") %> | ||||
|     </.link> | ||||
|     <%= if is_owner?(@note, @current_user) do %> | ||||
|       <.link class="btn btn-primary" patch={Routes.note_show_path(@socket, :edit, @note)}> | ||||
|       <.link class="btn btn-primary" patch={Routes.note_show_path(@socket, :edit, @note.slug)}> | ||||
|         <%= dgettext("actions", "edit") %> | ||||
|       </.link> | ||||
|     <% end %> | ||||
| @@ -42,7 +42,7 @@ | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:edit] do %> | ||||
|   <.modal return_to={Routes.note_show_path(@socket, :show, @note)}> | ||||
|   <.modal return_to={Routes.note_show_path(@socket, :show, @note.slug)}> | ||||
|     <.live_component | ||||
|       module={MemexWeb.NoteLive.FormComponent} | ||||
|       id={@note.id} | ||||
| @@ -50,7 +50,7 @@ | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       note={@note} | ||||
|       return_to={Routes.note_show_path(@socket, :show, @note)} | ||||
|       return_to={Routes.note_show_path(@socket, :show, @note.slug)} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
|   | ||||
| @@ -42,10 +42,10 @@ defmodule MemexWeb.PipelineLive.FormComponent do | ||||
|          pipeline_params | ||||
|        ) do | ||||
|     case Pipelines.update_pipeline(pipeline, pipeline_params, current_user) do | ||||
|       {:ok, %{title: title}} -> | ||||
|       {:ok, %{slug: slug}} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, gettext("%{title} saved", title: title)) | ||||
|          |> put_flash(:info, gettext("%{slug} saved", slug: slug)) | ||||
|          |> push_navigate(to: return_to)} | ||||
|  | ||||
|       {:error, %Ecto.Changeset{} = changeset} -> | ||||
| @@ -59,10 +59,10 @@ defmodule MemexWeb.PipelineLive.FormComponent do | ||||
|          pipeline_params | ||||
|        ) do | ||||
|     case Pipelines.create_pipeline(pipeline_params, current_user) do | ||||
|       {:ok, %{title: title}} -> | ||||
|       {:ok, %{slug: slug}} -> | ||||
|         {:noreply, | ||||
|          socket | ||||
|          |> put_flash(:info, gettext("%{title} created", title: title)) | ||||
|          |> put_flash(:info, gettext("%{slug} created", slug: slug)) | ||||
|          |> push_navigate(to: return_to)} | ||||
|  | ||||
|       {:error, %Ecto.Changeset{} = changeset} -> | ||||
|   | ||||
| @@ -9,11 +9,11 @@ | ||||
|     phx-debounce="300" | ||||
|     class="flex flex-col justify-start items-stretch space-y-4" | ||||
|   > | ||||
|     <%= text_input(f, :title, | ||||
|     <%= text_input(f, :slug, | ||||
|       class: "input input-primary", | ||||
|       placeholder: gettext("title") | ||||
|       placeholder: gettext("slug") | ||||
|     ) %> | ||||
|     <%= error_tag(f, :title) %> | ||||
|     <%= error_tag(f, :slug) %> | ||||
|  | ||||
|     <%= textarea(f, :description, | ||||
|       id: "pipeline-form-description", | ||||
|   | ||||
| @@ -16,11 +16,11 @@ defmodule MemexWeb.PipelineLive.Index do | ||||
|     {:noreply, apply_action(socket, live_action, params)} | ||||
|   end | ||||
|  | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"id" => id}) do | ||||
|     %{title: title} = pipeline = Pipelines.get_pipeline!(id, current_user) | ||||
|   defp apply_action(%{assigns: %{current_user: current_user}} = socket, :edit, %{"slug" => slug}) do | ||||
|     %{slug: slug} = pipeline = Pipelines.get_pipeline_by_slug(slug, current_user) | ||||
|  | ||||
|     socket | ||||
|     |> assign(page_title: gettext("edit %{title}", title: title)) | ||||
|     |> assign(page_title: gettext("edit %{slug}", slug: slug)) | ||||
|     |> assign(pipeline: pipeline) | ||||
|   end | ||||
|  | ||||
| @@ -49,12 +49,12 @@ defmodule MemexWeb.PipelineLive.Index do | ||||
|   @impl true | ||||
|   def handle_event("delete", %{"id" => id}, %{assigns: %{current_user: current_user}} = socket) do | ||||
|     pipeline = Pipelines.get_pipeline!(id, current_user) | ||||
|     {:ok, %{title: title}} = Pipelines.delete_pipeline(pipeline, current_user) | ||||
|     {:ok, %{slug: slug}} = Pipelines.delete_pipeline(pipeline, current_user) | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
|       |> assign(pipelines: Pipelines.list_pipelines(current_user)) | ||||
|       |> put_flash(:info, gettext("%{title} deleted", title: title)) | ||||
|       |> put_flash(:info, gettext("%{slug} deleted", slug: slug)) | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|   | ||||
| @@ -32,7 +32,7 @@ | ||||
|       <:actions :let={pipeline}> | ||||
|         <%= if is_owner?(pipeline, @current_user) do %> | ||||
|           <.link | ||||
|             patch={Routes.pipeline_index_path(@socket, :edit, pipeline)} | ||||
|             patch={Routes.pipeline_index_path(@socket, :edit, pipeline.slug)} | ||||
|             data-qa={"pipeline-edit-#{pipeline.id}"} | ||||
|           > | ||||
|             <%= dgettext("actions", "edit") %> | ||||
|   | ||||
| @@ -10,11 +10,15 @@ defmodule MemexWeb.PipelineLive.Show do | ||||
|  | ||||
|   @impl true | ||||
|   def handle_params( | ||||
|         %{"id" => id}, | ||||
|         %{"slug" => slug}, | ||||
|         _, | ||||
|         %{assigns: %{live_action: live_action, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     pipeline = Pipelines.get_pipeline!(id, current_user) | ||||
|     pipeline = | ||||
|       case Pipelines.get_pipeline_by_slug(slug, current_user) do | ||||
|         nil -> raise MemexWeb.NotFoundError, gettext("%{slug} could not be found", slug: slug) | ||||
|         pipeline -> pipeline | ||||
|       end | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
| @@ -30,18 +34,18 @@ defmodule MemexWeb.PipelineLive.Show do | ||||
|         _params, | ||||
|         %{assigns: %{pipeline: pipeline, current_user: current_user}} = socket | ||||
|       ) do | ||||
|     {:ok, %{title: title}} = Pipelines.delete_pipeline(pipeline, current_user) | ||||
|     {:ok, %{slug: slug}} = Pipelines.delete_pipeline(pipeline, current_user) | ||||
|  | ||||
|     socket = | ||||
|       socket | ||||
|       |> put_flash(:info, gettext("%{title} deleted", title: title)) | ||||
|       |> put_flash(:info, gettext("%{slug} deleted", slug: slug)) | ||||
|       |> push_navigate(to: Routes.pipeline_index_path(Endpoint, :index)) | ||||
|  | ||||
|     {:noreply, socket} | ||||
|   end | ||||
|  | ||||
|   defp page_title(:show, %{title: title}), do: title | ||||
|   defp page_title(:edit, %{title: title}), do: gettext("edit %{title}", title: title) | ||||
|   defp page_title(:show, %{slug: slug}), do: slug | ||||
|   defp page_title(:edit, %{slug: slug}), do: gettext("edit %{slug}", slug: slug) | ||||
|  | ||||
|   @spec is_owner_or_admin?(Pipeline.t(), User.t()) :: boolean() | ||||
|   defp is_owner_or_admin?(%{user_id: user_id}, %{id: user_id}), do: true | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| <div class="mx-auto flex flex-col justify-center items-stretch space-y-4 max-w-3xl"> | ||||
|   <h1 class="text-xl"> | ||||
|     <%= @pipeline.title %> | ||||
|     <%= @pipeline.slug %> | ||||
|   </h1> | ||||
|  | ||||
|   <p><%= if @pipeline.tags, do: @pipeline.tags |> Enum.join(", ") %></p> | ||||
| @@ -23,7 +23,10 @@ | ||||
|       <%= dgettext("actions", "back") %> | ||||
|     </.link> | ||||
|     <%= if is_owner?(@pipeline, @current_user) do %> | ||||
|       <.link class="btn btn-primary" patch={Routes.pipeline_show_path(@socket, :edit, @pipeline)}> | ||||
|       <.link | ||||
|         class="btn btn-primary" | ||||
|         patch={Routes.pipeline_show_path(@socket, :edit, @pipeline.slug)} | ||||
|       > | ||||
|         <%= dgettext("actions", "edit") %> | ||||
|       </.link> | ||||
|     <% end %> | ||||
| @@ -42,7 +45,7 @@ | ||||
| </div> | ||||
|  | ||||
| <%= if @live_action in [:edit] do %> | ||||
|   <.modal return_to={Routes.pipeline_show_path(@socket, :show, @pipeline)}> | ||||
|   <.modal return_to={Routes.pipeline_show_path(@socket, :show, @pipeline.slug)}> | ||||
|     <.live_component | ||||
|       module={MemexWeb.PipelineLive.FormComponent} | ||||
|       id={@pipeline.id} | ||||
| @@ -50,7 +53,7 @@ | ||||
|       title={@page_title} | ||||
|       action={@live_action} | ||||
|       pipeline={@pipeline} | ||||
|       return_to={Routes.pipeline_show_path(@socket, :show, @pipeline)} | ||||
|       return_to={Routes.pipeline_show_path(@socket, :show, @pipeline.slug)} | ||||
|     /> | ||||
|   </.modal> | ||||
| <% end %> | ||||
|   | ||||
							
								
								
									
										3
									
								
								lib/memex_web/not_found_error.ex
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								lib/memex_web/not_found_error.ex
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| defmodule MemexWeb.NotFoundError do | ||||
|   defexception [:message, plug_status: 404] | ||||
| end | ||||
| @@ -58,16 +58,16 @@ defmodule MemexWeb.Router do | ||||
|       pipe_through [:browser, :require_authenticated_user] | ||||
|  | ||||
|       live "/notes/new", NoteLive.Index, :new | ||||
|       live "/notes/:id/edit", NoteLive.Index, :edit | ||||
|       live "/note/:id/edit", NoteLive.Show, :edit | ||||
|       live "/notes/:slug/edit", NoteLive.Index, :edit | ||||
|       live "/note/:slug/edit", NoteLive.Show, :edit | ||||
|  | ||||
|       live "/contexts/new", ContextLive.Index, :new | ||||
|       live "/contexts/:id/edit", ContextLive.Index, :edit | ||||
|       live "/context/:id/edit", ContextLive.Show, :edit | ||||
|       live "/contexts/:slug/edit", ContextLive.Index, :edit | ||||
|       live "/context/:slug/edit", ContextLive.Show, :edit | ||||
|  | ||||
|       live "/pipelines/new", PipelineLive.Index, :new | ||||
|       live "/pipelines/:id/edit", PipelineLive.Index, :edit | ||||
|       live "/pipelines/:id/show/edit", PipelineLive.Show, :edit | ||||
|       live "/pipelines/:slug/edit", PipelineLive.Index, :edit | ||||
|       live "/pipeline/:slug/edit", PipelineLive.Show, :edit | ||||
|  | ||||
|       get "/users/settings", UserSettingsController, :edit | ||||
|       put "/users/settings", UserSettingsController, :update | ||||
| @@ -80,15 +80,15 @@ defmodule MemexWeb.Router do | ||||
|  | ||||
|       live "/notes", NoteLive.Index, :index | ||||
|       live "/notes/:search", NoteLive.Index, :search | ||||
|       live "/note/:id", NoteLive.Show, :show | ||||
|       live "/note/:slug", NoteLive.Show, :show | ||||
|  | ||||
|       live "/contexts", ContextLive.Index, :index | ||||
|       live "/contexts/:search", ContextLive.Index, :search | ||||
|       live "/context/:id", ContextLive.Show, :show | ||||
|       live "/context/:slug", ContextLive.Show, :show | ||||
|  | ||||
|       live "/pipelines", PipelineLive.Index, :index | ||||
|       live "/pipelines/:search", PipelineLive.Index, :search | ||||
|       live "/pipeline/:id", PipelineLive.Show, :show | ||||
|       live "/pipeline/:slug", PipelineLive.Show, :show | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ | ||||
|     <script defer type="text/javascript" src="/js/app.js"> | ||||
|     </script> | ||||
|   </head> | ||||
|   <body class="pb-8 m-0 p-0 w-full h-full"> | ||||
|   <body class="m-0 p-0 w-full h-full bg-primary-800 text-primary-400 subpixel-antialiased"> | ||||
|     <header> | ||||
|       <.topbar current_user={assigns[:current_user]}></.topbar> | ||||
|     </header> | ||||
| @@ -25,7 +25,7 @@ | ||||
|         <hr class="w-full hr" /> | ||||
|  | ||||
|         <a href={Routes.live_path(Endpoint, HomeLive)} class="link title text-primary-400 text-lg"> | ||||
|           <%= dgettext("errors", "Go back home") %> | ||||
|           <%= dgettext("errors", "go back home") %> | ||||
|         </a> | ||||
|       </div> | ||||
|     </div> | ||||
|   | ||||
| @@ -6,9 +6,9 @@ defmodule MemexWeb.ErrorView do | ||||
|   def template_not_found(error_path, _assigns) do | ||||
|     error_string = | ||||
|       case error_path do | ||||
|         "404.html" -> dgettext("errors", "Not found") | ||||
|         "401.html" -> dgettext("errors", "Unauthorized") | ||||
|         _ -> dgettext("errors", "Internal Server Error") | ||||
|         "404.html" -> dgettext("errors", "not found") | ||||
|         "401.html" -> dgettext("errors", "unauthorized") | ||||
|         _ -> dgettext("errors", "internal server error") | ||||
|       end | ||||
|  | ||||
|     render("error.html", %{error_string: error_string}) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user