Packages

phoenix_kit

1.7.69
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 modules newsletters web broadcast_editor.html.heex
Raw

lib/modules/newsletters/web/broadcast_editor.html.heex

<PhoenixKitWeb.Components.LayoutWrapper.app_layout
flash={@flash}
phoenix_kit_current_scope={assigns[:phoenix_kit_current_scope]}
page_title={@page_title}
current_path={@url_path}
project_title={@project_title}
>
<div class="container flex-col mx-auto px-4 py-6">
<.admin_page_header
back={Routes.path("/admin/newsletters/broadcasts")}
title={@page_title}
subtitle="Compose and send a broadcast email to your newsletter list"
/>
<form id="broadcast-form" phx-change="validate" phx-submit="save_draft">
<div class="grid grid-cols-1 xl:grid-cols-2 gap-6">
<%!-- Left: Editor --%>
<div class="space-y-4">
<%!-- Subject --%>
<fieldset class="fieldset">
<label class="label">Subject</label>
<input
type="text"
name="subject"
value={@subject}
placeholder="Enter email subject..."
class="input w-full"
/>
</fieldset>
<%!-- List selector --%>
<fieldset class="fieldset">
<label class="label">Newsletter List</label>
<select name="list_uuid" class="select w-full">
<option value="">Select a list...</option>
<option :for={list <- @lists} value={list.uuid} selected={@list_uuid == list.uuid}>
{list.name} ({list.subscriber_count} subscribers)
</option>
</select>
</fieldset>
<%!-- Template selector --%>
<fieldset class="fieldset">
<label class="label">Email Template</label>
<select name="template_uuid" class="select w-full">
<option value="">No template (plain markdown)</option>
<option
:for={template <- @templates}
value={template.uuid}
selected={@template_uuid == template.uuid}
>
{PhoenixKit.Modules.Emails.Template.get_translation(template.display_name, "en") ||
template.name}
</option>
</select>
</fieldset>
<%!-- Markdown Editor --%>
<fieldset class="fieldset">
<label class="label">Content (Markdown)</label>
<.live_component
module={PhoenixKitWeb.Components.Core.MarkdownEditor}
id="broadcast-editor"
content={@markdown_content}
save_status={:saved}
show_formatting_toolbar={true}
protect_navigation={false}
height="400px"
placeholder="Write your broadcast content in Markdown..."
/>
</fieldset>
<%!-- Actions --%>
<div class="flex flex-col sm:flex-row gap-3 pt-2">
<button type="submit" class="btn btn-outline btn-sm" disabled={@saving}>
<%= if @saving do %>
<span class="loading loading-spinner loading-xs"></span>
<% end %>
Save Draft
</button>
<button
type="button"
phx-click="send_now"
class="btn btn-primary btn-sm"
disabled={@saving or @subject == "" or @list_uuid == ""}
>
<.icon name="hero-paper-airplane" class="w-4 h-4" /> Send Now
</button>
<div class="flex items-center gap-2 ml-auto">
<input
type="datetime-local"
name="scheduled_at"
value={@scheduled_at}
class="input input-sm"
/>
<button
type="button"
phx-click="schedule"
class="btn btn-secondary btn-sm"
disabled={@saving or @scheduled_at == "" or @subject == "" or @list_uuid == ""}
>
<.icon name="hero-clock" class="w-4 h-4" /> Schedule
</button>
</div>
</div>
</div>
<%!-- Right: Preview --%>
<div>
<label class="label">Preview</label>
<div
class="border border-base-300 rounded-lg overflow-hidden bg-white"
style="height: 580px;"
>
<%= if @preview_html != "" do %>
<iframe
srcdoc={@preview_html}
class="w-full h-full border-0"
sandbox="allow-same-origin"
>
</iframe>
<% else %>
<div class="flex items-center justify-center h-full text-base-content/40">
<div class="text-center">
<.icon name="hero-eye" class="w-10 h-10 mx-auto mb-2 opacity-40" />
<p class="text-sm">Preview will appear here as you type</p>
</div>
</div>
<% end %>
</div>
</div>
</div>
</form>
</div>
</PhoenixKitWeb.Components.LayoutWrapper.app_layout>