effective_events 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 (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