Merged master from upstream, local changes

This commit is contained in:
Gopesh Tulsyan 2014-03-26 22:15:48 +05:30
commit 109312fc51
106 changed files with 1924 additions and 10572 deletions

12
Gemfile
View file

@ -1,6 +1,6 @@
source 'https://rubygems.org' source 'https://rubygems.org'
gem 'rails', '3.2.15' gem 'rails', '3.2.17'
# Bundle edge Rails instead: # Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git' # gem 'rails', :git => 'git://github.com/rails/rails.git'
@ -8,9 +8,7 @@ gem 'rails', '3.2.15'
# Gems used only for assets and not required # Gems used only for assets and not required
# in production environments by default. # in production environments by default.
group :assets do group :assets do
gem 'sass-rails', '~> 3.2.3'
# gem 'coffee-rails', '~> 3.2.1' # gem 'coffee-rails', '~> 3.2.1'
gem 'bootstrap-sass'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes # See https://github.com/sstephenson/execjs#readme for more supported runtimes
gem 'therubyracer', :platforms => :ruby gem 'therubyracer', :platforms => :ruby
@ -22,11 +20,12 @@ group :development, :test do
gem 'pry' gem 'pry'
gem 'mysql2' gem 'mysql2'
gem 'thin' gem 'thin'
gem 'rspec-rails', '2.11.0' gem 'letter_opener'
end end
group :production do group :production do
gem 'mysql2' gem 'mysql2'
gem 'rspec-rails', '2.11.0'
end end
group :test do group :test do
@ -38,13 +37,15 @@ gem 'paperclip', '~> 3.0'
gem 'jquery-rails' gem 'jquery-rails'
gem 'jquery-ui-rails' gem 'jquery-ui-rails'
gem 'jquery-fileupload-rails' gem 'jquery-fileupload-rails'
gem 'devise', '~> 2.2' gem 'devise'
gem 'cancan' gem 'cancan'
gem "haml" gem "haml"
gem 'bcrypt-ruby', '~> 3.0.0' gem 'bcrypt-ruby', '~> 3.0.0'
#gem 'node' #gem 'node'
gem 'paper_trail' gem 'paper_trail'
gem 'formtastic-bootstrap' gem 'formtastic-bootstrap'
gem 'bootstrap-sass'
gem 'sass-rails', '>= 3.2'
gem 'cocoon' gem 'cocoon'
gem 'transitions', :require => ["transitions", "active_record/transitions"] gem 'transitions', :require => ["transitions", "active_record/transitions"]
gem 'acts_as_commentable_with_threading' gem 'acts_as_commentable_with_threading'
@ -53,3 +54,4 @@ gem 'prawn_rails'
gem 'gravtastic' gem 'gravtastic'
gem 'active_model_serializers' gem 'active_model_serializers'
gem 'axlsx_rails' gem 'axlsx_rails'
gem 'd3_rails'

View file

@ -1,13 +1,12 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
Ascii85 (1.0.2) actionmailer (3.2.17)
actionmailer (3.2.15) actionpack (= 3.2.17)
actionpack (= 3.2.15)
mail (~> 2.5.4) mail (~> 2.5.4)
actionpack (3.2.15) actionpack (3.2.17)
activemodel (= 3.2.15) activemodel (= 3.2.17)
activesupport (= 3.2.15) activesupport (= 3.2.17)
builder (~> 3.0.0) builder (~> 3.0.0)
erubis (~> 2.7.0) erubis (~> 2.7.0)
journey (~> 1.0.4) journey (~> 1.0.4)
@ -17,26 +16,27 @@ GEM
sprockets (~> 2.2.1) sprockets (~> 2.2.1)
active_model_serializers (0.8.1) active_model_serializers (0.8.1)
activemodel (>= 3.0) activemodel (>= 3.0)
activemodel (3.2.15) activemodel (3.2.17)
activesupport (= 3.2.15) activesupport (= 3.2.17)
builder (~> 3.0.0) builder (~> 3.0.0)
activerecord (3.2.15) activerecord (3.2.17)
activemodel (= 3.2.15) activemodel (= 3.2.17)
activesupport (= 3.2.15) activesupport (= 3.2.17)
arel (~> 3.0.2) arel (~> 3.0.2)
tzinfo (~> 0.3.29) tzinfo (~> 0.3.29)
activeresource (3.2.15) activeresource (3.2.17)
activemodel (= 3.2.15) activemodel (= 3.2.17)
activesupport (= 3.2.15) activesupport (= 3.2.17)
activesupport (3.2.15) activesupport (3.2.17)
i18n (~> 0.6, >= 0.6.4) i18n (~> 0.6, >= 0.6.4)
multi_json (~> 1.0) multi_json (~> 1.0)
acts_as_commentable_with_threading (1.1.3) acts_as_commentable_with_threading (1.2.0)
activerecord (>= 3.0) activerecord (>= 3.0)
activesupport (~> 3.0) activesupport (>= 3.0)
awesome_nested_set (>= 2.0) awesome_nested_set (>= 2.0)
afm (0.2.0) addressable (2.3.5)
arel (3.0.2) arel (3.0.3)
atomic (1.1.16)
awesome_nested_set (2.1.6) awesome_nested_set (2.1.6)
activerecord (>= 3.0.0) activerecord (>= 3.0.0)
axlsx (2.0.1) axlsx (2.0.1)
@ -46,8 +46,9 @@ GEM
axlsx_rails (0.1.5) axlsx_rails (0.1.5)
axlsx axlsx
rails (>= 3.1) rails (>= 3.1)
bcrypt (3.1.7)
bcrypt-ruby (3.0.1) bcrypt-ruby (3.0.1)
bootstrap-sass (2.3.2.2) bootstrap-sass (3.1.1.0)
sass (~> 3.2) sass (~> 3.2)
builder (3.0.4) builder (3.0.4)
cancan (1.6.10) cancan (1.6.10)
@ -58,81 +59,82 @@ GEM
rack-test (>= 0.5.4) rack-test (>= 0.5.4)
selenium-webdriver (~> 2.0) selenium-webdriver (~> 2.0)
xpath (~> 0.1.4) xpath (~> 0.1.4)
childprocess (0.3.9) childprocess (0.5.1)
ffi (~> 1.0, >= 1.0.11) ffi (~> 1.0, >= 1.0.11)
climate_control (0.0.3) climate_control (0.0.3)
activesupport (>= 3.0) activesupport (>= 3.0)
cocaine (0.5.2) cocaine (0.5.3)
climate_control (>= 0.0.3, < 1.0) climate_control (>= 0.0.3, < 1.0)
cocoon (1.2.1) cocoon (1.2.5)
coderay (1.0.9) coderay (1.1.0)
d3_rails (3.4.3)
railties (>= 3.1.0)
daemons (1.1.9) daemons (1.1.9)
devise (2.2.7) devise (3.2.4)
bcrypt-ruby (~> 3.0) bcrypt (~> 3.0)
orm_adapter (~> 0.1) orm_adapter (~> 0.1)
railties (~> 3.1) railties (>= 3.2.6, < 5)
warden (~> 1.2.1) thread_safe (~> 0.1)
warden (~> 1.2.3)
diff-lcs (1.1.3) diff-lcs (1.1.3)
erubis (2.7.0) erubis (2.7.0)
eventmachine (1.0.3) eventmachine (1.0.3)
execjs (2.0.2) execjs (2.0.2)
ffi (1.9.0) ffi (1.9.3)
formtastic (2.2.1) formtastic (2.2.1)
actionpack (>= 3.0) actionpack (>= 3.0)
formtastic-bootstrap (2.1.3) formtastic-bootstrap (3.0.0)
formtastic (~> 2.2) formtastic (>= 2.2)
gravtastic (3.2.6) gravtastic (3.2.6)
haml (4.0.3) haml (4.0.5)
tilt tilt
hashery (2.1.1)
hike (1.2.3) hike (1.2.3)
htmlentities (4.3.1) htmlentities (4.3.1)
i18n (0.6.5) i18n (0.6.9)
journey (1.0.4) journey (1.0.4)
jquery-fileupload-rails (0.4.1) jquery-fileupload-rails (0.4.1)
actionpack (>= 3.1) actionpack (>= 3.1)
railties (>= 3.1) railties (>= 3.1)
jquery-rails (3.0.4) jquery-rails (3.1.0)
railties (>= 3.0, < 5.0) railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
jquery-ui-rails (4.0.5) jquery-ui-rails (4.1.2)
railties (>= 3.1.0) railties (>= 3.1.0)
json (1.8.1) json (1.8.1)
launchy (2.4.2)
addressable (~> 2.3)
letter_opener (1.2.0)
launchy (~> 2.2)
libv8 (3.16.14.3) libv8 (3.16.14.3)
mail (2.5.4) mail (2.5.4)
mime-types (~> 1.16) mime-types (~> 1.16)
treetop (~> 1.4.8) treetop (~> 1.4.8)
method_source (0.8.2) method_source (0.8.2)
mime-types (1.25) mime-types (1.25.1)
mini_portile (0.5.1) mini_portile (0.5.2)
multi_json (1.8.2) multi_json (1.9.2)
mysql2 (0.3.13) mysql2 (0.3.15)
nokogiri (1.6.0) nokogiri (1.6.1)
mini_portile (~> 0.5.0) mini_portile (~> 0.5.0)
orm_adapter (0.4.0) orm_adapter (0.5.0)
paper_trail (2.7.2) paper_trail (3.0.0)
activerecord (~> 3.0) activerecord (>= 3.0, < 5.0)
railties (~> 3.0) activesupport (>= 3.0, < 5.0)
paperclip (3.5.1) paperclip (3.5.4)
activemodel (>= 3.0.0) activemodel (>= 3.0.0)
activesupport (>= 3.0.0) activesupport (>= 3.0.0)
cocaine (~> 0.5.0) cocaine (~> 0.5.3)
mime-types mime-types
pdf-reader (1.3.3) pdf-core (0.1.6)
Ascii85 (~> 1.0.0) polyglot (0.3.4)
afm (~> 0.2.0) prawn (0.15.0)
hashery (~> 2.0) pdf-core (~> 0.1.3)
ruby-rc4 ttfunk (~> 1.1.0)
ttfunk
polyglot (0.3.3)
prawn (0.12.0)
pdf-reader (>= 0.9.0)
ttfunk (~> 1.0.2)
prawn_rails (0.0.11) prawn_rails (0.0.11)
prawn (>= 0.11.1) prawn (>= 0.11.1)
railties (>= 3.0.0) railties (>= 3.0.0)
pry (0.9.12.2) pry (0.9.12.6)
coderay (~> 1.0.5) coderay (~> 1.0)
method_source (~> 0.8) method_source (~> 0.8)
slop (~> 3.4) slop (~> 3.4)
rack (1.4.5) rack (1.4.5)
@ -142,22 +144,22 @@ GEM
rack rack
rack-test (0.6.2) rack-test (0.6.2)
rack (>= 1.0) rack (>= 1.0)
rails (3.2.15) rails (3.2.17)
actionmailer (= 3.2.15) actionmailer (= 3.2.17)
actionpack (= 3.2.15) actionpack (= 3.2.17)
activerecord (= 3.2.15) activerecord (= 3.2.17)
activeresource (= 3.2.15) activeresource (= 3.2.17)
activesupport (= 3.2.15) activesupport (= 3.2.17)
bundler (~> 1.0) bundler (~> 1.0)
railties (= 3.2.15) railties (= 3.2.17)
railties (3.2.15) railties (3.2.17)
actionpack (= 3.2.15) actionpack (= 3.2.17)
activesupport (= 3.2.15) activesupport (= 3.2.17)
rack-ssl (~> 1.3.2) rack-ssl (~> 1.3.2)
rake (>= 0.8.7) rake (>= 0.8.7)
rdoc (~> 3.4) rdoc (~> 3.4)
thor (>= 0.14.6, < 2.0) thor (>= 0.14.6, < 2.0)
rake (10.1.0) rake (10.1.1)
rdoc (3.12.2) rdoc (3.12.2)
json (~> 1.4) json (~> 1.4)
ref (1.0.5) ref (1.0.5)
@ -174,42 +176,45 @@ GEM
activesupport (>= 3.0) activesupport (>= 3.0)
railties (>= 3.0) railties (>= 3.0)
rspec (~> 2.11.0) rspec (~> 2.11.0)
ruby-rc4 (0.1.5)
rubyzip (1.0.0) rubyzip (1.0.0)
sass (3.2.12) sass (3.2.14)
sass-rails (3.2.6) sass-rails (3.2.6)
railties (~> 3.2.0) railties (~> 3.2.0)
sass (>= 3.1.10) sass (>= 3.1.10)
tilt (~> 1.3) tilt (~> 1.3)
selenium-webdriver (2.37.0) selenium-webdriver (2.40.0)
childprocess (>= 0.2.5) childprocess (>= 0.5.0)
multi_json (~> 1.0) multi_json (~> 1.0)
rubyzip (~> 1.0.0) rubyzip (~> 1.0)
websocket (~> 1.0.4) websocket (~> 1.0.4)
slop (3.4.6) slop (3.4.7)
sprockets (2.2.2) sprockets (2.2.2)
hike (~> 1.2) hike (~> 1.2)
multi_json (~> 1.0) multi_json (~> 1.0)
rack (~> 1.0) rack (~> 1.0)
tilt (~> 1.1, != 1.3.0) tilt (~> 1.1, != 1.3.0)
therubyracer (0.12.0) therubyracer (0.12.0)
sqlite3 (1.3.9)
therubyracer (0.12.1)
libv8 (~> 3.16.14.0) libv8 (~> 3.16.14.0)
ref ref
thin (1.5.1) thin (1.6.2)
daemons (>= 1.0.9) daemons (>= 1.0.9)
eventmachine (>= 0.12.6) eventmachine (>= 1.0.0)
rack (>= 1.0.0) rack (>= 1.0.0)
thor (0.18.1) thor (0.18.1)
thread_safe (0.3.1)
atomic (>= 1.1.7, < 2)
tilt (1.4.1) tilt (1.4.1)
transitions (0.1.11) transitions (0.1.12)
treetop (1.4.15) treetop (1.4.15)
polyglot polyglot
polyglot (>= 0.3.1) polyglot (>= 0.3.1)
ttfunk (1.0.3) ttfunk (1.1.1)
tzinfo (0.3.38) tzinfo (0.3.38)
uglifier (2.2.1) uglifier (2.4.0)
execjs (>= 0.3.0) execjs (>= 0.3.0)
multi_json (~> 1.0, >= 1.0.2) json (>= 1.8.0)
warden (1.2.3) warden (1.2.3)
rack (>= 1.0) rack (>= 1.0)
websocket (1.0.7) websocket (1.0.7)
@ -229,22 +234,26 @@ DEPENDENCIES
cancan cancan
capybara (= 1.1.2) capybara (= 1.1.2)
cocoon cocoon
devise (~> 2.2) d3_rails
devise
formtastic-bootstrap formtastic-bootstrap
gravtastic gravtastic
haml haml
jquery-fileupload-rails jquery-fileupload-rails
jquery-rails jquery-rails
jquery-ui-rails jquery-ui-rails
letter_opener
mysql2 mysql2
paper_trail paper_trail
paperclip (~> 3.0) paperclip (~> 3.0)
prawn prawn
prawn_rails prawn_rails
pry pry
rails (= 3.2.15) rails (= 3.2.17)
rspec-rails (= 2.11.0) rspec-rails (= 2.11.0)
sass-rails (~> 3.2.3) sass-rails (~> 3.2.3)
sass-rails (>= 3.2)
sqlite3
therubyracer therubyracer
thin thin
transitions transitions

View file

