Packages

phoenix_kit

1.4.8
1.7.210 1.7.209 1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib phoenix_kit_web live modules blogging settings.html.heex
Raw

lib/phoenix_kit_web/live/modules/blogging/settings.html.heex

<PhoenixKitWeb.Components.LayoutWrapper.app_layout
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title={@page_title}
current_path={@current_path}
project_title={@project_title}
current_locale={@current_locale}
>
<div class="container mx-auto px-4 py-6 space-y-6">
<div class="flex items-center justify-between">
<.link
navigate={PhoenixKit.Utils.Routes.path("/admin/settings", locale: @current_locale)}
class="btn btn-outline btn-sm"
>
<.icon name="hero-arrow-left" class="w-4 h-4 mr-1" />
{gettext("Back to Settings")}
</.link>
<div class="text-right">
<p class="text-sm text-base-content/70">{gettext("Project")}</p>
<p class="text-lg font-semibold">{@project_title}</p>
</div>
</div>
<header class="text-center space-y-2">
<p class="text-sm uppercase tracking-wide text-base-content/60">
{gettext("Blogging Module")}
</p>
<h1 class="text-4xl font-bold text-base-content">{gettext("Manage Blogs")}</h1>
<p class="text-base text-base-content/70 max-w-2xl mx-auto">
{gettext(
"Create dedicated blogs your team can publish to. Each blog appears as its own tab in the blogging workspace."
)}
</p>
</header>
<div class="grid gap-6 lg:grid-cols-3">
<div class="card bg-base-100 shadow-xl border border-base-200 lg:col-span-2">
<div class="card-body space-y-6">
<div class="space-y-2">
<h2 class="text-2xl font-semibold text-base-content">{gettext("Blogs")}</h2>
<p class="text-sm text-base-content/70">
{gettext(
"Create dedicated blogs like Product Updates, Release Notes, or Company News. Each blog stores its content in structured folders on disk."
)}
</p>
</div>
<.form
for={@new_blog_form}
id="blog-create-form"
class="space-y-4"
phx-change="update_new_blog"
phx-submit="add_blog"
>
<.input
field={@new_blog_form[:name]}
type="text"
label={gettext("Blog Name")}
placeholder={gettext("e.g. Product Updates")}
required
/>
<div class="form-control">
<label class="label">
<span class="label-text text-sm font-semibold text-base-content">
{gettext("Storage Mode")}
</span>
</label>
<div class="flex flex-col gap-2">
<label class="cursor-pointer label gap-2 justify-start">
<input
type="radio"
name={@new_blog_form[:mode].name}
value="timestamp"
class="radio radio-primary"
checked={@new_blog_form[:mode].value == "timestamp"}
/>
<span class="label-text">
{gettext("Timestamp (date/time folders)")}
</span>
</label>
<label class="cursor-pointer label gap-2 justify-start">
<input
type="radio"
name={@new_blog_form[:mode].name}
value="slug"
class="radio radio-primary"
checked={@new_blog_form[:mode].value == "slug"}
/>
<span class="label-text">
{gettext("Slug (semantic URLs)")}
</span>
</label>
</div>
<label class="label">
<span class="label-text-alt text-xs text-base-content/60">
{gettext("Cannot be changed after blog creation")}
</span>
</label>
</div>
<button type="submit" class="btn btn-primary btn-sm">
<.icon name="hero-plus-circle" class="w-4 h-4 mr-1" /> {gettext("Add Blog")}
</button>
</.form>
<%= if @blogs == [] do %>
<div class="alert alert-info">
<.icon name="hero-information-circle" class="w-5 h-5" />
<div>
<h3 class="font-bold">{gettext("No blogs yet")}</h3>
<p class="text-sm">
{gettext("Create your first blog to start publishing content.")}
</p>
</div>
</div>
<% else %>
<div class="space-y-4">
<%= for blog <- @blogs do %>
<div class="border border-base-200 rounded-lg p-4 flex items-center justify-between">
<div class="space-y-1">
<div class="flex items-center gap-2">
<p class="text-base font-semibold text-base-content">{blog["name"]}</p>
<span class={[
"badge badge-sm uppercase",
if(blog["mode"] == "slug", do: "badge-primary", else: "badge-ghost")
]}>
{blog["mode"] || "timestamp"}
</span>
</div>
<p class="text-xs text-base-content/60">
{gettext("Slug")}: <code class="font-mono">{blog["slug"]}</code>
</p>
</div>
<button
type="button"
phx-click="remove_blog"
phx-value-slug={blog["slug"]}
class="btn btn-ghost btn-sm text-error hover:bg-error hover:text-error-content"
data-confirm={
gettext(
"Move this blog to trash? The directory will be renamed with a timestamp."
)
}
>
<.icon name="hero-trash" class="w-4 h-4 mr-1" /> {gettext("Delete")}
</button>
</div>
<% end %>
</div>
<% end %>
</div>
</div>
<aside class="card bg-base-100 shadow-xl border border-base-200">
<div class="card-body space-y-4">
<h3 class="text-xl font-semibold text-base-content">{gettext("How it works")}</h3>
<ul class="text-sm text-base-content/70 space-y-3">
<li>{gettext("Each blog becomes a dedicated publishing workspace.")}</li>
<li>
{gettext("Posts are organized by date & time with multi-language support.")}
</li>
<li>
{gettext(
"Files live under priv/static/blogging for easy versioning and deployment."
)}
</li>
<li>
{gettext(
"Language variants are automatically created based on enabled languages."
)}
</li>
</ul>
</div>
</aside>
</div>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>