diff --git a/app/models/event.rb b/app/models/event.rb index 44122d9..674770c 100755 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -111,7 +111,7 @@ class Event < ApplicationRecord new_event.state = :draft new_event.created_at = Time.current new_event.updated_at = Time.current - + Event.transaction do if new_event.save # Duplicate all ticket types if requested diff --git a/app/views/promoter/events/new.html.erb b/app/views/promoter/events/new.html.erb index a3bd96b..c7dcde1 100644 --- a/app/views/promoter/events/new.html.erb +++ b/app/views/promoter/events/new.html.erb @@ -40,13 +40,13 @@

Informations générales

- +
<%= form.label :name, "Nom de l'événement", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.text_field :name, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "Ex: Soirée d'ouverture", data: { "event-form-target": "name", action: "input->event-form#generateSlug" } %>
- +
<%= form.label :slug, "Slug (URL)", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.text_field :slug, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "soiree-ouverture", data: { "event-form-target": "slug" } %> @@ -69,13 +69,13 @@

Date et heure

- +
<%= form.label :start_time, "Date et heure de début", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.datetime_local_field :start_time, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" %>
- +
<%= form.label :end_time, "Date et heure de fin", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.datetime_local_field :end_time, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent" %> @@ -86,55 +86,39 @@

Lieu de l'événement

- +
- +
<%= form.label :venue_name, "Nom du lieu", class: "block text-sm font-medium text-gray-700 mb-2" %> <%= form.text_field :venue_name, class: "w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "Ex: Le Grand Rex" %>
- +
<%= form.label :venue_address, "Adresse complète", class: "block text-sm font-medium text-gray-700 mb-2" %>
<%= form.text_field :venue_address, class: "w-full px-4 py-2 pr-12 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent", placeholder: "Ex: 1 Boulevard Poissonnière, 75002 Paris", data: { "event-form-target": "address", action: "input->event-form#addressChanged" } %> - +
- - -
- - -
- +

Les coordonnées GPS seront automatiquement calculées à partir de cette adresse.

- + <%= form.hidden_field :latitude, data: { "event-form-target": "latitude" } %> <%= form.hidden_field :longitude, data: { "event-form-target": "longitude" } %> - +
@@ -143,12 +127,25 @@

Options

- -
- <%= form.check_box :featured, class: "h-4 w-4 text-purple-600 border-gray-300 rounded focus:ring-purple-500" %> - <%= form.label :featured, "Mettre en avant sur la page d'accueil", class: "ml-2 text-sm text-gray-700" %> + +
+
+ <%= form.check_box :featured, class: "h-4 w-4 text-purple-600 border-gray-300 rounded focus:ring-purple-500" %> + <%= form.label :featured, "Mettre en avant sur la page d'accueil", class: "ml-2 text-sm text-gray-700" %> +
+

Les événements mis en avant apparaissent en premier sur la page d'accueil.

+ +
+ <%= form.check_box :allow_booking_during_event, class: "h-4 w-4 text-purple-600 border-gray-300 rounded focus:ring-purple-500 mt-1" %> +
+ <%= form.label :allow_booking_during_event, "Autoriser la réservation pendant l'événement", class: "text-sm text-gray-700 font-medium" %> +

+ Si activé, les participants pourront acheter des billets même après le début de l'événement. + Si désactivé, la vente de billets s'arrêtera automatiquement à l'heure de début. +

+
+
-

Les événements mis en avant apparaissent en premier sur la page d'accueil.

@@ -158,7 +155,7 @@ Annuler <% end %>
- +
<%= form.submit "Créer en brouillon", class: "inline-flex items-center px-6 py-3 bg-gray-600 text-white font-medium rounded-lg hover:bg-gray-700 transition-colors duration-200" %>
@@ -166,4 +163,3 @@ <% end %>
- diff --git a/app/views/promoter/events/show.html.erb b/app/views/promoter/events/show.html.erb index 269ae2b..fe95cb4 100644 --- a/app/views/promoter/events/show.html.erb +++ b/app/views/promoter/events/show.html.erb @@ -113,7 +113,7 @@
<%= link_to event_path(@event.slug, @event), target: "_blank", class: "text-green-600 hover:text-green-800 font-medium text-sm whitespace-nowrap" do %> - Voir publiquement + Voir la fiche publique <% end %>
@@ -311,7 +311,7 @@

Choisissez les options de duplication pour "<%= @event.name %>".