@ -19,8 +19,8 @@
//= require cocoon //= require cocoon
//= require bootstrap //= require bootstrap
//= require osem //= require osem
//= require d3.v3 //= require d3
//= require d3.v3.min
$(document).ready(function() { $(document).ready(function() {
$('a[disabled=disabled]').click(function(event){ $('a[disabled=disabled]').click(function(event){
return false; return false;

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -1,4 +1,9 @@
$(function() { $(function() {
$("#event_media_type").change(function () {
$(".media-type").hide();
$('#' + $(this).val().toLowerCase() + '-help').show();
});
$('.dropdown-toggle').dropdown(); $('.dropdown-toggle').dropdown();
$("#conference-start-datepicker").datepicker({ $("#conference-start-datepicker").datepicker({
dateFormat: 'yy/mm/dd', dateFormat: 'yy/mm/dd',

View file

@ -1,10 +1,12 @@
/* /*
*= require strap-on.css.scss *= require strap-on.css.scss
*= require formtastic-bootstrap *= require formtastic-bootstrap
*= require osem
*= require jquery-ui-1.9.2.custom *= require jquery-ui-1.9.2.custom
*= require jquery.fileupload-ui *= require jquery.fileupload-ui
*= require jquery-ui-timepicker-addon *= require jquery-ui-timepicker-addon
*= require jquery.dataTables_themeroller *= require jquery.dataTables_themeroller
*= require osem
*= require osem-rating
*= require osem-schedule
*= require osem-schedule-print *= require osem-schedule-print
*/ */

View file

@ -0,0 +1,18 @@
/* Styling for voting on proposals*/
.myrating.bright { background-image: image-url("star-bright.png"); }
.myrating.glow { background-image: image-url("star-glow.png"); }
.othersrating.bright { background-image: image-url("star-bright.png"); }
.avgrating.bright { background-image: image-url("star-bright.png"); }
.avgrating {
background: image-url("star.png") 0 0;
width: 26px;
height: 26px;
display: inline-block;
}
.myrating, .othersrating {
background: image-url("star.png") 0 0;
width: 26px;
height: 26px;
float: left;
}

View file

@ -0,0 +1,57 @@
#schedule td.event {
background-image: linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -o-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -moz-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -webkit-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -ms-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -webkit-gradient(
linear,
left bottom,
left top,
color-stop(0.24, rgb(247,250,242)),
color-stop(0.97, rgb(194,232,190)),
color-stop(1, rgb(194,232,190))
);
}
#schedule td.event:hover
{
background-image: linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -o-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -moz-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -webkit-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -ms-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -webkit-gradient(
linear,
left bottom,
left top,
color-stop(0.24, rgb(247,250,242)),
color-stop(0.97, rgb(83,171,74)),
color-stop(1, rgb(83,171,74))
);
}
.flexvideo {
position: relative;
padding-bottom: 56.25%; /* 16:9 */
padding-top: 25px;
height: 0;
}
.flexvideo iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.schedule-title, .schedule-subtitle, .schedule-speaker, .schedule-track {
clear: none;
display: block;
}
.schedule-subtitle {
color: rgb(185, 74, 72);
}

View file

@ -1,207 +1,29 @@
/* Sticky footer styles html {
-------------------------------------------------- */ position: relative;
html,
body {
height: 100%;
/* The html and body elements cannot have any padding or margin. */
}
/* Styling for voting on proposals*/
.myrating.bright { background-image: url(../assets/star-bright.png); }
.myrating.glow { background-image: url(../assets/star-glow.png); }
.othersrating.bright { background-image: url(../assets/star-bright.png); }
.avgrating.bright { background-image: url(../assets/star-bright.png); }
.avgrating {
background: url(../assets/star.png) 0 0;
width: 26px;
height: 26px;
display: inline-block;
}
.myrating, .othersrating {
background: url(../assets/star.png) 0 0;
width: 26px;
height: 26px;
float: left;
}
/* Wrapper for page content to push down footer */
#wrap {
min-height: 100%; min-height: 100%;
height: auto !important; }
height: 100%; body {
/* Negative indent footer by it's height */ /* Margin bottom by footer height */
margin: 0 auto -60px; margin-bottom: 60px;
} }
/* Set the fixed height of the footer here */ body > #messages {
#push, padding: 60px 15px 0;
#footer {
height: 60px;
} }
#footer { #footer {
position: absolute;
bottom: 0;
width: 100%;
/* Set the fixed height of the footer here */
height: 60px;
background-color: #f5f5f5; background-color: #f5f5f5;
} }
.container .credit { .container .text-muted {
margin: 20px 0; margin: 20px 0;
} }
/* Lastly, apply responsive CSS fixes as necessary */ #footer > .container {
@media (max-width: 767px) { padding: 15px;
#footer {
margin-left: -20px;
margin-right: -20px;
padding-left: 20px;
padding-right: 20px;
}
}
@media screen and (min-width: 980px) {
body { padding-top: 60px; }
}
.center {
margin:0 auto;
float:none;
}
textarea {
-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
-moz-box-sizing: border-box; /* Firefox, other Gecko */
box-sizing: border-box; /* Opera/IE 8+ */
width:100%;
}
div.dataTables_length label {
float: left;
text-align: left;
}
div.dataTables_length select {
width: 75px;
}
div.dataTables_filter label {
float: right;
}
div.dataTables_info {
padding-top: 8px;
}
div.dataTables_paginate {
float: right;
margin: 0;
}
table.table {
clear: both;
margin-bottom: 6px !important;
max-width: none !important;
}
table.table thead .sorting,
table.table thead .sorting_asc,
table.table thead .sorting_desc,
table.table thead .sorting_asc_disabled,
table.table thead .sorting_desc_disabled {
cursor: pointer;
*cursor: hand;
}
table.table thead .sorting { background: url('images/sort_both.png') no-repeat center right; }
table.table thead .sorting_asc { background: url('images/sort_asc.png') no-repeat center right; }
table.table thead .sorting_desc { background: url('images/sort_desc.png') no-repeat center right; }
table.table thead .sorting_asc_disabled { background: url('images/sort_asc_disabled.png') no-repeat center right; }
table.table thead .sorting_desc_disabled { background: url('images/sort_desc_disabled.png') no-repeat center right; }
table.dataTable th:active {
outline: none;
}
/* Scrolling */
div.dataTables_scrollHead table {
margin-bottom: 0 !important;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
div.dataTables_scrollHead table thead tr:last-child th:first-child,
div.dataTables_scrollHead table thead tr:last-child td:first-child {
border-bottom-left-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
div.dataTables_scrollBody table {
border-top: none;
margin-bottom: 0 !important;
}
div.dataTables_scrollBody tbody tr:first-child th,
div.dataTables_scrollBody tbody tr:first-child td {
border-top: none;
}
div.dataTables_scrollFoot table {
border-top: none;
}
#schedule td.event {
background-image: linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -o-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -moz-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -webkit-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -ms-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(194,232,190) 97%, rgb(194,232,190) 100%);
background-image: -webkit-gradient(
linear,
left bottom,
left top,
color-stop(0.24, rgb(247,250,242)),
color-stop(0.97, rgb(194,232,190)),
color-stop(1, rgb(194,232,190))
);
}
#schedule td.event:hover
{
background-image: linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -o-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -moz-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -webkit-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -ms-linear-gradient(bottom, rgb(247,250,242) 24%, rgb(83,171,74) 97%, rgb(83,171,74) 100%);
background-image: -webkit-gradient(
linear,
left bottom,
left top,
color-stop(0.24, rgb(247,250,242)),
color-stop(0.97, rgb(83,171,74)),
color-stop(1, rgb(83,171,74))
);
}
.flexvideo {
position: relative;
padding-bottom: 56.25%; /* 16:9 */
padding-top: 25px;
height: 0;
}
.flexvideo iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.schedule-title, .schedule-subtitle, .schedule-speaker, .schedule-track {
clear: none;
display: block;
}
.schedule-subtitle {
color: rgb(185, 74, 72);
} }

View file

@ -1,471 +0,0 @@
/***
Spectrum Colorpicker v1.0.1
https://github.com/bgrins/spectrum
Author: Brian Grinstead
License: MIT
***/
.sp-container {
position:absolute;
top:0;
left:0;
display:inline-block;
*display: inline;
*zoom: 1;
z-index: 2147483647;
overflow: hidden;
}
.sp-container.sp-flat {
position: relative;
}
/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
.sp-top {
position:relative;
width: 100%;
display:inline-block;
}
.sp-top-inner {
position:absolute;
top:0;
left:0;
bottom:0;
right:0;
}
.sp-color {
position: absolute;
top:0;
left:0;
bottom:0;
right:20%;
}
.sp-hue {
position: absolute;
top:0;
right:0;
bottom:0;
left:84%;
height: 100%;
}
.sp-fill {
padding-top: 80%;
}
.sp-sat, .sp-val {
position: absolute;
top:0;
left:0;
right:0;
bottom:0;
}
.sp-alpha-enabled .sp-top
{
margin-bottom: 18px;
}
.sp-alpha-enabled .sp-alpha
{
display: block;
}
.sp-alpha-handle
{
position:absolute;
top:-4px;
bottom: -4px;
width: 6px;
left: 50%;
cursor: pointer;
border: 1px solid black;
background: white;
opacity: .8;
}
.sp-alpha
{
display: none;
position: absolute;
bottom: -14px;
right: 0;
left: 0;
height: 8px;
}
.sp-alpha-inner{
border: solid 1px #333;
}
/* Don't allow text selection */
.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button {
-webkit-user-select:none;
-moz-user-select: -moz-none;
-o-user-select:none;
user-select: none;
}
.sp-container.sp-input-disabled .sp-input-container {
display: none;
}
.sp-container.sp-buttons-disabled .sp-button-container {
display: none;
}
.sp-palette-only .sp-picker-container {
display: none;
}
.sp-palette-disabled .sp-palette-container {
display: none;
}
.sp-initial-disabled .sp-initial {
display: none;
}
/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */
.sp-sat {
background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0)));
background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0));
background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0));
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";
filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81');
}
.sp-val {
background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0)));
background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0));
background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0));
-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";
filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000');
}
.sp-hue {
background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000));
background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
}
/* IE filters do not support multiple color stops.
Generate 6 divs, line them up, and do two color gradients for each.
Yes, really.
*/
.sp-1 {
height:17%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00');
}
.sp-2 {
height:16%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00');
}
.sp-3 {
height:17%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff');
}
.sp-4 {
height:17%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff');
}
.sp-5 {
height:16%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff');
}
.sp-6 {
height:17%;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000');
}
/* Clearfix hack */
.sp-cf:before, .sp-cf:after { content: ""; display: table; }
.sp-cf:after { clear: both; }
.sp-cf { *zoom: 1; }
/* Mobile devices, make hue slider bigger so it is easier to slide */
@media (max-device-width: 480px) {
.sp-color { right: 40%; }
.sp-hue { left: 63%; }
.sp-fill { padding-top: 60%; }
}
.sp-dragger {
border-radius: 5px;
height: 5px;
width: 5px;
border: 1px solid #fff;
background: #000;
cursor: pointer;
position:absolute;
top:0;
left: 0;
}
.sp-slider {
position: absolute;
top:0;
cursor:pointer;
height: 3px;
left: -1px;
right: -1px;
border: 1px solid #000;
background: white;
opacity: .8;
}
/* Basic display options (colors, fonts, global widths) */
.sp-container {
border-radius: 0;
background-color: #ECECEC;
border: solid 1px #f0c49B;
padding: 0;
}
.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue
{
font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
-ms-box-sizing: border-box;
box-sizing: border-box;
}
.sp-top
{
margin-bottom: 3px;
}
.sp-color, .sp-hue
{
border: solid 1px #666;
}
/* Input */
.sp-input-container {
float:right;
width: 100px;
margin-bottom: 4px;
}
.sp-initial-disabled .sp-input-container {
width: 100%;
}
.sp-input {
font-size: 12px !important;
border: 1px inset;
padding: 4px 5px;
margin: 0;
width: 100%;
background:transparent;
border-radius: 3px;
color: #222;
}
.sp-input:focus {
border: 1px solid orange;
}
.sp-input.sp-validation-error
{
border: 1px solid red;
background: #fdd;
}
.sp-picker-container , .sp-palette-container
{
float:left;
position: relative;
padding: 10px;
padding-bottom: 300px;
margin-bottom: -290px;
}
.sp-picker-container
{
width: 172px;
border-left: solid 1px #fff;
}
/* Palettes */
.sp-palette-container
{
border-right: solid 1px #ccc;
}
.sp-palette .sp-thumb-el {
display: block;
position:relative;
float:left;
width: 24px;
height: 15px;
margin: 3px;
cursor: pointer;
border:solid 2px transparent;
}
.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active {
border-color: orange;
}
.sp-thumb-el
{
position:relative;
}
/* Initial */
.sp-initial
{
float: left;
border: solid 1px #333;
}
.sp-initial span {
width: 30px;
height: 25px;
border:none;
display:block;
float:left;
margin:0;
}
/* Buttons */
.sp-button-container {
float: right;
}
/* Replacer (the little preview div that shows up instead of the <input>) */
.sp-replacer {
margin:0;
overflow:hidden;
cursor:pointer;
padding: 4px;
display:inline-block;
*zoom: 1;
*display: inline;
border: solid 1px #91765d;
background: #eee;
color: #333;
vertical-align: middle;
}
.sp-replacer:hover, .sp-replacer.sp-active {
border-color: #F0C49B;
color: #111;
}
.sp-replacer.sp-disabled {
cursor:default;
border-color: silver;
color: silver;
}
.sp-dd {
padding: 2px 0;
height: 16px;
line-height: 16px;
float:left;
font-size:10px;
}
.sp-preview
{
position:relative;
width:25px;
height: 20px;
border: solid 1px #222;
margin-right: 5px;
float:left;
z-index: 0;
}
.sp-palette
{
*width: 220px;
max-width: 220px;
}
.sp-palette .sp-thumb-el
{
width:16px;
height: 16px;
margin:2px 1px;
border: solid 1px #d0d0d0;
}
.sp-container
{
padding-bottom:0;
}
/* Buttons: http://hellohappy.org/css3-buttons/ */
.sp-container button {
background-color: #eeeeee;
background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);
background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);
background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
background-image: -o-linear-gradient(top, #eeeeee, #cccccc);
background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
background-image: linear-gradient(to bottom, #eeeeee, #cccccc);
border: 1px solid #ccc;
border-bottom: 1px solid #bbb;
border-radius: 3px;
color: #333;
font-size: 14px;
line-height: 1;
padding: 5px 4px;
text-align: center;
text-shadow: 0 1px 0 #eee;
vertical-align: middle;
}
.sp-container button:hover {
background-color: #dddddd;
background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb);
background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb);
background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
background-image: -o-linear-gradient(top, #dddddd, #bbbbbb);
background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
background-image: linear-gradient(to bottom, #dddddd, #bbbbbb);
border: 1px solid #bbb;
border-bottom: 1px solid #999;
cursor: pointer;
text-shadow: 0 1px 0 #ddd;
}
.sp-container button:active {
border: 1px solid #aaa;
border-bottom: 1px solid #888;
-webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
-moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
-ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
-o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
}
.sp-cancel
{
font-size: 11px;
color: #d93f3f !important;
margin:0;
padding:2px;
margin-right: 5px;
vertical-align: middle;
text-decoration:none;
}
.sp-cancel:hover
{
color: #d93f3f !important;
text-decoration: underline;
}
.sp-palette span:hover, .sp-palette span.sp-thumb-active
{
border-color: #000;
}
.sp-preview, .sp-alpha, .sp-thumb-el
{
position:relative;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
}
.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner
{
display:block;
position:absolute;
top:0;left:0;bottom:0;right:0;
}
.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner
{
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=);
}
.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner
{
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=);
}

View file

@ -1,15 +1,8 @@
$navbarBackground: #299a0b; $navbar-default-bg: #299a0b;
$navbarBackgroundHighlight: #299a0b; $navbar-default-link-active-bg: #DFE0DF;
$navbarBorder: 1px solid #d4d4d4; $navbar-default-border: 1px solid #d4d4d4;
$navbarText: #ffffff; $navbar-default-color: #ffffff;
$navbarLinkColor: white; $navbar-default-link-color: #ffffff;
$navbarLinkColorHover: black; $navbar-default-link-hover-color: #000000;
$navbarLinkBackgroundActive: #DFE0DF;
@import "bootstrap"; @import "bootstrap";
@import "bootstrap-responsive";
/* Set to navbarBackgroundHighlight otherwise */
.navbar .nav > li > a {
text-shadow: none;
}

View file

