Merged master from upstream, local changes
This commit is contained in:
commit
109312fc51
106 changed files with 1924 additions and 10572 deletions
12
Gemfile
12
Gemfile
|
|
@ -1,6 +1,6 @@
|
|||
source 'https://rubygems.org'
|
||||
|
||||
gem 'rails', '3.2.15'
|
||||
gem 'rails', '3.2.17'
|
||||
|
||||
# Bundle edge Rails instead:
|
||||
# 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
|
||||
# in production environments by default.
|
||||
group :assets do
|
||||
gem 'sass-rails', '~> 3.2.3'
|
||||
# gem 'coffee-rails', '~> 3.2.1'
|
||||
gem 'bootstrap-sass'
|
||||
|
||||
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
|
||||
gem 'therubyracer', :platforms => :ruby
|
||||
|
|
@ -22,11 +20,12 @@ group :development, :test do
|
|||
gem 'pry'
|
||||
gem 'mysql2'
|
||||
gem 'thin'
|
||||
gem 'rspec-rails', '2.11.0'
|
||||
gem 'letter_opener'
|
||||
end
|
||||
|
||||
group :production do
|
||||
gem 'mysql2'
|
||||
gem 'rspec-rails', '2.11.0'
|
||||
end
|
||||
|
||||
group :test do
|
||||
|
|
@ -38,13 +37,15 @@ gem 'paperclip', '~> 3.0'
|
|||
gem 'jquery-rails'
|
||||
gem 'jquery-ui-rails'
|
||||
gem 'jquery-fileupload-rails'
|
||||
gem 'devise', '~> 2.2'
|
||||
gem 'devise'
|
||||
gem 'cancan'
|
||||
gem "haml"
|
||||
gem 'bcrypt-ruby', '~> 3.0.0'
|
||||
#gem 'node'
|
||||
gem 'paper_trail'
|
||||
gem 'formtastic-bootstrap'
|
||||
gem 'bootstrap-sass'
|
||||
gem 'sass-rails', '>= 3.2'
|
||||
gem 'cocoon'
|
||||
gem 'transitions', :require => ["transitions", "active_record/transitions"]
|
||||
gem 'acts_as_commentable_with_threading'
|
||||
|
|
@ -53,3 +54,4 @@ gem 'prawn_rails'
|
|||
gem 'gravtastic'
|
||||
gem 'active_model_serializers'
|
||||
gem 'axlsx_rails'
|
||||
gem 'd3_rails'
|
||||
|
|
|
|||
177
Gemfile.lock
177
Gemfile.lock
|
|
@ -1,13 +1,12 @@
|
|||
GEM
|
||||
remote: https://rubygems.org/
|
||||
specs:
|
||||
Ascii85 (1.0.2)
|
||||
actionmailer (3.2.15)
|
||||
actionpack (= 3.2.15)
|
||||
actionmailer (3.2.17)
|
||||
actionpack (= 3.2.17)
|
||||
mail (~> 2.5.4)
|
||||
actionpack (3.2.15)
|
||||
activemodel (= 3.2.15)
|
||||
activesupport (= 3.2.15)
|
||||
actionpack (3.2.17)
|
||||
activemodel (= 3.2.17)
|
||||
activesupport (= 3.2.17)
|
||||
builder (~> 3.0.0)
|
||||
erubis (~> 2.7.0)
|
||||
journey (~> 1.0.4)
|
||||
|
|
@ -17,26 +16,27 @@ GEM
|
|||
sprockets (~> 2.2.1)
|
||||
active_model_serializers (0.8.1)
|
||||
activemodel (>= 3.0)
|
||||
activemodel (3.2.15)
|
||||
activesupport (= 3.2.15)
|
||||
activemodel (3.2.17)
|
||||
activesupport (= 3.2.17)
|
||||
builder (~> 3.0.0)
|
||||
activerecord (3.2.15)
|
||||
activemodel (= 3.2.15)
|
||||
activesupport (= 3.2.15)
|
||||
activerecord (3.2.17)
|
||||
activemodel (= 3.2.17)
|
||||
activesupport (= 3.2.17)
|
||||
arel (~> 3.0.2)
|
||||
tzinfo (~> 0.3.29)
|
||||
activeresource (3.2.15)
|
||||
activemodel (= 3.2.15)
|
||||
activesupport (= 3.2.15)
|
||||
activesupport (3.2.15)
|
||||
activeresource (3.2.17)
|
||||
activemodel (= 3.2.17)
|
||||
activesupport (= 3.2.17)
|
||||
activesupport (3.2.17)
|
||||
i18n (~> 0.6, >= 0.6.4)
|
||||
multi_json (~> 1.0)
|
||||
acts_as_commentable_with_threading (1.1.3)
|
||||
acts_as_commentable_with_threading (1.2.0)
|
||||
activerecord (>= 3.0)
|
||||
activesupport (~> 3.0)
|
||||
activesupport (>= 3.0)
|
||||
awesome_nested_set (>= 2.0)
|
||||
afm (0.2.0)
|
||||
arel (3.0.2)
|
||||
addressable (2.3.5)
|
||||
arel (3.0.3)
|
||||
atomic (1.1.16)
|
||||
awesome_nested_set (2.1.6)
|
||||
activerecord (>= 3.0.0)
|
||||
axlsx (2.0.1)
|
||||
|
|
@ -46,8 +46,9 @@ GEM
|
|||
axlsx_rails (0.1.5)
|
||||
axlsx
|
||||
rails (>= 3.1)
|
||||
bcrypt (3.1.7)
|
||||
bcrypt-ruby (3.0.1)
|
||||
bootstrap-sass (2.3.2.2)
|
||||
bootstrap-sass (3.1.1.0)
|
||||
sass (~> 3.2)
|
||||
builder (3.0.4)
|
||||
cancan (1.6.10)
|
||||
|
|
@ -58,81 +59,82 @@ GEM
|
|||
rack-test (>= 0.5.4)
|
||||
selenium-webdriver (~> 2.0)
|
||||
xpath (~> 0.1.4)
|
||||
childprocess (0.3.9)
|
||||
childprocess (0.5.1)
|
||||
ffi (~> 1.0, >= 1.0.11)
|
||||
climate_control (0.0.3)
|
||||
activesupport (>= 3.0)
|
||||
cocaine (0.5.2)
|
||||
cocaine (0.5.3)
|
||||
climate_control (>= 0.0.3, < 1.0)
|
||||
cocoon (1.2.1)
|
||||
coderay (1.0.9)
|
||||
cocoon (1.2.5)
|
||||
coderay (1.1.0)
|
||||
d3_rails (3.4.3)
|
||||
railties (>= 3.1.0)
|
||||
daemons (1.1.9)
|
||||
devise (2.2.7)
|
||||
bcrypt-ruby (~> 3.0)
|
||||
devise (3.2.4)
|
||||
bcrypt (~> 3.0)
|
||||
orm_adapter (~> 0.1)
|
||||
railties (~> 3.1)
|
||||
warden (~> 1.2.1)
|
||||
railties (>= 3.2.6, < 5)
|
||||
thread_safe (~> 0.1)
|
||||
warden (~> 1.2.3)
|
||||
diff-lcs (1.1.3)
|
||||
erubis (2.7.0)
|
||||
eventmachine (1.0.3)
|
||||
execjs (2.0.2)
|
||||
ffi (1.9.0)
|
||||
ffi (1.9.3)
|
||||
formtastic (2.2.1)
|
||||
actionpack (>= 3.0)
|
||||
formtastic-bootstrap (2.1.3)
|
||||
formtastic (~> 2.2)
|
||||
formtastic-bootstrap (3.0.0)
|
||||
formtastic (>= 2.2)
|
||||
gravtastic (3.2.6)
|
||||
haml (4.0.3)
|
||||
haml (4.0.5)
|
||||
tilt
|
||||
hashery (2.1.1)
|
||||
hike (1.2.3)
|
||||
htmlentities (4.3.1)
|
||||
i18n (0.6.5)
|
||||
i18n (0.6.9)
|
||||
journey (1.0.4)
|
||||
jquery-fileupload-rails (0.4.1)
|
||||
actionpack (>= 3.1)
|
||||
railties (>= 3.1)
|
||||
jquery-rails (3.0.4)
|
||||
jquery-rails (3.1.0)
|
||||
railties (>= 3.0, < 5.0)
|
||||
thor (>= 0.14, < 2.0)
|
||||
jquery-ui-rails (4.0.5)
|
||||
jquery-ui-rails (4.1.2)
|
||||
railties (>= 3.1.0)
|
||||
json (1.8.1)
|
||||
launchy (2.4.2)
|
||||
addressable (~> 2.3)
|
||||
letter_opener (1.2.0)
|
||||
launchy (~> 2.2)
|
||||
libv8 (3.16.14.3)
|
||||
mail (2.5.4)
|
||||
mime-types (~> 1.16)
|
||||
treetop (~> 1.4.8)
|
||||
method_source (0.8.2)
|
||||
mime-types (1.25)
|
||||
mini_portile (0.5.1)
|
||||
multi_json (1.8.2)
|
||||
mysql2 (0.3.13)
|
||||
nokogiri (1.6.0)
|
||||
mime-types (1.25.1)
|
||||
mini_portile (0.5.2)
|
||||
multi_json (1.9.2)
|
||||
mysql2 (0.3.15)
|
||||
nokogiri (1.6.1)
|
||||
mini_portile (~> 0.5.0)
|
||||
orm_adapter (0.4.0)
|
||||
paper_trail (2.7.2)
|
||||
activerecord (~> 3.0)
|
||||
railties (~> 3.0)
|
||||
paperclip (3.5.1)
|
||||
orm_adapter (0.5.0)
|
||||
paper_trail (3.0.0)
|
||||
activerecord (>= 3.0, < 5.0)
|
||||
activesupport (>= 3.0, < 5.0)
|
||||
paperclip (3.5.4)
|
||||
activemodel (>= 3.0.0)
|
||||
activesupport (>= 3.0.0)
|
||||
cocaine (~> 0.5.0)
|
||||
cocaine (~> 0.5.3)
|
||||
mime-types
|
||||
pdf-reader (1.3.3)
|
||||
Ascii85 (~> 1.0.0)
|
||||
afm (~> 0.2.0)
|
||||
hashery (~> 2.0)
|
||||
ruby-rc4
|
||||
ttfunk
|
||||
polyglot (0.3.3)
|
||||
prawn (0.12.0)
|
||||
pdf-reader (>= 0.9.0)
|
||||
ttfunk (~> 1.0.2)
|
||||
pdf-core (0.1.6)
|
||||
polyglot (0.3.4)
|
||||
prawn (0.15.0)
|
||||
pdf-core (~> 0.1.3)
|
||||
ttfunk (~> 1.1.0)
|
||||
prawn_rails (0.0.11)
|
||||
prawn (>= 0.11.1)
|
||||
railties (>= 3.0.0)
|
||||
pry (0.9.12.2)
|
||||
coderay (~> 1.0.5)
|
||||
pry (0.9.12.6)
|
||||
coderay (~> 1.0)
|
||||
method_source (~> 0.8)
|
||||
slop (~> 3.4)
|
||||
rack (1.4.5)
|
||||
|
|
@ -142,22 +144,22 @@ GEM
|
|||
rack
|
||||
rack-test (0.6.2)
|
||||
rack (>= 1.0)
|
||||
rails (3.2.15)
|
||||
actionmailer (= 3.2.15)
|
||||
actionpack (= 3.2.15)
|
||||
activerecord (= 3.2.15)
|
||||
activeresource (= 3.2.15)
|
||||
activesupport (= 3.2.15)
|
||||
rails (3.2.17)
|
||||
actionmailer (= 3.2.17)
|
||||
actionpack (= 3.2.17)
|
||||
activerecord (= 3.2.17)
|
||||
activeresource (= 3.2.17)
|
||||
activesupport (= 3.2.17)
|
||||
bundler (~> 1.0)
|
||||
railties (= 3.2.15)
|
||||
railties (3.2.15)
|
||||
actionpack (= 3.2.15)
|
||||
activesupport (= 3.2.15)
|
||||
railties (= 3.2.17)
|
||||
railties (3.2.17)
|
||||
actionpack (= 3.2.17)
|
||||
activesupport (= 3.2.17)
|
||||
rack-ssl (~> 1.3.2)
|
||||
rake (>= 0.8.7)
|
||||
rdoc (~> 3.4)
|
||||
thor (>= 0.14.6, < 2.0)
|
||||
rake (10.1.0)
|
||||
rake (10.1.1)
|
||||
rdoc (3.12.2)
|
||||
json (~> 1.4)
|
||||
ref (1.0.5)
|
||||
|
|
@ -174,42 +176,45 @@ GEM
|
|||
activesupport (>= 3.0)
|
||||
railties (>= 3.0)
|
||||
rspec (~> 2.11.0)
|
||||
ruby-rc4 (0.1.5)
|
||||
rubyzip (1.0.0)
|
||||
sass (3.2.12)
|
||||
sass (3.2.14)
|
||||
sass-rails (3.2.6)
|
||||
railties (~> 3.2.0)
|
||||
sass (>= 3.1.10)
|
||||
tilt (~> 1.3)
|
||||
selenium-webdriver (2.37.0)
|
||||
childprocess (>= 0.2.5)
|
||||
selenium-webdriver (2.40.0)
|
||||
childprocess (>= 0.5.0)
|
||||
multi_json (~> 1.0)
|
||||
rubyzip (~> 1.0.0)
|
||||
rubyzip (~> 1.0)
|
||||
websocket (~> 1.0.4)
|
||||
slop (3.4.6)
|
||||
slop (3.4.7)
|
||||
sprockets (2.2.2)
|
||||
hike (~> 1.2)
|
||||
multi_json (~> 1.0)
|
||||
rack (~> 1.0)
|
||||
tilt (~> 1.1, != 1.3.0)
|
||||
therubyracer (0.12.0)
|
||||
sqlite3 (1.3.9)
|
||||
therubyracer (0.12.1)
|
||||
libv8 (~> 3.16.14.0)
|
||||
ref
|
||||
thin (1.5.1)
|
||||
thin (1.6.2)
|
||||
daemons (>= 1.0.9)
|
||||
eventmachine (>= 0.12.6)
|
||||
eventmachine (>= 1.0.0)
|
||||
rack (>= 1.0.0)
|
||||
thor (0.18.1)
|
||||
thread_safe (0.3.1)
|
||||
atomic (>= 1.1.7, < 2)
|
||||
tilt (1.4.1)
|
||||
transitions (0.1.11)
|
||||
transitions (0.1.12)
|
||||
treetop (1.4.15)
|
||||
polyglot
|
||||
polyglot (>= 0.3.1)
|
||||
ttfunk (1.0.3)
|
||||
ttfunk (1.1.1)
|
||||
tzinfo (0.3.38)
|
||||
uglifier (2.2.1)
|
||||
uglifier (2.4.0)
|
||||
execjs (>= 0.3.0)
|
||||
multi_json (~> 1.0, >= 1.0.2)
|
||||
json (>= 1.8.0)
|
||||
warden (1.2.3)
|
||||
rack (>= 1.0)
|
||||
websocket (1.0.7)
|
||||
|
|
@ -229,22 +234,26 @@ DEPENDENCIES
|
|||
cancan
|
||||
capybara (= 1.1.2)
|
||||
cocoon
|
||||
devise (~> 2.2)
|
||||
d3_rails
|
||||
devise
|
||||
formtastic-bootstrap
|
||||
gravtastic
|
||||
haml
|
||||
jquery-fileupload-rails
|
||||
jquery-rails
|
||||
jquery-ui-rails
|
||||
letter_opener
|
||||
mysql2
|
||||
paper_trail
|
||||
paperclip (~> 3.0)
|
||||
prawn
|
||||
prawn_rails
|
||||
pry
|
||||
rails (= 3.2.15)
|
||||
rails (= 3.2.17)
|
||||
rspec-rails (= 2.11.0)
|
||||
sass-rails (~> 3.2.3)
|
||||
sass-rails (>= 3.2)
|
||||
sqlite3
|
||||
therubyracer
|
||||
thin
|
||||
transitions
|
||||
|
|
|
|||
|
|
@ -19,10 +19,10 @@
|
|||
//= require cocoon
|
||||
//= require bootstrap
|
||||
//= require osem
|
||||
//= require d3.v3
|
||||
//= require d3.v3.min
|
||||
//= require d3
|
||||
|
||||
$(document).ready(function() {
|
||||
$('a[disabled=disabled]').click(function(event){
|
||||
return false;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
8774
app/assets/javascripts/d3.v3.js
vendored
8774
app/assets/javascripts/d3.v3.js
vendored
File diff suppressed because it is too large
Load diff
5
app/assets/javascripts/d3.v3.min.js
vendored
5
app/assets/javascripts/d3.v3.min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1,4 +1,9 @@
|
|||
$(function() {
|
||||
$("#event_media_type").change(function () {
|
||||
$(".media-type").hide();
|
||||
$('#' + $(this).val().toLowerCase() + '-help').show();
|
||||
});
|
||||
|
||||
$('.dropdown-toggle').dropdown();
|
||||
$("#conference-start-datepicker").datepicker({
|
||||
dateFormat: 'yy/mm/dd',
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
/*
|
||||
*= require strap-on.css.scss
|
||||
*= require formtastic-bootstrap
|
||||
*= require osem
|
||||
*= require jquery-ui-1.9.2.custom
|
||||
*= require jquery.fileupload-ui
|
||||
*= require jquery-ui-timepicker-addon
|
||||
*= require jquery.dataTables_themeroller
|
||||
*= require osem
|
||||
*= require osem-rating
|
||||
*= require osem-schedule
|
||||
*= require osem-schedule-print
|
||||
*/
|
||||
|
|
|
|||
18
app/assets/stylesheets/osem-rating.css.scss
Normal file
18
app/assets/stylesheets/osem-rating.css.scss
Normal 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;
|
||||
}
|
||||
|
||||
57
app/assets/stylesheets/osem-schedule.css.scss
Normal file
57
app/assets/stylesheets/osem-schedule.css.scss
Normal 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);
|
||||
}
|
||||
|
|
@ -1,207 +1,29 @@
|
|||
/* Sticky footer styles
|
||||
-------------------------------------------------- */
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
/* The html and body elements cannot have any padding or margin. */
|
||||
html {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
}
|
||||
/* Styling for voting on proposals*/
|
||||
.myrating.bright { background-image: url(../assets/star-bright.png); }
|
||||
.myrating.glow { background-image: url(../assets/star-glow.png); }
|
||||
.othersrating.bright { background-image: url(../assets/star-bright.png); }
|
||||
.avgrating.bright { background-image: url(../assets/star-bright.png); }
|
||||
.avgrating {
|
||||
background: url(../assets/star.png) 0 0;
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
display: inline-block;
|
||||
}
|
||||
.myrating, .othersrating {
|
||||
background: url(../assets/star.png) 0 0;
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
float: left;
|
||||
body {
|
||||
/* Margin bottom by footer height */
|
||||
margin-bottom: 60px;
|
||||
}
|
||||
|
||||
/* Wrapper for page content to push down footer */
|
||||
#wrap {
|
||||
min-height: 100%;
|
||||
height: auto !important;
|
||||
height: 100%;
|
||||
/* Negative indent footer by it's height */
|
||||
margin: 0 auto -60px;
|
||||
body > #messages {
|
||||
padding: 60px 15px 0;
|
||||
}
|
||||
|
||||
/* Set the fixed height of the footer here */
|
||||
#push,
|
||||
#footer {
|
||||
height: 60px;
|
||||
}
|
||||
#footer {
|
||||
background-color: #f5f5f5;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
/* Set the fixed height of the footer here */
|
||||
height: 60px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
.container .credit {
|
||||
margin: 20px 0;
|
||||
.container .text-muted {
|
||||
margin: 20px 0;
|
||||
}
|
||||
|
||||
/* Lastly, apply responsive CSS fixes as necessary */
|
||||
@media (max-width: 767px) {
|
||||
#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);
|
||||
#footer > .container {
|
||||
padding: 15px;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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=);
|
||||
}
|
||||
|
|
@ -1,15 +1,8 @@
|
|||
$navbarBackground: #299a0b;
|
||||
$navbarBackgroundHighlight: #299a0b;
|
||||
$navbarBorder: 1px solid #d4d4d4;
|
||||
$navbarText: #ffffff;
|
||||
$navbarLinkColor: white;
|
||||
$navbarLinkColorHover: black;
|
||||
$navbarLinkBackgroundActive: #DFE0DF;
|
||||
$navbar-default-bg: #299a0b;
|
||||
$navbar-default-link-active-bg: #DFE0DF;
|
||||
$navbar-default-border: 1px solid #d4d4d4;
|
||||
$navbar-default-color: #ffffff;
|
||||
$navbar-default-link-color: #ffffff;
|
||||
$navbar-default-link-hover-color: #000000;
|
||||
|
||||
@import "bootstrap";
|
||||
@import "bootstrap-responsive";
|
||||
|
||||
/* Set to navbarBackgroundHighlight otherwise */
|
||||
.navbar .nav > li > a {
|
||||
text-shadow: none;
|
||||
}
|
||||
|
|
@ -3,9 +3,8 @@ class Admin::StatsController < ApplicationController
|
|||
|
||||
def index
|
||||
@registrations = @conference.registrations.includes(:person).order("registrations.created_at ASC")
|
||||
|
||||
@attendees = @conference.registrations.where("attended = ?", true).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_attended = @conference.registrations.where("created_at < ? AND attended = ?", @conference.start_date, true).count
|
||||
|
||||
|
|
@ -16,34 +15,118 @@ class Admin::StatsController < ApplicationController
|
|||
@handicapped_access_attended = @conference.registrations.where(handicapped_access_required: true)
|
||||
@handicapped_access_attended = @handicapped_access_attended.where(attended: 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
|
||||
@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
|
||||
@tickets = @conference.registrations.joins(:supporter_registration => :supporter_level)
|
||||
@tickets = @tickets.where("supporter_levels.title NOT LIKE ? ", "%Free%")
|
||||
|
||||
@mydays = []
|
||||
@mytickets = []
|
||||
@tickets_time = []
|
||||
|
||||
if @conference.registration_start_date and @conference.end_date
|
||||
(@conference.registration_start_date..@conference.end_date).each do |day|
|
||||
day_reg_count = @registrations.where("created_at LIKE '%#{day}%' ").count
|
||||
day_ticket_count = @tickets.where("supporter_registrations.created_at LIKE '%#{day}%' ").count
|
||||
if day_reg_count != 0
|
||||
@mydays << {"status" => "#{day}", "value" => day_reg_count}
|
||||
end
|
||||
@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
|
||||
if day_ticket_count !=0
|
||||
@mytickets << {"status" => "#{day}", "ticket" => "#{level}", "value" => day_ticket_count}
|
||||
end
|
||||
if @conference.registration_start_date and @conference.end_date and @registered > 0 and @supporter_levels
|
||||
start_date = @conference.registration_start_date
|
||||
end_date = @conference.end_date
|
||||
levels = [];
|
||||
@conference.supporter_levels.each do |level|
|
||||
@tickets_time << {"key" => level.title, "values" => []}
|
||||
levels << ["#{level.title}"]
|
||||
end
|
||||
|
||||
(start_date..end_date).each do |day|
|
||||
if @tickets.where("supporter_registrations.created_at LIKE ?", "%#{day}%").where("supporter_levels.title" => levels).count != 0
|
||||
@conference.supporter_levels.each do |level|
|
||||
|
||||
day_ticket_count = @tickets.where("supporter_registrations.created_at LIKE ? AND supporter_levels.title LIKE ?", "%#{day}%", "%#{level.title}%").count
|
||||
|
||||
index = @tickets_time.index {|v| v["key"] == "#{level.title}"}
|
||||
@tickets_time[index]["values"] << {"label" => "#{day}", "value" => day_ticket_count}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@tickets_distribution = []
|
||||
@tickets_time.each do |ticket|
|
||||
value = ticket["values"].map{|x| x["value"]}.sum
|
||||
percent = (value.to_f / @tickets.count * 100).round(2)
|
||||
@tickets_distribution << {"status" => ticket["key"], "value" => value, "percent" => percent}
|
||||
end
|
||||
|
||||
#OTHER_INFO chart / To be 'Questions'
|
||||
@other_info = [
|
||||
{"status" => "with partner (registered)", "value" => @registered_with_partner},
|
||||
{"status" => "with partner (attended)", "value" => @attended_with_partner},
|
||||
|
|
@ -52,8 +135,58 @@ class Admin::StatsController < ApplicationController
|
|||
{"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
|
||||
|
||||
def speaker_reg(speaker)
|
||||
speaker.registrations.where("conference_id = ? AND person_id = ?", @conference.id, speaker.id).first
|
||||
end
|
||||
|
|
@ -74,4 +207,4 @@ class Admin::StatsController < ApplicationController
|
|||
helper_method :speaker_diet
|
||||
helper_method :diet_count
|
||||
helper_method :social_event_count
|
||||
end
|
||||
end
|
||||
|
|
@ -6,16 +6,20 @@ class Admin::VolunteersController < ApplicationController
|
|||
|
||||
def show
|
||||
@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
|
||||
|
||||
def update
|
||||
@conference = Conference.find_all_by_short_title(params[:conference_id]).first
|
||||
begin
|
||||
@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
|
||||
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
|
||||
|
|
|
|||
|
|
@ -9,7 +9,13 @@ class ApplicationController < ActionController::Base
|
|||
end
|
||||
|
||||
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
|
||||
|
||||
def get_conferences
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ class Conference < ActiveRecord::Base
|
|||
:event_types_attributes, :registration_start_date, :registration_end_date, :logo,
|
||||
:questions_attributes, :question_ids, :answers_attributes, :answer_ids,
|
||||
: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
|
||||
|
||||
|
|
|
|||
|
|
@ -8,12 +8,12 @@ class EmailSettings < ActiveRecord::Base
|
|||
"email" => person.email,
|
||||
"name" => person.public_name,
|
||||
"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?
|
||||
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
|
||||
h
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
class Event < ActiveRecord::Base
|
||||
include ActiveRecord::Transitions
|
||||
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
|
||||
|
||||
|
|
@ -25,10 +25,16 @@ class Event < ActiveRecord::Base
|
|||
accepts_nested_attributes_for :people
|
||||
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 :biography_exists
|
||||
validates :title, :presence => true
|
||||
validates :abstract, :presence => true
|
||||
validates :media_type, inclusion: {in: self.media_types.values}
|
||||
|
||||
scope :confirmed, where(:state => "confirmed")
|
||||
|
||||
|
|
|
|||
|
|
@ -4,4 +4,6 @@ class EventType < ActiveRecord::Base
|
|||
belongs_to :conference
|
||||
|
||||
validates :length, :numericality => {:greater_than => 0}
|
||||
|
||||
alias_attribute :name, :title
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,14 +1,13 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= 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 :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 :description, :hint => "Welcome text for the Call for Papers"
|
||||
= 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_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"}
|
||||
.row-fluid
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= 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 :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 :description, :hint => "Welcome text for the Call for Papers"
|
||||
= 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_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"}
|
||||
|
|
|
|||
|
|
@ -1,29 +1,26 @@
|
|||
.well.sidebar-nav
|
||||
%ul.nav.nav-list
|
||||
%li.nav-header
|
||||
=@conference.short_title
|
||||
Settings
|
||||
%li{:class=> active_nav_li(admin_conference_path(@conference.short_title))}
|
||||
= link_to "Conference", admin_conference_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_venue_info_path(@conference.short_title))}
|
||||
= link_to "Venue", admin_conference_venue_info_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_cfp_info_path(@conference.short_title))}
|
||||
= link_to "Call for Papers", admin_conference_cfp_info_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_rooms_list_path(@conference.short_title))}
|
||||
= link_to "Rooms", admin_conference_rooms_list_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_tracks_list_path(@conference.short_title))}
|
||||
= link_to "Tracks", admin_conference_tracks_list_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_eventtype_list_path(@conference.short_title))}
|
||||
= link_to "Event Types", admin_conference_eventtype_list_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_difficulty_levels_path(@conference.short_title))}
|
||||
= link_to "Difficulty Levels", admin_conference_difficulty_levels_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_social_events_path(@conference.short_title))}
|
||||
= link_to "Social Events", admin_conference_social_events_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_supporter_levels_path(@conference.short_title))}
|
||||
= link_to "Supporter Levels", admin_conference_supporter_levels_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_email_settings_path(@conference.short_title))}
|
||||
= link_to "Emails", admin_conference_email_settings_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_questions_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)
|
||||
%ul.nav.nav-pills.nav-stacked
|
||||
%li{:class=> active_nav_li(admin_conference_path(@conference.short_title))}
|
||||
= link_to "Conference", admin_conference_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_venue_info_path(@conference.short_title))}
|
||||
= link_to "Venue", admin_conference_venue_info_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_cfp_info_path(@conference.short_title))}
|
||||
= link_to "Call for Papers", admin_conference_cfp_info_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_rooms_list_path(@conference.short_title))}
|
||||
= link_to "Rooms", admin_conference_rooms_list_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_tracks_list_path(@conference.short_title))}
|
||||
= link_to "Tracks", admin_conference_tracks_list_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_eventtype_list_path(@conference.short_title))}
|
||||
= link_to "Event Types", admin_conference_eventtype_list_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_difficulty_levels_path(@conference.short_title))}
|
||||
= link_to "Difficulty Levels", admin_conference_difficulty_levels_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_social_events_path(@conference.short_title))}
|
||||
= link_to "Social Events", admin_conference_social_events_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_supporter_levels_path(@conference.short_title))}
|
||||
= link_to "Supporter Levels", admin_conference_supporter_levels_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_email_settings_path(@conference.short_title))}
|
||||
= link_to "Emails", admin_conference_email_settings_path(@conference.short_title)
|
||||
%li{:class=> active_nav_li(admin_conference_questions_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)
|
||||
|
|
|
|||
|
|
@ -1,20 +1,19 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= 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 :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 :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 :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 :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" }
|
||||
- if !@conference.logo.blank?
|
||||
= image_tag @conference.logo(:thumb)
|
||||
= 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.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= 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 :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 :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 :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 :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" }
|
||||
- if !@conference.logo.blank?
|
||||
= image_tag @conference.logo(:thumb)
|
||||
= 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.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar', :activated => "Diet"
|
||||
.span9
|
||||
= semantic_form_for(@conference, :url => admin_conference_dietary_update_path(@conference.short_title)) do |f|
|
||||
= f.input :use_dietary_choices, :label => false
|
||||
= dynamic_association :dietary_choices, "Dietary Choices", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.span3
|
||||
= render 'admin/conference/sidebar', :activated => "Diet"
|
||||
.span9
|
||||
= semantic_form_for(@conference, :url => admin_conference_dietary_update_path(@conference.short_title)) do |f|
|
||||
= f.input :use_dietary_choices, :label => false
|
||||
= dynamic_association :dietary_choices, "Dietary Choices", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
|
@ -1,9 +1,8 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= semantic_form_for(@conference, :url => admin_conference_difficulty_levels_path(@conference.short_title)) do |f|
|
||||
= f.input :use_difficulty_levels, :label => false
|
||||
= dynamic_association :difficulty_levels, "Difficulty_Levels", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= semantic_form_for(@conference, :url => admin_conference_difficulty_levels_path(@conference.short_title)) do |f|
|
||||
= f.input :use_difficulty_levels, :label => false
|
||||
= dynamic_association :difficulty_levels, "Difficulty_Levels", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
|
|
|||
|
|
@ -1,45 +1,43 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= link_to "Template Help", "#", :id => "template-help-link"
|
||||
#template-help
|
||||
Valid attributes:
|
||||
%table.table
|
||||
%tr
|
||||
%td {email}
|
||||
%td The user's email address
|
||||
%tr
|
||||
%td {name}
|
||||
%td The user's full name
|
||||
%tr
|
||||
%td {conference}
|
||||
%td The full conference title
|
||||
%tr
|
||||
%td {proposalslink}
|
||||
%td A link to the user's proposal page
|
||||
%tr
|
||||
%td {registrationlink}
|
||||
%td A link to the registration page
|
||||
%tr
|
||||
%td {eventtitle}
|
||||
%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?"
|
||||
= f.input :registration_subject
|
||||
= f.input :registration_email_template, :input_html => { :rows => 10, :cols => 20}
|
||||
= f.input :send_on_accepted, :label => false, :hint => "Send an email when the proposal is accepted?"
|
||||
= f.input :accepted_subject
|
||||
= f.input :accepted_email_template, :input_html => { :rows => 10, :cols => 20 }
|
||||
= f.input :send_on_rejected, :label => false, :hint => "Send an email when the proposal is rejected?"
|
||||
= f.input :rejected_subject
|
||||
= f.input :rejected_email_template, :input_html => { :rows => 10, :cols => 20 }
|
||||
= 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_without_registration_subject
|
||||
= f.input :confirmed_email_template, :input_html => { :rows => 10, :cols => 20 }
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= link_to "Template Help", "#", :id => "template-help-link"
|
||||
#template-help
|
||||
Valid attributes:
|
||||
%table.table
|
||||
%tr
|
||||
%td {email}
|
||||
%td The user's email address
|
||||
%tr
|
||||
%td {name}
|
||||
%td The user's full name
|
||||
%tr
|
||||
%td {conference}
|
||||
%td The full conference title
|
||||
%tr
|
||||
%td {proposalslink}
|
||||
%td A link to the user's proposal page
|
||||
%tr
|
||||
%td {registrationlink}
|
||||
%td A link to the registration page
|
||||
%tr
|
||||
%td {eventtitle}
|
||||
%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?"
|
||||
= f.input :registration_subject
|
||||
= f.input :registration_email_template, :input_html => { :rows => 10, :cols => 20}
|
||||
= f.input :send_on_accepted, :label => false, :hint => "Send an email when the proposal is accepted?"
|
||||
= f.input :accepted_subject
|
||||
= f.input :accepted_email_template, :input_html => { :rows => 10, :cols => 20 }
|
||||
= f.input :send_on_rejected, :label => false, :hint => "Send an email when the proposal is rejected?"
|
||||
= f.input :rejected_subject
|
||||
= f.input :rejected_email_template, :input_html => { :rows => 10, :cols => 20 }
|
||||
= 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_without_registration_subject
|
||||
= f.input :confirmed_email_template, :input_html => { :rows => 10, :cols => 20 }
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
||||
:javascript
|
||||
$(document).ready( function() {
|
||||
|
|
|
|||
|
|
@ -1,45 +1,42 @@
|
|||
.row-fluid
|
||||
.row
|
||||
.span12
|
||||
%h5{:style=>"text-align: right"}
|
||||
= link_to "Events Stats", "#", :id => "events-stats-link", :class => "btn btn-success"
|
||||
|
||||
#events-stats
|
||||
.span12
|
||||
%table.table.table-bordered.table-striped
|
||||
%thead
|
||||
%th
|
||||
- @mystates.each do |state|
|
||||
.row
|
||||
.col-md-12
|
||||
= link_to "Show Events Stats", "#", :id => "events-stats-link", :class => "btn btn-default pull-right"
|
||||
.clearfix
|
||||
#events-stats
|
||||
.span12
|
||||
%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"}
|
||||
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|
|
||||
Total
|
||||
%br
|
||||
No & Time
|
||||
%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"])
|
||||
%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"])
|
||||
|
||||
|
||||
:javascript
|
||||
|
|
|
|||
|
|
@ -1,15 +1,14 @@
|
|||
.row-fluid
|
||||
.span10
|
||||
.row
|
||||
.col-md-12
|
||||
%h3
|
||||
= @event.title
|
||||
%br
|
||||
%span.muted
|
||||
%small
|
||||
= @event.subtitle
|
||||
.span2
|
||||
= link_to "Edit", edit_admin_conference_event_path(@conference.short_title, @event), :class => "btn btn-mini btn-primary"
|
||||
= link_to "Edit", edit_admin_conference_event_path(@conference.short_title, @event), :class => "btn btn-mini btn-default pull-right"
|
||||
|
||||
.row-fluid
|
||||
.span12
|
||||
.row
|
||||
.col-md-12
|
||||
%table.table
|
||||
%tr
|
||||
%td{:style => "width:15%"}
|
||||
|
|
@ -161,7 +160,7 @@
|
|||
= 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!"
|
||||
|
||||
.row-fluid
|
||||
.row
|
||||
= link_to "Comments (#{@comment_count})", "#", :id => "event-comment-link"
|
||||
#comments-div
|
||||
%hr
|
||||
|
|
|
|||
|
|
@ -1,2 +1 @@
|
|||
.container
|
||||
= render 'proposal/form'
|
||||
= render 'proposal/form'
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
= render :partial => "events_stats"
|
||||
|
||||
.row-fluid
|
||||
.span12
|
||||
.row
|
||||
.col-md-12
|
||||
%h2
|
||||
Events
|
||||
- if @events
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
- if @conference.call_for_papers.rating != 0
|
||||
%td{:style => "width:96px"}
|
||||
- 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
|
||||
#{pluralize(event.voters.length, 'voter')}
|
||||
%br
|
||||
|
|
@ -49,7 +49,7 @@
|
|||
- else
|
||||
= label_tag "label_rating", "", :class => "avgrating"
|
||||
- else
|
||||
Rating: 0/#{@conference.call_for_papers.rating}
|
||||
0/#{@conference.call_for_papers.rating}
|
||||
%br
|
||||
|
||||
- if event.submitter.registrations.count < 1
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
#proposal-content.tab-pane.active
|
||||
= render 'proposal'
|
||||
#history-content.tab-pane
|
||||
.span12
|
||||
.col-md-12
|
||||
%table.table
|
||||
%thead
|
||||
%th
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= semantic_form_for(@conference, :url => admin_conference_eventtype_update_path(@conference.short_title)) do |f|
|
||||
= dynamic_association :event_types, "Event Types", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= semantic_form_for(@conference, :url => admin_conference_eventtype_update_path(@conference.short_title)) do |f|
|
||||
= dynamic_association :event_types, "Event Types", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
|
|
|||
|
|
@ -1,15 +1,14 @@
|
|||
.row-fluid
|
||||
.span6
|
||||
%h2
|
||||
People
|
||||
- if @people
|
||||
= "(#{@people.length})"
|
||||
.span6
|
||||
.pull-right{:style=>"margin-top:20px; margin-bottom:20px;"}
|
||||
= link_to "New person", new_admin_person_path, :class => "btn btn-success"
|
||||
.row
|
||||
.col-md-12
|
||||
.page-header
|
||||
%h1
|
||||
People
|
||||
- if @people
|
||||
= "(#{@people.length})"
|
||||
= link_to "New person", new_admin_person_path, :class => "btn btn-success pull-right"
|
||||
|
||||
.row-fluid
|
||||
.span12
|
||||
.row
|
||||
.col-md-12
|
||||
.well
|
||||
%table.table.table-striped.table-bordered.table-hover#people
|
||||
%thead
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
.row-fluid
|
||||
.span6
|
||||
.row
|
||||
.col-md-6
|
||||
%legend Question
|
||||
= f.input :title, :label => "Your Question"
|
||||
= f.input :question_type
|
||||
= 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"
|
||||
|
|
@ -1,31 +1,29 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
.pull-right
|
||||
%b= link_to "Create New Question","#", "data-toggle" => "modal", "data-target" => "#new-question", :class => "btn btn-success"
|
||||
%br
|
||||
%br
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
.pull-right
|
||||
%b= link_to "Create New Question","#", "data-toggle" => "modal", "data-target" => "#new-question", :class => "btn btn-success"
|
||||
%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|
|
||||
|
||||
.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?"
|
||||
|
||||
.modal.hide.fade{:id => "new-question", "role" => "dialog", "aria-hidden" => "true"}
|
||||
.modal-header
|
||||
%h3{:id => "new-question-header"}
|
||||
Add new question
|
||||
.modal-body
|
||||
= semantic_form_for(@new_question, :url => admin_conference_questions_path(@conference.short_title), :method => :post) do |f|
|
||||
= render :partial => "form", :locals => {:f => f}
|
||||
%button{:class => "btn btn-primary"}
|
||||
Save
|
||||
.pull-right
|
||||
%button{:class=> "btn btn-danger", "data-dismiss"=> "modal", "aria-hidden"=>"true"}
|
||||
Cancel
|
||||
.modal.fade{:id => "new-question", "role" => "dialog", "aria-hidden" => "true"}
|
||||
.modal-dialog
|
||||
.modal-content
|
||||
.modal-header
|
||||
%h3{:id => "new-question-header"}
|
||||
Add new question
|
||||
.modal-body
|
||||
= semantic_form_for(@new_question, :url => admin_conference_questions_path(@conference.short_title), :method => :post) do |f|
|
||||
= render :partial => "form", :locals => {:f => f}
|
||||
%button{:class => "btn btn-primary"}
|
||||
Save
|
||||
.pull-right
|
||||
%button{:class=> "btn btn-danger", "data-dismiss"=> "modal", "aria-hidden"=>"true"}
|
||||
Cancel
|
||||
|
|
|
|||
|
|
@ -1,41 +1,35 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span12
|
||||
%h3
|
||||
Edit registration of #{@person.public_name} (#{@person.email}) for #{@conference.title}
|
||||
%br
|
||||
.row-fluid
|
||||
.span12
|
||||
= 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|
|
||||
= p.input :first_name, :as => :string
|
||||
= p.input :last_name, :as => :string
|
||||
= p.label :Nickname, :as => :string
|
||||
= p.text_field :irc_nickname, :as => :string
|
||||
= p.label :Affiliation
|
||||
= p.text_field :company, :placeholder => "Company/User Group/nothing", :as => :string
|
||||
|
||||
= f.inputs "Registration Information" do
|
||||
- if @conference.use_supporter_levels? and @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 :attending_with_partner, :label => false
|
||||
= f.input :using_affiliated_lodging, :label => false
|
||||
= f.input :handicapped_access_required, :label => false
|
||||
= f.input :other_special_needs, :label => "Any other special needs?", :input_html => {:rows => 2, :class => "span6"}
|
||||
|
||||
- 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, :collection => @conference.social_events
|
||||
|
||||
= f.action :submit, :button_html => { :value => "Edit Registration", :class => "btn btn-primary" }
|
||||
.row
|
||||
.col-md-12
|
||||
%h3
|
||||
Edit registration of #{@person.public_name} (#{@person.email}) for #{@conference.title}
|
||||
%br
|
||||
.row
|
||||
.col-md-12
|
||||
= 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|
|
||||
= p.input :first_name, :as => :string
|
||||
= p.input :last_name, :as => :string
|
||||
= p.label :Nickname, :as => :string
|
||||
= p.text_field :irc_nickname, :as => :string
|
||||
= p.label :Affiliation
|
||||
= p.text_field :company, :placeholder => "Company/User Group/nothing", :as => :string
|
||||
= f.inputs "Registration Information" do
|
||||
- if @conference.use_supporter_levels? and @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 :attending_with_partner, :label => false
|
||||
= f.input :using_affiliated_lodging, :label => false
|
||||
= f.input :handicapped_access_required, :label => false
|
||||
= f.input :other_special_needs, :label => "Any other special needs?", :input_html => {:rows => 2, :class => "span6"}
|
||||
- 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, :collection => @conference.social_events
|
||||
= f.action :submit, :button_html => { :value => "Edit Registration", :class => "btn btn-primary" }
|
||||
:javascript
|
||||
$("#registration_supporter_registration_attributes_supporter_level_id").change(function () {
|
||||
var str = "";
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
.row
|
||||
.span12
|
||||
.col-md-12
|
||||
%h3
|
||||
Create new account and registration
|
||||
.row
|
||||
.span12
|
||||
.col-md-12
|
||||
= semantic_form_for(@registration, :url => admin_conference_registrations_new_path(@conference.short_title), :html => { :method => :put }) do |f|
|
||||
|
||||
= f.inputs "Your details" do
|
||||
|
|
|
|||
|
|
@ -1,16 +1,15 @@
|
|||
.row-fluid
|
||||
.span12
|
||||
.pull-right{:style=>"margin-top:20px; margin-bottom:20px;"}
|
||||
= link_to "New", admin_conference_registrations_new_path(@conference.short_title), :class => "btn btn-primary"
|
||||
= link_to "Export PDF", admin_conference_registrations_path(@conference.short_title, :format => :pdf), :class => "btn btn-success"
|
||||
= link_to "Export xlsx", {:format => :xlsx}, :class => "btn btn-success"
|
||||
.row-fluid
|
||||
.span12
|
||||
%h2
|
||||
Registrations
|
||||
- if @registrations
|
||||
= "(#{@registrations.length})"
|
||||
= " - Attended (#{@attended})"
|
||||
.row
|
||||
.col-md-12
|
||||
.page-header
|
||||
%h2
|
||||
Registrations
|
||||
- if @registrations
|
||||
= "(#{@registrations.length})"
|
||||
= " - Attended (#{@attended})"
|
||||
.btn-group.pull-right
|
||||
= link_to "New", admin_conference_registrations_new_path(@conference.short_title), :class => "btn btn-default"
|
||||
= link_to "Export PDF", admin_conference_registrations_path(@conference.short_title, :format => :pdf), :class => "btn btn-default"
|
||||
= link_to "Export XLS", {:format => :xlsx}, :class => "btn btn-default"
|
||||
%table.table.table-bordered.table-striped.table-hover#registrations
|
||||
%thead
|
||||
%th
|
||||
|
|
@ -47,7 +46,7 @@
|
|||
- else
|
||||
= registration.send(field.to_sym)
|
||||
%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
|
||||
= link_to "Edit", admin_conference_registrations_edit_path(@conference.short_title, :id => registration.id), :method => :get, :class => "btn btn-primary"
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= semantic_form_for(@conference, :url => admin_conference_rooms_update_path(@conference.short_title)) do |f|
|
||||
= dynamic_association :rooms, "Rooms", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= semantic_form_for(@conference, :url => admin_conference_rooms_update_path(@conference.short_title)) do |f|
|
||||
= dynamic_association :rooms, "Rooms", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= semantic_form_for(@conference, :url => admin_conference_social_events_path(@conference.short_title)) do |f|
|
||||
= dynamic_association :social_events, "Social Events", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= semantic_form_for(@conference, :url => admin_conference_social_events_path(@conference.short_title)) do |f|
|
||||
= dynamic_association :social_events, "Social Events", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
|
|
|||
41
app/views/admin/stats/_events.html.haml
Normal file
41
app/views/admin/stats/_events.html.haml
Normal 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.
|
||||
34
app/views/admin/stats/_events_table.html.haml
Normal file
34
app/views/admin/stats/_events_table.html.haml
Normal 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"])
|
||||
71
app/views/admin/stats/_events_time.html
Normal file
71
app/views/admin/stats/_events_time.html
Normal 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>
|
||||
35
app/views/admin/stats/_events_tracks.html.haml
Normal file
35
app/views/admin/stats/_events_tracks.html.haml
Normal 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"
|
||||
79
app/views/admin/stats/_events_tracks_confirmed.html
Normal file
79
app/views/admin/stats/_events_tracks_confirmed.html
Normal 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>
|
||||
79
app/views/admin/stats/_events_tracks_new.html
Normal file
79
app/views/admin/stats/_events_tracks_new.html
Normal 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>
|
||||
79
app/views/admin/stats/_events_tracks_unconfirmed.html
Normal file
79
app/views/admin/stats/_events_tracks_unconfirmed.html
Normal 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>
|
||||
19
app/views/admin/stats/_events_types.html.haml
Normal file
19
app/views/admin/stats/_events_types.html.haml
Normal 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"
|
||||
78
app/views/admin/stats/_events_types_confirmed.html
Normal file
78
app/views/admin/stats/_events_types_confirmed.html
Normal 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>
|
||||
78
app/views/admin/stats/_events_types_new.html
Normal file
78
app/views/admin/stats/_events_types_new.html
Normal 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>
|
||||
78
app/views/admin/stats/_events_types_unconfirmed.html
Normal file
78
app/views/admin/stats/_events_types_unconfirmed.html
Normal 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>
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
<script>
|
||||
|
||||
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 barHeight = 24; // height of one bar
|
||||
|
|
|
|||
|
|
@ -1,35 +1,41 @@
|
|||
.row-fluid
|
||||
.span4
|
||||
- if @attendees > 0
|
||||
%h4{:style => "text-indent: 25px"}= "Registrations - Attendees (#{(@attendees.to_f / @registered * 100).round }%)"
|
||||
.row
|
||||
.col-md-4
|
||||
- if @registered > 0
|
||||
- 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
|
||||
%h4{:style => "text-indent: 25px"}= "Registrations - Attendees"
|
||||
.row-fluid
|
||||
.span12#registrations_attendees
|
||||
%h5 There are no registrations yet.
|
||||
|
||||
.span4
|
||||
%h4{:style => "text-indent: 10px"}= "Attendance of pre-registered"
|
||||
.row-fluid
|
||||
.span12#registered_attended
|
||||
.col-md-4
|
||||
- if @registered > 0
|
||||
%h4{:style => "text-indent: 10px"}= "Attendance of pre-registered"
|
||||
.row-fluid
|
||||
.span12#registered_attended
|
||||
= render :partial => "registered_attended"
|
||||
|
||||
.span4
|
||||
%h4{:style => "text-indent: 25px"}= "% of pre-registered"
|
||||
.row-fluid
|
||||
.span12#preregistered_onsite
|
||||
.col-md-4
|
||||
- if @registered > 0
|
||||
%h4{:style => "text-indent: 25px"}= "% of pre-registered"
|
||||
.row-fluid
|
||||
.span12#preregistered_onsite
|
||||
= render :partial => "preregistered_onsite"
|
||||
|
||||
.row-fluid
|
||||
.span6
|
||||
%h4= "Other Info"
|
||||
.row-fluid
|
||||
.span12#other_info
|
||||
.row
|
||||
.col-md-6
|
||||
- if @registered > 0
|
||||
%h4= "Other Info"
|
||||
.row-fluid
|
||||
.span12#other_info
|
||||
= render :partial => "other_info"
|
||||
|
||||
.span6
|
||||
%h4{:style => "text-indent: 98px"}= "Registrations over time"
|
||||
.row-fluid
|
||||
.span12#registered_time
|
||||
|
||||
= render :partial => "registered_attended"
|
||||
= render :partial => "registered_time"
|
||||
= render :partial => "preregistered_onsite"
|
||||
= render :partial => "registrations_attendees"
|
||||
= render :partial => "other_info"
|
||||
.col-md-6
|
||||
- if @registered > 0
|
||||
%h4{:style => "text-indent: 98px"}= "Registrations over time"
|
||||
.row-fluid
|
||||
.span12#registered_time
|
||||
= render :partial => "registered_time"
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@ var registrations = '<%= h @registered %>';
|
|||
var attendees = '<%= h @attendees %>';
|
||||
|
||||
var data = [
|
||||
{"status":"Registrations","value": registrations, "percent": ""},
|
||||
{"status":"Attendees","value": attendees, "percent": d3.round(attendees/registrations * 100)+"%"}
|
||||
{"status":"Did Not Attend","value": registrations-attendees, "percent": ""},
|
||||
{"status":"Attended","value": attendees, "percent": d3.round(attendees/registrations * 100)+"%"}
|
||||
];
|
||||
|
||||
var vis = d3.select("#registrations_attendees")
|
||||
|
|
@ -49,26 +49,7 @@ var arcs = vis.selectAll("g.slice")
|
|||
.data(pie)
|
||||
.enter()
|
||||
.append("svg:g")
|
||||
.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);
|
||||
});
|
||||
.attr("class", "slice");
|
||||
|
||||
arcs.append("svg:path")
|
||||
.attr("fill", function(d, i) { return color(i); } )
|
||||
|
|
@ -92,5 +73,5 @@ legend.append("text")
|
|||
.attr("x", 24)
|
||||
.attr("y", 9)
|
||||
.attr("dy", ".35em")
|
||||
.text(function(d) { return "Total " + d.status; });
|
||||
.text(function(d) { return "Total " + d.status + " (" + d.value + ")"; });
|
||||
</script>
|
||||
|
|
@ -1,5 +1,22 @@
|
|||
- if @tickets
|
||||
%h2
|
||||
= "Non-Free Tickets(#{@tickets.count})"
|
||||
.span4#tickets_time
|
||||
= render :partial => "tickets_time"
|
||||
- if @tickets.length > 0
|
||||
.row-fluid
|
||||
.span12
|
||||
%h2
|
||||
= "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.
|
||||
79
app/views/admin/stats/_tickets_distribution.html
Normal file
79
app/views/admin/stats/_tickets_distribution.html
Normal 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>
|
||||
|
|
@ -1,86 +1 @@
|
|||
<script>
|
||||
|
||||
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>
|
||||
(Not yet implemented)
|
||||
|
|
@ -1,8 +1,10 @@
|
|||
.row-fluid
|
||||
.span12
|
||||
.row
|
||||
.col-md-12
|
||||
%ul.nav.nav-tabs#myTab
|
||||
%li.active
|
||||
%a{:href=>"#registrations", "data-toggle"=>"tab"} Registrations
|
||||
%li
|
||||
%a{:href=>"#events", "data-toggle"=>"tab"} Events
|
||||
%li
|
||||
%a{:href=>"#speakers", "data-toggle"=>"tab"} Speakers
|
||||
%li
|
||||
|
|
@ -11,6 +13,8 @@
|
|||
.tab-content
|
||||
.tab-pane.active#registrations
|
||||
= render :partial => 'registrations'
|
||||
.tab-pane#events
|
||||
= render :partial => 'events'
|
||||
.tab-pane#speakers
|
||||
= render :partial => 'speakers'
|
||||
.tab-pane#tickets
|
||||
|
|
|
|||
|
|
@ -1,9 +1,8 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= semantic_form_for(@conference, :url => admin_conference_supporter_levels_path(@conference.short_title)) do |f|
|
||||
= f.input :use_supporter_levels, :label => false
|
||||
= dynamic_association :supporter_levels, "Supporter Levels", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= semantic_form_for(@conference, :url => admin_conference_supporter_levels_path(@conference.short_title)) do |f|
|
||||
= f.input :use_supporter_levels, :label => false
|
||||
= dynamic_association :supporter_levels, "Supporter Levels", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
|
|
|||
|
|
@ -7,12 +7,12 @@
|
|||
= f.input :code_is_valid, :as => :boolean, :label => false
|
||||
= f.action :submit, :button_html => { :value => "Save", :class => "btn btn-primary" }
|
||||
|
||||
.row-fluid
|
||||
.span12
|
||||
.row
|
||||
.col-md-12
|
||||
.pull-right{:style=>"margin-top:20px; margin-bottom:20px;"}
|
||||
= link_to "New Supporter", "#", :id => "new-supporter-button", :class => "btn btn-success"
|
||||
.row-fluid
|
||||
.span12
|
||||
.row
|
||||
.col-md-12
|
||||
%h2 Supporters
|
||||
.well
|
||||
%table.table.table-striped#supporters
|
||||
|
|
@ -32,6 +32,6 @@
|
|||
%tr
|
||||
%td= u.name
|
||||
%td= u.email
|
||||
%td= u.supporter_level.title
|
||||
%td= u.supporter_level.title if u.supporter_level
|
||||
%td= u.code
|
||||
%td= u.code_is_valid
|
||||
|
|
|
|||
|
|
@ -1,8 +1,7 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= semantic_form_for(@conference, :url => admin_conference_tracks_update_path(@conference.short_title)) do |f|
|
||||
= dynamic_association :tracks, "Tracks", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= semantic_form_for(@conference, :url => admin_conference_tracks_update_path(@conference.short_title)) do |f|
|
||||
= dynamic_association :tracks, "Tracks", f
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
<<<<<<< HEAD
|
||||
.container-fluid
|
||||
.row-fluid
|
||||
.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"
|
||||
- else
|
||||
=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
|
||||
$(document).ready(function() {
|
||||
|
|
|
|||
|
|
@ -1,11 +1,10 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= 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 :address, :input_html => {:rows => 1}
|
||||
= f.input :website
|
||||
= f.input :description, :input_html => { :rows => 10, :cols => 20 }
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= 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 :address, :input_html => {:rows => 1}
|
||||
= f.input :website
|
||||
= f.input :description, :input_html => { :rows => 10, :cols => 20 }
|
||||
= f.action :submit, :as => :button, :button_html => {:class => "btn btn-primary"}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<div class="nested-fields">
|
||||
<%= f.inputs do %>
|
||||
<%= 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 %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
|
@ -1,19 +1,27 @@
|
|||
%table.table.table-striped.table-bordered.table-hover#speakertable
|
||||
%thead
|
||||
%th First Name
|
||||
%th Last Name
|
||||
%th Email
|
||||
%th Mobile
|
||||
%th Languages
|
||||
%th Experience
|
||||
%th Tshirt Size
|
||||
%tbody
|
||||
- @volunteers.each do |volunteer|
|
||||
%tr
|
||||
%td= volunteer.first_name
|
||||
%td= volunteer.last_name
|
||||
%td= volunteer.email
|
||||
%td= volunteer.mobile
|
||||
%td= volunteer.languages
|
||||
%td= volunteer.volunteer_experience
|
||||
%td= volunteer.tshirt
|
||||
.well
|
||||
%table.table.table-striped.table-bordered.table-hover#volunteerstable
|
||||
%thead
|
||||
%th First Name
|
||||
%th Last Name
|
||||
%th Email
|
||||
%th Mobile
|
||||
%th Languages
|
||||
%th Experience
|
||||
%th Tshirt Size
|
||||
%tbody
|
||||
- @volunteers.each do |volunteer|
|
||||
%tr
|
||||
%td= volunteer.first_name
|
||||
%td= volunteer.last_name
|
||||
%td= volunteer.email
|
||||
%td= volunteer.mobile
|
||||
%td= volunteer.languages
|
||||
%td= volunteer.volunteer_experience
|
||||
%td= volunteer.tshirt
|
||||
|
||||
:javascript
|
||||
$(document).ready(function(){
|
||||
$('#volunteerstable').dataTable({
|
||||
"bPaginate": false
|
||||
});
|
||||
});
|
||||
|
|
@ -1,7 +1,7 @@
|
|||
<div class="nested-fields">
|
||||
<%= f.inputs do %>
|
||||
<%= 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:"%>
|
||||
<%= remove_association_link :vposition, f %>
|
||||
<% end %>
|
||||
|
|
|
|||
|
|
@ -1,15 +1,16 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span3
|
||||
= render 'admin/conference/sidebar'
|
||||
.span9
|
||||
= 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"}
|
||||
%br
|
||||
%br
|
||||
.span5
|
||||
.row
|
||||
.col-md-3
|
||||
= render 'admin/conference/sidebar'
|
||||
.col-md-9
|
||||
= 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"}
|
||||
%br
|
||||
%br
|
||||
= f.input :use_volunteers, :label => "Enable Volunteering"
|
||||
.row
|
||||
.col-md-6
|
||||
= f.input :use_vdays, :label => false
|
||||
= dynamic_association :vdays, "Volunteer Days", f
|
||||
.span5
|
||||
.col-md-6
|
||||
= f.input :use_vpositions, :label => false
|
||||
= dynamic_association :vpositions, "Volunteer positions", f
|
||||
|
|
|
|||
|
|
@ -1,30 +1,33 @@
|
|||
.row
|
||||
.span12
|
||||
.col-md-12
|
||||
%h3
|
||||
Registration for
|
||||
= @conference.title
|
||||
- if @person.proposal_count(@conference) > 0
|
||||
.row
|
||||
.span12
|
||||
.col-md-12
|
||||
%i
|
||||
Please note: Registration is not automatically performed for speakers. If you're scheduled to speak at the conference, you still need to register!
|
||||
.row
|
||||
.span12
|
||||
.col-md-12
|
||||
= 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.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|
|
||||
= 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 :attending_with_partner, :label => false
|
||||
= f.input :using_affiliated_lodging, :label => false
|
||||
= f.input :handicapped_access_required, :label => false
|
||||
= f.input :other_special_needs, :label => "Any other special needs?", :input_html => {:rows => 2, :class => "span6"}
|
||||
|
||||
= f.input :other_special_needs, :label => "Any other needs or comments?", :input_html => {:rows => 2, :class => "span6"}
|
||||
|
||||
- if @workshops.count > 0
|
||||
=f.inputs "Register to workshops" do
|
||||
|
|
@ -38,6 +41,11 @@
|
|||
%br Yes, I'll be attending...
|
||||
%br
|
||||
= 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
|
||||
$("#registration_supporter_registration_attributes_supporter_level_id").change(function () {
|
||||
|
|
@ -68,4 +76,3 @@
|
|||
$("#registration-arrival-datepicker").datepicker("option","maxDate", selected)
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
.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.fields_for :person do |p|
|
||||
= render :partial => 'devise/registrations/volunteerperson', :locals => {:p => p}
|
||||
|
|
|
|||
|
|
@ -1,48 +1,19 @@
|
|||
.row
|
||||
.span12
|
||||
.col-md-12
|
||||
= 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
|
||||
%ul.nav.nav-tabs
|
||||
%li.active
|
||||
= link_to "Register", "#register-content", "data-toggle"=>"tab"
|
||||
%li
|
||||
= link_to "Volunteer", "#volunteer-content", "data-toggle"=>"tab"
|
||||
- if @conference.use_volunteers
|
||||
%li
|
||||
= link_to "Volunteer", "#volunteer-content", "data-toggle"=>"tab"
|
||||
.tab-content
|
||||
#register-content.tab-pane.active
|
||||
= render 'conference_registration/registration', :f => f
|
||||
#volunteer-content.tab-pane
|
||||
= render 'conference_registration/volunteer', :f => f
|
||||
- if @conference.use_volunteers
|
||||
#volunteer-content.tab-pane
|
||||
= render 'conference_registration/volunteer', :f => f
|
||||
- if @registered
|
||||
= 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",
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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" %>
|
||||
|
|
@ -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" %>
|
||||
|
|
@ -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 %>
|
||||
|
|
@ -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 %>
|
||||
|
|
@ -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 %>
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
.container
|
||||
.row-fluid
|
||||
.row
|
||||
.col-md-12
|
||||
= 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|
|
||||
|
|
@ -8,8 +8,6 @@
|
|||
= p.input :public_name, :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."
|
||||
= 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
|
||||
You have used
|
||||
%span#biography-count #{current_user.person.biography_word_count}
|
||||
|
|
@ -17,7 +15,6 @@
|
|||
%br
|
||||
%br
|
||||
= render :partial => 'devise/registrations/volunteerperson', :locals => {:p => p}
|
||||
|
||||
= f.inputs :name => "Account" do
|
||||
= f.input :email, :required => false
|
||||
= f.input :password, :hint => "(Leave blank if you don't want to change it)", :input_html => {:autocomplete => "off"}
|
||||
|
|
|
|||
|
|
@ -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" %>
|
||||
|
|
@ -1,14 +1,15 @@
|
|||
.container
|
||||
%h2.text-center
|
||||
Sign Up
|
||||
.row-fluid
|
||||
.well.span3.offset2
|
||||
.row
|
||||
.page-header
|
||||
%h1.text-center Sign Up
|
||||
.col-md-5.col-md-offset-1
|
||||
.well
|
||||
= semantic_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
|
||||
= f.input :email
|
||||
= f.input :password
|
||||
= f.input :password_confirmation
|
||||
= 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
|
||||
Already have an account?
|
||||
= render "devise/shared/links"
|
||||
|
|
|
|||
|
|
@ -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" %>
|
||||
|
|
@ -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"
|
||||
|
|
@ -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)
|
||||
|
||||
|
|
@ -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" %>
|
||||
|
|
@ -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 %>
|
||||
|
||||
36
app/views/home/index.html.haml
Normal file
36
app/views/home/index.html.haml
Normal 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"
|
||||
30
app/views/layouts/_admin_menu.html.haml
Normal file
30
app/views/layouts/_admin_menu.html.haml
Normal 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
|
||||
|
|
@ -1,83 +1,59 @@
|
|||
%a.btn.btn-navbar{"data-target" => ".nav-collapse", "data-toggle" => "collapse", :id => "mobmenu" }
|
||||
%span.icon-th
|
||||
= link_to "OSEM", root_path, :class => 'brand', :title => "Open Source Event Manager"
|
||||
- if @conference && !@conference.short_title.nil?
|
||||
%span.brand
|
||||
= @conference.short_title
|
||||
.nav-collapse.collapse
|
||||
/ The Admin Menu for Conferences /
|
||||
- if user_signed_in?
|
||||
- if has_role?(current_user, "admin") || has_role?(current_user, "organizer")
|
||||
- if controller.class.name.split("::").first=="Admin"
|
||||
- if @conference and !@conference.short_title.nil?
|
||||
%ul.nav
|
||||
%li.nav-header.hidden-desktop
|
||||
= @conference.short_title
|
||||
%li{:class=> active_nav_li(admin_conference_path(@conference.short_title))}
|
||||
= link_to(admin_conference_path(@conference.short_title)) do
|
||||
%i.icon-wrench
|
||||
Settings
|
||||
%li{:class=> active_nav_li(admin_conference_registrations_path(@conference.short_title))}
|
||||
= link_to(admin_conference_registrations_path(@conference.short_title)) do
|
||||
%i.icon-user
|
||||
Registrations
|
||||
- if @conference.use_supporter_levels? and @conference.supporter_levels.length > 0
|
||||
%li{:class=> active_nav_li(admin_conference_supporters_path(@conference.short_title))}
|
||||
= link_to(admin_conference_supporters_path(@conference.short_title)) do
|
||||
%i.icon-star
|
||||
Supporters
|
||||
%li{:class=> active_nav_li(admin_conference_events_path(@conference.short_title))}
|
||||
= link_to(admin_conference_events_path(@conference.short_title)) do
|
||||
%i.icon-comment
|
||||
Events
|
||||
%li{:class=> active_nav_li(admin_conference_stats_path(@conference.short_title))}
|
||||
= link_to(admin_conference_stats_path(@conference.short_title)) do
|
||||
%i.icon-tasks
|
||||
Statistics
|
||||
%li{:class=> active_nav_li(admin_conference_volunteers_list_path(@conference.short_title))}
|
||||
= link_to(admin_conference_volunteers_list_path(@conference.short_title)) do
|
||||
%i.icon-user
|
||||
Volunteers
|
||||
%li
|
||||
= link_to(admin_conference_schedule_path(@conference.short_title), :target => "_blank") do
|
||||
%i.icon-calendar
|
||||
Schedule
|
||||
%ul.nav.hidden-desktop
|
||||
= render 'layouts/user_menu'
|
||||
%ul.nav.pull-right.visible-desktop
|
||||
%li.dropdown
|
||||
%a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"}
|
||||
#{current_user.person.public_name} (#{current_user.email})
|
||||
= image_tag(current_user.person.gravatar_url(:size => "18"), :title => "Yo #{current_user.person.public_name}!")
|
||||
%b.caret
|
||||
%ul.dropdown-menu{:style => "padding: 15px;"}
|
||||
= render 'layouts/user_menu'
|
||||
- else
|
||||
%ul.nav.pull-right
|
||||
- if current_page?(new_registration_path('user'))
|
||||
%li.active
|
||||
= link_to(new_registration_path('user')) do
|
||||
%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)
|
||||
.navbar.navbar-default.navbar-fixed-top{:role=>"navigation"}
|
||||
.container
|
||||
.navbar-header
|
||||
%button{"data-target"=>".navbar-collapse", "data-toggle"=>"collapse", :class=>"navbar-toggle", :type=>"button"}
|
||||
%span.sr-only
|
||||
Toggle navigation
|
||||
%span.icon-bar
|
||||
%span.icon-bar
|
||||
%span.icon-bar
|
||||
= link_to "OSEM", root_path, :class => 'navbar-brand', :title => "Open Source Event Manager"
|
||||
.collapse.navbar-collapse
|
||||
- if @conference && !@conference.short_title.nil?
|
||||
%p.navbar-text
|
||||
= @conference.short_title
|
||||
- if user_signed_in?
|
||||
- if has_role?(current_user, "admin") || has_role?(current_user, "organizer")
|
||||
- if controller.class.name.split("::").first=="Admin"
|
||||
- if @conference and not @conference.short_title.nil?
|
||||
= render 'layouts/admin_menu'
|
||||
%ul.nav.navbar-nav.navbar-right
|
||||
%li.dropdown
|
||||
%a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"}
|
||||
- if not current_user.person.public_name.empty?
|
||||
#{current_user.person.public_name}
|
||||
-else
|
||||
#{current_user.email}
|
||||
= image_tag(current_user.person.gravatar_url(:size => "18"), :title => "Yo #{current_user.person.public_name}!")
|
||||
%b.caret
|
||||
%ul.dropdown-menu
|
||||
= render 'layouts/user_menu'
|
||||
- else
|
||||
%ul.nav.navbar-nav.navbar-right
|
||||
- if current_page?(new_registration_path('user'))
|
||||
%li.active
|
||||
= link_to(new_registration_path('user')) do
|
||||
%span.glyphicon.glyphicon-heart
|
||||
Sign Up
|
||||
- else
|
||||
%li
|
||||
= link_to(new_registration_path('user')) do
|
||||
%span.glyphicon.glyphicon-heart
|
||||
Sign Up
|
||||
%li.dropdown.visible-desktop
|
||||
%a.dropdown-toggle{"data-toggle" => "dropdown", :href => "#"}
|
||||
%span.glyphicon.glyphicon-user
|
||||
Sign In
|
||||
%span.caret
|
||||
.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-lg
|
||||
= link_to('Sign In', new_user_session_path)
|
||||
|
|
@ -1,5 +1,3 @@
|
|||
%li.nav-header
|
||||
= current_user.person.public_name if current_user.person
|
||||
%li
|
||||
= link_to(edit_user_registration_path) do
|
||||
%i.icon-wrench
|
||||
|
|
@ -15,7 +13,7 @@
|
|||
Sign out
|
||||
-if has_role?(current_user, "admin") || has_role?(current_user, "organizer")
|
||||
%li.divider
|
||||
%li.nav-header
|
||||
%li.dropdown-header
|
||||
Conferences
|
||||
- @conferences.each do |conference|
|
||||
%li
|
||||
|
|
@ -28,7 +26,7 @@
|
|||
%i.icon-plus
|
||||
New Conference
|
||||
%li.divider
|
||||
%li.nav-header
|
||||
%li.dropdown-header
|
||||
People
|
||||
%li
|
||||
= link_to(admin_users_path) do
|
||||
|
|
|
|||
|
|
@ -17,31 +17,26 @@
|
|||
});
|
||||
= yield(:head)
|
||||
%body
|
||||
#wrap
|
||||
.navbar.navbar-fixed-top
|
||||
.navbar-inner
|
||||
.container-fluid
|
||||
= render 'layouts/navigation'
|
||||
.container#messages
|
||||
.row
|
||||
.span12
|
||||
= render 'layouts/messages'
|
||||
%noscript
|
||||
:css
|
||||
#content {
|
||||
display: none;
|
||||
}
|
||||
%h2
|
||||
JavaScript is not enabled
|
||||
%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
|
||||
= render 'layouts/navigation'
|
||||
.container#messages
|
||||
.row
|
||||
.col-md-12
|
||||
= render 'layouts/messages'
|
||||
%noscript
|
||||
:css
|
||||
#content {
|
||||
display: none;
|
||||
}
|
||||
%h2
|
||||
JavaScript is not enabled
|
||||
%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
|
||||
|
||||
#footer
|
||||
.container
|
||||
%p.muted.credit.text-center
|
||||
%p.muted.text-center
|
||||
OSEM is (C) 2013
|
||||
= link_to "Matt Barringer", "http://incoherent.de"
|
||||
and released under the GPL. You can get the source code from
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
.row
|
||||
.span12
|
||||
.col-md-12
|
||||
.tabbable
|
||||
%ul.nav.nav-tabs
|
||||
%li.active
|
||||
|
|
|
|||
|
|
@ -31,7 +31,15 @@
|
|||
%br
|
||||
%br
|
||||
= 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
|
||||
= f.inputs :name => "Your Information" do
|
||||
= semantic_fields_for @person do |p|
|
||||
|
|
|
|||
|
|
@ -1,2 +1 @@
|
|||
.container
|
||||
= render 'form'
|
||||
= render 'form'
|
||||
|
|
@ -1,36 +1,34 @@
|
|||
.container-fluid
|
||||
.row-fluid
|
||||
.span13
|
||||
%h2.pull-left
|
||||
= "My Proposals for #{@conference.title}"
|
||||
.pull-right{:style=>"margin-top:20px;"}
|
||||
- if @conference.cfp_open? || organizer_or_admin?
|
||||
= link_to "New Proposal", new_conference_proposal_path(@conference.short_title), :class => "btn btn-primary"
|
||||
- if @person.proposal_count(@conference) > 0
|
||||
.row-fluid
|
||||
.span12
|
||||
%table.table.table-bordered.table-striped
|
||||
%thead
|
||||
%th
|
||||
%b Title
|
||||
%th
|
||||
%b Status
|
||||
%th
|
||||
- @events.each do |event|
|
||||
%tr
|
||||
%td
|
||||
= link_to event.title, conference_proposal_path(@conference.short_title, event.id)
|
||||
%td
|
||||
= event.public_state
|
||||
- if event.state == 'confirmed' && event.require_registration == true
|
||||
(Pre-registered: #{pre_registered(event).count})
|
||||
- if event.confirmed? && !@conference.user_registered?(current_user)
|
||||
%br
|
||||
= link_to "Register to attend", register_conference_path(@conference.short_title), :style => "font-size:10px;"
|
||||
%td
|
||||
.pull-right
|
||||
- if event.transition_possible? :confirm
|
||||
= link_to "Confirm", conference_proposal_confirm_path(@conference.short_title, event, :send_mail=>false), :method => :put, :class => "btn btn-mini btn-success"
|
||||
= link_to "Edit", edit_conference_proposal_path(@conference.short_title, event.id), :class => "btn btn-mini btn-primary"
|
||||
= 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"
|
||||
.row
|
||||
.col-md-12.page-header
|
||||
%h1
|
||||
= "My Proposals for #{@conference.title}"
|
||||
- if @conference.cfp_open? || organizer_or_admin?
|
||||
= link_to "New Proposal", new_conference_proposal_path(@conference.short_title), :class => "btn btn-primary pull-right"
|
||||
- if @person.proposal_count(@conference) > 0
|
||||
.row
|
||||
.col-md-12
|
||||
%table.table.table-bordered.table-striped
|
||||
%thead
|
||||
%th
|
||||
%b Title
|
||||
%th
|
||||
%b Status
|
||||
%th
|
||||
- @events.each do |event|
|
||||
%tr
|
||||
%td
|
||||
= link_to event.title, conference_proposal_path(@conference.short_title, event.id)
|
||||
%td
|
||||
= event.public_state
|
||||
- if event.state == 'confirmed' && event.require_registration == true
|
||||
(Pre-registered: #{pre_registered(event).count})
|
||||
- if event.confirmed? && !@conference.user_registered?(current_user)
|
||||
%br
|
||||
= link_to "Register to attend", register_conference_path(@conference.short_title), :style => "font-size:10px;"
|
||||
%td
|
||||
.pull-right
|
||||
- if event.transition_possible? :confirm
|
||||
= link_to "Confirm", conference_proposal_confirm_path(@conference.short_title, event, :send_mail=>false), :method => :put, :class => "btn btn-mini btn-success"
|
||||
= link_to "Edit", edit_conference_proposal_path(@conference.short_title, event.id), :class => "btn btn-mini btn-primary"
|
||||
= 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"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
.row
|
||||
.span12
|
||||
.col-md-12
|
||||
= simple_format(@conference.call_for_papers.description)
|
||||
.row
|
||||
.span12
|
||||
.col-md-12
|
||||
= render 'proposal_form'
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
.row
|
||||
.span12
|
||||
.col-md-12.page-header
|
||||
%h2
|
||||
= @event.title
|
||||
- if @event.subtitle
|
||||
%br
|
||||
%span.muted
|
||||
%small
|
||||
= @event.subtitle
|
||||
.row-fluid
|
||||
.span3
|
||||
.row
|
||||
.col-md-3
|
||||
%p
|
||||
= simple_format(@event.abstract)
|
||||
%dl
|
||||
|
|
@ -22,31 +22,43 @@
|
|||
- if @event.track_id
|
||||
%span.label{:style =>"background-color: #{@event.track.color};"}
|
||||
= @event.track.name
|
||||
.span9
|
||||
-unless @event.video_id
|
||||
.row-fluid
|
||||
.span12
|
||||
.col-md-9
|
||||
-unless @event.media_id
|
||||
.row
|
||||
.col-md-12
|
||||
%h5.text-error
|
||||
No video of the event yet, sorry! Meanwhile...
|
||||
.row-fluid
|
||||
.span12.flexvideo
|
||||
-if @event.video_id
|
||||
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=>"http://www.youtube.com/embed/#{@event.video_id}?rel=0"}
|
||||
.row
|
||||
.col-md-13
|
||||
-if not @event.media_id.blank?
|
||||
.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
|
||||
%iframe{:width=>"560", :height=>"315", :frameborder=>"0", :allowfullscreen=>"true", :src=>"http://www.youtube.com/embed/Eiv4e5ZxTmg?rel=0"}
|
||||
.row-fluid
|
||||
.span8
|
||||
%div.well.well-lg="No video of the event yet, sorry! Meanwhile..."
|
||||
.row
|
||||
.col-md-8
|
||||
%h3
|
||||
by
|
||||
= @speaker.public_name
|
||||
- if @speaker.company
|
||||
- if @speaker.company?
|
||||
%br
|
||||
%span.muted
|
||||
from
|
||||
= @speaker.company
|
||||
-if @speaker.biography
|
||||
-if @speaker.biography?
|
||||
= simple_format(@speaker.biography)
|
||||
.span4
|
||||
= image_tag @speaker.gravatar_url(:size => 200), :class => "img-rounded pull-right", :style => "margin: 8px;"
|
||||
.col-md-4
|
||||
= image_tag @speaker.gravatar_url(:size => 200), :class => "img-responsive img-rounded"
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,10 @@
|
|||
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
|
||||
url_for_emails: localhost:3000
|
||||
# A secret key. You can generate one with 'rake secret'
|
||||
devise_secret_key: 12345
|
||||
|
||||
development:
|
||||
<<: *defaults
|
||||
|
|
@ -10,4 +14,3 @@ test:
|
|||
|
||||
production:
|
||||
<<: *defaults
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,14 @@
|
|||
# Load the rails application
|
||||
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
|
||||
Osem::Application.initialize!
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
Osem::Application.configure do
|
||||
# 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
|
||||
# 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.
|
||||
|
|
@ -35,5 +38,5 @@ Osem::Application.configure do
|
|||
# Expands the lines which load the assets
|
||||
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
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue