effective_events 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +97 -0
  4. data/Rakefile +18 -0
  5. data/app/assets/config/effective_events_manifest.js +3 -0
  6. data/app/assets/javascripts/effective_events/base.js +0 -0
  7. data/app/assets/javascripts/effective_events.js +1 -0
  8. data/app/assets/stylesheets/effective_events/base.scss +0 -0
  9. data/app/assets/stylesheets/effective_events.scss +1 -0
  10. data/app/controllers/admin/event_registrants_controller.rb +11 -0
  11. data/app/controllers/admin/event_registrations_controller.rb +19 -0
  12. data/app/controllers/admin/event_tickets_controller.rb +8 -0
  13. data/app/controllers/admin/events_controller.rb +18 -0
  14. data/app/controllers/effective/event_registrations_controller.rb +53 -0
  15. data/app/controllers/effective/events_controller.rb +47 -0
  16. data/app/datatables/admin/effective_event_registrants_datatable.rb +47 -0
  17. data/app/datatables/admin/effective_event_registrations_datatable.rb +25 -0
  18. data/app/datatables/admin/effective_event_tickets_datatable.rb +42 -0
  19. data/app/datatables/admin/effective_events_datatable.rb +51 -0
  20. data/app/datatables/effective_event_registrants_datatable.rb +50 -0
  21. data/app/datatables/effective_event_registrations_datatable.rb +35 -0
  22. data/app/datatables/effective_events_datatable.rb +42 -0
  23. data/app/helpers/effective_events_helper.rb +18 -0
  24. data/app/models/concerns/effective_events_event_registration.rb +231 -0
  25. data/app/models/effective/event.rb +181 -0
  26. data/app/models/effective/event_registrant.rb +85 -0
  27. data/app/models/effective/event_registration.rb +7 -0
  28. data/app/models/effective/event_ticket.rb +59 -0
  29. data/app/views/admin/event_registrants/_form.html.haml +14 -0
  30. data/app/views/admin/event_tickets/_form.html.haml +7 -0
  31. data/app/views/admin/events/_form.html.haml +27 -0
  32. data/app/views/admin/events/_form_access.html.haml +10 -0
  33. data/app/views/admin/events/_form_content.html.haml +5 -0
  34. data/app/views/admin/events/_form_event.html.haml +24 -0
  35. data/app/views/admin/events/_form_event_registration_content.html.haml +19 -0
  36. data/app/views/effective/event_registrants/_fields.html.haml +19 -0
  37. data/app/views/effective/event_registrations/_content.html.haml +10 -0
  38. data/app/views/effective/event_registrations/_dashboard.html.haml +30 -0
  39. data/app/views/effective/event_registrations/_event_registration.html.haml +8 -0
  40. data/app/views/effective/event_registrations/_layout.html.haml +3 -0
  41. data/app/views/effective/event_registrations/_orders.html.haml +4 -0
  42. data/app/views/effective/event_registrations/_registrants.html.haml +10 -0
  43. data/app/views/effective/event_registrations/_summary.html.haml +29 -0
  44. data/app/views/effective/event_registrations/billing.html.haml +14 -0
  45. data/app/views/effective/event_registrations/checkout.html.haml +6 -0
  46. data/app/views/effective/event_registrations/registrants.html.haml +14 -0
  47. data/app/views/effective/event_registrations/start.html.haml +18 -0
  48. data/app/views/effective/event_registrations/submitted.html.haml +15 -0
  49. data/app/views/effective/event_registrations/summary.html.haml +8 -0
  50. data/app/views/effective/event_tickets/_fields.html.haml +4 -0
  51. data/app/views/effective/events/_dashboard.html.haml +14 -0
  52. data/app/views/effective/events/_event.html.haml +23 -0
  53. data/app/views/effective/events/_layout.html.haml +1 -0
  54. data/app/views/effective/events/_spacer.html.haml +1 -0
  55. data/app/views/effective/events/index.html.haml +8 -0
  56. data/app/views/effective/events/show.html.haml +16 -0
  57. data/config/effective_events.rb +17 -0
  58. data/config/routes.rb +24 -0
  59. data/db/migrate/01_create_effective_events.rb.erb +98 -0
  60. data/db/seeds.rb +45 -0
  61. data/lib/effective_events/engine.rb +18 -0
  62. data/lib/effective_events/version.rb +3 -0
  63. data/lib/effective_events.rb +21 -0
  64. data/lib/generators/effective_events/install_generator.rb +30 -0
  65. data/lib/generators/templates/effective_events_mailer_preview.rb +4 -0
  66. data/lib/tasks/effective_events_tasks.rake +8 -0
  67. metadata +262 -0