@ -3,9 +3,8 @@ class Admin::StatsController < ApplicationController
def index def index
@registrations = @conference.registrations.includes(:person).order("registrations.created_at ASC") @registrations = @conference.registrations.includes(:person).order("registrations.created_at ASC")
@attendees = @conference.registrations.where("attended = ?", true).count
@registered = @conference.registrations.count @registered = @conference.registrations.count
@attendees = @conference.registrations.where("attended = ?", true).count
@pre_registered = @conference.registrations.where("created_at < ?", @conference.start_date).count @pre_registered = @conference.registrations.where("created_at < ?", @conference.start_date).count
@pre_registered_attended = @conference.registrations.where("created_at < ? AND attended = ?", @conference.start_date, true).count @pre_registered_attended = @conference.registrations.where("created_at < ? AND attended = ?", @conference.start_date, true).count
@ -17,33 +16,117 @@ class Admin::StatsController < ApplicationController
@handicapped_access_attended = @handicapped_access_attended.where(attended: true).count @handicapped_access_attended = @handicapped_access_attended.where(attended: true).count
@suggested_hotel_stay = @conference.registrations.where("using_affiliated_lodging = ?", true).count @suggested_hotel_stay = @conference.registrations.where("using_affiliated_lodging = ?", true).count
@events = @conference.events
#Events charts
@machine_states = [['confirmed'], ['cancelled'], ['rejected'], ['withdrawn'], ['new', 'review'], ['unconfirmed', 'accepted']]
#Types distribution per state
@type_state = {}
@machine_states.each do |state|
@type_state[state[0]] = var_state_func(@conference.event_types, "event_type", state)
end
#Tracks distribution per state
@no_track_all = @events.where(track_id: nil)
@no_track_new = @events.where(track_id: nil).where(state: ['new', 'review'])
@no_track_unconfirmed = @events.where(track_id: nil).where(state: "unconfirmed")
@no_track_confirmed = @events.where(track_id: nil).where(state: "confirmed")
@track_state = {}
@machine_states.each do |state|
@track_state[state[0]] = var_state_func(@conference.tracks, "track", state)
end
#Events_time chart
if @events.count > 0
start_date = @events.minimum("created_at").strftime("%Y-%m-%d")
end_date = @events.maximum("created_at").strftime("%Y-%m-%d")
if start_date != nil && end_date != nil
@events_time = var_time(start_date, end_date, @events, "created_at")
end
end
#Code for the table in events
@mystates = []
@mytypes = []
@eventstats = {}
statelength = 0
@totallength = 0
#Get totals per state
@events.state_machine.states.map.each do |mystate|
length = 0
events_mystate= @events.where("state" => mystate.name)
if events_mystate.count > 0
@mystates << mystate
events_mystate.each do |myevent|
length += myevent.event_type.length
end
@eventstats["#{mystate.name}"] = {"count" => events_mystate.count, "length" => length}
end
end
@conference.event_types.each do |mytype|
events_mytype = @events.where("event_type_id" => mytype.id)
if events_mytype.count > 0
@mytypes << mytype
end
end
@mytypes.each do |mytype|
@mystates.each do |mystate|
events_mytype = @events.where("event_type_id" => mytype.id)
events_mytype_mystate= events_mytype.where("state" => mystate.name)
typelength = 0
if events_mytype_mystate.count > 0
events_mytype_mystate.each do |myevent|
typelength += myevent.event_type.length
@totallength += myevent.event_type.length
end
@eventstats[mytype.title] = {"count" => events_mytype.count, "length" => events_mytype.count * mytype.length} if @eventstats[mytype.title] == nil
tmp = {"#{mystate.name}" => {"type_state_count" => events_mytype_mystate.count, "type_state_length" => typelength}}
@eventstats[mytype.title].merge!(tmp)
end
end
end
@eventstats["totallength"] = @totallength
#SPEAKERS stats
@speakers = Person.joins(:events).where("events.conference_id = ? AND events.state LIKE ?", @conference.id, 'confirmed').uniq @speakers = Person.joins(:events).where("events.conference_id = ? AND events.state LIKE ?", @conference.id, 'confirmed').uniq
@speaker_fields_person = %w[name email affiliation] @speaker_fields_person = %w[name email affiliation]
@speaker_fields_reg = %w[other_needs diet arrival departure] @speaker_fields_reg = %w[arrival departure]
#TICKETS stats
@supporter_levels = @conference.supporter_levels @supporter_levels = @conference.supporter_levels
@tickets = @conference.registrations.joins(:supporter_registration => :supporter_level) @tickets = @conference.registrations.joins(:supporter_registration => :supporter_level)
@tickets = @tickets.where("supporter_levels.title NOT LIKE ? ", "%Free%") @tickets = @tickets.where("supporter_levels.title NOT LIKE ? ", "%Free%")
@mydays = [] @tickets_time = []
@mytickets = []
if @conference.registration_start_date and @conference.end_date if @conference.registration_start_date and @conference.end_date and @registered > 0 and @supporter_levels
(@conference.registration_start_date..@conference.end_date).each do |day| start_date = @conference.registration_start_date
day_reg_count = @registrations.where("created_at LIKE '%#{day}%' ").count end_date = @conference.end_date
day_ticket_count = @tickets.where("supporter_registrations.created_at LIKE '%#{day}%' ").count levels = [];
if day_reg_count != 0
@mydays << {"status" => "#{day}", "value" => day_reg_count}
end
@conference.supporter_levels.each do |level| @conference.supporter_levels.each do |level|
day_ticket_count = @tickets.where("supporter_registrations.created_at LIKE ? AND supporter_levels.title LIKE ?", "%#{day}%", "%#{level.title}%").count @tickets_time << {"key" => level.title, "values" => []}
if day_ticket_count !=0 levels << ["#{level.title}"]
@mytickets << {"status" => "#{day}", "ticket" => "#{level}", "value" => day_ticket_count}
end
end
end
end end
(start_date..end_date).each do |day|
if @tickets.where("supporter_registrations.created_at LIKE ?", "%#{day}%").where("supporter_levels.title" => levels).count != 0
@conference.supporter_levels.each do |level|
day_ticket_count = @tickets.where("supporter_registrations.created_at LIKE ? AND supporter_levels.title LIKE ?", "%#{day}%", "%#{level.title}%").count
index = @tickets_time.index {|v| v["key"] == "#{level.title}"}
@tickets_time[index]["values"] << {"label" => "#{day}", "value" => day_ticket_count}
end
end
end
end
@tickets_distribution = []
@tickets_time.each do |ticket|
value = ticket["values"].map{|x| x["value"]}.sum
percent = (value.to_f / @tickets.count * 100).round(2)
@tickets_distribution << {"status" => ticket["key"], "value" => value, "percent" => percent}
end
#OTHER_INFO chart / To be 'Questions'
@other_info = [ @other_info = [
{"status" => "with partner (registered)", "value" => @registered_with_partner}, {"status" => "with partner (registered)", "value" => @registered_with_partner},
{"status" => "with partner (attended)", "value" => @attended_with_partner}, {"status" => "with partner (attended)", "value" => @attended_with_partner},
@ -52,6 +135,56 @@ class Admin::StatsController < ApplicationController
{"status" => "stay at suggested hotel", "value" => @suggested_hotel_stay} {"status" => "stay at suggested hotel", "value" => @suggested_hotel_stay}
] ]
# REGISTRATIONS, registered_time
if @conference.registration_start_date and @conference.end_date and @registered > 0
start_date = @conference.registration_start_date
end_date = @conference.end_date
@registered_time = var_time(start_date, end_date, @registrations, "created_at")
end
respond_to do |format|
format.html
format.json { render :json => @tickets_time.to_json }
end
end
#FUNCTIONS
def var_time(start_date, end_date, var, field)
result = []
(start_date..end_date).each do |day|
day_var_count = var.where("#{field} LIKE ?", "%#{day}%").count
if day_var_count !=0
result << {"status" => "#{day}", "value" => day_var_count}
end
end
return result
end
def var_state_func(vars, field, mystate)
result = []
for myvar in vars do
#Find events per track and state
value = @conference.events.where("#{field}_id" => myvar.id).where(state: mystate).count
#Find all events in that state
total = @conference.events.where(state: mystate).count
status = "#{myvar.name}"
if value != 0
percent = (value.to_f / total * 100).round(2)
result << {"status" => status, "value" => value, "percent" => percent}
else
percent = 0
end
end
#Get no of events for which the field is not set (Needed so that the pie shows half piece for 50%)
sum = result.inject(0) {|sum, hash| sum + hash["value"]}
value = total - sum if total and sum
if sum !=0 && value !=0
percent = (value.to_f / total * 100).round(2)
result << {"status" => "no #{field} set", "value" => value, "percent" => percent }
end
return result
end end
def speaker_reg(speaker) def speaker_reg(speaker)

View file

@ -6,16 +6,20 @@ class Admin::VolunteersController < ApplicationController
def show def show
@conference = Conference.find_all_by_short_title(params[:conference_id]).first @conference = Conference.find_all_by_short_title(params[:conference_id]).first
@volunteers = @conference.registrations.joins(:vchoices).all if @conference.use_vpositions
@volunteers = @conference.registrations.joins(:vchoices).uniq
else
@volunteers = @conference.registrations.where(:volunteer => true)
end
end end
def update def update
@conference = Conference.find_all_by_short_title(params[:conference_id]).first @conference = Conference.find_all_by_short_title(params[:conference_id]).first
begin begin
@conference.update_attributes!(params[:conference]) @conference.update_attributes!(params[:conference])
redirect_to(admin_conference_volunteer_info_path(:conference_id => params[:conference_id]), :notice => "Volunteering options were successfully updated.") redirect_to(admin_conference_volunteers_info_path(:conference_id => params[:conference_id]), :notice => "Volunteering options were successfully updated.")
rescue Exception => e rescue Exception => e
redirect_to(admin_conference_volunteer_info_path(:conference_id => params[:conference_id]), :alert => "Volunteering options update failed: #{e.message}") redirect_to(admin_conference_volunteers_info_path(:conference_id => params[:conference_id]), :alert => "Volunteering options update failed: #{e.message}")
end end
end end
end end

View file

@ -9,7 +9,13 @@ class ApplicationController < ActionController::Base
end end
def after_sign_in_path_for(resource) def after_sign_in_path_for(resource)
if not session[:return_to].start_with?(user_registration_path)
logger.debug "Returning to #{session[:return_to]}"
session[:return_to] session[:return_to]
else
logger.debug "Not returning to #{session[:return_to]} because it would loop"
super
end
end end
def get_conferences def get_conferences

View file

@ -5,7 +5,7 @@ class Conference < ActiveRecord::Base
:event_types_attributes, :registration_start_date, :registration_end_date, :logo, :event_types_attributes, :registration_start_date, :registration_end_date, :logo,
:questions_attributes, :question_ids, :answers_attributes, :answer_ids, :questions_attributes, :question_ids, :answers_attributes, :answer_ids,
:difficulty_levels_attributes, :use_difficulty_levels, :difficulty_levels_attributes, :use_difficulty_levels,
:use_vpositions, :use_vdays, :vdays_attributes, :vpositions_attributes :use_vpositions, :use_vdays, :vdays_attributes, :vpositions_attributes, :use_volunteers
has_paper_trail has_paper_trail

View file

@ -8,12 +8,12 @@ class EmailSettings < ActiveRecord::Base
"email" => person.email, "email" => person.email,
"name" => person.public_name, "name" => person.public_name,
"conference" => conference.title, "conference" => conference.title,
"registrationlink" => Rails.application.routes.url_helpers.register_conference_url(conference.short_title, :host => OSEM_CONFIG["url_for_emails"]) "registrationlink" => Rails.application.routes.url_helpers.register_conference_url(conference.short_title, :host => CONFIG["url_for_emails"])
} }
if !event.nil? if !event.nil?
h["eventtitle"] = event.title h["eventtitle"] = event.title
h["proposalslink"] = Rails.application.routes.url_helpers.conference_proposal_url(conference.short_title, event, :host => OSEM_CONFIG["url_for_emails"]) h["proposalslink"] = Rails.application.routes.url_helpers.conference_proposal_url(conference.short_title, event, :host => CONFIG["url_for_emails"])
end end
h h
end end

View file

@ -1,7 +1,7 @@
class Event < ActiveRecord::Base class Event < ActiveRecord::Base
include ActiveRecord::Transitions include ActiveRecord::Transitions
has_paper_trail has_paper_trail
attr_accessible :title, :subtitle, :abstract, :description, :event_type_id, :people_attributes, :person, :proposal_additional_speakers, :track_id, :video_id, :video_type, :require_registration, :difficulty_level_id attr_accessible :title, :subtitle, :abstract, :description, :event_type_id, :people_attributes, :person, :proposal_additional_speakers, :track_id, :media_id, :media_type, :require_registration, :difficulty_level_id
acts_as_commentable acts_as_commentable
@ -25,10 +25,16 @@ class Event < ActiveRecord::Base
accepts_nested_attributes_for :people accepts_nested_attributes_for :people
before_create :generate_guid before_create :generate_guid
def self.media_types
media_types = {:youtube => 'YouTube', :slideshare => 'SlideShare', :flickr => 'Flickr', :vimeo => 'Vimeo', :speakerdeck => 'Speakerdeck', :instagram => 'Instagram'}
return media_types
end
validate :abstract_limit validate :abstract_limit
validate :biography_exists validate :biography_exists
validates :title, :presence => true validates :title, :presence => true
validates :abstract, :presence => true validates :abstract, :presence => true
validates :media_type, inclusion: {in: self.media_types.values}
scope :confirmed, where(:state => "confirmed") scope :confirmed, where(:state => "confirmed")

View file

@ -4,4 +4,6 @@ class EventType < ActiveRecord::Base
belongs_to :conference belongs_to :conference
validates :length, :numericality => {:greater_than => 0} validates :length, :numericality => {:greater_than => 0}
alias_attribute :name, :title
end end

View file

@ -1,8 +1,7 @@
.container-fluid .row-fluid
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@cfp, :url => admin_conference_cfp_update_path(@conference.short_title),:html => {:multipart => true}) do |f| = semantic_form_for(@cfp, :url => admin_conference_cfp_update_path(@conference.short_title),:html => {:multipart => true}) do |f|
= f.input :start_date, :as => :string, :input_html => { :id => "conference-start-datepicker", :readonly => "readonly" } = f.input :start_date, :as => :string, :input_html => { :id => "conference-start-datepicker", :readonly => "readonly" }
= f.input :end_date, :as => :string, :input_html => { :id => "conference-end-datepicker", :readonly => "readonly" } = f.input :end_date, :as => :string, :input_html => { :id => "conference-end-datepicker", :readonly => "readonly" }

View file

@ -1,8 +1,5 @@
.well.sidebar-nav .well.sidebar-nav
%ul.nav.nav-list %ul.nav.nav-pills.nav-stacked
%li.nav-header
=@conference.short_title
Settings
%li{:class=> active_nav_li(admin_conference_path(@conference.short_title))} %li{:class=> active_nav_li(admin_conference_path(@conference.short_title))}
= link_to "Conference", admin_conference_path(@conference.short_title) = link_to "Conference", admin_conference_path(@conference.short_title)
%li{:class=> active_nav_li(admin_conference_venue_info_path(@conference.short_title))} %li{:class=> active_nav_li(admin_conference_venue_info_path(@conference.short_title))}

View file

@ -1,8 +1,7 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@conference, :url => admin_conference_path(@conference.short_title),:html => {:multipart => true}) do |f| = semantic_form_for(@conference, :url => admin_conference_path(@conference.short_title),:html => {:multipart => true}) do |f|
= f.input :title, :hint => "The full name of the conference, such as 'OpenSUSE Conference 2013'" = f.input :title, :hint => "The full name of the conference, such as 'OpenSUSE Conference 2013'"
= f.input :short_title, :hint => "A short title, such as 'osc2013', to be used in URLs" = f.input :short_title, :hint => "A short title, such as 'osc2013', to be used in URLs"

View file

@ -1,5 +1,4 @@
.container-fluid .row
.row-fluid
.span3 .span3
= render 'admin/conference/sidebar', :activated => "Diet" = render 'admin/conference/sidebar', :activated => "Diet"
.span9 .span9

View file

@ -1,8 +1,7 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@conference, :url => admin_conference_difficulty_levels_path(@conference.short_title)) do |f| = semantic_form_for(@conference, :url => admin_conference_difficulty_levels_path(@conference.short_title)) do |f|
= f.input :use_difficulty_levels, :label => false = f.input :use_difficulty_levels, :label => false
= dynamic_association :difficulty_levels, "Difficulty_Levels", f = dynamic_association :difficulty_levels, "Difficulty_Levels", f

View file

