Fix sport squadra su partite basket e ruoli organico per board.
Le partite ereditano lo sport_key della squadra alla creazione invece del default pallavolo; l'organico mostra ruoli per board (basket, volley, timed) e il wizard Android usa lo sport del team per overlay e icona. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -17,7 +17,7 @@ module Api
|
||||
|
||||
def create
|
||||
attrs = match_params.to_h
|
||||
attrs["sport_key"] = @team.sport_key if attrs["sport_key"].blank?
|
||||
attrs["sport_key"] = @team.sport_key
|
||||
normalize_scoring_rules!(attrs)
|
||||
match = @team.matches.create!(attrs)
|
||||
attach_opponent_logo(match)
|
||||
@@ -70,6 +70,7 @@ module Api
|
||||
if p[:sport].present? && p[:sport_key].blank?
|
||||
p[:sport_key] = p.delete(:sport)
|
||||
end
|
||||
p[:overlay_kind] = nil if p.key?(:overlay_kind) && p[:overlay_kind].blank?
|
||||
p
|
||||
end
|
||||
|
||||
|
||||
25
backend/app/domain/sports/player_roles.rb
Normal file
25
backend/app/domain/sports/player_roles.rb
Normal file
@@ -0,0 +1,25 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Sports
|
||||
class PlayerRoles
|
||||
BY_BOARD = {
|
||||
"volley" => %w[Schiacciatore Opposto Centrale Palleggiatore Libero Universale],
|
||||
"basket" => ["Playmaker", "Guardia", "Ala", "Ala forte", "Centro"],
|
||||
"racket" => %w[Giocatore],
|
||||
"timed" => %w[Portiere Difensore Centrocampista Attaccante],
|
||||
"generic" => %w[Giocatore],
|
||||
"timer" => %w[Giocatore]
|
||||
}.freeze
|
||||
|
||||
class << self
|
||||
def for_team(team)
|
||||
board = team.effective_board_type
|
||||
BY_BOARD[board] || BY_BOARD["generic"]
|
||||
end
|
||||
|
||||
def for_board(board)
|
||||
BY_BOARD[board.to_s] || BY_BOARD["generic"]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -23,9 +23,10 @@ module RosterHelper
|
||||
end
|
||||
end
|
||||
|
||||
def roster_player_role_options(selected = nil)
|
||||
def roster_player_role_options(team, selected = nil)
|
||||
roles = Sports::PlayerRoles.for_team(team)
|
||||
options_for_select(
|
||||
[["— Seleziona ruolo —", ""]] + TeamRosterMember::VOLLEYBALL_PLAYER_ROLES.map { |r| [r, r] },
|
||||
[["— Seleziona ruolo —", ""]] + roles.map { |r| [r, r] },
|
||||
selected
|
||||
)
|
||||
end
|
||||
|
||||
@@ -129,7 +129,10 @@ class Match < ApplicationRecord
|
||||
end
|
||||
|
||||
def inherit_sport_from_team
|
||||
self.sport_key = team.sport_key if sport_key.blank? && team.present?
|
||||
return unless team.present?
|
||||
|
||||
# Il default DB (pallavolo) non deve prevalere sullo sport della squadra alla creazione.
|
||||
self.sport_key = team.sport_key if new_record? || sport_key.blank?
|
||||
end
|
||||
|
||||
def sport_key_known
|
||||
|
||||
@@ -9,14 +9,7 @@ class TeamRosterMember < ApplicationRecord
|
||||
"player" => "Giocatori"
|
||||
}.freeze
|
||||
|
||||
VOLLEYBALL_PLAYER_ROLES = %w[
|
||||
Schiacciatore
|
||||
Opposto
|
||||
Centrale
|
||||
Palleggiatore
|
||||
Libero
|
||||
Universale
|
||||
].freeze
|
||||
VOLLEYBALL_PLAYER_ROLES = Sports::PlayerRoles::BY_BOARD["volley"].freeze
|
||||
|
||||
belongs_to :team
|
||||
|
||||
@@ -74,9 +67,10 @@ class TeamRosterMember < ApplicationRecord
|
||||
end
|
||||
|
||||
def player_role_label_valid
|
||||
return if role_label.in?(VOLLEYBALL_PLAYER_ROLES)
|
||||
allowed = Sports::PlayerRoles.for_team(team)
|
||||
return if role_label.in?(allowed)
|
||||
|
||||
errors.add(:role_label, "non è un ruolo pallavolo valido")
|
||||
errors.add(:role_label, "non è un ruolo valido per questo sport")
|
||||
end
|
||||
|
||||
def photo_file_type
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
<% form_url = member.persisted? ? public_team_roster_member_path(team, member) : public_team_roster_members_path(team) %>
|
||||
<% form_method = member.persisted? ? :patch : :post %>
|
||||
<% is_player = member.category == "player" %>
|
||||
<% player_role = member.role_label if member.role_label.in?(TeamRosterMember::VOLLEYBALL_PLAYER_ROLES) %>
|
||||
<% player_roles = Sports::PlayerRoles.for_team(team) %>
|
||||
<% player_role = member.role_label if member.role_label.in?(player_roles) %>
|
||||
|
||||
<%= form_with url: form_url, method: form_method, multipart: true, class: "roster-member-form card roster-sidebar__form", data: { roster_form: true } do %>
|
||||
<h3 class="roster-sidebar__title"><%= member.persisted? ? "Modifica scheda" : "Aggiungi persona" %></h3>
|
||||
@@ -19,7 +20,7 @@
|
||||
<div data-roster-role-fields>
|
||||
<div data-roster-role-player <%= "hidden" unless is_player %>>
|
||||
<%= label_tag "team_roster_member[role_label]", "Ruolo in campo" %>
|
||||
<%= select_tag "team_roster_member[role_label]", roster_player_role_options(player_role),
|
||||
<%= select_tag "team_roster_member[role_label]", roster_player_role_options(team, player_role),
|
||||
data: { roster_role_player: true }, disabled: !is_player %>
|
||||
</div>
|
||||
<div data-roster-role-other <%= "hidden" if is_player %>>
|
||||
|
||||
@@ -53,6 +53,15 @@ RSpec.describe Match, "scheduling scopes" do
|
||||
expect(match.coach_hub_visible?).to be(false)
|
||||
end
|
||||
|
||||
it "eredita lo sport della squadra alla creazione (non il default pallavolo)" do
|
||||
basket_team = club.teams.create!(name: "U13 Basket", sport_key: "basket")
|
||||
match = basket_team.matches.create!(opponent_name: "Ospiti", sets_to_win: 3)
|
||||
|
||||
expect(match.sport_key).to eq("basket")
|
||||
expect(match.effective_board_type).to eq("basket")
|
||||
expect(match.effective_overlay_kind).to eq("basket")
|
||||
end
|
||||
|
||||
it "nasconde partita con diretta terminata anche se resta una sessione idle vecchia" do
|
||||
match = team.matches.create!(opponent_name: "Avversario", sets_to_win: 3)
|
||||
StreamSession.create!(
|
||||
|
||||
Reference in New Issue
Block a user