diff --git a/.rubocop.yml b/.rubocop.yml index bbe91768..98897ae2 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -95,7 +95,7 @@ Metrics/BlockNesting: Max: 4 Metrics/ClassLength: - Max: 560 + Max: 570 # avoid redundunt curly braces when it is obvious that hash is used Style/BracesAroundHashParameters: 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..9f066422 100644 --- a/app/models/difficulty_level.rb +++ b/app/models/difficulty_level.rb @@ -3,4 +3,13 @@ class DifficultyLevel < ActiveRecord::Base has_many :events, dependent: :nullify validates :title, presence: true + validates :color, format: /\A#[0-9A-F]{6}\z/ + + before_validation :capitalize_color + + private + + def capitalize_color + self.color = color.upcase if color.present? + end end diff --git a/app/models/event.rb b/app/models/event.rb index fe605131..157446ac 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -115,7 +115,7 @@ class Event < ActiveRecord::Base json = super(options) json[:room_guid] = room.try(:guid) - json[:track_color] = track.try(:color) || '#ffffff' + json[:track_color] = track.try(:color) || '#FFFFFF' json[:length] = event_type.try(:length) || 25 json diff --git a/app/models/event_type.rb b/app/models/event_type.rb index 96d988cc..fd59aa0a 100644 --- a/app/models/event_type.rb +++ b/app/models/event_type.rb @@ -7,6 +7,9 @@ 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-F]{6}\z/ + + before_validation :capitalize_color alias_attribute :name, :title @@ -21,4 +24,8 @@ class EventType < ActiveRecord::Base def length_step errors.add(:length, "must be multiple of #{LENGTH_STEP}") if length % LENGTH_STEP != 0 end + + def capitalize_color + self.color = color.upcase if color.present? + end end diff --git a/app/models/track.rb b/app/models/track.rb index de4ead80..11db2e8a 100644 --- a/app/models/track.rb +++ b/app/models/track.rb @@ -4,6 +4,9 @@ class Track < ActiveRecord::Base before_create :generate_guid validates :name, presence: true + validates :color, format: /\A#[0-9A-F]{6}\z/ + + before_validation :capitalize_color private @@ -14,4 +17,8 @@ class Track < ActiveRecord::Base # end while Person.where(:guid => guid).exists? self.guid = guid end + + def capitalize_color + self.color = color.upcase if color.present? + end end diff --git a/lib/tasks/capitalize_colors.rake b/lib/tasks/capitalize_colors.rake new file mode 100644 index 00000000..48b9b4ef --- /dev/null +++ b/lib/tasks/capitalize_colors.rake @@ -0,0 +1,21 @@ +namespace :data do + desc 'Catitalize tracks, event types and difficult levels colors' + + task capitalize_colors: :environment do + capitalize_collection_colors(Track) + puts "Tracks' colors capitalized" + + capitalize_collection_colors(DifficultyLevel) + puts "Difficulty levels' colors capitalized" + + capitalize_collection_colors(EventType) + puts "Event types' colors capitalized" + end + + def capitalize_collection_colors(model) + model.all.each do |item| + item.color = item.color.upcase + item.save! + end + end +end 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 diff --git a/spec/features/event_types_spec.rb b/spec/features/event_types_spec.rb index cf9016f6..ea0fa735 100644 --- a/spec/features/event_types_spec.rb +++ b/spec/features/event_types_spec.rb @@ -32,7 +32,7 @@ feature EventType do within('table#event_types') do expect(page.has_content?('Party')).to be true expect(page.has_content?('13042')).to be true - expect(page.has_content?('#e4e4e4')).to be true + expect(page.has_content?('#E4E4E4')).to be true expect(page.assert_selector('tr', count: 3)).to be true end diff --git a/spec/models/conference_spec.rb b/spec/models/conference_spec.rb index c0c5f0d7..e1ce4328 100755 --- a/spec/models/conference_spec.rb +++ b/spec/models/conference_spec.rb @@ -426,7 +426,7 @@ describe Conference do result = {} result['Hard'] = { 'value' => 1, - 'color' => '#ffffff', + 'color' => '#FFFFFF', } result['Easy'] = { 'value' => 2, @@ -476,7 +476,7 @@ describe Conference do result = {} result['Hard'] = { 'value' => 1, - 'color' => '#ffffff' + 'color' => '#FFFFFF' } result['Easy'] = { 'value' => 1, @@ -526,7 +526,7 @@ describe Conference do } result['Lecture'] = { 'value' => 1, - 'color' => '#ffffff', + 'color' => '#FFFFFF', } expect(subject.event_type_distribution).to eq(result) end @@ -572,7 +572,7 @@ describe Conference do result = {} result['Lecture'] = { 'value' => 1, - 'color' => '#ffffff' + 'color' => '#FFFFFF' } result['Workshop'] = { 'value' => 1, @@ -622,7 +622,7 @@ describe Conference do } result['Track Two'] = { 'value' => 1, - 'color' => '#ffffff', + 'color' => '#FFFFFF', } expect(subject.tracks_distribution).to eq(result) end @@ -672,7 +672,7 @@ describe Conference do } result['Track Two'] = { 'value' => 1, - 'color' => '#ffffff' + 'color' => '#FFFFFF' } expect(subject.tracks_distribution(:confirmed)).to eq(result) end diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb index 2f699d86..eee34d98 100644 --- a/spec/models/event_spec.rb +++ b/spec/models/event_spec.rb @@ -236,7 +236,7 @@ describe Event do json_hash = event.as_json(nil) expect(json_hash[:room_guid]).to eq(event.room.guid) - expect(json_hash[:track_color]).to eq('#efefef') + expect(json_hash[:track_color]).to eq('#EFEFEF') expect(json_hash[:length]).to eq(30) end @@ -245,7 +245,7 @@ describe Event do json_hash = event.as_json(nil) expect(json_hash[:room_guid]).to be_nil - expect(json_hash[:track_color]).to eq('#ffffff') + expect(json_hash[:track_color]).to eq('#FFFFFF') expect(json_hash[:length]).to eq(25) end end diff --git a/spec/models/event_type_spec.rb b/spec/models/event_type_spec.rb index 61b3e3ef..6863ed8e 100644 --- a/spec/models/event_type_spec.rb +++ b/spec/models/event_type_spec.rb @@ -18,6 +18,22 @@ describe EventType do it { is_expected.to validate_presence_of(:minimum_abstract_length) } it { is_expected.to validate_presence_of(:maximum_abstract_length) } + it 'is valid if its color is a correct hexadecimal color with 7 characters' do + should allow_value('#FF0000').for(:color) + end + + it 'is not valid if its color is not a correct hexadecimal color' do + should_not allow_value('#AB1H7G').for(:color) + end + + it 'is not valid if its color has less than 7 characters' do + should_not allow_value('#fff').for(:color) + end + + it 'is not valid if its color has more than 7 characters' do + should_not allow_value('#123A4567').for(:color) + end + describe 'length' do it 'validates numericality and greater than 0' do is_expected.to validate_numericality_of(:length).is_greater_than(0) diff --git a/spec/views/admin/difficulty_levels/index.html.haml_spec.rb b/spec/views/admin/difficulty_levels/index.html.haml_spec.rb index 6e7d469a..984c90c4 100644 --- a/spec/views/admin/difficulty_levels/index.html.haml_spec.rb +++ b/spec/views/admin/difficulty_levels/index.html.haml_spec.rb @@ -9,6 +9,6 @@ describe 'admin/difficulty_levels/index' do render expect(rendered).to include('Example Difficulty Level') expect(rendered).to include('Lorem Ipsum dolsum') - expect(rendered).to include('#ffffff') + expect(rendered).to include('#FFFFFF') end end diff --git a/spec/views/admin/tracks/index.html.haml_spec.rb b/spec/views/admin/tracks/index.html.haml_spec.rb index e90275ba..1b755b5f 100644 --- a/spec/views/admin/tracks/index.html.haml_spec.rb +++ b/spec/views/admin/tracks/index.html.haml_spec.rb @@ -10,6 +10,6 @@ describe 'admin/tracks/index' do render expect(rendered).to include('Example Track') expect(rendered).to include('Lorem Ipsum dolsum') - expect(rendered).to include('#ffffff') + expect(rendered).to include('#FFFFFF') end end