conschedule 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +154 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/config/conschedule_manifest.js +2 -0
  6. data/app/assets/fonts/icomoon.eot +0 -0
  7. data/app/assets/fonts/proxima_nova_100.eot +0 -0
  8. data/app/assets/fonts/proxima_nova_400.eot +0 -0
  9. data/app/assets/fonts/proxima_nova_700.eot +0 -0
  10. data/app/assets/images/conschedule/chosen-sprite-small.png +0 -0
  11. data/app/assets/images/conschedule/chosen-sprite.png +0 -0
  12. data/app/assets/images/conschedule/close.png +0 -0
  13. data/app/assets/images/conschedule/spinner-small.gif +0 -0
  14. data/app/assets/images/conschedule/spinner.gif +0 -0
  15. data/app/assets/javascripts/conschedule/application.js +22 -0
  16. data/app/assets/javascripts/conschedule/calendar.js +467 -0
  17. data/app/assets/javascripts/conschedule/date.js +104 -0
  18. data/app/assets/javascripts/conschedule/form.js +53 -0
  19. data/app/assets/javascripts/conschedule/home.js +149 -0
  20. data/app/assets/javascripts/conschedule/jquery-ui-datepicker.min.js +1674 -0
  21. data/app/assets/javascripts/conschedule/jquery.easing.min.js +44 -0
  22. data/app/assets/javascripts/conschedule/jquery.validate.js +1532 -0
  23. data/app/assets/javascripts/conschedule/js_time_zone.js +1433 -0
  24. data/app/assets/javascripts/conschedule/moment-timezone.js +1209 -0
  25. data/app/assets/javascripts/conschedule/moment.js +4195 -0
  26. data/app/assets/javascripts/conschedule/schedules.js +22 -0
  27. data/app/assets/javascripts/conschedule/time_zones_drop_down.js +609 -0
  28. data/app/assets/stylesheets/conschedule/application.css +4 -0
  29. data/app/assets/stylesheets/conschedule/common.css +816 -0
  30. data/app/assets/stylesheets/conschedule/home.css +2441 -0
  31. data/app/assets/stylesheets/conschedule/main.css +884 -0
  32. data/app/assets/stylesheets/conschedule/schedules.css +4 -0
  33. data/app/controllers/conschedule/application_controller.rb +49 -0
  34. data/app/controllers/conschedule/schedules_controller.rb +125 -0
  35. data/app/helpers/conschedule/application_helper.rb +15 -0
  36. data/app/helpers/conschedule/schedules_helper.rb +43 -0
  37. data/app/jobs/conschedule/application_job.rb +4 -0
  38. data/app/mailers/conschedule/schedules_mailer.rb +46 -0
  39. data/app/models/conschedule/application_record.rb +5 -0
  40. data/app/models/conschedule/schedule.rb +63 -0
  41. data/app/views/conschedule/schedules/_confirmation.html.erb +38 -0
  42. data/app/views/conschedule/schedules/_page_one.html.erb +75 -0
  43. data/app/views/conschedule/schedules/_page_three.html.erb +94 -0
  44. data/app/views/conschedule/schedules/_page_two.html.erb +22 -0
  45. data/app/views/conschedule/schedules/_schedules.html.erb +122 -0
  46. data/app/views/conschedule/schedules/create.js.erb +11 -0
  47. data/app/views/conschedule/schedules/index.html.erb +123 -0
  48. data/app/views/conschedule/schedules/index.js.erb +3 -0
  49. data/app/views/conschedule/schedules/new.html.erb +11 -0
  50. data/app/views/conschedule/schedules_mailer/send_cancel_email_owner.html.erb +61 -0
  51. data/app/views/conschedule/schedules_mailer/send_cancel_email_user.html.erb +29 -0
  52. data/app/views/conschedule/schedules_mailer/send_confirmation_email_owner.html.erb +77 -0
  53. data/app/views/conschedule/schedules_mailer/send_confirmation_email_user.html.erb +30 -0
  54. data/app/views/kaminari/custom_theme/_first_page.html.erb +3 -0
  55. data/app/views/kaminari/custom_theme/_gap.html.erb +1 -0
  56. data/app/views/kaminari/custom_theme/_last_page.html.erb +3 -0
  57. data/app/views/kaminari/custom_theme/_next_page.html.erb +1 -0
  58. data/app/views/kaminari/custom_theme/_page.html.erb +5 -0
  59. data/app/views/kaminari/custom_theme/_paginator.html.erb +23 -0
  60. data/app/views/kaminari/custom_theme/_prev_page.html.erb +1 -0
  61. data/app/views/layouts/conschedule/application.html.erb +14 -0
  62. data/app/views/layouts/conschedule/mailer.html.erb +11 -0
  63. data/app/views/layouts/conschedule/schedules.html.erb +14 -0
  64. data/config/initializers/assets.rb +11 -0
  65. data/config/routes.rb +11 -0
  66. data/db/migrate/20160812085505_create_conschedule_schedules.rb +27 -0
  67. data/lib/conschedule.rb +34 -0
  68. data/lib/conschedule/configuration.rb +25 -0
  69. data/lib/conschedule/engine.rb +5 -0
  70. data/lib/conschedule/gem_dependencies.rb +2 -0
  71. data/lib/conschedule/version.rb +3 -0
  72. data/lib/generators/conschedule/install_generator.rb +23 -0
  73. data/lib/generators/conschedule/views_generator.rb +45 -0
  74. data/lib/generators/templates/README +40 -0
  75. data/lib/generators/templates/initializer.rb +25 -0
  76. data/lib/tasks/conschedule_tasks.rake +4 -0
  77. metadata +182 -0