@ -1,8 +1,7 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= link_to "Template Help", "#", :id => "template-help-link" = link_to "Template Help", "#", :id => "template-help-link"
#template-help #template-help
Valid attributes: Valid attributes:
@ -25,7 +24,6 @@
%tr %tr
%td {eventtitle} %td {eventtitle}
%td The title of an accepted or rejected proposal %td The title of an accepted or rejected proposal
= semantic_form_for(@settings, :url => admin_conference_email_settings_path(@conference.short_title),:html => {:multipart => true}) do |f| = semantic_form_for(@settings, :url => admin_conference_email_settings_path(@conference.short_title),:html => {:multipart => true}) do |f|
= f.input :send_on_registration, :label => false, :hint => "Send an email when the user registers for the conference?" = f.input :send_on_registration, :label => false, :hint => "Send an email when the user registers for the conference?"
= f.input :registration_subject = f.input :registration_subject

View file

@ -1,9 +1,7 @@
.row-fluid .row
.row .col-md-12
.span12 = link_to "Show Events Stats", "#", :id => "events-stats-link", :class => "btn btn-default pull-right"
%h5{:style=>"text-align: right"} .clearfix
= link_to "Events Stats", "#", :id => "events-stats-link", :class => "btn btn-success"
#events-stats #events-stats
.span12 .span12
%table.table.table-bordered.table-striped %table.table.table-bordered.table-striped
@ -16,7 +14,6 @@
Total Total
%br %br
No & Time No & Time
%tr %tr
%td %td
%b Total %b Total

View file

@ -1,15 +1,14 @@
.row-fluid .row
.span10 .col-md-12
%h3 %h3
= @event.title = @event.title
%br %br
%span.muted %small
= @event.subtitle = @event.subtitle
.span2 = link_to "Edit", edit_admin_conference_event_path(@conference.short_title, @event), :class => "btn btn-mini btn-default pull-right"
= link_to "Edit", edit_admin_conference_event_path(@conference.short_title, @event), :class => "btn btn-mini btn-primary"
.row-fluid .row
.span12 .col-md-12
%table.table %table.table
%tr %tr
%td{:style => "width:15%"} %td{:style => "width:15%"}
@ -161,7 +160,7 @@
= link_to "Delete", conference_proposal_event_attachment_path(@conference.short_title, @event.id, a.id), = link_to "Delete", conference_proposal_event_attachment_path(@conference.short_title, @event.id, a.id),
:method => :delete, :confirm => "Are you sure you want to delete this attachment? It's permanant!" :method => :delete, :confirm => "Are you sure you want to delete this attachment? It's permanant!"
.row-fluid .row
= link_to "Comments (#{@comment_count})", "#", :id => "event-comment-link" = link_to "Comments (#{@comment_count})", "#", :id => "event-comment-link"
#comments-div #comments-div
%hr %hr

View file

@ -1,2 +1 @@
.container = render 'proposal/form'
= render 'proposal/form'

View file

@ -1,7 +1,7 @@
= render :partial => "events_stats" = render :partial => "events_stats"
.row-fluid .row
.span12 .col-md-12
%h2 %h2
Events Events
- if @events - if @events
@ -38,7 +38,7 @@
- if @conference.call_for_papers.rating != 0 - if @conference.call_for_papers.rating != 0
%td{:style => "width:96px"} %td{:style => "width:96px"}
- if event.average_rating.to_f > 0 - if event.average_rating.to_f > 0
%b #{event.average_rating}/#{@conference.call_for_papers.rating} #{event.average_rating}/#{@conference.call_for_papers.rating}
%br %br
#{pluralize(event.voters.length, 'voter')} #{pluralize(event.voters.length, 'voter')}
%br %br
@ -49,7 +49,7 @@
- else - else
= label_tag "label_rating", "", :class => "avgrating" = label_tag "label_rating", "", :class => "avgrating"
- else - else
Rating: 0/#{@conference.call_for_papers.rating} 0/#{@conference.call_for_papers.rating}
%br %br
- if event.submitter.registrations.count < 1 - if event.submitter.registrations.count < 1

View file

@ -8,7 +8,7 @@
#proposal-content.tab-pane.active #proposal-content.tab-pane.active
= render 'proposal' = render 'proposal'
#history-content.tab-pane #history-content.tab-pane
.span12 .col-md-12
%table.table %table.table
%thead %thead
%th %th

View file

@ -1,8 +1,7 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@conference, :url => admin_conference_eventtype_update_path(@conference.short_title)) do |f| = semantic_form_for(@conference, :url => admin_conference_eventtype_update_path(@conference.short_title)) do |f|
= dynamic_association :event_types, "Event Types", f = dynamic_association :event_types, "Event Types", f
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"} = f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}

View file

@ -1,15 +1,14 @@
.row-fluid .row
.span6 .col-md-12
%h2 .page-header
%h1
People People
- if @people - if @people
= "(#{@people.length})" = "(#{@people.length})"
.span6 = link_to "New person", new_admin_person_path, :class => "btn btn-success pull-right"
.pull-right{:style=>"margin-top:20px; margin-bottom:20px;"}
= link_to "New person", new_admin_person_path, :class => "btn btn-success"
.row-fluid .row
.span12 .col-md-12
.well .well
%table.table.table-striped.table-bordered.table-hover#people %table.table.table-striped.table-bordered.table-hover#people
%thead %thead

View file

@ -1,8 +1,8 @@
.row-fluid .row
.span6 .col-md-6
%legend Question %legend Question
= f.input :title, :label => "Your Question" = f.input :title, :label => "Your Question"
= f.input :question_type = f.input :question_type
= f.input :global, :label => "Make Global", :hint => "(Global questions are available for selection to all conferences)" = f.input :global, :label => "Make Global", :hint => "(Global questions are available for selection to all conferences)"
.span6 .col-md-6
= dynamic_association :answers, "Answers", f, :hint => "Insert your answers in the order you want them to appear" = dynamic_association :answers, "Answers", f, :hint => "Insert your answers in the order you want them to appear"

View file

@ -1,23 +1,21 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
.pull-right .pull-right
%b= link_to "Create New Question","#", "data-toggle" => "modal", "data-target" => "#new-question", :class => "btn btn-success" %b= link_to "Create New Question","#", "data-toggle" => "modal", "data-target" => "#new-question", :class => "btn btn-success"
%br %br
%br %br
- if @questions.count > 0 - if @questions.count > 0
= semantic_form_for(@conference, :url => admin_conference_questions_update_conference_path(@conference.short_title), :method => 'put') do |f| = semantic_form_for(@conference, :url => admin_conference_questions_update_conference_path(@conference.short_title), :method => 'put') do |f|
.questions{:id => "myquestions"} .questions{:id => "myquestions"}
= render :partial => "questions" = render :partial => "questions"
= f.submit "Update Questions for #{@conference.short_title}", :class => "btn btn-primary", :confirm => "Are you sure you want to make these changes?" = f.submit "Update Questions for #{@conference.short_title}", :class => "btn btn-primary", :confirm => "Are you sure you want to make these changes?"
.modal.hide.fade{:id => "new-question", "role" => "dialog", "aria-hidden" => "true"}
.modal.fade{:id => "new-question", "role" => "dialog", "aria-hidden" => "true"}
.modal-dialog
.modal-content
.modal-header .modal-header
%h3{:id => "new-question-header"} %h3{:id => "new-question-header"}
Add new question Add new question

View file

@ -1,13 +1,11 @@
.container-fluid .row
.row-fluid .col-md-12
.span12
%h3 %h3
Edit registration of #{@person.public_name} (#{@person.email}) for #{@conference.title} Edit registration of #{@person.public_name} (#{@person.email}) for #{@conference.title}
%br %br
.row-fluid .row
.span12 .col-md-12
= semantic_form_for(@registration, :url => admin_conference_registrations_edit_path(@conference.short_title, @registration.id), :html => { :method => :put }) do |f| = semantic_form_for(@registration, :url => admin_conference_registrations_edit_path(@conference.short_title, @registration.id), :html => { :method => :put }) do |f|
= f.inputs "Personal Information" do = f.inputs "Personal Information" do
= f.fields_for :person do |p| = f.fields_for :person do |p|
= p.input :first_name, :as => :string = p.input :first_name, :as => :string
@ -16,25 +14,21 @@
= p.text_field :irc_nickname, :as => :string = p.text_field :irc_nickname, :as => :string
= p.label :Affiliation = p.label :Affiliation
= p.text_field :company, :placeholder => "Company/User Group/nothing", :as => :string = p.text_field :company, :placeholder => "Company/User Group/nothing", :as => :string
= f.inputs "Registration Information" do = f.inputs "Registration Information" do
- if @conference.use_supporter_levels? and @conference.supporter_levels.length > 0 - if @conference.use_supporter_levels? and @conference.supporter_levels.length > 0
= f.semantic_fields_for :supporter_registration do |reg| = f.semantic_fields_for :supporter_registration do |reg|
= reg.input :supporter_level, :as => :select, :collection => @conference.supporter_levels = reg.input :supporter_level, :as => :select, :collection => @conference.supporter_levels
= reg.input :code, :label => "Confirmation or registration code (if applicable)" = reg.input :code, :label => "Confirmation or registration code (if applicable)"
%span#supporter-link.help-block %span#supporter-link.help-block
= f.input :attending_with_partner, :label => false = f.input :attending_with_partner, :label => false
= f.input :using_affiliated_lodging, :label => false = f.input :using_affiliated_lodging, :label => false
= f.input :handicapped_access_required, :label => false = f.input :handicapped_access_required, :label => false
= f.input :other_special_needs, :label => "Any other special needs?", :input_html => {:rows => 2, :class => "span6"} = f.input :other_special_needs, :label => "Any other special needs?", :input_html => {:rows => 2, :class => "span6"}
- if @conference.social_events.count > 0 - if @conference.social_events.count > 0
= f.inputs "Are you planning to attend any of the parties?" do = f.inputs "Are you planning to attend any of the parties?" do
%br Yes, I'll be attending... %br Yes, I'll be attending...
%br %br
= f.input :social_events, :as => :check_boxes, :label => false, :collection => @conference.social_events = f.input :social_events, :as => :check_boxes, :label => false, :collection => @conference.social_events
= f.action :submit, :button_html => { :value => "Edit Registration", :class => "btn btn-primary" } = f.action :submit, :button_html => { :value => "Edit Registration", :class => "btn btn-primary" }
:javascript :javascript
$("#registration_supporter_registration_attributes_supporter_level_id").change(function () { $("#registration_supporter_registration_attributes_supporter_level_id").change(function () {

View file

@ -1,9 +1,9 @@
.row .row
.span12 .col-md-12
%h3 %h3
Create new account and registration Create new account and registration
.row .row
.span12 .col-md-12
= semantic_form_for(@registration, :url => admin_conference_registrations_new_path(@conference.short_title), :html => { :method => :put }) do |f| = semantic_form_for(@registration, :url => admin_conference_registrations_new_path(@conference.short_title), :html => { :method => :put }) do |f|
= f.inputs "Your details" do = f.inputs "Your details" do

View file

@ -1,16 +1,15 @@
.row-fluid .row
.span12 .col-md-12
.pull-right{:style=>"margin-top:20px; margin-bottom:20px;"} .page-header
= link_to "New", admin_conference_registrations_new_path(@conference.short_title), :class => "btn btn-primary"
= link_to "Export PDF", admin_conference_registrations_path(@conference.short_title, :format => :pdf), :class => "btn btn-success"
= link_to "Export xlsx", {:format => :xlsx}, :class => "btn btn-success"
.row-fluid
.span12
%h2 %h2
Registrations Registrations
- if @registrations - if @registrations
= "(#{@registrations.length})" = "(#{@registrations.length})"
= " - Attended (#{@attended})" = " - Attended (#{@attended})"
.btn-group.pull-right
= link_to "New", admin_conference_registrations_new_path(@conference.short_title), :class => "btn btn-default"
= link_to "Export PDF", admin_conference_registrations_path(@conference.short_title, :format => :pdf), :class => "btn btn-default"
= link_to "Export XLS", {:format => :xlsx}, :class => "btn btn-default"
%table.table.table-bordered.table-striped.table-hover#registrations %table.table.table-bordered.table-striped.table-hover#registrations
%thead %thead
%th %th
@ -47,7 +46,7 @@
- else - else
= registration.send(field.to_sym) = registration.send(field.to_sym)
%td %td
= link_to "Questions", "#", :class => "questions btn btn-success", :id => counter, :onclick => "toggle('row#{counter}')" = link_to "Questions", "javascript: void(0)", :class => "questions btn btn-success", :id => counter, :onclick => "toggle('row#{counter}')"
%td %td
= link_to "Edit", admin_conference_registrations_edit_path(@conference.short_title, :id => registration.id), :method => :get, :class => "btn btn-primary" = link_to "Edit", admin_conference_registrations_edit_path(@conference.short_title, :id => registration.id), :method => :get, :class => "btn btn-primary"

View file

@ -1,8 +1,7 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@conference, :url => admin_conference_rooms_update_path(@conference.short_title)) do |f| = semantic_form_for(@conference, :url => admin_conference_rooms_update_path(@conference.short_title)) do |f|
= dynamic_association :rooms, "Rooms", f = dynamic_association :rooms, "Rooms", f
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"} = f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}

View file

@ -1,8 +1,7 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@conference, :url => admin_conference_social_events_path(@conference.short_title)) do |f| = semantic_form_for(@conference, :url => admin_conference_social_events_path(@conference.short_title)) do |f|
= dynamic_association :social_events, "Social Events", f = dynamic_association :social_events, "Social Events", f
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"} = f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}

View file

@ -0,0 +1,41 @@
-if @events.count > 0
%h2{:style => "text-align: center"}
= "Events (#{@events.count})"
.row-fluid
%h3
%u Types per event state
- if !@conference.event_types.empty?
= render :partial => "events_types"
- else
%h4
%i There are no tracks defined for this conference!
.row-fluid
%h3
%u Tracks per event state
- if @no_track_all.count > 0
%i= " (#{pluralize(@no_track_all.count, 'event')} not assigned to a track)"
- if !@conference.tracks.empty?
= render :partial => "events_tracks"
- else
%h4
%i There are no tracks defined for this conference!
.row-fluid
.span12
%h3 Proposal Submissions over time
.row-fluid
.span12#events_time
= render :partial => "events_time"
.row-fluid
.span12
%br
%h3 Overview of all events
.row-fluid
.span12#events_table
= render :partial => "events_table"
- else
%h5 There are no submitted events yet.

View file

@ -0,0 +1,34 @@
%table.table.table-bordered.table-striped
%thead
%th
- @mystates.each do |state|
%th{:colspan => 2, :style => "text-align:center"}
State "#{state.name}"
%th{:colspan => 2, :style => "text-align:center"}
Total
%br
No & Time
%tr
%td
%b Total
- @mystates.each do |mystate|
%td
%b
= @eventstats["#{mystate.name}"]["count"]
%td
%b
#{@eventstats["#{mystate.name}"]["length"] / 60} h #{@eventstats["#{mystate.name}"]["length"] - @eventstats["#{mystate.name}"]["length"] / 60 * 60} m
%td
%b= @events.count
%td
%b= show_time(@eventstats["totallength"])
- @mytypes.each do |mytype|
%tr
%td= "#{mytype.title} (#{show_time(mytype.length)})"
- @mystates.each do |mystate|
%td= @eventstats["#{mytype.title}"]["#{mystate.name}"]["type_state_count"] unless @eventstats["#{mytype.title}"]["#{mystate.name}"] == nil
%td= show_time(@eventstats["#{mytype.title}"]["#{mystate.name}"]["type_state_length"]) unless @eventstats["#{mytype.title}"]["#{mystate.name}"] == nil
%td= @eventstats["#{mytype.title}"]["count"]
%td= show_time(@eventstats["#{mytype.title}"]["length"])

View file

@ -0,0 +1,71 @@
<script>
var events = '<%= h @events.count%>';
var data = <%=raw @events_time.to_json %>;
var valueLabelWidth = 10; // space reserved for value labels (right)
var barHeight = 24; // height of one bar
var barLabelWidth = 100; // space reserved for bar labels
var barLabelPadding = 8; // padding between bar and bar labels (left)
var gridLabelHeight = 18; // space reserved for gridline labels
var gridChartOffset = 3; // space between start of grid and first bar
var maxBarWidth = 420; // width of the bar with the max value
var color = d3.scale.category20();
// accessor functions
var barLabel = function(d) { return d['status']; };
var barValue = function(d) { return d['value'] / events * 100; };
var barValues = function(d) { return d['value']; };
// scales
var yScale = d3.scale.ordinal().domain(d3.range(0, data.length)).rangeBands([0, data.length * barHeight]);
var y = function(d, i) { return yScale(i); };
var yText = function(d, i) { return y(d, i) + yScale.rangeBand() / 2; };
var yMax = d3.max(data, function(d){ return barValue(d) + 15; });
var x = d3.scale.linear().domain([0, yMax]).range([0, maxBarWidth]);
var width = maxBarWidth + barLabelWidth + valueLabelWidth;
// svg container element
var chart = d3.select('#events_time').append("svg")
.attr('width', maxBarWidth + barLabelWidth + valueLabelWidth)
.attr('height', gridLabelHeight + gridChartOffset + data.length * barHeight);
// bar labels
var labelsContainer = chart.append('g')
.attr('transform', 'translate(' + (barLabelWidth - barLabelPadding) + ',' + (gridLabelHeight + gridChartOffset) + ')');
labelsContainer.selectAll('text').data(data).enter().append('text')
.attr('y', yText)
.attr('stroke', 'none')
.attr('fill', 'black')
.attr("dy", ".35em") // vertical-align: middle
.attr('text-anchor', 'end')
.text(barLabel);
// bars
var barsContainer = chart.append('g')
.attr('transform', 'translate(' + barLabelWidth + ',' + (gridLabelHeight + gridChartOffset) + ')');
barsContainer.selectAll("rect").data(data).enter().append("rect")
.attr('y', y)
.attr('height', yScale.rangeBand())
.attr('width', function(d) { return x(barValue(d)); })
.attr('stroke', 'white')
.attr('fill', function(d) { return color(barValue(d)); });
// bar value labels
barsContainer.selectAll("text").data(data).enter().append("text")
.attr("x", 5)
.attr("y", yText)
.attr("dx", 3) // padding-left
.attr("dy", ".35em") // vertical-align: middle
.attr("text-anchor", "start") // text-align: right
.attr("fill", "black")
.attr("stroke", "none")
.text(function(d) { return d3.round(barValues(d), 2) + " (" + d3.round(barValue(d), 0) + "%)"; });
// start line
barsContainer.append("line")
.attr("y1", -gridChartOffset)
.attr("y2", yScale.rangeExtent()[1] + gridChartOffset)
.style("stroke", "#000");
</script>

View file

@ -0,0 +1,35 @@
.row-fluid
- if !@track_state['new'].empty?
.span4
%h4 New Submissions
- if @no_track_new.count > 0
%h5= "#{pluralize(@no_track_new.count, 'event')} not assigned to a track"
- else
%h5
.row-fluid
.span12#events_tracks_new
= render :partial => "events_tracks_new"
- if !@track_state['unconfirmed'].empty?
.span4
%h4 Accepted (Unconfirmed)
- if @no_track_unconfirmed.count > 0
%h5= "#{pluralize(@no_track_unconfirmed.count, 'event')} not assigned to a track"
- else
%h5 All events assigned to track!
.row-fluid
.span12#events_tracks_unconfirmed
= render :partial => "events_tracks_unconfirmed"
- if !@track_state['confirmed'].empty?
.span4
%h4 Accepted (Confirmed)
- if @no_track_confirmed.count > 0
%h5= "#{pluralize(@no_track_confirmed.count, 'event')} not assigned to a track"
- else
%h5 All events assigned to track!
.row-fluid
.span12#events_tracks_confirmed
= render :partial => "events_tracks_confirmed"

View file

@ -0,0 +1,79 @@
<style>
.arc path {
stroke: #fff;
}
</style>
<script>
var width = 250,
height = 250,
radius = Math.min(width, height) / 2;
var color = d3.scale.ordinal()
.range(["#5254a3", "#6b6ecf", "#9c9ede "]);
var arc = d3.svg.arc()
.outerRadius(radius - 10)
.innerRadius(0);
var pie = d3.layout.pie()
.sort(null)
.value(function(d) { return d.value; });
// Where to put the chart
var svg = d3.select("#events_tracks_confirmed").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var data = <%=raw @track_state['confirmed'].to_json%>;
var g = svg.selectAll(".arc")
.data(pie(data))
.enter().append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.style("fill", function(d) { return color(d.data.status); });
// Put text inside every piece of the pie-chart
g.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.status; });
// Title of chart
svg.append("text")
.attr("class", "title")
.attr("x", radius)
.attr("y", -radius+10)
.text("% of pre-registered");
// Create & position legend
var legend = d3.select("#events_tracks_confirmed").append("svg")
.attr("class", "legend")
.attr("width", radius*2)
.attr("height", radius)
.selectAll("g")
.data(color.domain().slice().reverse())
.enter().append("g")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".15em")
.text(function(d) { return d + " (" + data.filter(function(v){return v.status === d;})[0].value + " or " + data.filter(function(v){return v.status === d;})[0].percent + "%)" ; });
</script>

