2013-01-07 09:04:09 +01:00
module ApplicationHelper
2016-07-05 16:44:53 +03:00
##
# Checks if the voting has already started, or if it has already ended
#
def voting_open_or_close ( program )
return if program . voting_period?
if program . voting_start_date > Date . today
return 'Voting period has not started yet!'
else # voting_end_date > Date.today because voting_start_date < voting_end_date
return 'Voting period is over!'
end
end
2016-06-15 17:52:59 +03:00
##
# Gets an EventType object, and returns its length in timestamp format (HH:MM)
# ====Gets
# * +Integer+ -> 30
# ====Returns
# * +String+ -> "00:30"
def length_timestamp ( length )
[ length / 60 , length % 60 ] . map { | t | t . to_s . rjust ( 2 , '0' ) } . join ( ':' )
end
2016-07-05 16:44:53 +03:00
##
# Gets a datetime object
# ====Returns
# * +String+ -> formated datetime object
def format_datetime ( obj )
return unless obj
obj . strftime ( '%Y-%m-%d %H:%M' )
end
2016-04-22 18:18:46 +03:00
##
# ====Returns
# * +String+ -> number of registrations / max allowed registrations
def registered_text ( event )
return " Registered: #{ event . registrations . count } / #{ event . max_attendees } " if event . max_attendees
" Registered: #{ event . registrations . count } "
end
2015-04-22 20:40:21 +03:00
# Set resource_name for devise so that we can call the devise help links (views/devise/shared/_links) from anywhere (eg sign_up form in proposal#new)
2015-04-18 21:44:40 +03:00
def resource_name
:user
end
2015-04-22 20:40:21 +03:00
# Set devise_mapping for devise so that we can call the devise help links (views/devise/shared/_links) from anywhere (eg sign_up form in proposal#new)
2015-04-18 21:44:40 +03:00
def devise_mapping
@devise_mapping || = Devise . mappings [ :user ]
end
2015-04-16 18:34:41 +03:00
def event_status_icon ( event )
case event . state
when 'new'
'fa-eye'
when 'unconfirmed'
'fa-check text-muted'
when 'confirmed'
'fa-check text-success'
when 'rejected' , 'withdrawn' , 'canceled'
'fa-ban'
end
end
def event_progress_color ( progress )
2016-03-18 01:59:05 +05:30
progress = progress . to_i
if progress == 100
'progress-bar-success'
elsif progress > = 85
'progress-bar-info'
elsif progress > = 71
'progress-bar-warning'
else
'progress-bar-danger'
2015-04-16 18:34:41 +03:00
end
end
2014-06-26 09:08:26 +02:00
def target_progress_color ( progress )
progress = progress . to_i
2015-02-26 12:58:28 +05:30
result =
case
when progress > = 90 then 'green'
when progress < 90 && progress > = 80 then 'orange'
else 'red'
2014-06-26 09:08:26 +02:00
end
2015-02-26 12:58:28 +05:30
2014-06-26 09:08:26 +02:00
result
end
def days_left_color ( days_left )
days_left = days_left . to_i
if days_left > 30
result = 'green'
elsif days_left < 30 && days_left > 10
result = 'orange'
else
result = 'red'
end
result
end
2014-05-13 14:17:39 +02:00
def bootstrap_class_for ( flash_type )
case flash_type
when 'success'
'alert-success'
when 'error'
2014-05-16 19:52:41 +02:00
'alert-danger'
2014-05-13 14:17:39 +02:00
when 'alert'
2014-05-16 19:52:41 +02:00
'alert-warning'
2014-05-13 14:17:39 +02:00
when 'notice'
'alert-info'
else
2015-03-12 23:53:57 +01:00
'alert-warning'
2014-05-13 14:17:39 +02:00
end
end
2014-06-04 16:11:33 +02:00
def label_for ( event_state )
result = ''
case event_state
2014-06-06 10:23:01 +02:00
when 'new'
2014-06-04 16:11:33 +02:00
result = 'label label-primary'
2014-06-06 10:23:01 +02:00
when 'withdrawn'
result = 'label label-danger'
when 'unconfirmed'
2014-06-04 16:11:33 +02:00
result = 'label label-success'
2014-06-06 10:23:01 +02:00
when 'confirmed'
2014-06-04 16:11:33 +02:00
result = 'label label-success'
2014-06-06 10:23:01 +02:00
when 'rejected'
2014-06-04 16:11:33 +02:00
result = 'label label-warning'
2014-06-06 10:23:01 +02:00
when 'canceled'
2014-06-04 16:11:33 +02:00
result = 'label label-danger'
end
result
end
2014-06-03 16:27:10 +02:00
def icon_for_todo ( bool )
if bool
2014-08-15 18:03:05 -07:00
return 'fa fa-check'
2014-06-03 16:27:10 +02:00
else
2014-08-15 18:03:05 -07:00
return 'fa fa-times'
2014-06-03 16:27:10 +02:00
end
end
def class_for_todo ( bool )
if bool
2015-04-16 18:34:41 +03:00
return 'todolist-ok'
2014-06-03 16:27:10 +02:00
else
2015-04-16 18:34:41 +03:00
return 'todolist-missing'
2014-06-03 16:27:10 +02:00
end
end
2014-06-02 12:37:57 +02:00
def normalize_array_length ( hashmap , length )
2014-07-21 14:37:26 +02:00
hashmap . each do | _ , value |
2014-06-02 12:37:57 +02:00
if value . length < length
value . fill ( value [ - 1 ] , value . length ... length )
end
end
end
2014-03-04 10:10:07 +01:00
def active_nav_li ( link )
if current_page? ( link )
return 'active'
else
return ''
end
end
2013-09-01 18:19:25 +03:00
def show_time ( length )
2016-08-16 00:44:49 +01:00
return '0 h 0 min' if length . blank?
h , min = length . divmod ( 60 )
if h == 0
" #{ min . round } min "
elsif min == 0
" #{ h } h "
2013-09-01 18:19:25 +03:00
else
2016-08-16 00:44:49 +01:00
" #{ h } h #{ min . round } min "
2013-09-01 18:19:25 +03:00
end
end
2013-01-07 09:04:09 +01:00
def add_association_link ( association_name , form_builder , div_class , html_options = { } )
2014-08-18 21:54:43 +03:00
link_to_add_association 'Add ' + association_name . to_s . singularize , form_builder , div_class , html_options . merge ( class : 'assoc btn btn-success' )
2013-01-07 09:04:09 +01:00
end
def remove_association_link ( association_name , form_builder )
2014-08-18 21:54:43 +03:00
link_to_remove_association ( 'Remove ' + association_name . to_s . singularize , form_builder , class : 'assoc btn btn-danger' ) + tag ( :hr )
2013-01-07 09:04:09 +01:00
end
def dynamic_association ( association_name , title , form_builder , options = { } )
2014-08-18 21:54:43 +03:00
render 'shared/dynamic_association' , association_name : association_name , title : title , f : form_builder , hint : options [ :hint ]
2013-01-07 09:04:09 +01:00
end
2013-06-14 13:17:40 +02:00
# Same as redirect_to(:back) if there is a valid HTTP referer, otherwise redirect_to()
def redirect_back_or_to ( options = { } , response_status = { } )
2014-08-18 21:54:43 +03:00
if request . env [ 'HTTP_REFERER' ]
2016-03-11 02:08:00 +05:30
redirect_to :back
2013-06-14 13:17:40 +02:00
else
2016-03-11 02:08:00 +05:30
redirect_to options , response_status
2013-06-14 13:17:40 +02:00
end
end
2014-11-20 14:57:03 +01:00
def event_types ( conference )
2015-10-25 13:29:02 +02:00
all = conference . program . event_types . map { | et | et . title . pluralize }
2014-11-20 14:57:03 +01:00
first = all [ 0 ... - 1 ]
last = all [ - 1 ]
ets = ''
if all . length > 1
ets << first . join ( ', ' )
ets << " and #{ last } "
else
ets = all . join
end
return ets
end
def tracks ( conference )
2015-10-25 13:29:02 +02:00
all = conference . program . tracks . map { | t | t . name }
first = all [ 0 ... - 1 ]
last = all [ - 1 ]
ts = ''
if all . length > 1
ts << first . join ( ', ' )
ts << " and #{ last } "
else
ts = all . join
end
return ts
end
def difficulty_levels ( conference )
all = conference . program . difficulty_levels . map { | t | t . title }
2014-11-20 14:57:03 +01:00
first = all [ 0 ... - 1 ]
last = all [ - 1 ]
ts = ''
if all . length > 1
ts << first . join ( ', ' )
ts << " and #{ last } "
else
ts = all . join
end
return ts
end
2014-12-05 16:04:34 +01:00
# rubocop:disable Lint/EndAlignment
def word_pluralize ( count , singular , plural = nil )
word = if ( count == 1 || count =~ / ^1( \ .0+)?$ / )
singular
else
plural || singular . pluralize
end
" #{ word } "
end
2014-06-29 17:44:27 +05:30
def markdown ( text )
2016-08-15 21:08:29 +01:00
return '' if text . nil?
2014-06-29 17:13:53 +05:30
options = {
2014-06-29 17:44:27 +05:30
autolink : true ,
space_after_headers : true ,
no_intra_emphasis : true
2014-06-29 17:13:53 +05:30
}
markdown = Redcarpet :: Markdown . new ( Redcarpet :: Render :: HTML , options )
markdown . render ( text ) . html_safe
end
2014-06-29 17:44:27 +05:30
2014-08-18 21:54:43 +03:00
def markdown_hint ( text = '' )
2014-06-29 17:44:27 +05:30
markdown ( " #{ text } Please look at #{ link_to '**Markdown Syntax**' , 'https://daringfireball.net/projects/markdown/syntax' , target : '_blank' } to format your text " )
end
2014-07-23 14:55:06 +02:00
def omniauth_configured
providers = [ ]
Devise . omniauth_providers . each do | provider |
provider_key = " #{ provider } _key "
provider_secret = " #{ provider } _secret "
unless Rails . application . secrets . send ( provider_key ) . blank? || Rails . application . secrets . send ( provider_secret ) . blank?
providers << provider
end
2016-03-22 18:14:40 +01:00
providers << provider if ! ENV [ " OSEM_ #{ provider . upcase } _KEY " ] . blank? && ! ENV [ " OSEM_ #{ provider . upcase } _SECRET " ] . blank?
2014-07-23 14:55:06 +02:00
end
2016-03-22 18:14:40 +01:00
return providers . uniq
2014-07-23 14:55:06 +02:00
end
2014-08-13 14:37:15 +03:00
# Receives a hash, generated from User model, function get_roles
# Outputs the roles of a user, including the conferences for which the user has the roles
# Eg. organizer(oSC13, oSC14), cfp(oSC12, oSC13)
def show_roles ( roles )
2016-04-17 11:32:06 +05:30
roles . map { | x | x [ 0 ] . titleize + ' (' + x [ 1 ] . join ( ', ' ) + ')' } . join ', '
2014-08-13 14:37:15 +03:00
end
2014-08-13 22:46:41 +03:00
def can_manage_volunteers ( conference )
2016-04-03 13:24:07 +05:30
if ( current_user . has_role? :organizer , conference ) || ( current_user . has_role? :volunteers_coordinator , conference )
2014-08-13 22:46:41 +03:00
true
else
false
end
end
2014-11-12 10:20:53 +01:00
def sign_in_path
2016-03-22 18:14:40 +01:00
if ENV [ 'OSEM_ICHAIN_ENABLED' ] == 'true'
2014-11-12 10:20:53 +01:00
new_user_ichain_session_path
else
new_user_session_path
end
end
2015-07-17 18:55:47 +02:00
def unread_notifications ( user )
2015-09-21 15:56:57 +02:00
Comment . accessible_by ( current_ability ) . find_since_last_login ( user )
2015-07-17 18:55:47 +02:00
end
2016-06-20 17:09:39 +02:00
# Returns black or white deppending on what of them contrast more with the
# given color. Useful to print text in a coloured background.
# hexcolor is a hex color of 7 characters, being the first one '#'.
# Reference: https://24ways.org/2010/calculating-color-contrast
def contrast_color ( hexcolor )
r = hexcolor [ 1 .. 2 ] . to_i ( 16 )
g = hexcolor [ 3 .. 4 ] . to_i ( 16 )
b = hexcolor [ 5 .. 6 ] . to_i ( 16 )
yiq = ( ( r * 299 ) + ( g * 587 ) + ( b * 114 ) ) / 1000
( yiq > = 128 ) ? 'black' : 'white'
end
2016-06-17 14:00:31 +02:00
def td_height ( rooms )
td_height = 500 / rooms . length
# we want all least 3 lines in events and td padding = 3px, speaker picture height >= 25px
# and line-height = 17px => (17 * 3) + 6 + 25 = 82
td_height < 82 ? 82 : td_height
end
def room_height ( rooms )
room_lines ( rooms ) * 17
end
def room_lines ( rooms )
# line-height = 17px, td padding = 3px
( td_height ( rooms ) - 6 ) / 17
end
def event_height ( rooms )
event_lines ( rooms ) * 17
end
def event_lines ( rooms )
# line-height = 17px, td padding = 3px, speaker picture height >= 25px
( td_height ( rooms ) - 31 ) / 17
end
def speaker_height ( rooms )
# td padding = 3px
speaker_height = td_height ( rooms ) - 6 - event_height ( rooms )
# The speaker picture is a circle and the width must be <= 37 to avoid making the cell widther
speaker_height > = 37 ? 37 : speaker_height
end
def speaker_width ( rooms )
# speaker picture padding: 4px 2px; and we want the picture to be a circle
speaker_height ( rooms ) - 4
end
2016-07-02 17:23:56 +02:00
def carousel_item_class ( number , carousel_number , num_cols , col )
item_class = 'item'
item_class += ' first' if number == 0
item_class += ' last' if number == ( carousel_number - 1 )
if ( col && ( ( col / num_cols ) == number ) ) || ( ! col && number == 0 )
item_class += ' active'
end
item_class
end
2016-08-04 01:59:58 +02:00
def selected_scheduled? ( schedule )
( schedule == @selected_schedule ) ? 'Yes' : 'No'
end
2016-05-24 23:54:46 +05:30
# Recieves a PaperTrail::Version object
# Outputs the list of attributes that were changed in the version (ignoring changes from one blank value to another)
# Eg: If version.changeset = '{"title"=>[nil, "Premium"], "description"=>[nil, "Premium = Super cool"], "conference_id"=>[nil, 3]}'
# Output will be 'title, description and conference'
def updated_attributes ( version )
version . changeset .
reject { | _ , values | values [ 0 ] . blank? && values [ 1 ] . blank? } .
keys . map { | key | key . gsub ( '_id' , '' ) . tr ( '_' , ' ' ) } . join ( ', ' ) .
reverse . sub ( ',' , ' dna ' ) . reverse
end
2016-07-29 20:09:16 +05:30
def link_to_user ( user_id )
2016-05-24 23:54:46 +05:30
user = User . find_by ( id : user_id )
if user
link_to user . name , admin_user_path ( id : user_id )
else
'Someone (probably via the console)'
end
end
# Recieves a PaperTrail::Version object
# Returns object in its current state if its alive
# Returns object as it was before version's change(unless its a create event's version)
# Else Returns object as it was after version's change
def get_version_object ( version )
2016-08-17 02:45:10 +05:30
return nil unless version
2016-05-24 23:54:46 +05:30
version . item || version . reify || version . next . reify
end
def event_change_description ( version )
case
when version . event == 'create' then 'submitted new'
when version . changeset [ 'state' ]
case version . changeset [ 'state' ] [ 1 ]
when 'unconfirmed' then 'accepted'
when 'withdrawn' then 'withdrew'
when 'canceled' , 'rejected' , 'confirmed' then version . changeset [ 'state' ] [ 1 ]
when 'new' then 'resubmitted'
end
else
" updated #{ updated_attributes ( version ) } of "
end
end
def users_role_change_description ( version )
version . event == 'create' ? 'added' : 'removed'
end
def subscription_change_description ( version )
user = get_version_object ( version ) . user
user_name = user . name unless user . id . to_s == version . whodunnit
version . event == 'create' ? " subscribed #{ user_name } to " : " unsubscribed #{ user_name } from "
end
def registration_change_description ( version )
if version . item_type == 'Registration'
user = get_version_object ( version ) . user
else
registration_id = get_version_object ( version ) . registration_id
registration_last_version = PaperTrail :: Version . where ( item_type : 'Registration' , item_id : registration_id ) . last
user = get_version_object ( registration_last_version ) . user
end
if user . id . to_s == version . whodunnit
case version . event
when 'create' then 'registered to'
when 'update' then " updated #{ updated_attributes ( version ) } of the registration for "
when 'destroy' then 'unregistered from'
end
else
case version . event
when 'create' then " registered #{ user . name } to "
when 'update' then " updated #{ updated_attributes ( version ) } of #{ user . name } 's registration for "
when 'destroy' then " unregistered #{ user . name } from "
end
end
end
def comment_change_description ( version )
user = get_version_object ( version ) . user
if version . event == 'create'
version . previous . nil? ? 'commented on' : " re-added #{ user . name } 's comment on "
else
" deleted #{ user . name } 's comment on "
end
end
def vote_change_description ( version )
user = get_version_object ( version ) . user
if version . event == 'create'
version . previous . nil? ? 'voted on' : " re-added #{ user . name } 's vote on "
elsif version . event == 'update'
" updated #{ user . name } 's vote on "
else
" deleted #{ user . name } 's vote on "
end
end
def user_change_description ( version )
if version . event == 'create'
2016-07-29 20:09:16 +05:30
link_to_user ( version . item_id ) + ' signed up'
2016-05-24 23:54:46 +05:30
elsif version . event == 'update'
if version . changeset . keys . include? ( 'reset_password_sent_at' )
'Someone requested password reset of'
elsif version . changeset . keys . include? ( 'confirmed_at' ) && version . changeset [ 'confirmed_at' ] [ 0 ] . nil?
2016-07-29 20:09:16 +05:30
( version . whodunnit . nil? ? link_to_user ( version . item_id ) : link_to_user ( version . whodunnit ) ) + ' confirmed account of'
2016-05-24 23:54:46 +05:30
elsif version . changeset . keys . include? ( 'confirmed_at' ) && version . changeset [ 'confirmed_at' ] [ 1 ] . nil?
2016-07-29 20:09:16 +05:30
link_to_user ( version . whodunnit ) + ' unconfirmed account of'
2016-05-24 23:54:46 +05:30
else
2016-07-29 20:09:16 +05:30
link_to_user ( version . whodunnit ) + " updated #{ updated_attributes ( version ) } of "
2016-05-24 23:54:46 +05:30
end
end
end
2016-08-13 23:45:46 +05:30
2016-08-18 00:32:16 +05:30
def event_schedule_change_description ( version )
case version . event
when 'create' then 'scheduled'
when 'update' then 'rescheduled'
when 'destroy' then 'unscheduled'
end
end
2016-08-13 23:45:46 +05:30
def general_change_description ( version )
if version . event == 'create'
'created new'
elsif version . event == 'update'
" updated #{ updated_attributes ( version ) } of "
else
'deleted'
end
end
2016-08-17 02:45:10 +05:30
def object_last_description ( model_name , id )
object_version = PaperTrail :: Version . where ( item_type : model_name , item_id : id ) . last
object = ( object_version . reify || object_version . item ) if object_version
object . try ( :name ) || object . try ( :title )
end
2013-01-07 09:04:09 +01:00
end