Aggiunge annunci in-app/sito, contatti e migliora UI copertina sul portale.
Include admin/API/banner nativi, form contatti e reset copertina standard con layout edit più ampio. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
<%= form_with model: announcement, url: (announcement.persisted? ? admin_announcement_path(announcement) : admin_announcements_path),
|
||||
method: (announcement.persisted? ? :patch : :post), local: true, class: "admin-form" do |f| %>
|
||||
<div class="admin-form-row">
|
||||
<div>
|
||||
<%= f.label :kind, t("admin.announcements.form.kind") %>
|
||||
<%= f.select :kind, AppAnnouncement::KINDS.map { |k| [t("admin.announcements.kind.#{k}"), k] } %>
|
||||
</div>
|
||||
<div>
|
||||
<%= f.label :severity, t("admin.announcements.form.severity") %>
|
||||
<%= f.select :severity, AppAnnouncement::SEVERITIES.map { |k| [t("admin.announcements.severity.#{k}"), k] } %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<%= f.label :status, t("admin.announcements.form.status") %>
|
||||
<%= f.select :status, AppAnnouncement::STATUSES.map { |k| [t("admin.announcements.status.#{k}"), k] } %>
|
||||
</div>
|
||||
|
||||
<fieldset class="admin-channels">
|
||||
<legend><%= t("admin.announcements.form.channels") %></legend>
|
||||
<label class="admin-checkbox">
|
||||
<%= f.check_box :show_on_app %>
|
||||
<span><%= t("admin.announcements.channels.app") %></span>
|
||||
</label>
|
||||
<label class="admin-checkbox">
|
||||
<%= f.check_box :show_on_web_public %>
|
||||
<span><%= t("admin.announcements.channels.web_public") %></span>
|
||||
</label>
|
||||
<label class="admin-checkbox">
|
||||
<%= f.check_box :show_on_web_private %>
|
||||
<span><%= t("admin.announcements.channels.web_private") %></span>
|
||||
</label>
|
||||
<p class="muted admin-form-hint"><%= t("admin.announcements.form.channels_hint") %></p>
|
||||
</fieldset>
|
||||
|
||||
<div>
|
||||
<%= f.label :title, t("admin.announcements.form.title") %>
|
||||
<%= f.text_field :title, required: true, maxlength: 120 %>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<%= f.label :body, t("admin.announcements.form.body") %>
|
||||
<%= f.text_area :body, required: true, rows: 5, maxlength: 2000 %>
|
||||
</div>
|
||||
|
||||
<div class="admin-form-row">
|
||||
<div>
|
||||
<%= f.label :starts_at, t("admin.announcements.form.starts_at") %>
|
||||
<%= f.datetime_field :starts_at, value: announcement.starts_at&.in_time_zone&.strftime("%Y-%m-%dT%H:%M") %>
|
||||
</div>
|
||||
<div>
|
||||
<%= f.label :ends_at, t("admin.announcements.form.ends_at") %>
|
||||
<%= f.datetime_field :ends_at, value: announcement.ends_at&.in_time_zone&.strftime("%Y-%m-%dT%H:%M") %>
|
||||
</div>
|
||||
</div>
|
||||
<p class="muted admin-form-hint"><%= t("admin.announcements.form.window_hint") %></p>
|
||||
|
||||
<div>
|
||||
<%= f.label :action_url, t("admin.announcements.form.action_url") %>
|
||||
<%= f.url_field :action_url, placeholder: "https://" %>
|
||||
</div>
|
||||
<p class="muted admin-form-hint"><%= t("admin.announcements.form.action_url_hint") %></p>
|
||||
|
||||
<div>
|
||||
<%= f.label :action_label, t("admin.announcements.form.action_label") %>
|
||||
<%= f.text_field :action_label, maxlength: 40 %>
|
||||
</div>
|
||||
|
||||
<label class="admin-checkbox">
|
||||
<%= f.check_box :dismissible %>
|
||||
<span><%= t("admin.announcements.form.dismissible") %></span>
|
||||
</label>
|
||||
<p class="muted admin-form-hint"><%= t("admin.announcements.form.dismissible_hint") %></p>
|
||||
|
||||
<div class="admin-form-actions">
|
||||
<%= f.submit (announcement.persisted? ? t("admin.announcements.form.submit_update") : t("admin.announcements.form.submit_create")), class: "admin-btn admin-btn--primary" %>
|
||||
<%= link_to t("admin.announcements.form.cancel"), admin_announcements_path, class: "admin-btn admin-btn--outline" %>
|
||||
</div>
|
||||
<% end %>
|
||||
@@ -0,0 +1,9 @@
|
||||
<% content_for :body_class, "admin-body" %>
|
||||
|
||||
<div class="admin-page-head">
|
||||
<h2 class="admin-page-title"><%= t("admin.announcements.edit.title") %></h2>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<%= render "form", announcement: @announcement %>
|
||||
</div>
|
||||
@@ -0,0 +1,56 @@
|
||||
<% content_for :body_class, "admin-body" %>
|
||||
|
||||
<div class="admin-page-head">
|
||||
<h2 class="admin-page-title"><%= t("admin.announcements.index.title") %></h2>
|
||||
<p class="muted admin-page-sub"><%= t("admin.announcements.index.lead") %></p>
|
||||
</div>
|
||||
|
||||
<div class="panel" style="margin-bottom:1.5rem">
|
||||
<div class="admin-toolbar">
|
||||
<%= link_to t("admin.announcements.index.new"), new_admin_announcement_path, class: "admin-btn admin-btn--primary" %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<h2><%= t("admin.announcements.index.table_title") %></h2>
|
||||
<% if @announcements.any? %>
|
||||
<div class="admin-table-wrap">
|
||||
<table class="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><%= t("admin.announcements.table.status") %></th>
|
||||
<th><%= t("admin.announcements.table.kind") %></th>
|
||||
<th><%= t("admin.announcements.table.title") %></th>
|
||||
<th><%= t("admin.announcements.table.channels") %></th>
|
||||
<th><%= t("admin.announcements.table.window") %></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% @announcements.each do |item| %>
|
||||
<tr>
|
||||
<td>
|
||||
<span class="badge badge--<%= announcement_status_badge(item) %>"><%= t("admin.announcements.status.#{item.status}") %></span>
|
||||
</td>
|
||||
<td class="muted"><%= t("admin.announcements.kind.#{item.kind}") %></td>
|
||||
<td>
|
||||
<strong><%= item.title %></strong>
|
||||
<div class="muted" style="font-size:0.85rem;margin-top:0.25rem"><%= truncate(item.body, length: 90) %></div>
|
||||
</td>
|
||||
<td class="muted"><%= announcement_channels_label(item) %></td>
|
||||
<td class="muted"><%= announcement_window_label(item) %></td>
|
||||
<td class="admin-actions">
|
||||
<%= link_to t("admin.announcements.actions.edit"), edit_admin_announcement_path(item), class: "admin-btn admin-btn--sm" %>
|
||||
<%= button_to t("admin.announcements.actions.delete"), admin_announcement_path(item), method: :delete,
|
||||
class: "admin-btn admin-btn--sm admin-btn--danger",
|
||||
form: { data: { confirm: t("admin.announcements.actions.delete_confirm") } } %>
|
||||
</td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<% else %>
|
||||
<p class="empty"><%= t("admin.announcements.index.none") %></p>
|
||||
<% end %>
|
||||
</div>
|
||||
@@ -0,0 +1,9 @@
|
||||
<% content_for :body_class, "admin-body" %>
|
||||
|
||||
<div class="admin-page-head">
|
||||
<h2 class="admin-page-title"><%= t("admin.announcements.new.title") %></h2>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<%= render "form", announcement: @announcement %>
|
||||
</div>
|
||||
Reference in New Issue
Block a user