diff --git a/app/controllers/admin/difficulty_levels_controller.rb b/app/controllers/admin/difficulty_levels_controller.rb index 7056507d..1579bf0f 100644 --- a/app/controllers/admin/difficulty_levels_controller.rb +++ b/app/controllers/admin/difficulty_levels_controller.rb @@ -11,7 +11,7 @@ module Admin def edit; end def new - @difficulty_level = @conference.program.difficulty_levels.new + @difficulty_level = @conference.program.difficulty_levels.new(color: @conference.next_color_for_collection(:levels)) end def create diff --git a/app/controllers/admin/event_types_controller.rb b/app/controllers/admin/event_types_controller.rb index b8b81148..d1e4af7f 100644 --- a/app/controllers/admin/event_types_controller.rb +++ b/app/controllers/admin/event_types_controller.rb @@ -9,7 +9,7 @@ module Admin def edit; end def new - @event_type = @conference.program.event_types.new + @event_type = @conference.program.event_types.new(color: @conference.next_color_for_collection(:types)) end def create diff --git a/app/controllers/admin/tracks_controller.rb b/app/controllers/admin/tracks_controller.rb index b7cbf8ec..643350f9 100644 --- a/app/controllers/admin/tracks_controller.rb +++ b/app/controllers/admin/tracks_controller.rb @@ -14,7 +14,7 @@ module Admin end def new - @track = @program.tracks.new + @track = @program.tracks.new(color: @conference.next_color_for_collection(:tracks)) end def create diff --git a/app/models/conference.rb b/app/models/conference.rb index bf697909..149504d5 100644 --- a/app/models/conference.rb +++ b/app/models/conference.rb @@ -595,6 +595,20 @@ class Conference < ActiveRecord::Base registration_limit > 0 && registrations.count >= registration_limit end + # Returns an hexadecimal color given a collection. The returned color changed + # when the number of element in the collection changes and for consecutive + # number of elements it returns highly different colors. + def next_color_for_collection(collection) + # we have different start indices for every collection to generate a + # different color for every of them. + start_index = { + tracks: (program.tracks.count + 1), + levels: (program.difficulty_levels.count + 51), + types: (program.event_types.count + 101) + } + next_color(start_index[collection]) + end + private # Returns a different html colour for every i and consecutive colors are diff --git a/app/models/difficulty_level.rb b/app/models/difficulty_level.rb index b544c8d6..821e388e 100644 --- a/app/models/difficulty_level.rb +++ b/app/models/difficulty_level.rb @@ -3,4 +3,5 @@ class DifficultyLevel < ActiveRecord::Base has_many :events, dependent: :nullify validates :title, presence: true + validates :color, format: /\A#[0-9a-fA-F]{6}\z/ end diff --git a/app/models/event_type.rb b/app/models/event_type.rb index 96d988cc..4c21f886 100644 --- a/app/models/event_type.rb +++ b/app/models/event_type.rb @@ -7,6 +7,7 @@ class EventType < ActiveRecord::Base validates :minimum_abstract_length, presence: true validates :maximum_abstract_length, presence: true validate :length_step + validates :color, format: /\A#[0-9a-fA-F]{6}\z/ alias_attribute :name, :title diff --git a/app/models/track.rb b/app/models/track.rb index de4ead80..4f428f8b 100644 --- a/app/models/track.rb +++ b/app/models/track.rb @@ -4,6 +4,7 @@ class Track < ActiveRecord::Base before_create :generate_guid validates :name, presence: true + validates :color, format: /\A#[0-9a-fA-F]{6}\z/ private diff --git a/spec/factories/event_types.rb b/spec/factories/event_types.rb index 3b616fa9..5686254d 100644 --- a/spec/factories/event_types.rb +++ b/spec/factories/event_types.rb @@ -6,6 +6,7 @@ FactoryGirl.define do length 30 minimum_abstract_length 0 maximum_abstract_length 500 + color '#ffffff' program end