Un avviso ha un testo per lingua; per differenziare le piattaforme si creano due avvisi. L'app riceve già il copy risolto da Accept-Language. Co-authored-by: Cursor <cursoragent@cursor.com>
113 lines
4.8 KiB
ERB
113 lines
4.8 KiB
ERB
<%= 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_android %>
|
|
<span><%= t("admin.announcements.channels.android") %></span>
|
|
</label>
|
|
<label class="admin-checkbox">
|
|
<%= f.check_box :show_on_ios %>
|
|
<span><%= t("admin.announcements.channels.ios") %></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>
|
|
|
|
<fieldset class="admin-channels">
|
|
<legend><%= t("admin.announcements.form.locales_legend") %></legend>
|
|
<p class="muted admin-form-hint"><%= t("admin.announcements.form.locales_hint") %></p>
|
|
<div class="admin-locale-tabs" role="tablist">
|
|
<% language_options.each do |opt| %>
|
|
<button type="button"
|
|
class="admin-locale-tab<%= " is-active" if opt[:code].to_s == I18n.default_locale.to_s %>"
|
|
data-locale-tab="<%= opt[:code] %>"
|
|
role="tab"
|
|
aria-selected="<%= opt[:code].to_s == I18n.default_locale.to_s %>">
|
|
<span aria-hidden="true"><%= opt[:flag] %></span>
|
|
<%= opt[:native] %>
|
|
<% if opt[:code].to_s == I18n.default_locale.to_s %>
|
|
<span class="muted">(<%= t("admin.announcements.form.locale_required") %>)</span>
|
|
<% elsif announcement.filled_locale_codes.include?(opt[:code].to_s) %>
|
|
<span class="muted">✓</span>
|
|
<% end %>
|
|
</button>
|
|
<% end %>
|
|
</div>
|
|
<% language_options.each do |opt| %>
|
|
<div class="admin-locale-panel"
|
|
data-locale-panel="<%= opt[:code] %>"
|
|
role="tabpanel"
|
|
<%= "hidden" unless opt[:code].to_s == I18n.default_locale.to_s %>>
|
|
<%= render "locale_copy", f: f, announcement: announcement, locale: opt[:code] %>
|
|
</div>
|
|
<% end %>
|
|
</fieldset>
|
|
|
|
<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>
|
|
|
|
<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 %>
|
|
|
|
<script>
|
|
(function () {
|
|
var tabs = document.querySelectorAll("[data-locale-tab]");
|
|
if (!tabs.length) return;
|
|
tabs.forEach(function (btn) {
|
|
btn.addEventListener("click", function () {
|
|
var loc = btn.getAttribute("data-locale-tab");
|
|
tabs.forEach(function (other) {
|
|
var on = other === btn;
|
|
other.classList.toggle("is-active", on);
|
|
other.setAttribute("aria-selected", on ? "true" : "false");
|
|
});
|
|
document.querySelectorAll("[data-locale-panel]").forEach(function (panel) {
|
|
panel.hidden = panel.getAttribute("data-locale-panel") !== loc;
|
|
});
|
|
});
|
|
});
|
|
})();
|
|
</script>
|