defmodule GitSyncWeb.SourceHTML do @moduledoc """ Source management and run history pages. """ use GitSyncWeb, :html embed_templates "source_html/*" @doc """ A repository picker for one end of a mirror. A forge that can be listed gives a searchable list of its repositories; anything else falls back to a typed `owner/name`. """ attr :id, :string, required: true attr :field, Phoenix.HTML.FormField, required: true attr :label, :string, required: true attr :repos, :any, required: true, doc: "`Forge.list_repos/1` result, or nil for no forge yet" def repo_field(assigns) do ~H"""
<.repo_input field={@field} label={@label} repos={@repos} />
""" end defp repo_input(%{repos: {:ok, repos}} = assigns) do assigns = assign(assigns, :options, Enum.map(repos, & &1.full_name)) ~H""" <.input field={@field} type="datalist" label={@label} options={@options} placeholder="Type to search" autocomplete="off" data-1p-ignore data-lpignore="true" /> """ end defp repo_input(%{repos: nil} = assigns) do ~H""" <.input field={@field} type="select" label={@label} options={[]} prompt="Choose a forge first" disabled /> """ end defp repo_input(assigns) do ~H""" <.input field={@field} label={@label} placeholder="adam/git-sync" autocomplete="off" data-1p-ignore data-lpignore="true" />

Could not list repositories: {elem(@repos, 1)}

""" end @doc """ The forge picker for one end of a mirror, which repaints the repository picker beside it as it changes. """ attr :field, Phoenix.HTML.FormField, required: true attr :label, :string, required: true attr :options, :list, required: true def forge_field(assigns) do ~H""" <.input field={@field} type="select" label={@label} options={@options} prompt="Choose a forge" data-bind={"#{@field.form.name}_connection_id"} data-on:change={"@get('#{~p"/sources/repos"}')"} /> """ end @doc """ The run history of one source, patched into the page as runs happen. """ attr :runs, :list, required: true def runs(assigns) do ~H"""

No runs yet.

"is-success" :failure -> "is-failed" :running -> "is-running" end ]}> {run.status} Run #{run.id}

Started · finished

Source log

{run.log}

Destination results

No destination results recorded.

{target.destination.repo} on {target.destination.connection.base_url}

{target.status}

No refs pushed.

Pushed {Enum.join(target.refs_pushed, ", ")}

Destination log
{target.log}
""" end end