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, min-height: 100%;
body {
height: 100%;
/* The html and body elements cannot have any padding or margin. */
} }
/* Styling for voting on proposals*/ body {
.myrating.bright { background-image: url(../assets/star-bright.png); } /* Margin bottom by footer height */
.myrating.glow { background-image: url(../assets/star-glow.png); } margin-bottom: 60px;
.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 */ body > #messages {
#wrap { padding: 60px 15px 0;
min-height: 100%;
height: auto !important;
height: 100%;
/* Negative indent footer by it's height */
margin: 0 auto -60px;
} }
/* Set the fixed height of the footer here */
#push,
#footer { #footer {
height: 60px; position: absolute;
} bottom: 0;
#footer { width: 100%;
background-color: #f5f5f5; /* Set the fixed height of the footer here */
height: 60px;
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 @conference.supporter_levels.each do |level|
@mydays << {"status" => "#{day}", "value" => day_reg_count} @tickets_time << {"key" => level.title, "values" => []}
end levels << ["#{level.title}"]
@conference.supporter_levels.each do |level| end
day_ticket_count = @tickets.where("supporter_registrations.created_at LIKE ? AND supporter_levels.title LIKE ?", "%#{day}%", "%#{level.title}%").count
if day_ticket_count !=0 (start_date..end_date).each do |day|
@mytickets << {"status" => "#{day}", "ticket" => "#{level}", "value" => day_ticket_count} 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
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)
session[:return_to] if not session[:return_to].start_with?(user_registration_path)
logger.debug "Returning 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,14 +1,13 @@
.container-fluid .row-fluid
.row-fluid .col-md-3
.span3 = render 'admin/conference/sidebar'
= render 'admin/conference/sidebar' .col-md-9
.span9 = 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" } = f.input :hard_deadline, :as => :string, :input_html => { :id => "cfp-hard-datepicker", :readonly => "readonly" }
= f.input :hard_deadline, :as => :string, :input_html => { :id => "cfp-hard-datepicker", :readonly => "readonly" } = f.input :description, :hint => "Welcome text for the Call for Papers"
= f.input :description, :hint => "Welcome text for the Call for Papers" = f.input :schedule_changes
= f.input :schedule_changes = f.input :rating, :hint => "Enter the number of different rating levels you want to have for voting on proposals. Enter 0 if you do not want to vote on proposals."
= f.input :rating, :hint => "Enter the number of different rating levels you want to have for voting on proposals. Enter 0 if you do not want to vote on proposals." = f.input :rating_desc, :label => "Rating Description", :hint => "Enter comments about voting process.", :input_html => {:value => "1 is for 'I don't like this proposal',\n2 is for 'I am ok with this proposal.',\n3 is for 'I love this proposal!'", :rows => 5, :class => "span6"}
= f.input :rating_desc, :label => "Rating Description", :hint => "Enter comments about voting process.", :input_html => {:value => "1 is for 'I don't like this proposal',\n2 is for 'I am ok with this proposal.',\n3 is for 'I love this proposal!'", :rows => 5, :class => "span6"} = 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,29 +1,26 @@
.well.sidebar-nav .well.sidebar-nav
%ul.nav.nav-list %ul.nav.nav-pills.nav-stacked
%li.nav-header %li{:class=> active_nav_li(admin_conference_path(@conference.short_title))}
=@conference.short_title = link_to "Conference", admin_conference_path(@conference.short_title)
Settings %li{:class=> active_nav_li(admin_conference_venue_info_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_path(@conference.short_title))} = link_to "Venue", admin_conference_venue_info_path(@conference.short_title)
= link_to "Conference", admin_conference_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_cfp_info_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_venue_info_path(@conference.short_title))} = link_to "Call for Papers", admin_conference_cfp_info_path(@conference.short_title)
= link_to "Venue", admin_conference_venue_info_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_rooms_list_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_cfp_info_path(@conference.short_title))} = link_to "Rooms", admin_conference_rooms_list_path(@conference.short_title)
= link_to "Call for Papers", admin_conference_cfp_info_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_tracks_list_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_rooms_list_path(@conference.short_title))} = link_to "Tracks", admin_conference_tracks_list_path(@conference.short_title)
= link_to "Rooms", admin_conference_rooms_list_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_eventtype_list_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_tracks_list_path(@conference.short_title))} = link_to "Event Types", admin_conference_eventtype_list_path(@conference.short_title)
= link_to "Tracks", admin_conference_tracks_list_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_difficulty_levels_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_eventtype_list_path(@conference.short_title))} = link_to "Difficulty Levels", admin_conference_difficulty_levels_path(@conference.short_title)
= link_to "Event Types", admin_conference_eventtype_list_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_social_events_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_difficulty_levels_path(@conference.short_title))} = link_to "Social Events", admin_conference_social_events_path(@conference.short_title)
= link_to "Difficulty Levels", admin_conference_difficulty_levels_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_supporter_levels_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_social_events_path(@conference.short_title))} = link_to "Supporter Levels", admin_conference_supporter_levels_path(@conference.short_title)
= link_to "Social Events", admin_conference_social_events_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_email_settings_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_supporter_levels_path(@conference.short_title))} = link_to "Emails", admin_conference_email_settings_path(@conference.short_title)
= link_to "Supporter Levels", admin_conference_supporter_levels_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_questions_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_email_settings_path(@conference.short_title))} = link_to "Questions", admin_conference_questions_path(@conference.short_title)
= link_to "Emails", admin_conference_email_settings_path(@conference.short_title) %li{:class=> active_nav_li(admin_conference_volunteers_info_path(@conference.short_title))}
%li{:class=> active_nav_li(admin_conference_questions_path(@conference.short_title))} = link_to "Volunteers", admin_conference_volunteers_info_path(@conference.short_title)
= link_to "Questions", admin_conference_questions_path(@conference.short_title)
%li{:class=> active_nav_li(admin_conference_volunteers_info_path(@conference.short_title))}
= link_to "Volunteers", admin_conference_volunteers_info_path(@conference.short_title)