View file

@ -0,0 +1,79 @@
<style>
.arc path {
stroke: #fff;
}
</style>
<script>
var width = 250,
height = 250,
radius = Math.min(width, height) / 2;
var color = d3.scale.ordinal()
.range(["#5254a3", "#6b6ecf", "#9c9ede "]);
var arc = d3.svg.arc()
.outerRadius(radius - 10)
.innerRadius(0);
var pie = d3.layout.pie()
.sort(null)
.value(function(d) { return d.value; });
// Where to put the chart
var svg = d3.select("#events_tracks_new").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var data = <%=raw @track_state['new'].to_json%>;
var g = svg.selectAll(".arc")
.data(pie(data))
.enter().append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.style("fill", function(d) { return color(d.data.status); });
// Put text inside every piece of the pie-chart
g.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.status; });
// Title of chart
svg.append("text")
.attr("class", "title")
.attr("x", radius)
.attr("y", -radius+10)
.text("% of pre-registered");
// Create & position legend
var legend = d3.select("#events_tracks_new").append("svg")
.attr("class", "legend")
.attr("width", radius*2)
.attr("height", radius)
.selectAll("g")
.data(color.domain().slice().reverse())
.enter().append("g")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".15em")
.text(function(d) { return d + " (" + data.filter(function(v){return v.status === d;})[0].value + " or " + data.filter(function(v){return v.status === d;})[0].percent + "%)" ; });
</script>

View file

@ -0,0 +1,79 @@
<style>
.arc path {
stroke: #fff;
}
</style>
<script>
var width = 250,
height = 250,
radius = Math.min(width, height) / 2;
var color = d3.scale.ordinal()
.range(["#5254a3", "#6b6ecf", "#9c9ede "]);
var arc = d3.svg.arc()
.outerRadius(radius - 10)
.innerRadius(0);
var pie = d3.layout.pie()
.sort(null)
.value(function(d) { return d.value; });
// Where to put the chart
var svg = d3.select("#events_tracks_unconfirmed").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var data = <%=raw @track_state['unconfirmed'].to_json%>;
var g = svg.selectAll(".arc")
.data(pie(data))
.enter().append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.style("fill", function(d) { return color(d.data.status); });
// Put text inside every piece of the pie-chart
g.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.status; });
// Title of chart
svg.append("text")
.attr("class", "title")
.attr("x", radius)
.attr("y", -radius+10)
.text("% of pre-registered");
// Create & position legend
var legend = d3.select("#events_tracks_unconfirmed").append("svg")
.attr("class", "legend")
.attr("width", radius*2)
.attr("height", radius)
.selectAll("g")
.data(color.domain().slice().reverse())
.enter().append("g")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".15em")
.text(function(d) { return d + " (" + data.filter(function(v){return v.status === d;})[0].value + " or " + data.filter(function(v){return v.status === d;})[0].percent + "%)" ; });
</script>

View file

@ -0,0 +1,19 @@
.row-fluid
- if !@type_state['new'].empty?
.span4
%h4 New Submissions: #{@type_state['new'].map{|x| x["value"]}.sum}
.row-fluid
.span12#events_types_new
= render :partial => "events_types_new"
- if !@type_state['unconfirmed'].empty?
.span4
%h4 Accepted (Unconfirmed): #{@type_state['unconfirmed'].map{|x| x["value"]}.sum}
.row-fluid
.span12#events_types_unconfirmed
= render :partial => "events_types_unconfirmed"
- if !@type_state['confirmed'].empty?
.span4
%h4 Accepted (Confirmed): #{@type_state['confirmed'].map{|x| x["value"]}.sum}
.row-fluid
.span12#events_types_confirmed
= render :partial => "events_types_confirmed"

View file

@ -0,0 +1,78 @@
<style>
.arc path {
stroke: #fff;
}
</style>
<script>
var width = 250,
height = 250,
radius = Math.min(width, height) / 2;
var color = d3.scale.category20();
var arc = d3.svg.arc()
.outerRadius(radius - 10)
.innerRadius(0);
var pie = d3.layout.pie()
.sort(null)
.value(function(d) { return d.value; });
// Where to put the chart
var svg = d3.select("#events_types_confirmed").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var data = <%=raw @type_state['confirmed'].to_json%>;
var g = svg.selectAll(".arc")
.data(pie(data))
.enter().append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.style("fill", function(d) { return color(d.data.status); });
// Put text inside every piece of the pie-chart
g.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.status; });
// Title of chart
svg.append("text")
.attr("class", "title")
.attr("x", radius)
.attr("y", -radius+10)
.text("% of pre-registered");
// Create & position legend
var legend = d3.select("#events_types_confirmed").append("svg")
.attr("class", "legend")
.attr("width", radius*2)
.attr("height", radius)
.selectAll("g")
.data(color.domain().slice().reverse())
.enter().append("g")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".15em")
.text(function(d) { return d + " (" + data.filter(function(v){return v.status === d;})[0].value + " or " + data.filter(function(v){return v.status === d;})[0].percent + "%)" ; });
</script>

View file

@ -0,0 +1,78 @@
<style>
.arc path {
stroke: #fff;
}
</style>
<script>
var width = 250,
height = 250,
radius = Math.min(width, height) / 2;
var color = d3.scale.category20();
var arc = d3.svg.arc()
.outerRadius(radius - 10)
.innerRadius(0);
var pie = d3.layout.pie()
.sort(null)
.value(function(d) { return d.percent; });
// Where to put the chart
var svg = d3.select("#events_types_new").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var data = <%=raw @type_state['new'].to_json%>;
var g = svg.selectAll(".arc")
.data(pie(data))
.enter().append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.style("fill", function(d) { return color(d.data.status); });
// Put text inside every piece of the pie-chart
g.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.status; });
// Title of chart
svg.append("text")
.attr("class", "title")
.attr("x", radius)
.attr("y", -radius+10)
.text("% of pre-registered");
// Create & position legend
var legend = d3.select("#events_types_new").append("svg")
.attr("class", "legend")
.attr("width", radius*2)
.attr("height", radius)
.selectAll("g")
.data(color.domain().slice().reverse())
.enter().append("g")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".15em")
.text(function(d) { return d + " (" + data.filter(function(v){return v.status === d;})[0].value + " or " + data.filter(function(v){return v.status === d;})[0].percent + "%)" ; });
</script>

View file

@ -0,0 +1,78 @@
<style>
.arc path {
stroke: #fff;
}
</style>
<script>
var width = 250,
height = 250,
radius = Math.min(width, height) / 2;
var color = d3.scale.category20();
var arc = d3.svg.arc()
.outerRadius(radius - 10)
.innerRadius(0);
var pie = d3.layout.pie()
.sort(null)
.value(function(d) { return d.value; });
// Where to put the chart
var svg = d3.select("#events_types_unconfirmed").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var data = <%=raw @type_state['unconfirmed'].to_json%>;
var g = svg.selectAll(".arc")
.data(pie(data))
.enter().append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.style("fill", function(d) { return color(d.data.status); });
// Put text inside every piece of the pie-chart
g.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.status; });
// Title of chart
svg.append("text")
.attr("class", "title")
.attr("x", radius)
.attr("y", -radius+10)
.text("% of pre-registered");
// Create & position legend
var legend = d3.select("#events_types_unconfirmed").append("svg")
.attr("class", "legend")
.attr("width", radius*2)
.attr("height", radius)
.selectAll("g")
.data(color.domain().slice().reverse())
.enter().append("g")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".15em")
.text(function(d) { return d + " (" + data.filter(function(v){return v.status === d;})[0].value + " or " + data.filter(function(v){return v.status === d;})[0].percent + "%)" ; });
</script>

View file

@ -1,7 +1,7 @@
<script> <script>
var registered = '<%= h @registrations.count%>'; var registered = '<%= h @registrations.count%>';
var data = <%=raw @mydays.to_json %>; var data = <%=raw @registered_time.to_json %>;
var valueLabelWidth = 10; // space reserved for value labels (right) var valueLabelWidth = 10; // space reserved for value labels (right)
var barHeight = 24; // height of one bar var barHeight = 24; // height of one bar

View file

@ -1,35 +1,41 @@
.row-fluid .row
.span4 .col-md-4
- if @registered > 0
- if @attendees > 0 - if @attendees > 0
%h4{:style => "text-indent: 25px"}= "Registrations - Attendees (#{(@attendees.to_f / @registered * 100).round }%)" %h4{:style => "text-indent: 25px"}= "Registrations - Attendees (#{(@attendees.to_f / @registered * 100).round }%)"
- else - else
%h4{:style => "text-indent: 25px"}= "Registrations - Attendees" %h4{:style => "text-indent: 25px"}= "Registrations - Attendees"
.row-fluid .row-fluid
.span12#registrations_attendees .span12#registrations_attendees
= render :partial => "registrations_attendees"
- else
%h5 There are no registrations yet.
.span4 .col-md-4
- if @registered > 0
%h4{:style => "text-indent: 10px"}= "Attendance of pre-registered" %h4{:style => "text-indent: 10px"}= "Attendance of pre-registered"
.row-fluid .row-fluid
.span12#registered_attended .span12#registered_attended
= render :partial => "registered_attended"
.span4 .col-md-4
- if @registered > 0
%h4{:style => "text-indent: 25px"}= "% of pre-registered" %h4{:style => "text-indent: 25px"}= "% of pre-registered"
.row-fluid .row-fluid
.span12#preregistered_onsite .span12#preregistered_onsite
= render :partial => "preregistered_onsite"
.row-fluid .row
.span6 .col-md-6
- if @registered > 0
%h4= "Other Info" %h4= "Other Info"
.row-fluid .row-fluid
.span12#other_info .span12#other_info
= render :partial => "other_info"
.span6 .col-md-6
- if @registered > 0
%h4{:style => "text-indent: 98px"}= "Registrations over time" %h4{:style => "text-indent: 98px"}= "Registrations over time"
.row-fluid .row-fluid
.span12#registered_time .span12#registered_time
= render :partial => "registered_time"
= render :partial => "registered_attended"
= render :partial => "registered_time"
= render :partial => "preregistered_onsite"
= render :partial => "registrations_attendees"
= render :partial => "other_info"

View file

@ -9,8 +9,8 @@ var registrations = '<%= h @registered %>';
var attendees = '<%= h @attendees %>'; var attendees = '<%= h @attendees %>';
var data = [ var data = [
{"status":"Registrations","value": registrations, "percent": ""}, {"status":"Did Not Attend","value": registrations-attendees, "percent": ""},
{"status":"Attendees","value": attendees, "percent": d3.round(attendees/registrations * 100)+"%"} {"status":"Attended","value": attendees, "percent": d3.round(attendees/registrations * 100)+"%"}
]; ];
var vis = d3.select("#registrations_attendees") var vis = d3.select("#registrations_attendees")
@ -49,26 +49,7 @@ var arcs = vis.selectAll("g.slice")
.data(pie) .data(pie)
.enter() .enter()
.append("svg:g") .append("svg:g")
.attr("class", "slice") .attr("class", "slice");
.on("mouseover", function(d) {
d3.select(this).select("path").transition()
.duration(200)
.attr("d", arcOver)
textTop.text(d3.select(this).datum().data.status)
.attr("y", -10);
textBottom.text( d3.select(this).datum().data.value)
.attr("y", 10);
})
.on("mouseout", function(d) {
d3.select(this).select("path").transition()
.duration(100)
.attr("d", arc);
textTop.text("Registered: " + registrations)
.attr("y", -10);
textBottom.text("Attended: " + attendees);
});
arcs.append("svg:path") arcs.append("svg:path")
.attr("fill", function(d, i) { return color(i); } ) .attr("fill", function(d, i) { return color(i); } )
@ -92,5 +73,5 @@ legend.append("text")
.attr("x", 24) .attr("x", 24)
.attr("y", 9) .attr("y", 9)
.attr("dy", ".35em") .attr("dy", ".35em")
.text(function(d) { return "Total " + d.status; }); .text(function(d) { return "Total " + d.status + " (" + d.value + ")"; });
</script> </script>