@@ -0,0 +1,10 @@
1
+ - all_steps_content = resource.event&.rich_text_all_steps_content
2
+ - step_content = resource.event&.send("rich_text_#{step}_content")
3
+
4
+ - if all_steps_content.present?
5
+ .card
6
+ .card-body= all_steps_content
7
+
8
+ - if step_content.present?
9
+ .card
10
+ .card-body= step_content
@@ -0,0 +1,30 @@
1
+ -# In progress registration
2
+ - registration = EffectiveEvents.EventRegistration.in_progress.for(current_user).first
3
+ - datatable = EffectiveResources.best('EffectiveEventRegistrationsDatatable').new(self, namespace: :effective)
4
+
5
+ - if registration.present?
6
+ %h2 In Progress Event Registrations
7
+
8
+ %p
9
+ Your registration for
10
+ = link_to(registration.event, effective_events.event_path(registration.event))
11
+ is incomplete
12
+
13
+ %p
14
+ Please
15
+ = link_to("Continue registration for #{registration.event}", effective_events.event_event_registration_build_path(registration.event, registration, registration.next_step), 'data-turbolinks' => false, class: 'btn btn-primary')
16
+ or you can
17
+ = link_to('Abandon registration', effective_events.event_event_registration_path(registration.event, registration), 'data-confirm': "Really delete #{registration}?", 'data-method': :delete, class: 'btn btn-danger')
18
+ to register for another event.
19
+
20
+ %hr
21
+
22
+ %h2 Event Registrations
23
+
24
+ - if datatable.present?
25
+ = render_simple_datatable(datatable)
26
+ - else
27
+ %p You have no past event registrations. When you do, we'll show them here.
28
+
29
+ - if registration.blank?
30
+ %p= link_to 'View all Events', effective_events.events_path, class: 'btn btn-primary'
@@ -0,0 +1,8 @@
1
+ .effective-event-registration
2
+ - blacklist = EffectiveEvents.EventRegistration.required_wizard_steps
3
+ - steps = event_registration.required_steps - blacklist
4
+
5
+ = render "effective/event_registrations/summary", event_registration: event_registration
6
+
7
+ - steps.select { |step| event_registration.has_completed_step?(step) }.each do |partial|
8
+ = render "effective/event_registrations/#{partial}", event_registration: event_registration, step: partial
@@ -0,0 +1,3 @@
1
+ .row
2
+ .col-lg-3.mb-3= render_wizard_sidebar(resource)
3
+ .col-lg-9= yield
@@ -0,0 +1,4 @@
1
+ - if event_registration.submit_order&.purchased?
2
+ .card.mb-4
3
+ .card-body
4
+ = render(event_registration.submit_order)
@@ -0,0 +1,10 @@
1
+ .card
2
+ .card-body
3
+ .row
4
+ .col-sm
5
+ %h5.card-title= event_registration.wizard_step_title(:registrants)
6
+ .col-sm-auto.text-right
7
+ = link_to('Edit', wizard_path(:registrants)) if edit_effective_event_registrations_wizard?
8
+
9
+ - datatable = EffectiveEventRegistrantsDatatable.new(event_registration: event_registration)
10
+ .mb-4= render_simple_datatable(datatable)
@@ -0,0 +1,29 @@
1
+ .card
2
+ .card-body
3
+ %h5 Event Registration
4
+
5
+ %table.table.table-sm
6
+ %tbody
7
+ %tr
8
+ %th.border-0 Event
9
+ %td.border-0
10
+ = link_to(event_registration.event, effective_events.event_path(event_registration.event))
11
+
12
+ - if request.path.start_with?('/admin')
13
+ %tr
14
+ %th Owner
15
+ %td
16
+ - url = (polymorphic_admin_path(event_registration.owner) rescue "/admin/users/#{event_registration.owner.to_param}/edit")
17
+ = link_to(event_registration.owner, url)
18
+ - else
19
+ %tr
20
+ %th Owner
21
+ %td= event_registration.owner
22
+
23
+
24
+ - if event_registration.orders.present?
25
+ %tr
26
+ %th Order
27
+ %td
28
+ - event_registration.orders.each do |order|
29
+ = link_to(order, effective_orders.order_path(order))
@@ -0,0 +1,14 @@
1
+ = render 'layout' do
2
+ = render 'effective/event_registrations/content', resource: resource
3
+
4
+ - raise('expected owner to respond to billing_address') unless resource.owner.respond_to?(:billing_address)
5
+
6
+ .card
7
+ .card-body
8
+ = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
9
+ = f.hidden_field :id
10
+
11
+ = f.fields_for(:owner, f.object.owner) do |fu|
12
+ = effective_address_fields(fu, :billing)
13
+
14
+ = f.save 'Save and Continue'
@@ -0,0 +1,6 @@
1
+ = render 'layout' do
2
+ = render 'effective/event_registrations/content', resource: resource
3
+
4
+ .card
5
+ .card-body
6
+ = render_checkout_step2(resource.submit_order, purchased_url: wizard_path(:submitted), deferred_url: wizard_path(:checkout), declined_url: wizard_path(:checkout))
@@ -0,0 +1,14 @@
1
+ = render 'layout' do
2
+ = render 'effective/event_registrations/content', resource: resource
3
+
4
+ .card
5
+ .card-body
6
+ %p Please add one or more registrant.
7
+
8
+ = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
9
+ = f.hidden_field :id
10
+
11
+ = f.has_many :event_registrants, f.object.build_event_registrants do |fr|
12
+ = render('effective/event_registrants/fields', f: fr, event: f.object.event)
13
+
14
+ = f.save 'Save and Continue'
@@ -0,0 +1,18 @@
1
+ = render 'layout' do
2
+ = render 'effective/event_registrations/content', resource: resource
3
+
4
+ .card
5
+ .card-body
6
+ %p Welcome #{current_user}!
7
+
8
+ %p You are registering for #{resource.event}.
9
+
10
+ = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
11
+ = f.hidden_field :id
12
+
13
+ = f.hidden_field :event_id
14
+
15
+ = f.hidden_field :owner_type
16
+ = f.hidden_field :owner_id
17
+
18
+ = f.save 'Save and Continue'
@@ -0,0 +1,15 @@
1
+ = render 'layout' do
2
+ = render 'effective/event_registrations/content', resource: resource
3
+
4
+ - raise('expected a submitted event_registration') unless resource.was_submitted?
5
+ - raise('expected a purchased event_registration submit_order') unless resource.submit_order&.purchased?
6
+
7
+ .alert.alert-warning.mb-4
8
+ Successfully paid on #{resource.submit_order.purchased_at.strftime('%F')}.
9
+
10
+ = link_to "Return to Dashboard", root_path, class: 'btn btn-lg btn-primary mb-4'
11
+
12
+ = render 'effective/event_registrations/event_registration', event_registration: resource
13
+ = render 'effective/event_registrations/orders', event_registration: resource
14
+
15
+ = link_to "Return to Dashboard", root_path, class: 'btn btn-lg btn-primary'
@@ -0,0 +1,8 @@
1
+ = render 'layout' do
2
+ = render 'effective/event_registrations/content', resource: resource
3
+
4
+ = render('effective/event_registrations/event_registration', event_registration: resource)
5
+
6
+ = effective_form_with(model: resource, url: wizard_path(step), method: :put) do |f|
7
+ = f.hidden_field :id
8
+ = f.submit 'Save and Continue', class: 'btn btn-primary'
@@ -0,0 +1,4 @@
1
+ = f.text_field :title
2
+ = f.price_field :regular_price
3
+ = f.price_field :early_bird_price
4
+ = f.check_box :tax_exempt
@@ -0,0 +1,14 @@
1
+ %h2 Events
2
+
3
+ - upcoming = Effective::Event.events(user: current_user).upcoming.count
4
+
5
+ %p
6
+ - if upcoming == 1
7
+ There is 1 upcoming event.
8
+ - else
9
+ There are #{upcoming} upcoming events.
10
+
11
+ - datatable = EffectiveEventsDatatable.new(self, namespace: :effective)
12
+ = render_datatable(datatable, simple: true)
13
+
14
+ %p= link_to 'View All Events', effective_events.events_path, class: 'btn btn-primary'
@@ -0,0 +1,23 @@
1
+ .effective-event
2
+ %h2.event-title= link_to event, effective_events.event_path(event)
3
+
4
+ %table.table.effective-events-table
5
+ %tbody
6
+ %tr
7
+ %td Starts
8
+ %td= event.start_at
9
+
10
+ %tr
11
+ %td Ends
12
+ %td= event.end_at
13
+
14
+ %tr
15
+ %td Registration Closes
16
+ %td= event.registration_end_at
17
+
18
+ %tr
19
+ %td Early Bird
20
+ %td= event.early_bird_status
21
+
22
+ .event-content.event-excerpt
23
+ = event.excerpt
@@ -0,0 +1 @@
1
+ = yield
@@ -0,0 +1,8 @@
1
+ %h1= @page_title
2
+
3
+ = render 'layout' do
4
+ .effective-events
5
+ = render partial: @events, spacer_template: 'spacer'
6
+
7
+ %nav.d-flex.justify-content-center
8
+ = bootstrap_paginate(@events, per_page: EffectiveEvents.per_page)
@@ -0,0 +1,16 @@
1
+ = render 'layout' do
2
+ .effective-event
3
+
4
+ - if @event.sold_out?
5
+ .alert.alert-warning This event is sold out.
6
+
7
+ - if @event.closed?
8
+ .alert.alert-warning This event is no longer available.
9
+
10
+ - if @event.registerable?
11
+ = link_to 'Register For This Event', effective_events.new_event_event_registration_path(@event), class: 'btn btn-primary'
12
+
13
+ = render 'effective/events/event', event: @event
14
+
15
+ .event-body.event-content
16
+ = @event.body
@@ -0,0 +1,17 @@
1
+ EffectiveEvents.setup do |config|
2
+ config.events_table_name = :events
3
+ config.event_tickets_table_name = :event_tickets
4
+ config.event_registrants_table_name = :event_registrants
5
+ config.event_registrations_table_name = :event_registrations
6
+
7
+ # Layout Settings
8
+ # Configure the Layout per controller, or all at once
9
+ # config.layout = { application: 'application', admin: 'admin' }
10
+
11
+ # Event Settings
12
+ # config.event_registrations_class_name = 'Effective::EventRegistration'
13
+
14
+ config.per_page = 10
15
+
16
+ config.use_effective_roles = true
17
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ mount EffectiveEvents::Engine => '/', as: 'effective_events'
5
+ end
6
+
7
+ EffectiveEvents::Engine.routes.draw do
8
+ # Public routes
9
+ scope module: 'effective' do
10
+ resources :events, only: [:index, :show] do
11
+ resources :event_registrations, only: [:new, :show, :destroy] do
12
+ resources :build, controller: :event_registrations, only: [:show, :update]
13
+ end
14
+ end
15
+ end
16
+
17
+ namespace :admin do
18
+ resources :events, except: [:show]
19
+ resources :event_tickets, except: [:show]
20
+ resources :event_registrants, except: [:show]
21
+ resources :event_registrations, only: [:index, :show]
22
+ end
23
+
24
+ end
@@ -0,0 +1,98 @@
1
+ class CreateEffectiveEvents < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :events do |t|
4
+ t.string :title
5
+
6
+ t.string :slug
7
+ t.boolean :draft, default: false
8
+
9
+ t.datetime :start_at
10
+ t.datetime :end_at
11
+
12
+ t.datetime :registration_start_at
13
+ t.datetime :registration_end_at
14
+ t.datetime :early_bird_end_at
15
+
16
+ t.integer :event_registrants_count, default: 0
17
+
18
+ t.integer :roles_mask
19
+ t.boolean :authenticate_user, default: false
20
+
21
+ t.timestamps
22
+ end
23
+
24
+ add_index :events, :title
25
+ add_index :events, :end_at
26
+
27
+ create_table :event_tickets do |t|
28
+ t.integer :event_id
29
+
30
+ t.string :title
31
+ t.integer :capacity
32
+
33
+ t.integer :regular_price
34
+ t.integer :early_bird_price
35
+
36
+ t.string :qb_item_name
37
+ t.boolean :tax_exempt, default: false
38
+
39
+ t.integer :position
40
+
41
+ t.timestamps
42
+ end
43
+
44
+ create_table :event_registrants do |t|
45
+ t.integer :event_id
46
+ t.integer :event_ticket_id
47
+
48
+ t.integer :owner_id
49
+ t.string :owner_type
50
+
51
+ t.integer :event_registration_id
52
+ t.string :event_registration_type
53
+
54
+ t.string :first_name
55
+ t.string :last_name
56
+ t.string :email
57
+
58
+ t.string :company
59
+ t.string :number
60
+ t.text :notes
61
+
62
+ t.integer :purchased_order_id
63
+ t.integer :price
64
+
65
+ t.timestamps
66
+ end
67
+
68
+ create_table :event_registrations do |t|
69
+ t.string :token
70
+
71
+ t.integer :event_id
72
+
73
+ t.integer :owner_id
74
+ t.string :owner_type
75
+
76
+ t.integer :user_id
77
+ t.string :user_type
78
+
79
+ # Acts as Statused
80
+ t.string :status
81
+ t.text :status_steps
82
+
83
+ # Acts as Wizard
84
+ t.text :wizard_steps
85
+
86
+ # Dates
87
+ t.datetime :submitted_at
88
+
89
+ t.datetime :updated_at
90
+ t.datetime :created_at
91
+ end
92
+
93
+ add_index :event_registrations, [:owner_id, :owner_type]
94
+ add_index :event_registrations, :status
95
+ add_index :event_registrations, :token
96
+
97
+ end
98
+ end
data/db/seeds.rb ADDED
@@ -0,0 +1,45 @@
1
+ puts "Running effective_events seeds"
2
+
3
+ now = Time.zone.now
4
+
5
+ if Rails.env.test?
6
+ Effective::Event.destroy_all
7
+ ActionText::RichText.where(record_type: ['Effective::Event', 'Effective::Ticket']).delete_all
8
+ end
9
+
10
+ # Build the first CpdCycle
11
+ event = Effective::Event.create!(
12
+ title: "#{now.year} Main Event",
13
+ body: '<p>This is a great event!</p>',
14
+
15
+ start_at: (now + 1.week),
16
+ end_at: (now + 1.week + 1.hour),
17
+
18
+ registration_start_at: now,
19
+ registration_end_at: (now + 6.days),
20
+ early_bird_end_at: (now + 3.days)
21
+ )
22
+
23
+ event.event_tickets.create!(
24
+ title: 'Ticket A 10 Seats',
25
+ capacity: 10,
26
+ regular_price: 100_00,
27
+ early_bird_price: 50_00,
28
+ qb_item_name: 'Tickets'
29
+ )
30
+
31
+ event.event_tickets.create!(
32
+ title: 'Ticket B 20 Seats',
33
+ capacity: 20,
34
+ regular_price: 200_00,
35
+ early_bird_price: 150_00,
36
+ qb_item_name: 'Tickets'
37
+ )
38
+
39
+ event.event_tickets.create!(
40
+ title: 'Ticket C Unlimited Seats',
41
+ capacity: nil,
42
+ regular_price: 200_00,
43
+ early_bird_price: 150_00,
44
+ qb_item_name: 'Tickets'
45
+ )
@@ -0,0 +1,18 @@
1
+ module EffectiveEvents
2
+ class Engine < ::Rails::Engine
3
+ engine_name 'effective_events'
4
+
5
+ # Set up our default configuration options.
6
+ initializer 'effective_events.defaults', before: :load_config_initializers do |app|
7
+ eval File.read("#{config.root}/config/effective_events.rb")
8
+ end
9
+
10
+ # Include concern and allow any ActiveRecord object to call it
11
+ initializer 'effective_events.active_record' do |app|
12
+ ActiveSupport.on_load :active_record do
13
+ ActiveRecord::Base.extend(EffectiveEventsEventRegistration::Base)
14
+ end
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module EffectiveEvents
2
+ VERSION = '0.1.0'.freeze
3
+ end
@@ -0,0 +1,21 @@
1
+ require 'effective_resources'
2
+ require 'effective_events/engine'
3
+ require 'effective_events/version'
4
+
5
+ module EffectiveEvents
6
+
7
+ def self.config_keys
8
+ [
9
+ :events_table_name, :event_registrants_table_name, :event_tickets_table_name, :event_registrations_table_name,
10
+ :layout, :per_page, :use_effective_roles,
11
+ :event_registration_class_name
12
+ ]
13
+ end
14
+
15
+ include EffectiveGem
16
+
17
+ def self.EventRegistration
18
+ event_registration_class_name&.constantize || Effective::EventRegistration
19
+ end
20
+
21
+ end
@@ -0,0 +1,30 @@
1
+ module EffectiveMemberships
2
+ module Generators
3
+ class InstallGenerator < Rails::Generators::Base
4
+ include Rails::Generators::Migration
5
+
6
+ desc 'Creates an EffectiveEvents initializer in your application.'
7
+
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ def self.next_migration_number(dirname)
11
+ if not ActiveRecord::Base.timestamped_migrations
12
+ Time.new.utc.strftime("%Y%m%d%H%M%S")
13
+ else
14
+ '%.3d' % (current_migration_number(dirname) + 1)
15
+ end
16
+ end
17
+
18
+ def copy_initializer
19
+ template ('../' * 3) + 'config/effective_events.rb', 'config/initializers/effective_events.rb'
20
+ end
21
+
22
+ def create_migration_file
23
+ @events_table_name = ':' + EffectiveEvents.events_table_name.to_s
24
+
25
+ migration_template ('../' * 3) + 'db/migrate/01_create_effective_events.rb.erb', 'db/migrate/create_effective_events.rb'
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,4 @@
1
+ # Visit http://localhost:3000/rails/mailers
2
+
3
+ class EffectiveEventsMailerPreview < ActionMailer::Preview
4
+ end
@@ -0,0 +1,8 @@
1
+ namespace :effective_events do
2
+
3
+ # bundle exec rake effective_events:seed
4
+ task seed: :environment do
5
+ load "#{__dir__}/../../db/seeds.rb"
6
+ end
7
+
8
+ end