@@ -0,0 +1,4 @@
1
+ /*
2
+ *= require conschedule/common
3
+ *= require conschedule/main
4
+ */
@@ -0,0 +1,49 @@
1
+ module Conschedule
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+
5
+ def validate_config
6
+ ["main_heading", "purpose", "instructions", "location_details", "start_date", "end_date", "available_days", "system_time_zone", "black_out_dates", "sun_timings",
7
+ "mon_timings", "tue_timings", "wed_timings", "thu_timings", "fri_timings", "sat_timings", "duration", "from_address", "send_confirmation_mail", "send_cancel_mail",
8
+ "to_address", "contact_name"].each do |name|
9
+ case name
10
+ when "main_heading", "purpose", "instructions", "location_details"
11
+ fail "Invalid value for #{name.to_s.titleize}, value should be a String" if !Conschedule.send(name).blank? && !Conschedule.send(name).is_a?(String)
12
+ when "start_date"
13
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Date" unless Date.valid_date? *Conschedule.send(name).split('-').map(&:to_i)
14
+ when "end_date"
15
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Date" unless Date.valid_date? *Conschedule.send(name).split('-').map(&:to_i)
16
+ fail "Invalid value for #{name.to_s.titleize}, value should be greater than start date" if Conschedule.end_date.to_date < Conschedule.start_date.to_date
17
+ when "available_days"
18
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Array" if !Conschedule.send(name).is_a?(Array)
19
+ valid_days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
20
+ invalid_values = Conschedule.send(name) - valid_days
21
+ fail "Invalid value for #{name.to_s.titleize}, valid values are #{valid_days.join(', ')}" unless invalid_values.empty?
22
+ when "system_time_zone"
23
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid TimeZone" unless ActiveSupport::TimeZone[Conschedule.send(name)].present?
24
+ when "black_out_dates"
25
+ unless Conschedule.send(name).blank?
26
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Array" if !Conschedule.send(name).is_a?(Array)
27
+ Conschedule.send(name).each do |date|
28
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Date" unless Date.valid_date? *date.split('-').map(&:to_i)
29
+ end
30
+ end
31
+ when "sun_timings", "mon_timings", "tue_timings", "wed_timings", "thu_timings", "fri_timings", "sat_timings"
32
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Array" if !Conschedule.send(name).is_a?(Array)
33
+ start_time, end_time = Conschedule.send(name)
34
+ fail "Invalid value for #{name.to_s.titleize}, value should have a valid start time" if /^(2[0-3]|[01][0-9]):([0-5][0-9])$/.match(start_time).blank?
35
+ fail "Invalid value for #{name.to_s.titleize}, value should have a valid end time" if /^(2[0-3]|[01][0-9]):([0-5][0-9])$/.match(end_time).blank?
36
+ fail "Invalid value for #{name.to_s.titleize}, value should have a valid start time and end time" if end_time.to_time < start_time.to_time
37
+ when "duration"
38
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Integer" if !Conschedule.send(name).is_a?(Integer)
39
+ fail "Invalid value for #{name.to_s.titleize}, value should be a greater than or equal to 5 and less than or equal to 1440" unless Conschedule.send(name) >= 5 && Conschedule.send(name) <= 1440
40
+ when "send_confirmation_mail", "send_cancel_mail"
41
+ fail "Invalid value for #{name.to_s.titleize}, value should be a valid Boolean true or false" unless Conschedule.send(name).is_a?(TrueClass) || Conschedule.send(name).is_a?(FalseClass)
42
+ when "contact_name"
43
+ fail "Invalid value for #{name.to_s.titleize}, value should be a string" if !Conschedule.send(name).is_a?(String)
44
+ end
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,125 @@
1
+ require_dependency "conschedule/application_controller"
2
+
3
+ module Conschedule
4
+ class SchedulesController < ApplicationController
5
+
6
+ before_action :validate_config
7
+
8
+ def index
9
+ config_data
10
+ @filters_applied = params[:status_ids].present? && params[:status_ids].include?("cancelled") ? true : false
11
+ @schedules = schedules_search.page(params[:page])
12
+ @grouped = @schedules.group_by { |s| s.slot_start_time.strftime("%Y-%m-%d") }
13
+ render layout: "conschedule/application"
14
+ end
15
+
16
+ def new
17
+ config_data
18
+ @schedule = Schedule.new
19
+ render layout: "conschedule/schedules"
20
+ end
21
+
22
+ def create
23
+ config_data
24
+ sst = convert_to_tz(params[:schedule][:slot_start_time],params[:schedule][:user_time_zone])
25
+ set = convert_to_tz(params[:schedule][:slot_end_time],params[:schedule][:user_time_zone])
26
+ schedule_data = {
27
+ app_time_zone: @page_info[:system_time_zone],
28
+ event_name: @page_info[:purpose],
29
+ event_description: @page_info[:instructions],
30
+ location_details: @page_info[:location_details],
31
+ contact_name: Conschedule.contact_name,
32
+ slot_start_time: sst,
33
+ slot_end_time: set
34
+ }
35
+ schedule_data.each do |key,value|
36
+ params[:schedule][key.to_sym] = value
37
+ end
38
+ @schedule = Schedule.create(schedule_params)
39
+ end
40
+
41
+ def cancel
42
+ @schedule = Schedule.find(params[:id])
43
+ @schedule.update(schedule_params.merge(status: 'cancelled'))
44
+ redirect_to schedules_path
45
+ end
46
+
47
+ private
48
+
49
+ def config_data
50
+ @page_info = {
51
+ main_heading: Conschedule.main_heading,
52
+ purpose: Conschedule.purpose,
53
+ instructions: Conschedule.instructions,
54
+ location_details: Conschedule.location_details,
55
+ start_date: Conschedule.start_date,
56
+ end_date: Conschedule.end_date,
57
+ original_start_date: Conschedule.start_date,
58
+ original_end_date: Conschedule.end_date,
59
+ available_days: Conschedule.available_days,
60
+ system_time_zone: Conschedule.system_time_zone,
61
+ black_out_dates: Conschedule.black_out_dates,
62
+ sun_timings: Conschedule.sun_timings,
63
+ mon_timings: Conschedule.mon_timings,
64
+ tue_timings: Conschedule.tue_timings,
65
+ wed_timings: Conschedule.wed_timings,
66
+ thu_timings: Conschedule.thu_timings,
67
+ fri_timings: Conschedule.fri_timings,
68
+ sat_timings: Conschedule.sat_timings,
69
+ duration: Conschedule.duration,
70
+ enable_tz: Conschedule.enable_tz
71
+ }
72
+ gon.page_info = @page_info
73
+ end
74
+
75
+ def schedule_params
76
+ params.require(:schedule).permit(:app_time_zone, :user_time_zone, :app_tz_offset, :user_tz_offset, :event_name, :event_description, :location_details, :slot_start_time, :slot_end_time, :contact_name, :first_name, :last_name, :phone, :email, :message, :status, :cancel_reason)
77
+ end
78
+
79
+ def schedules_search
80
+ status = params[:status_ids].blank? ? ["active"] : params[:status_ids]
81
+ current_time = Time.now.in_time_zone(@page_info[:system_time_zone])
82
+ case params[:period]
83
+ when "past"
84
+ schedules = Schedule.past(status,current_time)
85
+ @date_range_label = "All Past"
86
+ @filter_message = "You have no past events"
87
+ @suggestion_message = "past events"
88
+ when "upcoming"
89
+ schedules = Schedule.upcoming(status,current_time)
90
+ @date_range_label = "All Upcoming"
91
+ @filter_message = "You have no upcoming events yet"
92
+ @suggestion_message = "upcoming events"
93
+ when "today"
94
+ schedules = Schedule.range(status,Time.now.beginning_of_day,Time.now.end_of_day)
95
+ @date_range_label = "Today"
96
+ @filter_message = "You have no events for today yet"
97
+ @suggestion_message = "events for today"
98
+ when "this_week", "this_month", "range"
99
+ schedules = Schedule.range(status,params[:start_date],params[:end_date])
100
+ if params[:period] == "range"
101
+ @date_range_label = params[:start_date].to_date.strftime("%b %-d, %Y") + " - " + params[:end_date].to_date.strftime("%b %-d, %Y")
102
+ @filter_message = "You have no events for the date range of #{@date_range_label}"
103
+ @suggestion_message = "events for #{@date_range_label}"
104
+ else
105
+ @date_range_label = params[:period].titleize
106
+ @filter_message = "You have no events for #{params[:period].gsub('_'," ")} yet"
107
+ @suggestion_message = "events for #{params[:period].gsub('_'," ")}"
108
+ end
109
+ else
110
+ schedules = Schedule.upcoming(status,current_time)
111
+ @date_range_label = "All Upcoming"
112
+ @filter_message = "You have no upcoming events yet"
113
+ @suggestion_message = "upcoming events"
114
+ end
115
+ schedules.order("slot_start_time")
116
+ end
117
+
118
+ def convert_to_tz(date,tz)
119
+ Time.zone = tz
120
+ ctz = Time.zone.parse(date)
121
+ return ctz
122
+ end
123
+
124
+ end
125
+ end
@@ -0,0 +1,15 @@
1
+ module Conschedule
2
+ module ApplicationHelper
3
+
4
+ def fdtime(date_time,format)
5
+ formats = {
6
+ time: "%I:%M%P",
7
+ date: "%A, %B %-d, %Y",
8
+ month_date: "%B %-d, %Y"
9
+ }
10
+ date_time.strftime(formats[format])
11
+ end
12
+
13
+
14
+ end
15
+ end
@@ -0,0 +1,43 @@
1
+ module Conschedule
2
+ module SchedulesHelper
3
+
4
+ def cancel_reason(schedule)
5
+ if schedule.cancel_reason.blank?
6
+ 'No reason provided.'
7
+ else
8
+ schedule.cancel_reason
9
+ end
10
+ end
11
+
12
+ def slot_start_end_time(schedule,version,start_time=false)
13
+ slot_start_time = schedule.slot_start_time
14
+ slot_end_time = schedule.slot_end_time
15
+ tz = version == "app" ? schedule.app_time_zone : schedule.user_time_zone
16
+ sst = slot_start_time.in_time_zone(tz)
17
+ set = slot_end_time.in_time_zone(tz)
18
+ if start_time
19
+ [fdtime(sst,:time),fdtime(sst,:date)].join(" - ")
20
+ else
21
+ [fdtime(sst,:time),fdtime(set,:time)].join(" - ")
22
+ end
23
+ end
24
+
25
+ def is_today?(date,tz)
26
+ Time.now.in_time_zone(tz).strftime("%Y-%m-%d") == date.in_time_zone(tz).strftime("%Y-%m-%d")
27
+ end
28
+
29
+ def page_entries_info(collection, options = {})
30
+ entry_name = options[:entry_name] || collection.entry_name
31
+ entry_name = entry_name.pluralize unless collection.total_count == 1
32
+
33
+ if collection.total_pages < 2
34
+ "Displaying #{collection.total_count} of #{collection.total_count} #{entry_name}"
35
+ else
36
+ first = collection.offset_value + 1
37
+ last = (sum = collection.offset_value + collection.limit_value) > collection.total_count ? collection.total_count : sum
38
+ "Displaying #{first} – #{last} of #{collection.total_count} #{entry_name} "
39
+ end.html_safe
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,4 @@
1
+ module Conschedule
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,46 @@
1
+ module Conschedule
2
+ class SchedulesMailer < ActionMailer::Base
3
+ default from: Conschedule.from_address
4
+ layout 'conschedule/mailer'
5
+
6
+ def send_cancel_email_user(schedule)
7
+ @schedule = schedule
8
+ @slot_date = schedule.slot_date_time("user","start").strftime("%B %-d, %Y")
9
+ mail(
10
+ to: "#{schedule.full_name} <#{schedule.email}>",
11
+ subject: "Canceled: #{schedule.event_name} with #{Conschedule.contact_name} on #{@slot_date}"
12
+ )
13
+ end
14
+
15
+ def send_cancel_email_owner(schedule)
16
+ @schedule = schedule
17
+ @slot_date = schedule.slot_date_time("app","start").strftime("%B %-d, %Y")
18
+ @slot_start_time = schedule.slot_date_time("app","start")
19
+ mail(
20
+ to: Conschedule.to_address,
21
+ subject: "Canceled: #{schedule.event_name} with #{schedule.full_name} on #{@slot_date}"
22
+ )
23
+ end
24
+
25
+ def send_confirmation_email_owner(schedule)
26
+ @schedule = schedule
27
+ @slot_date = schedule.slot_date_time("app","start").strftime("%B %-d, %Y")
28
+ @slot_start_time = schedule.slot_date_time("app","start")
29
+ mail(
30
+ to: Conschedule.to_address,
31
+ subject: "New Event: #{schedule.event_name} with #{schedule.full_name} on #{@slot_date}"
32
+ )
33
+ end
34
+
35
+ def send_confirmation_email_user(schedule)
36
+ @schedule = schedule
37
+ @slot_date = schedule.slot_date_time("user","start").strftime("%B %-d, %Y")
38
+ mail(
39
+ to: "#{schedule.full_name} <#{schedule.email}>",
40
+ subject: "Confirmed: #{schedule.event_name} with #{Conschedule.contact_name} on #{@slot_date}"
41
+ )
42
+ end
43
+
44
+
45
+ end
46
+ end
@@ -0,0 +1,5 @@
1
+ module Conschedule
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,63 @@
1
+ module Conschedule
2
+ class Schedule < ApplicationRecord
3
+
4
+ validates :app_time_zone, :user_time_zone, :app_tz_offset, :user_tz_offset, :slot_start_time, :slot_end_time, :first_name, :phone, :email, presence: true
5
+
6
+ scope :past, -> (status,time) { where("status IN (?) AND slot_start_time < ?",status,time) }
7
+ scope :upcoming, -> (status,time) { where("status IN (?) AND slot_start_time >= ?",status,time) }
8
+ scope :range, -> (status,start_time,end_time) { where("status IN (?) AND (slot_start_time >= ? AND slot_start_time <= ?)",status,start_time,end_time) }
9
+
10
+ after_create :send_confirmation_email
11
+ after_update :send_cancel_email
12
+
13
+ def full_name
14
+ [first_name,last_name].compact.join(" ")
15
+ end
16
+
17
+ def send_confirmation_email
18
+ SchedulesMailer.send_confirmation_email_user(self).deliver
19
+ if Conschedule.send_confirmation_mail && validate_to_address
20
+ SchedulesMailer.send_confirmation_email_owner(self).deliver
21
+ end
22
+ end
23
+
24
+ def send_cancel_email
25
+ if status_changed?
26
+ SchedulesMailer.send_cancel_email_user(self).deliver
27
+ end
28
+ if Conschedule.send_cancel_mail && validate_to_address
29
+ SchedulesMailer.send_cancel_email_owner(self).deliver
30
+ end
31
+ end
32
+
33
+ def status_changed?
34
+ changed_attributes.has_key?("status") && changed_attributes["status"] == "active"
35
+ end
36
+
37
+ def validate_to_address
38
+ return false if Conschedule.to_address.downcase =~ /please-change-me/
39
+ return true
40
+ end
41
+
42
+ def cancelled?
43
+ status == "cancelled"
44
+ end
45
+
46
+ def display_action?
47
+ if status == "cancelled"
48
+ return false
49
+ else
50
+ slot_start_time = self.slot_date_time("app","start")
51
+ current_time = Time.now.in_time_zone(app_time_zone)
52
+ return current_time > slot_start_time ? false : true
53
+ end
54
+ end
55
+
56
+ def slot_date_time(version,period)
57
+ tz = version == "app" ? app_time_zone : user_time_zone
58
+ period == "start" ? slot_start_time.in_time_zone(tz) : slot_end_time.in_time_zone(tz)
59
+ end
60
+
61
+
62
+ end
63
+ end
@@ -0,0 +1,38 @@
1
+ <div id="main-region">
2
+ <div>
3
+ <div class="header">
4
+ <h2 class="pts">Confirmed</h2>
5
+ <div class="mbs phl">
6
+ You are scheduled with <%= @schedule.contact_name %>.
7
+ </div>
8
+ </div>
9
+ <div class="wrapper narrower">
10
+ <hr class="dotted mbm">
11
+ <div class="mbs row">
12
+ <div class="marker" style="background-color: #fff200"></div>
13
+ <div class="last-col">
14
+ <h2><%= @schedule.event_name %></h2>
15
+ </div>
16
+ </div>
17
+ <div class="iconed-text emphasis">
18
+ <i class="icon-clock"></i> <%= slot_start_end_time(@schedule,"user",true) %>
19
+ </div>
20
+ <div class="iconed-text">
21
+ <i class="icon-globe"></i><%= @schedule.user_time_zone %>
22
+ </div>
23
+ <div class="iconed-text">
24
+ <i class="icon-description"></i>
25
+ <div class="last-col">
26
+ <%= @schedule.event_description %>
27
+ </div>
28
+ </div>
29
+ <div class="iconed-text">
30
+ <i class="icon-location-target"></i>
31
+ <div class="last-col">
32
+ <%= @schedule.location_details %>
33
+ </div>
34
+ </div>
35
+ <hr class="dotted mbl">
36
+ </div>
37
+ </div>
38
+ </div>
@@ -0,0 +1,75 @@
1
+ <div id="main-region">
2
+ <div class="date-time-step">
3
+ <div class="header">
4
+ <div class="js-profile-region">
5
+ <div class="wrapper">
6
+ <div class="label">
7
+ <%= @page_info[:main_heading] %>
8
+ <div class="js-popover-region"></div>
9
+ </div>
10
+ </div>
11
+ </div>
12
+ </div>
13
+ <div class="subheader">
14
+ <div class="wrapper row">
15
+ <div class="col1of2">
16
+ <% unless @page_info[:purpose].blank? %>
17
+ <div class="marker" style="background-color: #fff200"></div>
18
+ <div class="last-col">
19
+ <h3><%= @page_info[:purpose] %></h3>
20
+ </div>
21
+ <% else %>
22
+ &nbsp;
23
+ <% end %>
24
+ </div>
25
+ <div class="col1of2">
26
+ <div class="timezone-area">
27
+ <span class="muted">Times are in</span>
28
+ <div class="timezone">
29
+ <%= f.select :user_time_zone, "", {}, {class: "chzn js-timezone-dropdown chzn-done", id: "timezonesdropdown", style: "display: none;"} %>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ <div class="wrapper">
36
+ <div class="iconed-text muted">
37
+ <% unless @page_info[:instructions].blank? %>
38
+ <i class="icon-description"></i>
39
+ <div class="last-col">
40
+ <%= @page_info[:instructions] %>
41
+ </div>
42
+ <% end %>
43
+ </div>
44
+ <div class="iconed-text muted">
45
+ <% unless @page_info[:location_details].blank? %>
46
+ <i class="icon-location-target"></i>
47
+ <div class="last-col">
48
+ <%= @page_info[:location_details] %>
49
+ </div>
50
+ <% end %>
51
+ </div>
52
+ <div class="js-days-region mvl">
53
+ <div class="week-view">
54
+ <h2 class="text-center mbl">Select a Day</h2>
55
+ <div class="js-days-region">
56
+ <div class="period row"><span class="icon-angle-left js-navigation-prev"></span>
57
+ <span class="icon-angle-right js-navigation-next"></span>
58
+ <div class="js-days-body">
59
+ </div>
60
+ </div>
61
+ </div>
62
+ <div class="spinner js-spinner hidden">
63
+ <div class="bounce1"></div>
64
+ <div class="bounce2"></div>
65
+ <div class="bounce3"></div>
66
+ </div>
67
+ <div class="js-weeks-region">
68
+ </div>
69
+ </div>
70
+ </div>
71
+ <div style="display: block;" class="pagination row js-pagination-bar mbl">
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>