View file

@ -1,20 +1,19 @@
.container-fluid .row
.row-fluid .col-md-3
.span3 = render 'admin/conference/sidebar'
= render 'admin/conference/sidebar' .col-md-9
.span9 = 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" = f.input :social_tag, :hint => "The hashtag you'll use on Twitter and Google+. Don't include the '#' sign!'"
= f.input :social_tag, :hint => "The hashtag you'll use on Twitter and Google+. Don't include the '#' sign!'" = f.input :contact_email, :hint => "Contact email address for your conference. Will be used as reply-to address in emails sent out by the system."
= f.input :contact_email, :hint => "Contact email address for your conference. Will be used as reply-to address in emails sent out by the system." = f.input :timezone, :as => :time_zone, :hint => "The conference time zone"
= f.input :timezone, :as => :time_zone, :hint => "The conference time zone" = 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" } = f.input :registration_start_date, :as => :string, :input_html => { :id => "conference-reg-start-datepicker", :readonly => "readonly" }
= f.input :registration_start_date, :as => :string, :input_html => { :id => "conference-reg-start-datepicker", :readonly => "readonly" } = f.input :registration_end_date, :as => :string, :input_html => { :id => "conference-reg-end-datepicker", :readonly => "readonly" }
= f.input :registration_end_date, :as => :string, :input_html => { :id => "conference-reg-end-datepicker", :readonly => "readonly" } - if !@conference.logo.blank?
- if !@conference.logo.blank? = image_tag @conference.logo(:thumb)
= image_tag @conference.logo(:thumb) = f.input :logo, :label => "Conference Logo", :hint => "This will be displayed on the front page."
= f.input :logo, :label => "Conference Logo", :hint => "This will be displayed on the front page." = f.input :html_export_path, :hint => "The path for static HTML exports"
= f.input :html_export_path, :hint => "The path for static HTML exports" = 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,9 +1,8 @@
.container-fluid .row
.row-fluid .span3
.span3 = render 'admin/conference/sidebar', :activated => "Diet"
= render 'admin/conference/sidebar', :activated => "Diet" .span9
.span9 = semantic_form_for(@conference, :url => admin_conference_dietary_update_path(@conference.short_title)) do |f|
= semantic_form_for(@conference, :url => admin_conference_dietary_update_path(@conference.short_title)) do |f| = f.input :use_dietary_choices, :label => false
= f.input :use_dietary_choices, :label => false = dynamic_association :dietary_choices, "Dietary Choices", f
= dynamic_association :dietary_choices, "Dietary Choices", 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,9 +1,8 @@
.container-fluid .row
.row-fluid .col-md-3
.span3 = render 'admin/conference/sidebar'
= render 'admin/conference/sidebar' .col-md-9
.span9 = 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 = 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,45 +1,43 @@
.container-fluid .row
.row-fluid .col-md-3
.span3 = render 'admin/conference/sidebar'
= render 'admin/conference/sidebar' .col-md-9
.span9 = link_to "Template Help", "#", :id => "template-help-link"
= link_to "Template Help", "#", :id => "template-help-link" #template-help
#template-help Valid attributes:
Valid attributes: %table.table
%table.table %tr
%tr %td {email}
%td {email} %td The user's email address
%td The user's email address %tr
%tr %td {name}
%td {name} %td The user's full name
%td The user's full name %tr
%tr %td {conference}
%td {conference} %td The full conference title
%td The full conference title %tr
%tr %td {proposalslink}
%td {proposalslink} %td A link to the user's proposal page
%td A link to the user's proposal page %tr
%tr %td {registrationlink}
%td {registrationlink} %td A link to the registration page
%td A link to the registration page %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|
= f.input :send_on_registration, :label => false, :hint => "Send an email when the user registers for the conference?"
= semantic_form_for(@settings, :url => admin_conference_email_settings_path(@conference.short_title),:html => {:multipart => true}) do |f| = f.input :registration_subject
= f.input :send_on_registration, :label => false, :hint => "Send an email when the user registers for the conference?" = f.input :registration_email_template, :input_html => { :rows => 10, :cols => 20}
= f.input :registration_subject = f.input :send_on_accepted, :label => false, :hint => "Send an email when the proposal is accepted?"
= f.input :registration_email_template, :input_html => { :rows => 10, :cols => 20} = f.input :accepted_subject
= f.input :send_on_accepted, :label => false, :hint => "Send an email when the proposal is accepted?" = f.input :accepted_email_template, :input_html => { :rows => 10, :cols => 20 }
= f.input :accepted_subject = f.input :send_on_rejected, :label => false, :hint => "Send an email when the proposal is rejected?"
= f.input :accepted_email_template, :input_html => { :rows => 10, :cols => 20 } = f.input :rejected_subject
= f.input :send_on_rejected, :label => false, :hint => "Send an email when the proposal is rejected?" = f.input :rejected_email_template, :input_html => { :rows => 10, :cols => 20 }
= f.input :rejected_subject = f.input :send_on_confirmed_without_registration, :label => false, :hint => "Send an email when a user has a confirmed proposal, but isn't yet registered?"
= f.input :rejected_email_template, :input_html => { :rows => 10, :cols => 20 } = f.input :confirmed_without_registration_subject
= f.input :send_on_confirmed_without_registration, :label => false, :hint => "Send an email when a user has a confirmed proposal, but isn't yet registered?" = f.input :confirmed_email_template, :input_html => { :rows => 10, :cols => 20 }
= f.input :confirmed_without_registration_subject = f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
= f.input :confirmed_email_template, :input_html => { :rows => 10, :cols => 20 }
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
:javascript :javascript
$(document).ready( function() { $(document).ready( function() {

View file

@ -1,45 +1,42 @@
.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
.span12
#events-stats %table.table.table-bordered.table-striped
.span12 %thead
%table.table.table-bordered.table-striped %th
%thead - @mystates.each do |state|
%th %th{:colspan => 2, :style => "text-align:center"}
- @mystates.each do |state| State "#{state.name}"
%th{:colspan => 2, :style => "text-align:center"} %th{:colspan => 2, :style => "text-align:center"}
State "#{state.name}" Total
%th{:colspan => 2, :style => "text-align:center"} %br
Total No & Time
%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 %tr
%td= "#{mytype.title} (#{show_time(mytype.length)})" %td
- @mystates.each do |mystate| %b Total
%td= @eventstats["#{mytype.title}"]["#{mystate.name}"]["type_state_count"] unless @eventstats["#{mytype.title}"]["#{mystate.name}"] == nil - @mystates.each do |mystate|
%td= show_time(@eventstats["#{mytype.title}"]["#{mystate.name}"]["type_state_length"]) unless @eventstats["#{mytype.title}"]["#{mystate.name}"] == nil %td
%td= @eventstats["#{mytype.title}"]["count"] %b
%td= show_time(@eventstats["#{mytype.title}"]["length"]) = @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"])
:javascript :javascript

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' .col-md-9
.span9 = 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
People %h1
- if @people People
= "(#{@people.length})" - if @people
.span6 = "(#{@people.length})"
.pull-right{:style=>"margin-top:20px; margin-bottom:20px;"} = link_to "New person", new_admin_person_path, :class => "btn btn-success pull-right"
= 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,31 +1,29 @@
.container-fluid .row
.row-fluid .col-md-3
.span3 = render 'admin/conference/sidebar'
= render 'admin/conference/sidebar' .col-md-9
.span9 .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
= semantic_form_for(@conference, :url => admin_conference_questions_update_conference_path(@conference.short_title), :method => 'put') do |f|
.questions{:id => "myquestions"}
= 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?"
- if @questions.count > 0
= semantic_form_for(@conference, :url => admin_conference_questions_update_conference_path(@conference.short_title), :method => 'put') do |f| .modal.fade{:id => "new-question", "role" => "dialog", "aria-hidden" => "true"}
.modal-dialog
.questions{:id => "myquestions"} .modal-content
= render :partial => "questions" .modal-header
%h3{:id => "new-question-header"}
= f.submit "Update Questions for #{@conference.short_title}", :class => "btn btn-primary", :confirm => "Are you sure you want to make these changes?" Add new question
.modal-body
.modal.hide.fade{:id => "new-question", "role" => "dialog", "aria-hidden" => "true"} = semantic_form_for(@new_question, :url => admin_conference_questions_path(@conference.short_title), :method => :post) do |f|
.modal-header = render :partial => "form", :locals => {:f => f}
%h3{:id => "new-question-header"} %button{:class => "btn btn-primary"}
Add new question Save
.modal-body .pull-right
= semantic_form_for(@new_question, :url => admin_conference_questions_path(@conference.short_title), :method => :post) do |f| %button{:class=> "btn btn-danger", "data-dismiss"=> "modal", "aria-hidden"=>"true"}
= render :partial => "form", :locals => {:f => f} Cancel
%button{:class => "btn btn-primary"}
Save
.pull-right
%button{:class=> "btn btn-danger", "data-dismiss"=> "modal", "aria-hidden"=>"true"}
Cancel

View file

@ -1,41 +1,35 @@
.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
.row-fluid .col-md-12
.span12 = 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.fields_for :person do |p|
= f.inputs "Personal Information" do = p.input :first_name, :as => :string
= f.fields_for :person do |p| = p.input :last_name, :as => :string
= p.input :first_name, :as => :string = p.label :Nickname, :as => :string
= p.input :last_name, :as => :string = p.text_field :irc_nickname, :as => :string
= p.label :Nickname, :as => :string = p.label :Affiliation
= p.text_field :irc_nickname, :as => :string = p.text_field :company, :placeholder => "Company/User Group/nothing", :as => :string
= p.label :Affiliation = f.inputs "Registration Information" do
= p.text_field :company, :placeholder => "Company/User Group/nothing", :as => :string - if @conference.use_supporter_levels? and @conference.supporter_levels.length > 0
= f.semantic_fields_for :supporter_registration do |reg|
= f.inputs "Registration Information" do = reg.input :supporter_level, :as => :select, :collection => @conference.supporter_levels
- if @conference.use_supporter_levels? and @conference.supporter_levels.length > 0 = reg.input :code, :label => "Confirmation or registration code (if applicable)"
= f.semantic_fields_for :supporter_registration do |reg| %span#supporter-link.help-block
= reg.input :supporter_level, :as => :select, :collection => @conference.supporter_levels = f.input :attending_with_partner, :label => false
= reg.input :code, :label => "Confirmation or registration code (if applicable)" = f.input :using_affiliated_lodging, :label => false
%span#supporter-link.help-block = 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 :attending_with_partner, :label => false - if @conference.social_events.count > 0
= f.input :using_affiliated_lodging, :label => false = f.inputs "Are you planning to attend any of the parties?" do
= f.input :handicapped_access_required, :label => false %br Yes, I'll be attending...
= f.input :other_special_needs, :label => "Any other special needs?", :input_html => {:rows => 2, :class => "span6"} %br
= f.input :social_events, :as => :check_boxes, :label => false, :collection => @conference.social_events
- if @conference.social_events.count > 0 = f.action :submit, :button_html => { :value => "Edit Registration", :class => "btn btn-primary" }
= 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, :collection => @conference.social_events
= 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 () {
var str = ""; var str = "";

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" %h2
= link_to "Export PDF", admin_conference_registrations_path(@conference.short_title, :format => :pdf), :class => "btn btn-success" Registrations
= link_to "Export xlsx", {:format => :xlsx}, :class => "btn btn-success" - if @registrations
.row-fluid = "(#{@registrations.length})"
.span12 = " - Attended (#{@attended})"
%h2 .btn-group.pull-right
Registrations = link_to "New", admin_conference_registrations_new_path(@conference.short_title), :class => "btn btn-default"
- if @registrations = link_to "Export PDF", admin_conference_registrations_path(@conference.short_title, :format => :pdf), :class => "btn btn-default"
= "(#{@registrations.length})" = link_to "Export XLS", {:format => :xlsx}, :class => "btn btn-default"
= " - Attended (#{@attended})"
%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' .col-md-9
.span9 = 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' .col-md-9
.span9 = 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 @attendees > 0 - if @registered > 0
%h4{:style => "text-indent: 25px"}= "Registrations - Attendees (#{(@attendees.to_f / @registered * 100).round }%)" - if @attendees > 0
%h4{:style => "text-indent: 25px"}= "Registrations - Attendees (#{(@attendees.to_f / @registered * 100).round }%)"
- else
%h4{:style => "text-indent: 25px"}= "Registrations - Attendees"
.row-fluid
.span12#registrations_attendees
= render :partial => "registrations_attendees"
- else - else
%h4{:style => "text-indent: 25px"}= "Registrations - Attendees" %h5 There are no registrations yet.
.row-fluid
.span12#registrations_attendees
.span4 .col-md-4
%h4{:style => "text-indent: 10px"}= "Attendance of pre-registered" - if @registered > 0
.row-fluid %h4{:style => "text-indent: 10px"}= "Attendance of pre-registered"
.span12#registered_attended .row-fluid
.span12#registered_attended
= render :partial => "registered_attended"
.span4 .col-md-4
%h4{:style => "text-indent: 25px"}= "% of pre-registered" - if @registered > 0
.row-fluid %h4{:style => "text-indent: 25px"}= "% of pre-registered"
.span12#preregistered_onsite .row-fluid
.span12#preregistered_onsite
= render :partial => "preregistered_onsite"
.row-fluid .row
.span6 .col-md-6
%h4= "Other Info" - if @registered > 0
.row-fluid %h4= "Other Info"
.span12#other_info .row-fluid
.span12#other_info
= render :partial => "other_info"
.span6 .col-md-6
%h4{:style => "text-indent: 98px"}= "Registrations over time" - if @registered > 0
.row-fluid %h4{:style => "text-indent: 98px"}= "Registrations over time"
.span12#registered_time .row-fluid
.span12#registered_time
= render :partial => "registered_attended" = render :partial => "registered_time"
= 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
%h2 .row-fluid
= "Non-Free Tickets(#{@tickets.count})" .span12
.span4#tickets_time %h2
= render :partial => "tickets_time" = "Non-Free Tickets (#{@tickets.count})"
.row-fluid
.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,9 +1,8 @@
.container-fluid .row
.row-fluid .col-md-3
.span3 = render 'admin/conference/sidebar'
= render 'admin/conference/sidebar' .col-md-9
.span9 = 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 = f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}

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' .col-md-9
.span9 = 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,11 +1,10 @@
.container-fluid .row
.row-fluid .col-md-3
.span3 = render 'admin/conference/sidebar'
= render 'admin/conference/sidebar' .col-md-9
.span9 = 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} = f.input :website
= f.input :website = f.input :description, :input_html => { :rows => 10, :cols => 20 }
= f.input :description, :input_html => { :rows => 10, :cols => 20 } = 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,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,19 +1,27 @@
%table.table.table-striped.table-bordered.table-hover#speakertable .well
%thead %table.table.table-striped.table-bordered.table-hover#volunteerstable
%th First Name %thead
%th Last Name %th First Name
%th Email %th Last Name
%th Mobile %th Email
%th Languages %th Mobile
%th Experience %th Languages
%th Tshirt Size %th Experience
%tbody %th Tshirt Size
- @volunteers.each do |volunteer| %tbody
%tr - @volunteers.each do |volunteer|
%td= volunteer.first_name %tr
%td= volunteer.last_name %td= volunteer.first_name
%td= volunteer.email %td= volunteer.last_name
%td= volunteer.mobile %td= volunteer.email
%td= volunteer.languages %td= volunteer.mobile
%td= volunteer.volunteer_experience %td= volunteer.languages
%td= volunteer.tshirt %td= volunteer.volunteer_experience
%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' .col-md-9
.span9 = 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 = f.input :use_volunteers, :label => "Enable Volunteering"
.span5 .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,48 +1,19 @@
.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"
%li - if @conference.use_volunteers
= link_to "Volunteer", "#volunteer-content", "data-toggle"=>"tab" %li
= 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
#volunteer-content.tab-pane - if @conference.use_volunteers
= render 'conference_registration/volunteer', :f => f #volunteer-content.tab-pane
= render 'conference_registration/volunteer', :f => f
- if @registered - if @registered
= f.action :submit, :button_html => { :value => "Update Registration", :class => "btn btn-primary" } = f.action :submit, :button_html => { :value => "Update Registration", :class => "btn btn-primary" }
= link_to "Unregister", register_conference_path(@conference.short_title),:method => :delete, :class => "btn btn-danger", = link_to "Unregister", register_conference_path(@conference.short_title),:method => :delete, :class => "btn btn-danger",

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,83 +1,59 @@
%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
- if @conference && !@conference.short_title.nil? %button{"data-target"=>".navbar-collapse", "data-toggle"=>"collapse", :class=>"navbar-toggle", :type=>"button"}
%span.brand %span.sr-only
= @conference.short_title Toggle navigation
.nav-collapse.collapse %span.icon-bar
/ The Admin Menu for Conferences / %span.icon-bar
- if user_signed_in? %span.icon-bar
- if has_role?(current_user, "admin") || has_role?(current_user, "organizer") = link_to "OSEM", root_path, :class => 'navbar-brand', :title => "Open Source Event Manager"
- if controller.class.name.split("::").first=="Admin" .collapse.navbar-collapse
- if @conference and !@conference.short_title.nil? - if @conference && !@conference.short_title.nil?
%ul.nav %p.navbar-text
%li.nav-header.hidden-desktop = @conference.short_title
= @conference.short_title - if user_signed_in?
%li{:class=> active_nav_li(admin_conference_path(@conference.short_title))} - if has_role?(current_user, "admin") || has_role?(current_user, "organizer")
= link_to(admin_conference_path(@conference.short_title)) do - if controller.class.name.split("::").first=="Admin"
%i.icon-wrench - if @conference and not @conference.short_title.nil?
Settings = render 'layouts/admin_menu'
%li{:class=> active_nav_li(admin_conference_registrations_path(@conference.short_title))} %ul.nav.navbar-nav.navbar-right
= link_to(admin_conference_registrations_path(@conference.short_title)) do %li.dropdown
%i.icon-user %a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"}
Registrations - if not current_user.person.public_name.empty?
- if @conference.use_supporter_levels? and @conference.supporter_levels.length > 0 #{current_user.person.public_name}
%li{:class=> active_nav_li(admin_conference_supporters_path(@conference.short_title))} -else
= link_to(admin_conference_supporters_path(@conference.short_title)) do #{current_user.email}
%i.icon-star = image_tag(current_user.person.gravatar_url(:size => "18"), :title => "Yo #{current_user.person.public_name}!")
Supporters %b.caret
%li{:class=> active_nav_li(admin_conference_events_path(@conference.short_title))} %ul.dropdown-menu
= link_to(admin_conference_events_path(@conference.short_title)) do = render 'layouts/user_menu'
%i.icon-comment - else
Events %ul.nav.navbar-nav.navbar-right
%li{:class=> active_nav_li(admin_conference_stats_path(@conference.short_title))} - if current_page?(new_registration_path('user'))
= link_to(admin_conference_stats_path(@conference.short_title)) do %li.active
%i.icon-tasks = link_to(new_registration_path('user')) do
Statistics %span.glyphicon.glyphicon-heart
%li{:class=> active_nav_li(admin_conference_volunteers_list_path(@conference.short_title))} Sign Up
= link_to(admin_conference_volunteers_list_path(@conference.short_title)) do - else
%i.icon-user %li
Volunteers = link_to(new_registration_path('user')) do
%li %span.glyphicon.glyphicon-heart
= link_to(admin_conference_schedule_path(@conference.short_title), :target => "_blank") do Sign Up
%i.icon-calendar %li.dropdown.visible-desktop
Schedule %a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"}
%ul.nav.hidden-desktop %span.glyphicon.glyphicon-user
= render 'layouts/user_menu' Sign In
%ul.nav.pull-right.visible-desktop %span.caret
%li.dropdown .dropdown-menu{:style => "padding: 17px;"}
%a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"} = form_tag user_session_path do
#{current_user.person.public_name} (#{current_user.email}) = text_field_tag 'user[email]'
= image_tag(current_user.person.gravatar_url(:size => "18"), :title => "Yo #{current_user.person.public_name}!") = password_field_tag 'user[password]'
%b.caret %label.checkbox
%ul.dropdown-menu{:style => "padding: 15px;"} = check_box_tag 'user[remember_me]'
= render 'layouts/user_menu' Remember me
- else %button.btn.btn-block Sign in
%ul.nav.pull-right %br
- if current_page?(new_registration_path('user')) = link_to "Forgot your password?", new_password_path('user')
%li.active %li.hidden-lg
= link_to(new_registration_path('user')) do = link_to('Sign In', new_user_session_path)
%i.icon-heart
Sign Up
- else
%li
= link_to(new_registration_path('user')) do
%i.icon-heart
Sign Up
%li.dropdown.visible-desktop
%a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"}
%i.icon-user.icon-2x
Sign In
%i.icon-angle-down
.dropdown-menu{:style => "padding: 17px;"}
= form_tag user_session_path do
= text_field_tag 'user[email]'
= password_field_tag 'user[password]'
%label.checkbox
= check_box_tag 'user[remember_me]'
Remember me
%button.btn.btn-block Sign in
%br
= link_to "Forgot your password?", new_password_path('user')
%li.hidden-desktop
= 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,31 +17,26 @@
}); });
= yield(:head) = yield(:head)
%body %body
#wrap = render 'layouts/navigation'
.navbar.navbar-fixed-top .container#messages
.navbar-inner .row
.container-fluid .col-md-12
= render 'layouts/navigation' = render 'layouts/messages'
.container#messages %noscript
.row :css
.span12 #content {
= render 'layouts/messages' display: none;
%noscript }
:css %h2
#content { JavaScript is not enabled
display: none; %p
} OSEM requires JavaScript to be enabled to function. Please turn on JavaScript in your browser's settings and reload the page to continue.
%h2 .container#content
JavaScript is not enabled = yield
%p
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
= 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,36 +1,34 @@
.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}" - if @conference.cfp_open? || organizer_or_admin?
.pull-right{:style=>"margin-top:20px;"} = link_to "New Proposal", new_conference_proposal_path(@conference.short_title), :class => "btn btn-primary pull-right"
- if @conference.cfp_open? || organizer_or_admin? - if @person.proposal_count(@conference) > 0
= link_to "New Proposal", new_conference_proposal_path(@conference.short_title), :class => "btn btn-primary" .row
- if @person.proposal_count(@conference) > 0 .col-md-12
.row-fluid %table.table.table-bordered.table-striped
.span12 %thead
%table.table.table-bordered.table-striped %th
%thead %b Title
%th %th
%b Title %b Status
%th %th
%b Status - @events.each do |event|
%th %tr
- @events.each do |event| %td
%tr = link_to event.title, conference_proposal_path(@conference.short_title, event.id)
%td %td
= link_to event.title, conference_proposal_path(@conference.short_title, event.id) = event.public_state
%td - if event.state == 'confirmed' && event.require_registration == true
= event.public_state (Pre-registered: #{pre_registered(event).count})
- if event.state == 'confirmed' && event.require_registration == true - if event.confirmed? && !@conference.user_registered?(current_user)
(Pre-registered: #{pre_registered(event).count}) %br
- if event.confirmed? && !@conference.user_registered?(current_user) = link_to "Register to attend", register_conference_path(@conference.short_title), :style => "font-size:10px;"
%br %td
= link_to "Register to attend", register_conference_path(@conference.short_title), :style => "font-size:10px;" .pull-right
%td - if event.transition_possible? :confirm
.pull-right = link_to "Confirm", conference_proposal_confirm_path(@conference.short_title, event, :send_mail=>false), :method => :put, :class => "btn btn-mini btn-success"
- if event.transition_possible? :confirm = link_to "Edit", edit_conference_proposal_path(@conference.short_title, event.id), :class => "btn btn-mini btn-primary"
= link_to "Confirm", conference_proposal_confirm_path(@conference.short_title, event, :send_mail=>false), :method => :put, :class => "btn btn-mini btn-success" = link_to "Withdraw", conference_proposal_path(@conference.short_title, event.id), :method => :delete,
= link_to "Edit", edit_conference_proposal_path(@conference.short_title, event.id), :class => "btn btn-mini btn-primary" :confirm => "Are you sure you want to withdraw this proposal?", :class => "btn btn-mini btn-danger"
= link_to "Withdraw", conference_proposal_path(@conference.short_title, event.id), :method => :delete,
:confirm => "Are you sure you want to withdraw this proposal?", :class => "btn btn-mini btn-danger"

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
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=> request.ssl? ? "https://" : "http://" + "www.youtube.com/embed/#{@event.media_id}?rel=0"}
-else -else
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=>"http://www.youtube.com/embed/Eiv4e5ZxTmg?rel=0"} %div.well.well-lg="No video of the event yet, sorry! Meanwhile..."
.row-fluid .row
.span8 .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