View file

@ -1,5 +1,22 @@
- if @tickets - if @tickets.length > 0
.row-fluid
.span12
%h2 %h2
= "Non-Free Tickets(#{@tickets.count})" = "Non-Free Tickets (#{@tickets.count})"
.span4#tickets_time .row-fluid
= render :partial => "tickets_time" .span4
%h4 Ticket distribution
.row-fluid
.span12#tickets_distribution
= render :partial => "tickets_distribution"
.row-fluid
.span10
%h4 Ticket sales over time
.row-fluid
.span12#tickets_time
= render :partial => "tickets_time"
- else
- if @conference.use_supporter_levels
%h5 No tickets have been bought yet.
- else
%h5 There are no tickets set for this conference.

View file

@ -0,0 +1,79 @@
<style>
.arc path {
stroke: #fff;
}
</style>
<script>
var width = 250,
height = 250,
radius = Math.min(width, height) / 2;
var color = d3.scale.ordinal()
.range(["#9ECAE1", "#6baed6", "#DEEBF7"]);
var arc = d3.svg.arc()
.outerRadius(radius - 10)
.innerRadius(0);
var pie = d3.layout.pie()
.sort(null)
.value(function(d) { return d.value; });
// Where to put the chart
var svg = d3.select("#tickets_distribution").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
var data = <%=raw @tickets_distribution.to_json %>;
var g = svg.selectAll(".arc")
.data(pie(data))
.enter().append("g")
.attr("class", "arc");
g.append("path")
.attr("d", arc)
.style("fill", function(d) { return color(d.data.status); });
// Put text inside every piece of the pie-chart
g.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return d.data.percent +"%"; });
// Title of chart
svg.append("text")
.attr("class", "title")
.attr("x", radius)
.attr("y", -radius+10)
.text("% of pre-registered");
// Create & position legend
var legend = d3.select("#tickets_distribution").append("svg")
.attr("class", "legend")
.attr("width", radius * 2)
.attr("height", radius)
.selectAll("g")
.data(color.domain().slice().reverse())
.enter().append("g")
.attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
legend.append("rect")
.attr("width", 18)
.attr("height", 18)
.style("fill", color);
legend.append("text")
.attr("x", 24)
.attr("y", 9)
.attr("dy", ".15em")
.text(function(d) { return d + " (" + data.filter(function(v){return v.status === d;})[0].value + " or " + data.filter(function(v){return v.status === d;})[0].percent + "%)" ; });
</script>

View file

@ -1,86 +1 @@
<script> (Not yet implemented)
var registered = '<%= h @registrations.count%>';
var data = <%=raw @mytickets.to_json %>;
var valueLabelWidth = 40; // space reserved for value labels (right)
var barHeight = 24; // height of one bar
var barLabelWidth = 100; // space reserved for bar labels
var barLabelPadding = 8; // padding between bar and bar labels (left)
var gridLabelHeight = 18; // space reserved for gridline labels
var gridChartOffset = 3; // space between start of grid and first bar
var maxBarWidth = 420; // width of the bar with the max value
// accessor functions
var barLabel = function(d) { return d['status']; };
var barValue = function(d) { return d['value'] / registered * 100; };
var barValues = function(d) { return d['value']; };
// scales
var yScale = d3.scale.ordinal().domain(d3.range(0, data.length)).rangeBands([0, data.length * barHeight]);
var y = function(d, i) { return yScale(i); };
var yText = function(d, i) { return y(d, i) + yScale.rangeBand() / 2; };
var x = d3.scale.linear().domain([0, 100]).range([0, maxBarWidth]);
// svg container element
var chart = d3.select('#tickets_time').append("svg")
.attr('width', maxBarWidth + barLabelWidth + valueLabelWidth)
.attr('height', gridLabelHeight + gridChartOffset + data.length * barHeight);
/*
// grid line labels
var gridContainer = chart.append('g')
.attr('transform', 'translate(' + barLabelWidth + ',' + gridLabelHeight + ')');
gridContainer.selectAll("text").data(x.ticks(10)).enter().append("text")
.attr("x", x)
.attr("dy", -3)
.attr("text-anchor", "middle")
.text(String);
// vertical grid lines
gridContainer.selectAll("line").data(x.ticks(10)).enter().append("line")
.attr("x1", x)
.attr("x2", x)
.attr("y1", 0)
.attr("y2", yScale.rangeExtent()[1] + gridChartOffset)
.style("stroke", "#ccc");*/
// bar labels
var labelsContainer = chart.append('g')
.attr('transform', 'translate(' + (barLabelWidth - barLabelPadding) + ',' + (gridLabelHeight + gridChartOffset) + ')');
labelsContainer.selectAll('text').data(data).enter().append('text')
.attr('y', yText)
.attr('stroke', 'none')
.attr('fill', 'black')
.attr("dy", ".35em") // vertical-align: middle
.attr('text-anchor', 'end')
.text(barLabel);
// bars
var barsContainer = chart.append('g')
.attr('transform', 'translate(' + barLabelWidth + ',' + (gridLabelHeight + gridChartOffset) + ')');
barsContainer.selectAll("rect").data(data).enter().append("rect")
.attr('y', y)
.attr('height', yScale.rangeBand())
.attr('width', function(d) { return x(barValue(d)); })
.attr('stroke', 'white')
.attr('fill', 'steelblue');
// bar value labels
barsContainer.selectAll("text").data(data).enter().append("text")
.attr("x", function(d) { return x(barValue(d)); })
.attr("y", yText)
.attr("dx", 3) // padding-left
.attr("dy", ".35em") // vertical-align: middle
.attr("text-anchor", "start") // text-align: right
.attr("fill", "black")
.attr("stroke", "none")
.text(function(d) { return d3.round(barValues(d), 2) + " registrations (" + d3.round(barValue(d), 0) + "%)"; });
// start line
barsContainer.append("line")
.attr("y1", -gridChartOffset)
.attr("y2", yScale.rangeExtent()[1] + gridChartOffset)
.style("stroke", "#000");
</script>

View file

@ -1,8 +1,10 @@
.row-fluid .row
.span12 .col-md-12
%ul.nav.nav-tabs#myTab %ul.nav.nav-tabs#myTab
%li.active %li.active
%a{:href=>"#registrations", "data-toggle"=>"tab"} Registrations %a{:href=>"#registrations", "data-toggle"=>"tab"} Registrations
%li
%a{:href=>"#events", "data-toggle"=>"tab"} Events
%li %li
%a{:href=>"#speakers", "data-toggle"=>"tab"} Speakers %a{:href=>"#speakers", "data-toggle"=>"tab"} Speakers
%li %li
@ -11,6 +13,8 @@
.tab-content .tab-content
.tab-pane.active#registrations .tab-pane.active#registrations
= render :partial => 'registrations' = render :partial => 'registrations'
.tab-pane#events
= render :partial => 'events'
.tab-pane#speakers .tab-pane#speakers
= render :partial => 'speakers' = render :partial => 'speakers'
.tab-pane#tickets .tab-pane#tickets

View file

@ -1,8 +1,7 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@conference, :url => admin_conference_supporter_levels_path(@conference.short_title)) do |f| = semantic_form_for(@conference, :url => admin_conference_supporter_levels_path(@conference.short_title)) do |f|
= f.input :use_supporter_levels, :label => false = f.input :use_supporter_levels, :label => false
= dynamic_association :supporter_levels, "Supporter Levels", f = dynamic_association :supporter_levels, "Supporter Levels", f

View file

@ -7,12 +7,12 @@
= f.input :code_is_valid, :as => :boolean, :label => false = f.input :code_is_valid, :as => :boolean, :label => false
= f.action :submit, :button_html => { :value => "Save", :class => "btn btn-primary" } = f.action :submit, :button_html => { :value => "Save", :class => "btn btn-primary" }
.row-fluid .row
.span12 .col-md-12
.pull-right{:style=>"margin-top:20px; margin-bottom:20px;"} .pull-right{:style=>"margin-top:20px; margin-bottom:20px;"}
= link_to "New Supporter", "#", :id => "new-supporter-button", :class => "btn btn-success" = link_to "New Supporter", "#", :id => "new-supporter-button", :class => "btn btn-success"
.row-fluid .row
.span12 .col-md-12
%h2 Supporters %h2 Supporters
.well .well
%table.table.table-striped#supporters %table.table.table-striped#supporters
@ -32,6 +32,6 @@
%tr %tr
%td= u.name %td= u.name
%td= u.email %td= u.email
%td= u.supporter_level.title %td= u.supporter_level.title if u.supporter_level
%td= u.code %td= u.code
%td= u.code_is_valid %td= u.code_is_valid

View file

@ -1,8 +1,7 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@conference, :url => admin_conference_tracks_update_path(@conference.short_title)) do |f| = semantic_form_for(@conference, :url => admin_conference_tracks_update_path(@conference.short_title)) do |f|
= dynamic_association :tracks, "Tracks", f = dynamic_association :tracks, "Tracks", f
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"} = f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}

View file

@ -1,3 +1,4 @@
<<<<<<< HEAD
.container-fluid .container-fluid
.row-fluid .row-fluid
.span12 .span12
@ -78,6 +79,79 @@
=link_to 'Delete',admin_user_path(user), :method => :delete , :data => {:confirm => 'Are you sure ?'}, :disabled => true,:class => "btn btn-primary disabled btn-danger",:role => "button" =link_to 'Delete',admin_user_path(user), :method => :delete , :data => {:confirm => 'Are you sure ?'}, :disabled => true,:class => "btn btn-primary disabled btn-danger",:role => "button"
- else - else
=link_to 'Delete',admin_user_path(user), :method=> :delete , :data=> {:confirm => 'Are you sure ?'},:class => "btn btn-primary btn-danger" =link_to 'Delete',admin_user_path(user), :method=> :delete , :data=> {:confirm => 'Are you sure ?'},:class => "btn btn-primary btn-danger"
=======
.row
.col-md-12
%h2
Users
- if @users
= "(#{@users.length})"
.well
%table.table.table-striped.table-bordered.table-hover#users
%thead
%th
%b ID
%th
%b State
%th
%b Email
%th
%b Last Name
%th
%b First Name
%th
%b Public Name
%th
%b Roles
%th
%th
- @users.each do |user|
- person = Person.find_person_by_user_id(user.id)
%tr
%td
= user.id
%td
- if user.confirmed?
confirmed
- else
unconfirmed
%td
= user.email
%td
= user.last_name
%td
= user.first_name
%td
= user.public_name
%td
= user.roles.map { |role| role.name }.join ','
%td
.modal.hide.fade{:id => "user-role-selection-#{user.id}", "role" => "dialog", "aria-hidden" => "true"}
.modal-header
%button{"type"=>"button", :class=>"close", "data-dismiss"=>"modal", "aria-hidden"=>"true"}
×
%h3{:id => "role-selector-header-#{user.id}"}
Modifying Roles
.modal-body
- if current_user == user
You cannot modify your own role!
%br
%button{:class=> "btn btn-danger", "data-dismiss"=> "modal", "aria-hidden"=>"true"}
Cancel
- else
= "Give #{user.public_name} (#{user.email}) the following roles:"
= semantic_form_for(user, :url => admin_user_path(user), :method => :put) do |f|
= f.input :roles, :label => false
%button{:class=> "btn btn-danger", "data-dismiss"=> "modal", "aria-hidden"=>"true"}
Cancel
= f.action :submit, :as => :button, :button_html => {:value => "Save", :class => "btn btn-primary"}
=link_to "Modify Roles", "#", "data-toggle" => "modal", "data-target" => "#user-role-selection-#{user.id}"
%td
=link_to "Details", "javascript: void(0)", :class => "user-details-popover", "data-trigger" => "click", "data-placement" => "bottom",
"data-html" => "true",
"data-content" => user.popup_details,
"data-original-title" => ""
>>>>>>> upstream/master
:javascript :javascript
$(document).ready(function() { $(document).ready(function() {

View file

@ -1,8 +1,7 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@venue, :url => admin_conference_venue_update_path(@conference.short_title),:html => {:multipart => true}) do |f| = semantic_form_for(@venue, :url => admin_conference_venue_update_path(@conference.short_title),:html => {:multipart => true}) do |f|
= f.input :name, :input_html => {:rows => 1} = f.input :name, :input_html => {:rows => 1}
= f.input :address, :input_html => {:rows => 1} = f.input :address, :input_html => {:rows => 1}

View file

@ -1,7 +1,7 @@
<div class="nested-fields"> <div class="nested-fields">
<%= f.inputs do %> <%= f.inputs do %>
<%= f.date_select :day %> <%= f.date_select :day %>
<%= f.input :description, :input_html => {:rows => "2", :class => "span8"} %> <%= f.input :description, :input_html => {:rows => "2", :class => "col-md-8"} %>
<%= remove_association_link :vday, f %> <%= remove_association_link :vday, f %>
<% end %> <% end %>
</div> </div>

View file

@ -1,4 +1,5 @@
%table.table.table-striped.table-bordered.table-hover#speakertable .well
%table.table.table-striped.table-bordered.table-hover#volunteerstable
%thead %thead
%th First Name %th First Name
%th Last Name %th Last Name
@ -17,3 +18,10 @@
%td= volunteer.languages %td= volunteer.languages
%td= volunteer.volunteer_experience %td= volunteer.volunteer_experience
%td= volunteer.tshirt %td= volunteer.tshirt
:javascript
$(document).ready(function(){
$('#volunteerstable').dataTable({
"bPaginate": false
});
});

View file

@ -1,7 +1,7 @@
<div class="nested-fields"> <div class="nested-fields">
<%= f.inputs do %> <%= f.inputs do %>
<%= f.input :title %> <%= f.input :title %>
<%= f.input :description, :input_html => {:rows => "2", :class => "span8"}%> <%= f.input :description, :input_html => {:rows => "2", :class => "col-md-8"}%>
<%= f.input :vdays, :collection => @conference.vdays.map {|x| [x.day, x.id]}, :label => "Position is required for the following days:"%> <%= f.input :vdays, :collection => @conference.vdays.map {|x| [x.day, x.id]}, :label => "Position is required for the following days:"%>
<%= remove_association_link :vposition, f %> <%= remove_association_link :vposition, f %>
<% end %> <% end %>

View file

@ -1,15 +1,16 @@
.container-fluid .row
.row-fluid .col-md-3
.span3
= render 'admin/conference/sidebar' = render 'admin/conference/sidebar'
.span9 .col-md-9
= semantic_form_for(@conference, :url => admin_conference_volunteers_update_path(@conference.short_title)) do |f| = semantic_form_for(@conference, :url => admin_conference_volunteers_update_path(@conference.short_title)) do |f|
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"} = f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
%br %br
%br %br
.span5 = f.input :use_volunteers, :label => "Enable Volunteering"
.row
.col-md-6
= f.input :use_vdays, :label => false = f.input :use_vdays, :label => false
= dynamic_association :vdays, "Volunteer Days", f = dynamic_association :vdays, "Volunteer Days", f
.span5 .col-md-6
= f.input :use_vpositions, :label => false = f.input :use_vpositions, :label => false
= dynamic_association :vpositions, "Volunteer positions", f = dynamic_association :vpositions, "Volunteer positions", f

View file

@ -1,30 +1,33 @@
.row .row
.span12 .col-md-12
%h3 %h3
Registration for Registration for
= @conference.title = @conference.title
- if @person.proposal_count(@conference) > 0 - if @person.proposal_count(@conference) > 0
.row .row
.span12 .col-md-12
%i %i
Please note: Registration is not automatically performed for speakers. If you're scheduled to speak at the conference, you still need to register! Please note: Registration is not automatically performed for speakers. If you're scheduled to speak at the conference, you still need to register!
.row .row
.span12 .col-md-12
= f.inputs :name => "Your Details" do = f.inputs :name => "Your Details" do
%br %br
Your public name (required) Your public name (required)
%br %br
= f.fields_for :person do |p| = f.fields_for :person do |p|
= p.text_field :public_name, :for => :person = p.text_field :public_name, :for => :person
- if @conference.use_supporter_levels? and @conference.supporter_levels.length > 0
- if @conference.questions
= render :partial => "questions", :locals => {:f => f}
%br
- if @conference.use_supporter_levels? && @conference.supporter_levels.length > 0
= f.semantic_fields_for :supporter_registration do |reg| = f.semantic_fields_for :supporter_registration do |reg|
= reg.input :supporter_level, :as => :select, :collection => @conference.supporter_levels = reg.input :supporter_level, :as => :select, :collection => @conference.supporter_levels
= reg.input :code, :label => "Confirmation or registration code (if applicable)" = reg.input :code, :label => "Confirmation or registration code (if applicable)"
%span#supporter-link.help-block %span#supporter-link.help-block
= f.input :attending_with_partner, :label => false
= f.input :using_affiliated_lodging, :label => false = f.input :other_special_needs, :label => "Any other needs or comments?", :input_html => {:rows => 2, :class => "span6"}
= f.input :handicapped_access_required, :label => false
= f.input :other_special_needs, :label => "Any other special needs?", :input_html => {:rows => 2, :class => "span6"}
- if @workshops.count > 0 - if @workshops.count > 0
=f.inputs "Register to workshops" do =f.inputs "Register to workshops" do
@ -38,6 +41,11 @@
%br Yes, I'll be attending... %br Yes, I'll be attending...
%br %br
= f.input :social_events, :as => :check_boxes, :label => false = f.input :social_events, :as => :check_boxes, :label => false
- if @conference.use_dietary_choices?
= f.inputs "Food" do
= f.input :dietary_choice, :collection => [["None", nil]] + @conference.dietary_choices.map {|x| [x.title, x.id]},
:include_blank => false, :label => "Special Dietary Restriction"
= f.input :other_dietary_choice, :input_html => {:rows => "2"}, :label => "Other Dietary Restictions (please describe)"
:javascript :javascript
$("#registration_supporter_registration_attributes_supporter_level_id").change(function () { $("#registration_supporter_registration_attributes_supporter_level_id").change(function () {
@ -68,4 +76,3 @@
$("#registration-arrival-datepicker").datepicker("option","maxDate", selected) $("#registration-arrival-datepicker").datepicker("option","maxDate", selected)
} }
}); });

View file

@ -1,5 +1,5 @@
.row .row
.span12 .col-md-12
= f.input :volunteer, :label => "Click here if you want to become a volunteer at #{@conference.short_title}", :input_html => {:maxlength => 15, :size => 40} = f.input :volunteer, :label => "Click here if you want to become a volunteer at #{@conference.short_title}", :input_html => {:maxlength => 15, :size => 40}
= f.fields_for :person do |p| = f.fields_for :person do |p|
= render :partial => 'devise/registrations/volunteerperson', :locals => {:p => p} = render :partial => 'devise/registrations/volunteerperson', :locals => {:p => p}

View file

@ -1,46 +1,17 @@
.row .row
.span12 .col-md-12
= semantic_form_for(@registration, :url => register_conference_path(@conference.short_title), :html => { :method => :put }) do |f| = semantic_form_for(@registration, :url => register_conference_path(@conference.short_title), :html => { :method => :put }) do |f|
= f.inputs :name => "Your Details" do
%br
Your public name (required)
%br
= f.fields_for :person do |p|
= p.text_field :public_name, :for => :person
- if @conference.questions
= render :partial => "questions", :locals => {:f => f}
%br
- if @conference.use_supporter_levels? && @conference.supporter_levels.length > 0
= f.semantic_fields_for :supporter_registration do |reg|
= reg.input :supporter_level, :as => :select, :collection => @conference.supporter_levels
= reg.input :code, :label => "Confirmation or registration code (if applicable)"
%span#supporter-link.help-block
= f.input :other_special_needs, :label => "Any other needs or comments?", :input_html => {:rows => 2, :class => "span6"}
- if @workshops.count > 0
=f.inputs "Register to workshops" do
= f.input :events, :as => :check_boxes, :label => false, :collection => @workshops
= f.inputs "Travel Info" do
= f.input :arrival, :as => :string, :input_html => {:value => (f.object.arrival.to_formatted_s(:db_without_seconds) unless f.object.arrival.nil?), :id => "registration-arrival-datepicker", :readonly => "readonly" }
= f.input :departure, :as => :string, :input_html => {:value => (f.object.departure.to_formatted_s(:db_without_seconds) unless f.object.departure.nil?), :id => "registration-departure-datepicker", :readonly => "readonly" }
- if @conference.social_events.count > 0
= f.inputs "Are you planning to attend any of the parties?" do
%br Yes, I'll be attending...
%br
= f.input :social_events, :as => :check_boxes, :label => false
.tabbable .tabbable
%ul.nav.nav-tabs %ul.nav.nav-tabs
%li.active %li.active
= link_to "Register", "#register-content", "data-toggle"=>"tab" = link_to "Register", "#register-content", "data-toggle"=>"tab"
- if @conference.use_volunteers
%li %li
= link_to "Volunteer", "#volunteer-content", "data-toggle"=>"tab" = link_to "Volunteer", "#volunteer-content", "data-toggle"=>"tab"
.tab-content .tab-content
#register-content.tab-pane.active #register-content.tab-pane.active
= render 'conference_registration/registration', :f => f = render 'conference_registration/registration', :f => f
- if @conference.use_volunteers
#volunteer-content.tab-pane #volunteer-content.tab-pane
= render 'conference_registration/volunteer', :f => f = render 'conference_registration/volunteer', :f => f
- if @registered - if @registered

View file

@ -1,5 +0,0 @@
<p>Welcome <%= @resource.email %>!</p>
<p>You can confirm your account email through the link below:</p>
<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @resource.confirmation_token) %></p>

