Merge branch 'main' into collaudo

Porta in collaudo l'invito trasmissione con email automatica.
This commit is contained in:
2026-08-15 20:02:40 +02:00
29 changed files with 448 additions and 97 deletions
@@ -6,7 +6,7 @@
<% recordings = local_assigns[:recordings] %>
<% entitlements = local_assigns[:entitlements] %>
<section class="team-streaming-staff">
<section class="team-streaming-staff" id="responsabili-trasmissione">
<% if can_manage %>
<% if owner_membership&.staff_kind.blank? %>
<div class="card team-streaming-staff__self">
@@ -51,12 +51,34 @@
<% else %>
<p class="muted">
<%= t("team.streaming_staff.no_staff") %>
<% if can_manage %><%= link_to t("team.streaming_staff.invite_someone"), public_team_invite_path(team) %>.<% end %>
<% if can_manage %><%= link_to t("team.streaming_staff.invite_someone"), "#invita-trasmissione" %>.<% end %>
</p>
<% end %>
</div>
<% if can_manage %>
<div class="card team-invite-form" id="invita-trasmissione">
<h2><%= t("team.streaming_staff.invite_form_heading") %></h2>
<p class="muted team-invite-form__hint"><%= t("team.streaming_staff.invite_form_hint") %></p>
<%= form_with url: public_team_invite_path(team), method: :post, class: "team-invite-form__fields" do %>
<%= hidden_field_tag :staff_kind, "transmission" %>
<%= label_tag :email, t("team.invite.email_label") %>
<%= email_field_tag :email, params[:email], required: true, autocomplete: "email", placeholder: "nome@email.it" %>
<%= submit_tag t("team.invite.submit"), class: "btn btn-primary" %>
<% end %>
<% if flash[:invite_url].present? %>
<div class="team-invite-link" id="invito-generato">
<p class="team-invite-link__title"><%= t("team.invite.share_hint") %></p>
<code class="team-invite-link__url" id="team-invite-url"><%= flash[:invite_url] %></code>
<button type="button" class="btn btn-secondary team-invite-link__copy" data-copy-target="team-invite-url">
<%= t("regia.copy_link") %>
</button>
<p class="muted team-invite-link__note"><%= t("team.streaming_staff.invite_once_note") %></p>
</div>
<% end %>
</div>
<h2><%= t("team.streaming_staff.pending_invitations_heading") %></h2>
<div class="card">
<% if pending_invitations.any? %>
@@ -114,3 +136,18 @@
</div>
<% end %>
</section>
<script>
document.querySelectorAll("[data-copy-target]").forEach(function (btn) {
btn.addEventListener("click", async function () {
var el = document.getElementById(btn.getAttribute("data-copy-target"));
if (!el) return;
try {
await navigator.clipboard.writeText(el.textContent.trim());
btn.textContent = <%= raw t("team.streaming_staff.copied").to_json %>;
} catch (e) {
window.getSelection().selectAllChildren(el);
}
});
});
</script>
@@ -56,7 +56,7 @@
<% if @can_manage %>
<%= link_to t("club.back_to_club"), public_club_path(@club), class: "btn btn-secondary" %>
<%= link_to t("team.details.public_page"), public_team_page_path(@team.slug), class: "btn btn-secondary", target: "_blank", rel: "noopener" %>
<%= link_to t("team.details.streaming_managers"), public_team_invite_path(@team), class: "btn btn-secondary" %>
<%= link_to t("team.details.streaming_managers"), "#responsabili-trasmissione", class: "btn btn-secondary" %>
<% end %>
<% if current_user.can_stream_for?(@team) %>
<%= link_to t("team.details.schedule_matches"), public_team_matches_path(@team), class: "btn btn-primary" %>
+3 -33
View File
@@ -1,38 +1,8 @@
<%# Pagina legacy: l'invito è sulla pagina dettagli squadra. %>
<% content_for :title, t("team.invite.title", name: @team.name) %>
<% content_for :robots, "noindex, nofollow" %>
<div class="wrap" style="padding-top:20px">
<h1><%= t("team.invite.heading") %></h1>
<p>
<%= t("team.invite.assigned_label") %> <strong><%= @entitlements.staff_count_for("transmission") %> / <%= @entitlements.max_staff_transmission || "∞" %></strong>
<%= t("team.invite.per_team_note") %>
</p>
<p class="muted" style="max-width:640px">
<%= raw t("team.invite.info") %>
</p>
<% owner_membership = current_user.user_teams.find_by(team: @team) %>
<% if owner_membership&.staff_kind.blank? %>
<div class="card" style="max-width:520px;margin-bottom:16px">
<p style="margin:0 0 12px;color:#aaa;font-size:0.92rem">
<%= raw t("team.invite.self_assign_hint_html", email: current_user.email) %>
</p>
<%= button_to t("team.invite.self_assign_submit"), public_team_assign_self_staff_path(@team), method: :post, params: { staff_kind: "transmission" }, class: "btn btn-primary" %>
</div>
<% end %>
<div class="card" style="max-width:520px">
<h2 style="margin-top:0;font-size:1.05rem"><%= t("team.invite.invite_other_heading") %></h2>
<%= form_with url: public_team_invite_path(@team), method: :post do %>
<%= hidden_field_tag :staff_kind, "transmission" %>
<%= label_tag :email, t("team.invite.email_label") %>
<%= email_field_tag :email, params[:email], required: true %>
<%= submit_tag t("team.invite.submit"), class: "btn btn-primary" %>
<% end %>
<% if defined?(@invite_url) && @invite_url.present? %>
<p style="margin-top:16px"><%= t("team.invite.share_hint") %></p>
<code style="word-break:break-all;display:block;background:#0a0a0e;padding:12px;border-radius:8px"><%= @invite_url %></code>
<% end %>
</div>
<p><%= link_to t("team.back_to_details"), public_team_details_path(@team) %></p>
<p class="muted"><%= t("team.streaming_staff.invite_form_hint") %></p>
<p><%= link_to t("team.back_to_details"), public_team_details_path(@team, anchor: "invita-trasmissione"), class: "btn btn-primary" %></p>
</div>