- +
diff --git a/app/views/promoter/ticket_types/show.html.erb b/app/views/promoter/ticket_types/show.html.erb index 82e0e40..fea82b3 100644 --- a/app/views/promoter/ticket_types/show.html.erb +++ b/app/views/promoter/ticket_types/show.html.erb @@ -1,6 +1,15 @@ <% content_for(:title, "#{@ticket_type.name} - #{@event.name}") %> -
+
+ + <%= render 'components/breadcrumb', crumbs: [ + { name: 'Dashboard', path: dashboard_path }, + { name: 'Événements', path: promoter_events_path }, + { name: @event.name, path: promoter_event_path(@event) }, + { name: 'Types de billets', path: promoter_event_ticket_types_path(@event) }, + { name: @ticket_type.name, path: nil } + ] %> +
diff --git a/test/controllers/promoter/events_controller_test.rb b/test/controllers/promoter/events_controller_test.rb index 512a214..1bf2f01 100644 --- a/test/controllers/promoter/events_controller_test.rb +++ b/test/controllers/promoter/events_controller_test.rb @@ -28,7 +28,7 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest test "should duplicate an event with ticket types" do sign_in @promoter - + # Create ticket types for the event ticket_type1 = TicketType.create!( name: "Standard Ticket", @@ -39,7 +39,7 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest sale_end_at: @event.start_time - 1.hour, event: @event ) - + ticket_type2 = TicketType.create!( name: "VIP Ticket", description: "A VIP ticket for the event with special access", @@ -49,27 +49,27 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest sale_end_at: @event.start_time - 1.hour, event: @event ) - + # Verify that ticket types were created successfully assert ticket_type1.valid? assert ticket_type2.valid? - + # Duplicate the event - assert_difference('Event.count', 1) do + assert_difference("Event.count", 1) do post duplicate_promoter_event_path(@event), params: { clone_ticket_types: "true" } end - + # Check that the new event was created assert_redirected_to edit_promoter_event_path(Event.last) assert_equal "Événement dupliqué avec succès! Vous pouvez maintenant modifier les détails de l'événement copié.", flash[:notice] - + # Check that the new event has the correct attributes new_event = Event.last assert_equal "Copie de #{@event.name}", new_event.name assert_equal "draft", new_event.state assert_equal @event.venue_name, new_event.venue_name assert_equal @event.venue_address, new_event.venue_address - + # Check that ticket types were duplicated assert_equal 2, new_event.ticket_types.count assert_equal "Standard Ticket", new_event.ticket_types.find_by(name: "Standard Ticket").name @@ -78,7 +78,7 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest test "should duplicate an event without ticket types" do sign_in @promoter - + # Create ticket types for the event ticket_type1 = TicketType.create!( name: "Standard Ticket", @@ -89,7 +89,7 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest sale_end_at: @event.start_time - 1.hour, event: @event ) - + ticket_type2 = TicketType.create!( name: "VIP Ticket", description: "A VIP ticket for the event with special access", @@ -99,27 +99,27 @@ class Promoter::EventsControllerTest < ActionDispatch::IntegrationTest sale_end_at: @event.start_time - 1.hour, event: @event ) - + # Verify that ticket types were created successfully assert ticket_type1.valid? assert ticket_type2.valid? - + # Duplicate the event without ticket types - assert_difference('Event.count', 1) do + assert_difference("Event.count", 1) do post duplicate_promoter_event_path(@event), params: { clone_ticket_types: "false" } end - + # Check that the new event was created assert_redirected_to edit_promoter_event_path(Event.last) assert_equal "Événement dupliqué avec succès! Vous pouvez maintenant modifier les détails de l'événement copié.", flash[:notice] - + # Check that the new event has the correct attributes new_event = Event.last assert_equal "Copie de #{@event.name}", new_event.name assert_equal "draft", new_event.state assert_equal @event.venue_name, new_event.venue_name assert_equal @event.venue_address, new_event.venue_address - + # Check that ticket types were NOT duplicated assert_equal 0, new_event.ticket_types.count end diff --git a/test/models/event_test.rb b/test/models/event_test.rb index 78f2e55..8249bd1 100755 --- a/test/models/event_test.rb +++ b/test/models/event_test.rb @@ -275,21 +275,21 @@ class EventTest < ActiveSupport::TestCase test "should duplicate event with ticket types" do user = User.create!(email: "test@example.com", password: "password123", password_confirmation: "password123") event = Event.create!(name: "Original Event", slug: "original", description: "A description that is sufficiently long", venue_name: "v", venue_address: "a", user: user, latitude: 48.0, longitude: 2.0, start_time: 1.week.from_now, state: :published) - + # Create ticket types ticket_type1 = TicketType.create!(name: "Standard", description: "A standard ticket for the event", price_cents: 2000, quantity: 100, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event) ticket_type2 = TicketType.create!(name: "VIP", description: "A VIP ticket for the event", price_cents: 5000, quantity: 50, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event) - + # Duplicate the event duplicated_event = event.duplicate - + # Check that duplication was successful assert_not_nil duplicated_event assert_equal "Copie de #{event.name}", duplicated_event.name assert_equal "draft", duplicated_event.state assert_equal event.venue_name, duplicated_event.venue_name assert_equal event.venue_address, duplicated_event.venue_address - + # Check that ticket types were duplicated assert_equal 2, duplicated_event.ticket_types.count assert_equal "Standard", duplicated_event.ticket_types.find_by(name: "Standard").name @@ -299,21 +299,21 @@ class EventTest < ActiveSupport::TestCase test "should duplicate event without ticket types" do user = User.create!(email: "test@example.com", password: "password123", password_confirmation: "password123") event = Event.create!(name: "Original Event", slug: "original", description: "A description that is sufficiently long", venue_name: "v", venue_address: "a", user: user, latitude: 48.0, longitude: 2.0, start_time: 1.week.from_now, state: :published) - + # Create ticket types ticket_type1 = TicketType.create!(name: "Standard", description: "A standard ticket for the event", price_cents: 2000, quantity: 100, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event) ticket_type2 = TicketType.create!(name: "VIP", description: "A VIP ticket for the event", price_cents: 5000, quantity: 50, sale_start_at: 1.day.ago, sale_end_at: event.start_time - 1.hour, event: event) - + # Duplicate the event without ticket types duplicated_event = event.duplicate(clone_ticket_types: false) - + # Check that duplication was successful assert_not_nil duplicated_event assert_equal "Copie de #{event.name}", duplicated_event.name assert_equal "draft", duplicated_event.state assert_equal event.venue_name, duplicated_event.venue_name assert_equal event.venue_address, duplicated_event.venue_address - + # Check that ticket types were NOT duplicated assert_equal 0, duplicated_event.ticket_types.count end