View file

@ -1,8 +0,0 @@
<p>Hello <%= @resource.email %>!</p>
<p>Someone has requested a link to change your password, and you can do this through the link below.</p>
<p><%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %></p>
<p>If you didn't request this, please ignore this email.</p>
<p>Your password won't change until you access the link above and create a new one.</p>

View file

@ -1,7 +0,0 @@
<p>Hello <%= @resource.email %>!</p>
<p>Your account has been locked due to an excessive amount of unsuccessful sign in attempts.</p>
<p>Click the link below to unlock your account:</p>
<p><%= link_to 'Unlock my account', unlock_url(@resource, :unlock_token => @resource.unlock_token) %></p>

View file

@ -1,16 +0,0 @@
<h2>Change your password</h2>
<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put }) do |f| %>
<%= devise_error_messages! %>
<%= f.hidden_field :reset_password_token %>
<div><%= f.label :password, "New password" %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation, "Confirm new password" %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.submit "Change my password" %></div>
<% end %>
<%= render "devise/shared/links" %>

View file

@ -1,12 +0,0 @@
<h2>Forgot your password?</h2>
<%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post }) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.submit "Send me reset password instructions" %></div>
<% end %>
<%= render "devise/shared/links" %>

View file

@ -1,21 +0,0 @@
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :password %> <i>(leave blank if you don't want to change it)</i><br />
<%= f.password_field :password, :autocomplete => "off" %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
<%= f.password_field :current_password %></div>
<div><%= f.submit "Update" %></div>
<% end %>
<h3>Cancel my account</h3>
<p>Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :data => { :confirm => "Are you sure?" }, :method => :delete %>.</p>
<%= link_to "Back", :back %>

View file

@ -1,20 +0,0 @@
<% if false %>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<%= f.fields_for :person do |p| %>
<h2><%= p.label :first_name %></h2>
<p><%= p.text_field :first_name %></p>
<h2><%= p.label :last_name %></h2>
<p><%= p.text_field :last_name %></p>
<% end %>
<div><%= f.submit "Update" %></div>
<% end %>
<% end %>
<%= semantic_form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<%= f.fields_for :person do |p| %>
<%= f.inputs :first_name, :last_name, :for => :person %>
<% end %>
<div><%= f.submit "Update" %></div>
<% end %>

View file

@ -1,18 +0,0 @@
<%= devise_error_messages! %>
<%= semantic_form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<%= f.inputs :name => "Profile" do %>
<%= f.fields_for :person do |p| %>
<%= f.inputs :first_name, :last_name, :for => :person %>
<% end %>
<% end %>
<%= f.inputs :name => "Account" do %>
<%= f.input :email %>
<%= f.input :password, :hint => "(Leave blank if you don't want to change it)", :input_html => {:autocomplete => "off"} %>
<%= f.input :password_confirmation, :input_html => {:autocomplete => "off"} %>
<%= f.input :current_password, :input_html => {:autocomplete => "off"}, :hint => "(we need your current password to confirm your changes)" %>
<% end %>
<div><%= f.submit "Update" %></div>
<% end %>

View file

@ -1,5 +1,5 @@
.container .row
.row-fluid .col-md-12
= semantic_form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| = semantic_form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f|
= f.inputs :name => "Profile" do = f.inputs :name => "Profile" do
= f.fields_for :person do |p| = f.fields_for :person do |p|
@ -8,8 +8,6 @@
= p.input :public_name, :as => :string = p.input :public_name, :as => :string
= p.input :irc_nickname, :label => "IRC nick:", :as => :string = p.input :irc_nickname, :label => "IRC nick:", :as => :string
= p.input :company, :label => "Affiliation", :as => :string, :hint => "This could be a company, a user group, or nothing at all." = p.input :company, :label => "Affiliation", :as => :string, :hint => "This could be a company, a user group, or nothing at all."
= image_tag current_user.person.avatar(:small)
= p.input :avatar, :label => "Picture", :hint => "Upload a new picture."
= p.input :biography, :input_html => {:rows => 5, "onkeyup" => "word_count(this, 'biography-count', 150)"}, :for => :person = p.input :biography, :input_html => {:rows => 5, "onkeyup" => "word_count(this, 'biography-count', 150)"}, :for => :person
You have used You have used
%span#biography-count #{current_user.person.biography_word_count} %span#biography-count #{current_user.person.biography_word_count}
@ -17,7 +15,6 @@
%br %br
%br %br
= render :partial => 'devise/registrations/volunteerperson', :locals => {:p => p} = render :partial => 'devise/registrations/volunteerperson', :locals => {:p => p}
= f.inputs :name => "Account" do = f.inputs :name => "Account" do
= f.input :email, :required => false = f.input :email, :required => false
= f.input :password, :hint => "(Leave blank if you don't want to change it)", :input_html => {:autocomplete => "off"} = f.input :password, :hint => "(Leave blank if you don't want to change it)", :input_html => {:autocomplete => "off"}

View file

@ -1,18 +0,0 @@
<h2>Sign up</h2>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<div><%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation %></div>
<div><%= f.submit "Sign up" %></div>
<% end %>
<%= render "devise/shared/links" %>

View file

@ -1,14 +1,15 @@
.container .row
%h2.text-center .page-header
Sign Up %h1.text-center Sign Up
.row-fluid .col-md-5.col-md-offset-1
.well.span3.offset2 .well
= semantic_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| = semantic_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
= f.input :email = f.input :email
= f.input :password = f.input :password
= f.input :password_confirmation = f.input :password_confirmation
= f.action :submit, :as => :button, :label => "Sign Up", :button_html => {:class => "btn btn-primary"} = f.action :submit, :as => :button, :label => "Sign Up", :button_html => {:class => "btn btn-primary"}
.well.span3.offset2 .col-md-3.col-md-offset-2
.well
%h4 %h4
Already have an account? Already have an account?
= render "devise/shared/links" = render "devise/shared/links"

View file

@ -1,18 +0,0 @@
/
<h2>Sign in</h2>
<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.label :password %><br />
<%= f.password_field :password %></div>
<% if devise_mapping.rememberable? -%>
<div><%= f.check_box :remember_me %> <%= f.label :remember_me %></div>
<% end -%>
<div><%= f.submit "Sign in" %></div>
<% end %>
<%= render "devise/shared/links" %>

View file

@ -1,15 +0,0 @@
.container
%h2.text-center
Sign In
.row-fluid
.well.span3.offset2
= semantic_form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f|
= f.input :email
= f.input :password
- if devise_mapping.rememberable?
= f.input :remember_me, :as=> :boolean, :label => false
= f.action :submit, :as => :button, :label => "Sign In", :button_html => {:class => "btn btn-primary"}
.well.span3.offset2
%h4
No account?
= render "devise/shared/links"

View file

@ -1,22 +0,0 @@
- if controller_name != 'sessions'
= button_to "Sign In", new_session_path(resource_name), :method => :get, :class => "btn btn-primary", :style=> "margin-top: 5px"
- if devise_mapping.registerable? && controller_name != 'registrations'
= button_to "Sign Up", new_registration_path(resource_name), :method => :get, :class => "btn btn-primary", :style=> "margin-top: 5px"
- if devise_mapping.recoverable? && controller_name != 'passwords'
= link_to "Forgot your password?", new_password_path(resource_name)
%br
- if devise_mapping.confirmable? && controller_name != 'confirmations'
= link_to "Didn't receive confirmation instructions?", new_confirmation_path(resource_name)
%br
- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks'
= link_to "Didn't receive unlock instructions?", new_unlock_path(resource_name)
%br
- if devise_mapping.omniauthable?
- resource_class.omniauth_providers.each do |provider|
= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider)

View file

@ -1,12 +0,0 @@
<h2>Resend unlock instructions</h2>
<%= form_for(resource, :as => resource_name, :url => unlock_path(resource_name), :html => { :method => :post }) do |f| %>
<%= devise_error_messages! %>
<div><%= f.label :email %><br />
<%= f.email_field :email %></div>
<div><%= f.submit "Resend unlock instructions" %></div>
<% end %>
<%= render "devise/shared/links" %>

View file

@ -1,55 +0,0 @@
<div class="row">
<div class="span12">
<h2 class="text-center">Upcoming Conferences</h2>
</div>
</div>
<% @current.each do |conference| %>
<div class="row-fluid" style="margin-top: 30px;">
<div clas="span12">
<div class="well">
<div class="row">
<div class="span4 text-center">
<%= image_tag conference.logo(:original) %>
</div>
<div class="span6">
<h3>
<%= conference.title %>
<br>
<span class="muted"><%= conference.date_range_string %></span>
</h3>
<% if conference.venue.name and conference.venue.website and conference.venue.address %>
<p>
<small>
<%= link_to conference.venue.name, conference.venue.website %>,
<%= link_to conference.venue.address, "http://maps.google.com/maps?q=#{conference.venue.address}" %>
</small>
<% end -%>
<% if conference.venue.description %>
<%= simple_format(conference.venue.description, class: 'lead') %>
<% end -%>
</div>
<div class="span2">
<ul class="nav nav-tabs nav-stacked">
<% if conference.registration_open? %>
<%- if conference.user_registered?(current_user) %>
<li><%= link_to "Modify Registration", register_conference_path(conference.short_title) %></li>
<%- else %>
<li><%= link_to "Register", register_conference_path(conference.short_title) %></li>
<% end %>
<% end %>
<li><%= link_to "Schedule", conference_schedule_path(conference.short_title) %></li>
<%- if !current_user.nil? && current_user.person.proposal_count(conference) > 0 %>
<li><%= link_to "View My Proposals", conference_proposal_index_path(conference.short_title) %></li>
<%- elsif conference.cfp_open? %>
<li><%= link_to "Submit Proposal", conference_proposal_index_path(conference.short_title) %></li>
<% end %>
</ul>
</div>
</div>
</div>
</div>
</div>
<% end %>

View file

@ -0,0 +1,36 @@
.row
.col-md-12.page-header
%h2.text-center Upcoming Conferences
- @current.each do |conference|
.row
.col-md-12
.well
.row
.col-md-4.text-center
= image_tag(conference.logo(:original), class: 'img-responsive')
.col-md-6
%h3
= conference.title
%small
%b
= conference.date_range_string
- if conference.venue.name and conference.venue.website and conference.venue.address
%p
%small
= link_to conference.venue.name, conference.venue.website
,
\#{link_to conference.venue.address, "http://maps.google.com/maps?q=#{conference.venue.address}"}
- if conference.venue.description
= simple_format(conference.venue.description, class: 'lead')
.col-md-2
.btn-group-vertical
- if conference.registration_open?
- if conference.user_registered?(current_user)
= link_to "Modify Registration", register_conference_path(conference.short_title), :class =>"btn btn-default"
- else
= link_to "Register", register_conference_path(conference.short_title), :class =>"btn btn-success"
= link_to "Schedule", conference_schedule_path(conference.short_title), :class =>"btn btn-default"
- if !current_user.nil? && current_user.person.proposal_count(conference) > 0
= link_to "View My Proposals", conference_proposal_index_path(conference.short_title), :class =>"btn btn-default"
- elsif conference.cfp_open?
= link_to "Submit Proposal", conference_proposal_index_path(conference.short_title), :class =>"btn btn-default"

View file

@ -0,0 +1,30 @@
%ul.nav.navbar-nav
%li{:class=> active_nav_li(admin_conference_path(@conference.short_title))}
= link_to(admin_conference_path(@conference.short_title)) do
%span.glyphicon.glyphicon-wrench
Settings
%li{:class=> active_nav_li(admin_conference_registrations_path(@conference.short_title))}
= link_to(admin_conference_registrations_path(@conference.short_title)) do
%span.glyphicon.glyphicon-user
Registrations
- if @conference.use_supporter_levels? and @conference.supporter_levels.length > 0
%li{:class=> active_nav_li(admin_conference_supporters_path(@conference.short_title))}
= link_to(admin_conference_supporters_path(@conference.short_title)) do
%span.glyphicon.glyphicon-star
Supporters
%li{:class=> active_nav_li(admin_conference_events_path(@conference.short_title))}
= link_to(admin_conference_events_path(@conference.short_title)) do
%span.glyphicon.glyphicon-comment
Events
%li{:class=> active_nav_li(admin_conference_stats_path(@conference.short_title))}
= link_to(admin_conference_stats_path(@conference.short_title)) do
%span.glyphicon.glyphicon-tasks
Statistics
%li{:class=> active_nav_li(admin_conference_volunteers_list_path(@conference.short_title))}
= link_to(admin_conference_volunteers_list_path(@conference.short_title)) do
%span.glyphicon.glyphicon-user
Volunteers
%li
= link_to(admin_conference_schedule_path(@conference.short_title), :target => "_blank") do
%span.glyphicon.glyphicon-calendar
Schedule

View file

@ -1,74 +1,50 @@
%a.btn.btn-navbar{"data-target" => ".nav-collapse", "data-toggle" => "collapse", :id => "mobmenu" } .navbar.navbar-default.navbar-fixed-top{:role=>"navigation"}
%span.icon-th .container
= link_to "OSEM", root_path, :class => 'brand', :title => "Open Source Event Manager" .navbar-header
%button{"data-target"=>".navbar-collapse", "data-toggle"=>"collapse", :class=>"navbar-toggle", :type=>"button"}
%span.sr-only
Toggle navigation
%span.icon-bar
%span.icon-bar
%span.icon-bar
= link_to "OSEM", root_path, :class => 'navbar-brand', :title => "Open Source Event Manager"
.collapse.navbar-collapse
- if @conference && !@conference.short_title.nil? - if @conference && !@conference.short_title.nil?
%span.brand %p.navbar-text
= @conference.short_title = @conference.short_title
.nav-collapse.collapse
/ The Admin Menu for Conferences /
- if user_signed_in? - if user_signed_in?
- if has_role?(current_user, "admin") || has_role?(current_user, "organizer") - if has_role?(current_user, "admin") || has_role?(current_user, "organizer")
- if controller.class.name.split("::").first=="Admin" - if controller.class.name.split("::").first=="Admin"
- if @conference and !@conference.short_title.nil? - if @conference and not @conference.short_title.nil?
%ul.nav = render 'layouts/admin_menu'
%li.nav-header.hidden-desktop %ul.nav.navbar-nav.navbar-right
= @conference.short_title
%li{:class=> active_nav_li(admin_conference_path(@conference.short_title))}
= link_to(admin_conference_path(@conference.short_title)) do
%i.icon-wrench
Settings
%li{:class=> active_nav_li(admin_conference_registrations_path(@conference.short_title))}
= link_to(admin_conference_registrations_path(@conference.short_title)) do
%i.icon-user
Registrations
- if @conference.use_supporter_levels? and @conference.supporter_levels.length > 0
%li{:class=> active_nav_li(admin_conference_supporters_path(@conference.short_title))}
= link_to(admin_conference_supporters_path(@conference.short_title)) do
%i.icon-star
Supporters
%li{:class=> active_nav_li(admin_conference_events_path(@conference.short_title))}
= link_to(admin_conference_events_path(@conference.short_title)) do
%i.icon-comment
Events
%li{:class=> active_nav_li(admin_conference_stats_path(@conference.short_title))}
= link_to(admin_conference_stats_path(@conference.short_title)) do
%i.icon-tasks
Statistics
%li{:class=> active_nav_li(admin_conference_volunteers_list_path(@conference.short_title))}
= link_to(admin_conference_volunteers_list_path(@conference.short_title)) do
%i.icon-user
Volunteers
%li
= link_to(admin_conference_schedule_path(@conference.short_title), :target => "_blank") do
%i.icon-calendar
Schedule
%ul.nav.hidden-desktop
= render 'layouts/user_menu'
%ul.nav.pull-right.visible-desktop
%li.dropdown %li.dropdown
%a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"} %a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"}
#{current_user.person.public_name} (#{current_user.email}) - if not current_user.person.public_name.empty?
#{current_user.person.public_name}
-else
#{current_user.email}
= image_tag(current_user.person.gravatar_url(:size => "18"), :title => "Yo #{current_user.person.public_name}!") = image_tag(current_user.person.gravatar_url(:size => "18"), :title => "Yo #{current_user.person.public_name}!")
%b.caret %b.caret
%ul.dropdown-menu{:style => "padding: 15px;"} %ul.dropdown-menu
= render 'layouts/user_menu' = render 'layouts/user_menu'
- else - else
%ul.nav.pull-right %ul.nav.navbar-nav.navbar-right
- if current_page?(new_registration_path('user')) - if current_page?(new_registration_path('user'))
%li.active %li.active
= link_to(new_registration_path('user')) do = link_to(new_registration_path('user')) do
%i.icon-heart %span.glyphicon.glyphicon-heart
Sign Up Sign Up
- else - else
%li %li
= link_to(new_registration_path('user')) do = link_to(new_registration_path('user')) do
%i.icon-heart %span.glyphicon.glyphicon-heart
Sign Up Sign Up
%li.dropdown.visible-desktop %li.dropdown.visible-desktop
%a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"} %a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"}
%i.icon-user.icon-2x %span.glyphicon.glyphicon-user
Sign In Sign In
%i.icon-angle-down %span.caret
.dropdown-menu{:style => "padding: 17px;"} .dropdown-menu{:style => "padding: 17px;"}
= form_tag user_session_path do = form_tag user_session_path do
= text_field_tag 'user[email]' = text_field_tag 'user[email]'
@ -79,5 +55,5 @@
%button.btn.btn-block Sign in %button.btn.btn-block Sign in
%br %br
= link_to "Forgot your password?", new_password_path('user') = link_to "Forgot your password?", new_password_path('user')
%li.hidden-desktop %li.hidden-lg
= link_to('Sign In', new_user_session_path) = link_to('Sign In', new_user_session_path)

View file

@ -1,5 +1,3 @@
%li.nav-header
= current_user.person.public_name if current_user.person
%li %li
= link_to(edit_user_registration_path) do = link_to(edit_user_registration_path) do
%i.icon-wrench %i.icon-wrench
@ -15,7 +13,7 @@
Sign out Sign out
-if has_role?(current_user, "admin") || has_role?(current_user, "organizer") -if has_role?(current_user, "admin") || has_role?(current_user, "organizer")
%li.divider %li.divider
%li.nav-header %li.dropdown-header
Conferences Conferences
- @conferences.each do |conference| - @conferences.each do |conference|
%li %li
@ -28,7 +26,7 @@
%i.icon-plus %i.icon-plus
New Conference New Conference
%li.divider %li.divider
%li.nav-header %li.dropdown-header
People People
%li %li
= link_to(admin_users_path) do = link_to(admin_users_path) do

View file

@ -17,14 +17,10 @@
}); });
= yield(:head) = yield(:head)
%body %body
#wrap
.navbar.navbar-fixed-top
.navbar-inner
.container-fluid
= render 'layouts/navigation' = render 'layouts/navigation'
.container#messages .container#messages
.row .row
.span12 .col-md-12
= render 'layouts/messages' = render 'layouts/messages'
%noscript %noscript
:css :css
@ -37,11 +33,10 @@
OSEM requires JavaScript to be enabled to function. Please turn on JavaScript in your browser's settings and reload the page to continue. OSEM requires JavaScript to be enabled to function. Please turn on JavaScript in your browser's settings and reload the page to continue.
.container#content .container#content
= yield = yield
#push
#footer #footer
.container .container
%p.muted.credit.text-center %p.muted.text-center
OSEM is (C) 2013 OSEM is (C) 2013
= link_to "Matt Barringer", "http://incoherent.de" = link_to "Matt Barringer", "http://incoherent.de"
and released under the GPL. You can get the source code from and released under the GPL. You can get the source code from

View file

@ -1,5 +1,5 @@
.row .row
.span12 .col-md-12
.tabbable .tabbable
%ul.nav.nav-tabs %ul.nav.nav-tabs
%li.active %li.active

View file

@ -31,7 +31,15 @@
%br %br
%br %br
= f.input :description, :input_html => {:rows => 5, :class=> "span11"}, :hint => "This will only be shown to organizers, not to attendees." = f.input :description, :input_html => {:rows => 5, :class=> "span11"}, :hint => "This will only be shown to organizers, not to attendees."
= f.input :video_id, :as => :string, :hint => "Go to your youtube video, click on \"share\" and copy everything behind http://youtu.be/" = f.input :media_type, :as => :select, :label => "Media Type", :collection => Event.media_types.values, :include_blank => false
%p{:class => "help-block media-type", :id => "youtube-help"} Go to your YouTube video, click on "share" and copy everything behind http://youtu.be/"
%p{:class => "help-block media-type", :id => "slideshare-help", :style => "display:none"} Go to your SlideShare, click on "share" -> "embed" and copy the id
%p{:class => "help-block media-type", :id => "flickr-help", :style => "display:none"} Go to your flickr image, click on "Grab the link" -> "Show short url" and copy everything behind https://flic.kr/p/
%p{:class => "help-block media-type", :id => "vimeo-help", :style => "display:none"} Go to your vimeo video, click on "share" and copy everything behind http://vimeo.com/
%p{:class => "help-block media-type", :id => "speakerdeck-help", :style => "display:none"} Go to your SpeakerDeck, click on "share" -> "embed" and copy the data-id
%p{:class => "help-block media-type", :id => "instagram-help", :style => "display:none"} Go to your Instagram photo page and copy everything behind instagram.com/p/ (without trailing /# hash symbol)
= f.input :media_id, :label => "Media ID", :as => :string
%section#information %section#information
= f.inputs :name => "Your Information" do = f.inputs :name => "Your Information" do
= semantic_fields_for @person do |p| = semantic_fields_for @person do |p|

View file

@ -1,2 +1 @@
.container = render 'form'
= render 'form'

View file

@ -1,14 +1,12 @@
.container-fluid .row
.row-fluid .col-md-12.page-header
.span13 %h1
%h2.pull-left
= "My Proposals for #{@conference.title}" = "My Proposals for #{@conference.title}"
.pull-right{:style=>"margin-top:20px;"}
- if @conference.cfp_open? || organizer_or_admin? - if @conference.cfp_open? || organizer_or_admin?
= link_to "New Proposal", new_conference_proposal_path(@conference.short_title), :class => "btn btn-primary" = link_to "New Proposal", new_conference_proposal_path(@conference.short_title), :class => "btn btn-primary pull-right"
- if @person.proposal_count(@conference) > 0 - if @person.proposal_count(@conference) > 0
.row-fluid .row
.span12 .col-md-12
%table.table.table-bordered.table-striped %table.table.table-bordered.table-striped
%thead %thead
%th %th

View file

@ -1,6 +1,6 @@
.row .row
.span12 .col-md-12
= simple_format(@conference.call_for_papers.description) = simple_format(@conference.call_for_papers.description)
.row .row
.span12 .col-md-12
= render 'proposal_form' = render 'proposal_form'

View file

@ -1,13 +1,13 @@
.row .row
.span12 .col-md-12.page-header
%h2 %h2
= @event.title = @event.title
- if @event.subtitle - if @event.subtitle
%br %br
%span.muted %small
= @event.subtitle = @event.subtitle
.row-fluid .row
.span3 .col-md-3
%p %p
= simple_format(@event.abstract) = simple_format(@event.abstract)
%dl %dl
@ -22,31 +22,43 @@
- if @event.track_id - if @event.track_id
%span.label{:style =>"background-color: #{@event.track.color};"} %span.label{:style =>"background-color: #{@event.track.color};"}
= @event.track.name = @event.track.name
.span9 .col-md-9
-unless @event.video_id -unless @event.media_id
.row-fluid .row
.span12 .col-md-12
%h5.text-error %h5.text-error
No video of the event yet, sorry! Meanwhile... No video of the event yet, sorry! Meanwhile...
.row-fluid .row
.span12.flexvideo .col-md-13
-if @event.video_id -if not @event.media_id.blank?
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=>"http://www.youtube.com/embed/#{@event.video_id}?rel=0"} .flexvideo
-if @event.media_type == Event.media_types[:slideshare]
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=> request.ssl? ? "https://" : "http://" + "www.slideshare.net/slideshow/embed_code/#{@event.media_id}"}
-elsif @event.media_type == Event.media_types[:flickr]
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=> request.ssl? ? "https://" : "http://" + "flic.kr/p/#{@event.media_id}/player/268a054da2"}
-elsif @event.media_type == Event.media_types[:vimeo]
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=> "//player.vimeo.com/video/#{@event.media_id}"}
-elsif @event.media_type == Event.media_types[:speakerdeck]
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=> "//speakerdeck.com/player/#{@event.media_id}?"}
-elsif @event.media_type == Event.media_types[:instagram]
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :scrolling =>"no", :allowtransparency=>"true", :src=> "//instagram.com/p/#{@event.media_id}/embed/"}
-else -else
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=>"http://www.youtube.com/embed/Eiv4e5ZxTmg?rel=0"} %iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=> request.ssl? ? "https://" : "http://" + "www.youtube.com/embed/#{@event.media_id}?rel=0"}
.row-fluid -else
.span8 %div.well.well-lg="No video of the event yet, sorry! Meanwhile..."
.row
.col-md-8
%h3 %h3
by by
= @speaker.public_name = @speaker.public_name
- if @speaker.company - if @speaker.company?
%br %br
%span.muted %span.muted
from from
= @speaker.company = @speaker.company
-if @speaker.biography -if @speaker.biography?
= simple_format(@speaker.biography) = simple_format(@speaker.biography)
.span4 .col-md-4
= image_tag @speaker.gravatar_url(:size => 200), :class => "img-rounded pull-right", :style => "margin: 8px;" = image_tag @speaker.gravatar_url(:size => 200), :class => "img-responsive img-rounded"

View file

@ -1,6 +1,10 @@
defaults: &defaults defaults: &defaults
# The sender address of emails
devise_mail_sender: no-reply@localhost
# The hostname to be used when building the URL in the emails # The hostname to be used when building the URL in the emails
url_for_emails: localhost:3000 url_for_emails: localhost:3000
# A secret key. You can generate one with 'rake secret'
devise_secret_key: 12345
development: development:
<<: *defaults <<: *defaults
@ -10,4 +14,3 @@ test:
production: production:
<<: *defaults <<: *defaults

View file

@ -1,5 +1,14 @@
# Load the rails application # Load the rails application
require File.expand_path('../application', __FILE__) require File.expand_path('../application', __FILE__)
path = Rails.root.join("config", "config.yml")
begin
CONFIG = YAML.load_file(path)[Rails.env]
rescue Exception
puts "Error while parsing config file #{path}"
CONFIG = Hash.new
end
# Initialize the rails application # Initialize the rails application
Osem::Application.initialize! Osem::Application.initialize!

View file

@ -1,6 +1,9 @@
Osem::Application.configure do Osem::Application.configure do
# Settings specified here will take precedence over those in config/application.rb # Settings specified here will take precedence over those in config/application.rb
# Use letter_opener
config.action_mailer.delivery_method = :letter_opener
# In the development environment your application's code is reloaded on # In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development # every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes. # since you don't have to restart the web server when you make code changes.
@ -35,5 +38,5 @@ Osem::Application.configure do
# Expands the lines which load the assets # Expands the lines which load the assets
config.assets.debug = true config.assets.debug = true
config.action_mailer.default_url_options = { :host => 'localhost:3000' } config.action_mailer.default_url_options = { :host => CONFIG['url_for_emails'] }
end end

Some files were not shown because too many files have changed in this diff Show more