dm_event 4.2.1.5 → 4.2.2
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.
- checksums.yaml +4 -4
- data/app/controllers/dm_event/admin/admin_controller.rb +1 -1
- data/app/controllers/dm_event/admin/registrations_controller.rb +10 -1
- data/app/controllers/dm_event/admin/workshop_prices_controller.rb +6 -0
- data/app/controllers/dm_event/admin/workshops_controller.rb +58 -9
- data/app/controllers/dm_event/registrations_controller.rb +1 -1
- data/app/datatables/registration_datatable.rb +23 -8
- data/app/models/dm_event/concerns/ability.rb +39 -9
- data/app/models/dm_event/model_decorators.rb +1 -0
- data/app/models/dm_event/permitted_params.rb +8 -5
- data/app/views/dm_event/admin/registrations/_form.html.erb +8 -5
- data/app/views/dm_event/admin/workshops/_registration_stats.html.erb +57 -53
- data/app/views/dm_event/admin/workshops/index.html.erb +54 -46
- data/app/views/dm_event/admin/workshops/permissions.html.erb +58 -0
- data/app/views/dm_event/admin/workshops/show.html.erb +32 -13
- data/config/initializers/dm_event.rb +1 -1
- data/config/routes.rb +2 -0
- data/lib/dm_event/engine.rb +1 -2
- metadata +8 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: dea6ef511efd6db0aee3ce60595983c05a8ed4b1
|
|
4
|
+
data.tar.gz: ea0c6813860edba83743ff1798ff539401b888b4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 308fbd246363d28dbbbc6ae94c82d3ad0e0c0a43b8b685d70b749487bef03033bc49198e06230c702a62aea724de37a3fcbd6b3633420f9e200175456f783e81
|
|
7
|
+
data.tar.gz: 495774ef45baee7b4a6dfdb98da51b9ee1ab2d0dedeb0bbe96079d42813a4046985778a16ad18b131aa365cea7ec01d918449d4f0367e098efd3f68b7bd6c376
|
|
@@ -5,7 +5,7 @@ protected
|
|
|
5
5
|
|
|
6
6
|
#------------------------------------------------------------------------------
|
|
7
7
|
def authorize_access
|
|
8
|
-
unless can?(:
|
|
8
|
+
unless can?(:access_event_section, :all)
|
|
9
9
|
flash[:alert] = "Unauthorized Access!"
|
|
10
10
|
redirect_to current_account.index_path
|
|
11
11
|
end
|
|
@@ -6,6 +6,8 @@ class DmEvent::Admin::RegistrationsController < DmEvent::Admin::AdminController
|
|
|
6
6
|
#------------------------------------------------------------------------------
|
|
7
7
|
def action_state
|
|
8
8
|
@registration = Registration.find(params[:id])
|
|
9
|
+
authorize! :manage_event_registrations, @registration.workshop
|
|
10
|
+
|
|
9
11
|
@state_event = params[:state_event].downcase
|
|
10
12
|
case @state_event
|
|
11
13
|
# when 'verify payment'
|
|
@@ -32,6 +34,7 @@ class DmEvent::Admin::RegistrationsController < DmEvent::Admin::AdminController
|
|
|
32
34
|
#------------------------------------------------------------------------------
|
|
33
35
|
def destroy
|
|
34
36
|
registration = Registration.find(params[:id])
|
|
37
|
+
authorize! :manage_event_registrations, registration.workshop
|
|
35
38
|
registration.destroy
|
|
36
39
|
redirect_to admin_workshop_url(registration.workshop), notice: 'Registration was successfully deleted.'
|
|
37
40
|
end
|
|
@@ -40,16 +43,18 @@ class DmEvent::Admin::RegistrationsController < DmEvent::Admin::AdminController
|
|
|
40
43
|
def edit
|
|
41
44
|
@registration = Registration.find(params[:id])
|
|
42
45
|
@workshop = @registration.workshop
|
|
46
|
+
authorize! :manage_event_registrations, @registration.workshop
|
|
43
47
|
end
|
|
44
48
|
|
|
45
49
|
#------------------------------------------------------------------------------
|
|
46
50
|
def update
|
|
47
51
|
@registration = Registration.find(params[:id])
|
|
48
52
|
@workshop = @registration.workshop
|
|
53
|
+
authorize! :manage_event_registrations, @registration.workshop
|
|
49
54
|
|
|
50
55
|
#--- save without validation, so can update without having to fill in all details
|
|
51
56
|
payment_comment_text = params[:registration].delete(:payment_comment_text)
|
|
52
|
-
@registration.attributes = registration_params
|
|
57
|
+
@registration.attributes = registration_params(@workshop)
|
|
53
58
|
|
|
54
59
|
if @registration.save(:validate => false)
|
|
55
60
|
if @registration.payment_comment.nil? && payment_comment_text
|
|
@@ -70,6 +75,8 @@ class DmEvent::Admin::RegistrationsController < DmEvent::Admin::AdminController
|
|
|
70
75
|
def ajax_payment
|
|
71
76
|
@registration = Registration.find(params[:id])
|
|
72
77
|
@workshop = @registration.workshop
|
|
78
|
+
authorize! :manage_event_registrations, @registration.workshop
|
|
79
|
+
|
|
73
80
|
previous_payment = params[:payment_id] ? PaymentHistory.find(params[:payment_id]) : nil
|
|
74
81
|
@payment_history = @registration.manual_payment(previous_payment,
|
|
75
82
|
params[:payment_history][:cost],
|
|
@@ -98,6 +105,8 @@ class DmEvent::Admin::RegistrationsController < DmEvent::Admin::AdminController
|
|
|
98
105
|
#------------------------------------------------------------------------------
|
|
99
106
|
def ajax_delete_payment
|
|
100
107
|
@registration = Registration.find(params[:id])
|
|
108
|
+
authorize! :manage_event_registrations, @registration.workshop
|
|
109
|
+
|
|
101
110
|
if @registration.delete_payment(params[:payment_id])
|
|
102
111
|
redirect_to edit_admin_registration_path(@registration), notice: 'Payment was deleted'
|
|
103
112
|
else
|
|
@@ -6,20 +6,24 @@ class DmEvent::Admin::WorkshopPricesController < DmEvent::Admin::AdminController
|
|
|
6
6
|
|
|
7
7
|
#------------------------------------------------------------------------------
|
|
8
8
|
def index
|
|
9
|
+
authorize! :manage_events, @workshop
|
|
9
10
|
@workshop_prices = @workshop.workshop_prices
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
#------------------------------------------------------------------------------
|
|
13
14
|
def new
|
|
15
|
+
authorize! :manage_events, @workshop
|
|
14
16
|
@workshop_price = @workshop.workshop_prices.build(price_currency: @workshop.base_currency)
|
|
15
17
|
end
|
|
16
18
|
|
|
17
19
|
#------------------------------------------------------------------------------
|
|
18
20
|
def edit
|
|
21
|
+
authorize! :manage_events, @workshop
|
|
19
22
|
end
|
|
20
23
|
|
|
21
24
|
#------------------------------------------------------------------------------
|
|
22
25
|
def create
|
|
26
|
+
authorize! :manage_events, @workshop
|
|
23
27
|
attributes = WorkshopPrice.prepare_prices(workshop_price_params.merge(price_currency: @workshop.base_currency))
|
|
24
28
|
@workshop_price = @workshop.workshop_prices.new(attributes)
|
|
25
29
|
if @workshop_price.save
|
|
@@ -31,6 +35,7 @@ class DmEvent::Admin::WorkshopPricesController < DmEvent::Admin::AdminController
|
|
|
31
35
|
|
|
32
36
|
#------------------------------------------------------------------------------
|
|
33
37
|
def update
|
|
38
|
+
authorize! :manage_events, @workshop
|
|
34
39
|
attributes = WorkshopPrice.prepare_prices(workshop_price_params.merge(price_currency: @workshop.base_currency))
|
|
35
40
|
if @workshop_price.update_attributes(attributes)
|
|
36
41
|
redirect_to admin_workshop_workshop_prices_url(@workshop), notice: 'Price was successfully updated.'
|
|
@@ -41,6 +46,7 @@ class DmEvent::Admin::WorkshopPricesController < DmEvent::Admin::AdminController
|
|
|
41
46
|
|
|
42
47
|
#------------------------------------------------------------------------------
|
|
43
48
|
def destroy
|
|
49
|
+
authorize! :manage_events, @workshop
|
|
44
50
|
if @workshop_price.registrations.count == 0
|
|
45
51
|
@workshop_price.destroy
|
|
46
52
|
redirect_to admin_workshop_workshop_prices_url(@workshop), notice: 'Price was successfully deleted.'
|
|
@@ -9,21 +9,25 @@ class DmEvent::Admin::WorkshopsController < DmEvent::Admin::AdminController
|
|
|
9
9
|
|
|
10
10
|
#------------------------------------------------------------------------------
|
|
11
11
|
def index
|
|
12
|
-
|
|
13
|
-
@
|
|
12
|
+
authorize! :access_event_section, :all
|
|
13
|
+
@workshops = Workshop.upcoming.select {|w| can?(:list_events, w)}
|
|
14
|
+
@workshops_past = Workshop.past.select {|w| can?(:list_events, w)}
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
#------------------------------------------------------------------------------
|
|
17
18
|
def new
|
|
19
|
+
authorize! :manage_events, :all
|
|
18
20
|
@workshop = Workshop.new
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
#------------------------------------------------------------------------------
|
|
22
24
|
def edit
|
|
25
|
+
authorize! :manage_events, @workshop
|
|
23
26
|
end
|
|
24
27
|
|
|
25
28
|
#------------------------------------------------------------------------------
|
|
26
29
|
def create
|
|
30
|
+
authorize! :manage_events, :all
|
|
27
31
|
@workshop = Workshop.new(workshop_params)
|
|
28
32
|
if @workshop.save
|
|
29
33
|
redirect_to admin_workshop_url(@workshop), notice: 'Workshop was successfully created.'
|
|
@@ -34,6 +38,7 @@ class DmEvent::Admin::WorkshopsController < DmEvent::Admin::AdminController
|
|
|
34
38
|
|
|
35
39
|
#------------------------------------------------------------------------------
|
|
36
40
|
def update
|
|
41
|
+
authorize! :manage_events, @workshop
|
|
37
42
|
if @workshop.update_attributes(workshop_params)
|
|
38
43
|
redirect_to admin_workshop_url(@workshop), notice: 'Workshop was successfully updated.'
|
|
39
44
|
else
|
|
@@ -43,18 +48,25 @@ class DmEvent::Admin::WorkshopsController < DmEvent::Admin::AdminController
|
|
|
43
48
|
|
|
44
49
|
#------------------------------------------------------------------------------
|
|
45
50
|
def show
|
|
46
|
-
|
|
47
|
-
|
|
51
|
+
authorize! :list_events, @workshop
|
|
48
52
|
respond_to do |format|
|
|
49
53
|
format.html # show.html.erb
|
|
50
|
-
format.json {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
format.json {
|
|
55
|
+
permissions = {
|
|
56
|
+
manage_events: can?(:manage_events, @workshop),
|
|
57
|
+
manage_event_registrations: can?(:manage_event_registrations, @workshop),
|
|
58
|
+
manage_event_finances: can?(:manage_event_finances, @workshop)
|
|
59
|
+
}
|
|
60
|
+
render json: RegistrationDatatable.new(view_context, current_user, permissions)
|
|
61
|
+
}
|
|
62
|
+
format.xls { data_export(Registration.csv_columns(@workshop), @workshop.registrations, filename: @workshop.slug, expressions: true, format: 'xls') if can?(:manage_event_registrations, @workshop)}
|
|
63
|
+
format.csv { data_export(Registration.csv_columns(@workshop), @workshop.registrations, filename: @workshop.slug, expressions: true, format: 'csv') if can?(:manage_event_registrations, @workshop)}
|
|
64
|
+
end
|
|
54
65
|
end
|
|
55
66
|
|
|
56
67
|
#------------------------------------------------------------------------------
|
|
57
68
|
def destroy
|
|
69
|
+
authorize! :manage_events, :all
|
|
58
70
|
@workshop.destroy
|
|
59
71
|
redirect_to admin_workshops_url, notice: 'Workshop was successfully deleted.'
|
|
60
72
|
end
|
|
@@ -63,6 +75,7 @@ class DmEvent::Admin::WorkshopsController < DmEvent::Admin::AdminController
|
|
|
63
75
|
# to determine which one we're editing
|
|
64
76
|
#------------------------------------------------------------------------------
|
|
65
77
|
def edit_system_email
|
|
78
|
+
authorize! :manage_events, @workshop
|
|
66
79
|
redirect_to(admin_workshop_url(@workshop), error: 'Invalid system email type') if params[:email_type].blank?
|
|
67
80
|
# [todo] verify that the email_type is one of the Registration.aasm.states
|
|
68
81
|
|
|
@@ -78,13 +91,15 @@ class DmEvent::Admin::WorkshopsController < DmEvent::Admin::AdminController
|
|
|
78
91
|
|
|
79
92
|
#------------------------------------------------------------------------------
|
|
80
93
|
def financials
|
|
94
|
+
authorize! :manage_event_finances, @workshop
|
|
81
95
|
@financials = @workshop.financial_details
|
|
82
96
|
@payments = PaymentHistory.where(owner_type: 'Registration', owner_id: @workshop.registrations.pluck(:id)).includes(:user_profile, owner: [:user_profile])
|
|
83
97
|
end
|
|
84
98
|
|
|
85
|
-
# Generate a list of all outstanding balances
|
|
99
|
+
# Generate a list of all outstanding balances across all workshops
|
|
86
100
|
#------------------------------------------------------------------------------
|
|
87
101
|
def user_outstanding_balances
|
|
102
|
+
authorize! :manage_events, :all
|
|
88
103
|
@unpaid = Registration.unpaid.includes(:user_profile, :workshop_price)
|
|
89
104
|
@unpaid = @unpaid.to_a.delete_if {|i| i.balance_owed.zero?}.group_by {|i| i.full_name}.sort_by {|i| i[0].downcase}
|
|
90
105
|
end
|
|
@@ -92,6 +107,7 @@ class DmEvent::Admin::WorkshopsController < DmEvent::Admin::AdminController
|
|
|
92
107
|
# Handle any additional configuration, such as selecting the attached blog/forum
|
|
93
108
|
#------------------------------------------------------------------------------
|
|
94
109
|
def additional_configuration
|
|
110
|
+
authorize! :manage_events, @workshop
|
|
95
111
|
if put_or_post?
|
|
96
112
|
if @workshop.valid?
|
|
97
113
|
new_blog_id = params[:workshop].delete(:cms_blog).to_i
|
|
@@ -119,6 +135,7 @@ class DmEvent::Admin::WorkshopsController < DmEvent::Admin::AdminController
|
|
|
119
135
|
|
|
120
136
|
#------------------------------------------------------------------------------
|
|
121
137
|
def send_payment_reminder_emails
|
|
138
|
+
authorize! :manage_event_finances, @workshop
|
|
122
139
|
status = @workshop.send_payment_reminder_emails(params[:registration_id])
|
|
123
140
|
msg = "Reminder emails sent ==> Success: #{status[:success]} Failed: #{status[:failed]}"
|
|
124
141
|
status[:failed] > 0 ? (flash[:warning] = msg) : (flash[:notice] = msg)
|
|
@@ -127,6 +144,7 @@ class DmEvent::Admin::WorkshopsController < DmEvent::Admin::AdminController
|
|
|
127
144
|
|
|
128
145
|
#------------------------------------------------------------------------------
|
|
129
146
|
def lost_users
|
|
147
|
+
authorize! :manage_event_registrations, @workshop
|
|
130
148
|
if put_or_post?
|
|
131
149
|
@days_ago = params[:lost_users][:days_ago].to_i
|
|
132
150
|
@days_ago = 60 if @days_ago > 60
|
|
@@ -137,6 +155,37 @@ class DmEvent::Admin::WorkshopsController < DmEvent::Admin::AdminController
|
|
|
137
155
|
@lost_users = @workshop.lost_users(@days_ago)
|
|
138
156
|
end
|
|
139
157
|
|
|
158
|
+
#------------------------------------------------------------------------------
|
|
159
|
+
def permissions
|
|
160
|
+
authorize! :manage_events, :all
|
|
161
|
+
if put_or_post?
|
|
162
|
+
if params[:user][:user_id]
|
|
163
|
+
user = User.find(params[:user][:user_id])
|
|
164
|
+
if user
|
|
165
|
+
roles = params[:user].delete(:roles)
|
|
166
|
+
[:manage_event, :manage_event_registration, :manage_event_finance].each do |role|
|
|
167
|
+
roles[role].as_boolean ? user.add_role(role, @workshop) : user.remove_role(role, @workshop)
|
|
168
|
+
end
|
|
169
|
+
user.save!
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
@event_managers = User.with_role(:event_manager)
|
|
174
|
+
@event_managers_alacarte = User.with_role(:event_manager_alacarte)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
#------------------------------------------------------------------------------
|
|
178
|
+
def ajax_toggle_permission
|
|
179
|
+
authorize! :manage_events, :all
|
|
180
|
+
user = User.find(params[:user_id])
|
|
181
|
+
role = params[:role].to_sym
|
|
182
|
+
if user && [:manage_event, :manage_event_registration, :manage_event_finance].include?(role)
|
|
183
|
+
user.has_role?(role, @workshop) ? user.remove_role(role, @workshop) : user.add_role(role, @workshop)
|
|
184
|
+
user.save!
|
|
185
|
+
end
|
|
186
|
+
render nothing: true
|
|
187
|
+
end
|
|
188
|
+
|
|
140
189
|
private
|
|
141
190
|
|
|
142
191
|
#------------------------------------------------------------------------------
|
|
@@ -42,7 +42,7 @@ class DmEvent::RegistrationsController < DmEvent::ApplicationController
|
|
|
42
42
|
profile_params = params[:registration].delete("user_profile_attributes") if params[:registration]
|
|
43
43
|
profile_params.delete(:id) if profile_params
|
|
44
44
|
|
|
45
|
-
@registration = @workshop.registrations.new(registration_params)
|
|
45
|
+
@registration = @workshop.registrations.new(registration_params(@workshop))
|
|
46
46
|
@registration.registered_locale = I18n.locale
|
|
47
47
|
@registration.user_profile = current_user ? current_user.user_profile : UserProfile.new
|
|
48
48
|
@registration.user_profile.assign_attributes(user_profile_direct_params(profile_params)) unless profile_params.blank?
|
|
@@ -8,8 +8,10 @@ class RegistrationDatatable
|
|
|
8
8
|
delegate :url_helpers, to: 'DmEvent::Engine.routes'
|
|
9
9
|
|
|
10
10
|
#------------------------------------------------------------------------------
|
|
11
|
-
def initialize(view)
|
|
11
|
+
def initialize(view, user, permissions)
|
|
12
12
|
@view = view
|
|
13
|
+
@user = user
|
|
14
|
+
@permissions = permissions
|
|
13
15
|
end
|
|
14
16
|
|
|
15
17
|
#------------------------------------------------------------------------------
|
|
@@ -32,8 +34,8 @@ private
|
|
|
32
34
|
"<span style='white-space:nowrap;'>#{registration.receipt_code}</span>",
|
|
33
35
|
name_and_avatar(registration),
|
|
34
36
|
present(registration).balance_or_paid,
|
|
35
|
-
"<span
|
|
36
|
-
(registration.user_profile.user ? present(registration.user_profile.user).last_access : colored_label('no user', :gray))
|
|
37
|
+
"<span class='date'>#{format_date(registration.created_at)}</span>",
|
|
38
|
+
"<span class='date'>#{(registration.user_profile.user ? present(registration.user_profile.user).last_access : colored_label('no user', :gray))}</span>"
|
|
37
39
|
]
|
|
38
40
|
end
|
|
39
41
|
end
|
|
@@ -46,13 +48,22 @@ private
|
|
|
46
48
|
#------------------------------------------------------------------------------
|
|
47
49
|
def name_and_avatar(registration)
|
|
48
50
|
# image_tag(registration.user_profile.public_avatar_url(:sq35), width: 25, height: 25) + link_to(registration.full_name, url_helpers.edit_admin_registration_path(I18n.locale, registration))
|
|
49
|
-
|
|
51
|
+
if @permissions[:manage_event_registrations]
|
|
52
|
+
link_to(registration.full_name, url_helpers.edit_admin_registration_path(I18n.locale, registration))
|
|
53
|
+
else
|
|
54
|
+
registration.full_name
|
|
55
|
+
end
|
|
50
56
|
end
|
|
51
57
|
|
|
52
58
|
#------------------------------------------------------------------------------
|
|
53
59
|
def fetch_registrations
|
|
54
60
|
@workshop = Workshop.find_by_slug(params[:id])
|
|
55
61
|
registrations = @workshop.registrations.includes(:workshop_price, :user_profile => [:user => :current_site_profile]).references(:user_profiles).order("#{sort_column} #{sort_direction}")
|
|
62
|
+
|
|
63
|
+
if !@permissions[:manage_event_registrations] && !@permissions[:manage_event_finances]
|
|
64
|
+
# limit to your own registration if can only edit the workshop
|
|
65
|
+
registrations = registrations.where(user_profile_id: @user.user_profile.id)
|
|
66
|
+
end
|
|
56
67
|
if params[:duplicates].present?
|
|
57
68
|
#--- grab only registrations that have duplicates (based on the user_profile_id)
|
|
58
69
|
grouped = registrations.group(:user_profile_id)
|
|
@@ -70,10 +81,14 @@ private
|
|
|
70
81
|
def registration_actions(registration)
|
|
71
82
|
actions = ''
|
|
72
83
|
actions += '<div class="btn-group">'
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
actions +=
|
|
76
|
-
|
|
84
|
+
if @permissions[:manage_event_registrations]
|
|
85
|
+
actions += "<button class='btn btn-xs dropdown-toggle btn-#{registration.current_state} hovertip' data-placement='right' data-toggle='dropdown' title='#{registration.current_state.capitalize} on #{format_date(registration.process_changed_on)}'><i class='caret'></i></button>"
|
|
86
|
+
actions += '<ul class="dropdown-menu">'
|
|
87
|
+
actions += action_list(registration)
|
|
88
|
+
actions += '</ul>'
|
|
89
|
+
else
|
|
90
|
+
actions += "<button class='btn btn-xs btn-#{registration.current_state} hovertip' data-placement='right' title='#{registration.current_state.capitalize} on #{format_date(registration.process_changed_on)}'></button>"
|
|
91
|
+
end
|
|
77
92
|
actions += '</div>'
|
|
78
93
|
end
|
|
79
94
|
|
|
@@ -1,38 +1,68 @@
|
|
|
1
|
-
# Wrap
|
|
1
|
+
# Wrap event specific CanCan rules. Should be included in the main app's
|
|
2
2
|
# Ability class.
|
|
3
3
|
# NOTE: When checking abilities, don't check for Class level abilities,
|
|
4
4
|
# unless you don't care about the instance level. For example, don't
|
|
5
5
|
# use both styles
|
|
6
|
-
# can? :moderate,
|
|
7
|
-
# can? :moderate, @
|
|
6
|
+
# can? :moderate, Workshop
|
|
7
|
+
# can? :moderate, @workshop
|
|
8
8
|
# In this case, if you need to check the class level, then use specific
|
|
9
|
-
# current_user.has_role? :moderator,
|
|
9
|
+
# current_user.has_role? :moderator, Workshop
|
|
10
10
|
#------------------------------------------------------------------------------
|
|
11
|
-
|
|
12
11
|
module DmEvent
|
|
13
12
|
module Concerns
|
|
14
13
|
module Ability
|
|
15
14
|
def dm_event_abilities(user)
|
|
16
15
|
if user
|
|
16
|
+
# an `event_manager` gets access to all workshops, registration, and finances.
|
|
17
17
|
if user.has_role?(:event_manager)
|
|
18
18
|
can :manage_events, :all
|
|
19
|
+
can :manage_event_registrations, :all
|
|
20
|
+
can :manage_event_finances, :all
|
|
21
|
+
can :access_event_section, :all
|
|
22
|
+
can :list_events, :all
|
|
23
|
+
# can :access_media_library, :all
|
|
24
|
+
can :access_admin, :all
|
|
25
|
+
elsif user.has_role?(:event_manager_alacarte)
|
|
26
|
+
# allowed to access the backend event section
|
|
27
|
+
can :access_event_section, :all
|
|
19
28
|
can :access_admin, :all
|
|
29
|
+
|
|
30
|
+
# can edit a workshop, including workshop prices and email templates
|
|
31
|
+
# (does not include access to registrations or finances)
|
|
32
|
+
manage_event_ids = @user_roles.select {|r| r.name == 'manage_event' && r.resource_type == 'Workshop'}.map(&:resource_id)
|
|
33
|
+
can :manage_events, Workshop, id: manage_event_ids
|
|
34
|
+
# can(:access_media_library, :all) unless manage_event_ids.empty?
|
|
35
|
+
|
|
36
|
+
# can see and manage a workshops registrations
|
|
37
|
+
manage_event_registration_ids = @user_roles.select {|r| r.name == 'manage_event_registration' && r.resource_type == 'Workshop'}.map(&:resource_id)
|
|
38
|
+
can :manage_event_registrations, Workshop, id: manage_event_registration_ids
|
|
39
|
+
|
|
40
|
+
# can see and manage a workshops finances
|
|
41
|
+
manage_event_finance_ids = @user_roles.select {|r| r.name == 'manage_event_finance' && r.resource_type == 'Workshop'}.map(&:resource_id)
|
|
42
|
+
can :manage_event_finances, Workshop, id: manage_event_finance_ids
|
|
43
|
+
|
|
44
|
+
can :list_events, Workshop, id: (manage_event_ids + manage_event_registration_ids + manage_event_finance_ids).uniq
|
|
20
45
|
end
|
|
46
|
+
|
|
21
47
|
end
|
|
22
48
|
end
|
|
49
|
+
|
|
50
|
+
::Ability.register_abilities(:dm_event_abilities)
|
|
51
|
+
|
|
23
52
|
end
|
|
24
53
|
end
|
|
25
54
|
end
|
|
26
55
|
|
|
56
|
+
|
|
27
57
|
#------------------------------------------------------------------------------
|
|
28
58
|
# The abilities get basically compiled. So if you use
|
|
29
59
|
#
|
|
30
|
-
# can :moderate,
|
|
60
|
+
# can :moderate, Workshop, :id => Workshop.with_role(:moderator, user).map(&:id)
|
|
31
61
|
#
|
|
32
|
-
# this will execute the
|
|
62
|
+
# this will execute the Workshop.with_role query once during Ability.new. However
|
|
33
63
|
#
|
|
34
|
-
# can :moderate,
|
|
35
|
-
# user.has_role? :moderator,
|
|
64
|
+
# can :moderate, Workshop do |workshop|
|
|
65
|
+
# user.has_role? :moderator, workshop
|
|
36
66
|
# end
|
|
37
67
|
#
|
|
38
68
|
# this will execute the has_role? block on each call to can?
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
module DmEvent
|
|
2
2
|
module PermittedParams
|
|
3
3
|
|
|
4
|
+
# access to this is protected before the call
|
|
4
5
|
#------------------------------------------------------------------------------
|
|
5
6
|
def workshop_params
|
|
6
|
-
params.require(:workshop).permit!
|
|
7
|
+
params.require(:workshop).permit!
|
|
7
8
|
end
|
|
8
9
|
|
|
10
|
+
# access to this is protected before the call
|
|
9
11
|
#------------------------------------------------------------------------------
|
|
10
12
|
def workshop_price_params
|
|
11
|
-
params.require(:workshop_price).permit!
|
|
13
|
+
params.require(:workshop_price).permit!
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
#------------------------------------------------------------------------------
|
|
15
|
-
def registration_params
|
|
17
|
+
def registration_params(workshop)
|
|
16
18
|
return nil if params[:registration].nil? || params[:registration].empty?
|
|
17
|
-
if can?
|
|
19
|
+
if can?(:manage_event_registrations, @workshop)
|
|
18
20
|
params.require(:registration).permit!
|
|
19
21
|
else
|
|
20
22
|
# nested attributes: because field_data can be either a single value or an array of values,
|
|
@@ -26,9 +28,10 @@ module DmEvent
|
|
|
26
28
|
end
|
|
27
29
|
end
|
|
28
30
|
|
|
31
|
+
# access to this is protected before the call
|
|
29
32
|
#------------------------------------------------------------------------------
|
|
30
33
|
def system_email_params
|
|
31
|
-
params.require(:system_email).permit!
|
|
34
|
+
params.require(:system_email).permit!
|
|
32
35
|
end
|
|
33
36
|
|
|
34
37
|
end
|
|
@@ -165,11 +165,6 @@
|
|
|
165
165
|
<% end %>
|
|
166
166
|
<% end %>
|
|
167
167
|
|
|
168
|
-
<%= subsection title: 'Payment Reminders' do %>
|
|
169
|
-
<%= f.input :preferred_payment_reminder_hold_until, label: 'No reminder until', as: :date_picker, input_wrapper_html: {class: 'col-sm-4'},
|
|
170
|
-
hint: 'When sending reminders in batch, this persons reminder will not be sent unless after the specified date' %>
|
|
171
|
-
<% end %>
|
|
172
|
-
|
|
173
168
|
<%= submit_or_cancel cancel_url: admin_workshop_path(@workshop), delete_url: [:admin, @registration], delete_confirm: 'Are you sure you wish to delete this registration? Any associated payments will also be deleted!' %>
|
|
174
169
|
<% end %>
|
|
175
170
|
</div>
|
|
@@ -211,7 +206,15 @@
|
|
|
211
206
|
<% end %>
|
|
212
207
|
|
|
213
208
|
<%= subsection title: 'Payment Reminders' do %>
|
|
209
|
+
<%= simple_form_for @registration, url: admin_registration_path,
|
|
210
|
+
html: { class: 'form-horizontal' }, wrapper: :bs3_horizontal_form, wrapper_mappings: DmAdmin::FormWrapperMappings do |f| %>
|
|
211
|
+
<%= f.input :preferred_payment_reminder_hold_until, label: 'No reminder until', as: :date_picker, input_wrapper_html: {class: 'col-sm-4'},
|
|
212
|
+
hint: 'When sending reminders in batch, this persons reminder will not be sent unless after the specified date' %>
|
|
214
213
|
|
|
214
|
+
<%= submit_or_cancel cancel: false %>
|
|
215
|
+
<% end %>
|
|
216
|
+
<hr/>
|
|
217
|
+
|
|
215
218
|
<table class="table table-condensed table-gradient table-hover" style="margin-bottom: 20px;">
|
|
216
219
|
<thead>
|
|
217
220
|
<tr>
|
|
@@ -1,58 +1,62 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
<% num = workshop.registrations.number_of(:attending) %>
|
|
5
|
-
<%= slim_progress_bar(label: 'Attending', value: "#{num} / #{num.percent_of(num_registrations).to_s}%", color: 'success', percentage: num.percent_of(num_registrations)) %>
|
|
6
|
-
<% if (num = workshop.registrations.number_of(:pending)) > 0 %>
|
|
7
|
-
<%= slim_progress_bar(label: 'Pending', value: "#{num}", color: 'pending', percentage: num.percent_of(num_registrations)) %>
|
|
8
|
-
<% end %>
|
|
9
|
-
<% num = workshop.registrations.number_of(:accepted) %>
|
|
10
|
-
<%= slim_progress_bar(label: 'Accepted', value: "#{num}", color: 'accepted', percentage: num.percent_of(num_registrations)) %>
|
|
11
|
-
<% num = workshop.registrations.number_of(:paid) %>
|
|
12
|
-
<%= slim_progress_bar(label: 'Paid', value: "#{num}", color: 'paid', percentage: num.percent_of(num_registrations)) %>
|
|
13
|
-
<% if (num = workshop.registrations.number_of(:waitlisted)) > 0 %>
|
|
14
|
-
<%= slim_progress_bar(label: 'Waitlisted', value: "#{num}", color: 'waitlisted', percentage: num.percent_of(num_registrations)) %>
|
|
15
|
-
<% end %>
|
|
16
|
-
<% if (num = workshop.registrations.number_of(:reviewing)) > 0 %>
|
|
17
|
-
<%= slim_progress_bar(label: 'Reviewing', value: "#{num}", color: 'reviewing', percentage: num.percent_of(num_registrations)) %>
|
|
18
|
-
<% end %>
|
|
19
|
-
<% if (num = workshop.registrations.number_of(:rejected)) > 0 %>
|
|
20
|
-
<%= slim_progress_bar(label: 'Rejected', value: "#{num}", color: 'rejected', percentage: num.percent_of(num_registrations)) %>
|
|
21
|
-
<% end %>
|
|
22
|
-
<% if (num = workshop.registrations.number_of(:canceled)) > 0 %>
|
|
23
|
-
<%= slim_progress_bar(label: 'Canceled', value: "#{num}", color: 'canceled', percentage: num.percent_of(num_registrations)) %>
|
|
24
|
-
<% end %>
|
|
25
|
-
<% if (num = workshop.registrations.number_of(:refunded)) > 0 %>
|
|
26
|
-
<%= slim_progress_bar(label: 'Refunded', value: "#{num}", color: 'refunded', percentage: num.percent_of(num_registrations)) %>
|
|
27
|
-
<% end %>
|
|
28
|
-
<% if (num = workshop.registrations.number_of(:noshow)) > 0 %>
|
|
29
|
-
<%= slim_progress_bar(label: 'No Show', value: "#{num}", color: 'noshow', percentage: num.percent_of(num_registrations)) %>
|
|
30
|
-
<% end %>
|
|
31
|
-
</div>
|
|
32
|
-
<% end %>
|
|
33
|
-
|
|
34
|
-
<% unless @workshop.workshop_prices.empty? %>
|
|
35
|
-
<%= subsection title: 'Price Distribution' do %>
|
|
36
|
-
<% financials = @workshop.financial_details(:summary) %>
|
|
37
|
-
<ul class="statistics statistics-small statistics-linear">
|
|
38
|
-
<li><%= stat_block_small label: 'Best', number: financials[:summary][:total_possible].format(no_cents_if_whole: true), color_type: :info, icon: 'icon-coin', percent: 100 %></li>
|
|
39
|
-
<li><%= stat_block_small label: 'Worst (80%)', number: financials[:summary][:total_possible_worst].format(no_cents_if_whole: true), color_type: :warning, icon: 'icon-coin', percent: 80 %></li>
|
|
40
|
-
<li><%= stat_block_small label: 'Paid', number: financials[:summary][:total_paid].format(no_cents_if_whole: true), color_type: :success, icon: 'icon-coin', percent: financials[:summary][:total_paid_percent] %></li>
|
|
41
|
-
</ul>
|
|
42
|
-
<%= link_to 'Financial Details', financials_admin_workshop_url(@workshop) %>
|
|
43
|
-
<hr>
|
|
1
|
+
<% if can?(:manage_event_registrations, @workshop) || can?(:manage_event_finances, @workshop) %>
|
|
2
|
+
<%= subsection title: 'Registration Statistics' do %>
|
|
3
|
+
<% num_registrations = workshop.registrations.count %>
|
|
44
4
|
<div class="block progress-statistics">
|
|
45
|
-
<%
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
5
|
+
<% num = workshop.registrations.number_of(:attending) %>
|
|
6
|
+
<%= slim_progress_bar(label: 'Attending', value: "#{num} / #{num.percent_of(num_registrations).to_s}%", color: 'success', percentage: num.percent_of(num_registrations)) %>
|
|
7
|
+
<% if (num = workshop.registrations.number_of(:pending)) > 0 %>
|
|
8
|
+
<%= slim_progress_bar(label: 'Pending', value: "#{num}", color: 'pending', percentage: num.percent_of(num_registrations)) %>
|
|
9
|
+
<% end %>
|
|
10
|
+
<% num = workshop.registrations.number_of(:accepted) %>
|
|
11
|
+
<%= slim_progress_bar(label: 'Accepted', value: "#{num}", color: 'accepted', percentage: num.percent_of(num_registrations)) %>
|
|
12
|
+
<% num = workshop.registrations.number_of(:paid) %>
|
|
13
|
+
<%= slim_progress_bar(label: 'Paid', value: "#{num}", color: 'paid', percentage: num.percent_of(num_registrations)) %>
|
|
14
|
+
<% if (num = workshop.registrations.number_of(:waitlisted)) > 0 %>
|
|
15
|
+
<%= slim_progress_bar(label: 'Waitlisted', value: "#{num}", color: 'waitlisted', percentage: num.percent_of(num_registrations)) %>
|
|
16
|
+
<% end %>
|
|
17
|
+
<% if (num = workshop.registrations.number_of(:reviewing)) > 0 %>
|
|
18
|
+
<%= slim_progress_bar(label: 'Reviewing', value: "#{num}", color: 'reviewing', percentage: num.percent_of(num_registrations)) %>
|
|
19
|
+
<% end %>
|
|
20
|
+
<% if (num = workshop.registrations.number_of(:rejected)) > 0 %>
|
|
21
|
+
<%= slim_progress_bar(label: 'Rejected', value: "#{num}", color: 'rejected', percentage: num.percent_of(num_registrations)) %>
|
|
22
|
+
<% end %>
|
|
23
|
+
<% if (num = workshop.registrations.number_of(:canceled)) > 0 %>
|
|
24
|
+
<%= slim_progress_bar(label: 'Canceled', value: "#{num}", color: 'canceled', percentage: num.percent_of(num_registrations)) %>
|
|
25
|
+
<% end %>
|
|
26
|
+
<% if (num = workshop.registrations.number_of(:refunded)) > 0 %>
|
|
27
|
+
<%= slim_progress_bar(label: 'Refunded', value: "#{num}", color: 'refunded', percentage: num.percent_of(num_registrations)) %>
|
|
28
|
+
<% end %>
|
|
29
|
+
<% if (num = workshop.registrations.number_of(:noshow)) > 0 %>
|
|
30
|
+
<%= slim_progress_bar(label: 'No Show', value: "#{num}", color: 'noshow', percentage: num.percent_of(num_registrations)) %>
|
|
55
31
|
<% end %>
|
|
56
32
|
</div>
|
|
57
33
|
<% end %>
|
|
58
34
|
<% end %>
|
|
35
|
+
|
|
36
|
+
<% if can?(:manage_event_finances, @workshop) %>
|
|
37
|
+
<% unless @workshop.workshop_prices.empty? %>
|
|
38
|
+
<%= subsection title: 'Price Distribution' do %>
|
|
39
|
+
<% financials = @workshop.financial_details(:summary) %>
|
|
40
|
+
<ul class="statistics statistics-small statistics-linear">
|
|
41
|
+
<li><%= stat_block_small label: 'Best', number: financials[:summary][:total_possible].format(no_cents_if_whole: true), color_type: :info, icon: 'icon-coin', percent: 100 %></li>
|
|
42
|
+
<li><%= stat_block_small label: 'Worst (80%)', number: financials[:summary][:total_possible_worst].format(no_cents_if_whole: true), color_type: :warning, icon: 'icon-coin', percent: 80 %></li>
|
|
43
|
+
<li><%= stat_block_small label: 'Paid', number: financials[:summary][:total_paid].format(no_cents_if_whole: true), color_type: :success, icon: 'icon-coin', percent: financials[:summary][:total_paid_percent] %></li>
|
|
44
|
+
</ul>
|
|
45
|
+
<%= link_to 'Financial Details', financials_admin_workshop_url(@workshop) %>
|
|
46
|
+
<hr>
|
|
47
|
+
<div class="block progress-statistics">
|
|
48
|
+
<% num_attending = workshop.registrations.number_of(:attending) %>
|
|
49
|
+
<% workshop.registrations.number_of(:for_all_prices).each do |price_id, registration_count| %>
|
|
50
|
+
<% if price_id %>
|
|
51
|
+
<% price = WorkshopPrice.find_by_id(price_id ) %>
|
|
52
|
+
<%= slim_progress_bar(label: price.price_formatted, value: registration_count, color: 'success',
|
|
53
|
+
percentage: registration_count.percent_of(num_attending), bottom_label: price.price_description) %>
|
|
54
|
+
<% else %>
|
|
55
|
+
<%= slim_progress_bar(label: 'no pricing selected', value: registration_count, color: 'noshow',
|
|
56
|
+
percentage: registration_count.percent_of(num_attending), bottom_label: '') %>
|
|
57
|
+
<% end %>
|
|
58
|
+
<% end %>
|
|
59
|
+
</div>
|
|
60
|
+
<% end %>
|
|
61
|
+
<% end %>
|
|
62
|
+
<% end %>
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<% content_for :content_title, 'Workshop Dashboard' %>
|
|
2
2
|
<% content_for :content_title_extra do %>
|
|
3
3
|
<%= page_header_buttons do %>
|
|
4
|
-
<%= link_to('Outstanding Balances', admin_workshop_user_outstanding_balances_path, title: 'Outstanding Balances', class: "btn btn-xs btn-default") %>
|
|
5
|
-
<%= link_to(icon_label(:new, 'New'), new_admin_workshop_path, title: 'New Workshop', class: "btn btn-xs btn-default") %>
|
|
4
|
+
<%= link_to('Outstanding Balances', admin_workshop_user_outstanding_balances_path, title: 'Outstanding Balances', class: "btn btn-xs btn-default") if can?(:manage_events, :all) %>
|
|
5
|
+
<%= link_to(icon_label(:new, 'New'), new_admin_workshop_path, title: 'New Workshop', class: "btn btn-xs btn-default") if can?(:manage_events, :all) %>
|
|
6
6
|
<% end %>
|
|
7
7
|
<% end %>
|
|
8
8
|
|
|
@@ -12,49 +12,53 @@
|
|
|
12
12
|
<% panel_class = workshop.registration_closed? ? 'panel-default' : 'panel-success' %>
|
|
13
13
|
<div class="col-md-6">
|
|
14
14
|
<%= panel title: link_to(workshop.title, [:admin, workshop]), subtitle: present(workshop).start_end_date, class: panel_class do %>
|
|
15
|
-
<%
|
|
16
|
-
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
<%= slim_progress_bar(label: '
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
15
|
+
<% if can? :manage_event_finances, workshop %>
|
|
16
|
+
<% financials = workshop.financial_details(:summary) %>
|
|
17
|
+
<ul class="statistics">
|
|
18
|
+
<li><%= stat_block_small label: 'Projected', number: financials[:summary][:total_possible].format(no_cents_if_whole: true), color_type: :info, icon: 'icon-coin', percent: 100 %></li>
|
|
19
|
+
<li><%= stat_block_small label: 'Paid', number: financials[:summary][:total_paid].format(no_cents_if_whole: true), color_type: :success, icon: 'icon-coin', percent: financials[:summary][:total_paid_percent] %></li>
|
|
20
|
+
<li><%= stat_block_small label: 'Unpaid', number: financials[:summary][:total_outstanding].format(no_cents_if_whole: true), color_type: :danger, icon: 'icon-coin', percent: 80 %></li>
|
|
21
|
+
</ul>
|
|
22
|
+
<% end %>
|
|
23
|
+
|
|
24
|
+
<% if can?(:manage_event_finances, workshop) || can?(:manage_event_registrations, workshop) %>
|
|
25
|
+
<div class="separator-reflected" style="margin: 10px 0px;"></div>
|
|
26
|
+
<% num_registrations = workshop.registrations.count %>
|
|
27
|
+
<div class="block progress-statistics">
|
|
28
|
+
<% num = workshop.registrations.number_of(:attending) %>
|
|
29
|
+
<%= slim_progress_bar(label: 'Attending', value: "#{num} / #{num.percent_of(num_registrations).to_s}%", color: 'success', percentage: num.percent_of(num_registrations)) %>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="row">
|
|
32
|
+
<div class="col-md-6">
|
|
33
|
+
<div class="block well progress-statistics">
|
|
34
|
+
<div class="body">
|
|
35
|
+
<% num = workshop.registrations.number_of(:accepted) %>
|
|
36
|
+
<%= slim_progress_bar(label: 'Accepted', value: "#{num}", color: 'accepted', percentage: num.percent_of(num_registrations)) %>
|
|
37
|
+
<% num = workshop.registrations.number_of(:paid) %>
|
|
38
|
+
<div class="semi-block">
|
|
39
|
+
<%= slim_progress_bar(label: 'Paid', value: "#{num}", color: 'paid', percentage: num.percent_of(num_registrations)) %>
|
|
40
|
+
</div>
|
|
41
|
+
<% num = workshop.registrations.number_of(:pending) %>
|
|
42
|
+
<div class="semi-block">
|
|
43
|
+
<%= slim_progress_bar(label: 'Pending', value: "#{num}", color: 'pending', percentage: num.percent_of(num_registrations)) %>
|
|
44
|
+
</div>
|
|
41
45
|
</div>
|
|
42
46
|
</div>
|
|
43
47
|
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
<div class="col-md-6">
|
|
49
|
+
<div class="block well progress-statistics">
|
|
50
|
+
<div class="body">
|
|
51
|
+
<% num = workshop.registrations.number_of(:waitlisted) %>
|
|
52
|
+
<%= slim_progress_bar(label: 'Waitlisted', value: "#{num}", color: 'waitlisted', percentage: num.percent_of(num_registrations)) %>
|
|
53
|
+
<% num = workshop.registrations.number_of(:reviewing) %>
|
|
54
|
+
<div class="semi-block">
|
|
55
|
+
<%= slim_progress_bar(label: 'Reviewing', value: "#{num}", color: 'reviewing', percentage: num.percent_of(num_registrations)) %>
|
|
56
|
+
</div>
|
|
53
57
|
</div>
|
|
54
58
|
</div>
|
|
55
59
|
</div>
|
|
56
60
|
</div>
|
|
57
|
-
|
|
61
|
+
<% end %>
|
|
58
62
|
|
|
59
63
|
<% end %>
|
|
60
64
|
</div>
|
|
@@ -71,26 +75,30 @@
|
|
|
71
75
|
<th>Projected</th>
|
|
72
76
|
<th>Paid</th>
|
|
73
77
|
<th>Unpaid</th>
|
|
74
|
-
<th
|
|
78
|
+
<th class="date">Date</th>
|
|
75
79
|
</tr>
|
|
76
80
|
</thead>
|
|
77
81
|
<tbody>
|
|
78
82
|
<% @workshops_past.each do |workshop| %>
|
|
79
83
|
<% # TODO very ineffecient to do for each workshop. look at caching values %>
|
|
80
|
-
<% financials = workshop.financial_details(:summary) %>
|
|
84
|
+
<% financials = workshop.financial_details(:summary) if can?(:manage_event_finances, workshop) %>
|
|
81
85
|
<% present workshop do |workshop_presenter| %>
|
|
82
86
|
<tr class="item" data-item_id="<%= workshop.id %>">
|
|
83
87
|
<td>
|
|
84
88
|
<%= link_to workshop.title, [:admin, workshop] %>
|
|
85
89
|
</td>
|
|
86
|
-
<td><%= financials[:summary][:total_possible].format(no_cents_if_whole: true) %></td>
|
|
87
|
-
<td><span class="text-success"><%= financials[:summary][:total_paid].format(no_cents_if_whole: true) %></span></td>
|
|
90
|
+
<td><%= can?(:manage_event_finances, workshop) ? financials[:summary][:total_possible].format(no_cents_if_whole: true) : 'n/a' %></td>
|
|
91
|
+
<td><span class="text-success"><%= can?(:manage_event_finances, workshop) ? financials[:summary][:total_paid].format(no_cents_if_whole: true) : 'n/a' %></span></td>
|
|
88
92
|
<td>
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
93
|
+
<% if can?(:manage_event_finances, workshop) %>
|
|
94
|
+
<%= '<span class="text-danger">'.html_safe if financials[:summary][:total_outstanding].positive? %>
|
|
95
|
+
<%= financials[:summary][:total_outstanding].format(no_cents_if_whole: true) %>
|
|
96
|
+
<%= '</span>'.html_safe if financials[:summary][:total_outstanding].positive? %>
|
|
97
|
+
<% else %>
|
|
98
|
+
n/a
|
|
99
|
+
<% end %>
|
|
92
100
|
</td>
|
|
93
|
-
<td><%= workshop_presenter.start_end_date %></td>
|
|
101
|
+
<td class="date"><%= workshop_presenter.start_end_date %></td>
|
|
94
102
|
</tr>
|
|
95
103
|
<% end %>
|
|
96
104
|
<% end %>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
<% content_for :content_title, "Permissions" %>
|
|
2
|
+
<% content_for :content_subtitle, "#{@workshop.title}" %>
|
|
3
|
+
|
|
4
|
+
<div class="row">
|
|
5
|
+
<div class="col-md-8">
|
|
6
|
+
<%= panel body: false, title: "Permissions" do %>
|
|
7
|
+
<div class="panel-body">
|
|
8
|
+
<p>The users below can be granted different levels of access to this particular workshop.</p>
|
|
9
|
+
|
|
10
|
+
<% @event_managers_alacarte.each do |user| %>
|
|
11
|
+
<div class="row">
|
|
12
|
+
<div class="col-md-12">
|
|
13
|
+
<%= subsection title: user.full_name do %>
|
|
14
|
+
<% manage_event_state = user.has_role?(:manage_event, @workshop) ? 'btn-success active' : 'btn-default' %>
|
|
15
|
+
<% manage_event_registration_state = user.has_role?(:manage_event_registration, @workshop) ? 'btn-success active' : 'btn-default' %>
|
|
16
|
+
<% manage_event_finance_state = user.has_role?(:manage_event_finance, @workshop) ? 'btn-success active' : 'btn-default' %>
|
|
17
|
+
<%= link_to 'Workshop Editing', dm_event.ajax_toggle_permission_admin_workshop_path(@workshop, user.id, :manage_event), class: "permission_btn btn btn-xs #{manage_event_state}", role: 'button', remote: true, method: :patch %>
|
|
18
|
+
<%= link_to 'Manage Registrations', dm_event.ajax_toggle_permission_admin_workshop_path(@workshop, user.id, :manage_event_registration), class: "permission_btn btn btn-xs #{manage_event_registration_state}", role: 'button', remote: true, method: :patch %>
|
|
19
|
+
<%= link_to 'View Finances', dm_event.ajax_toggle_permission_admin_workshop_path(@workshop, user.id, :manage_event_finance), class: "permission_btn btn btn-xs #{manage_event_finance_state}", role: 'button', remote: true, method: :patch %>
|
|
20
|
+
<% end %>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
<% end %>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<% end %>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="col-md-4">
|
|
29
|
+
<%= panel body: false, title: "Event Managers" do %>
|
|
30
|
+
<div class="panel-body">
|
|
31
|
+
<p>Current users that can fully manage this event</p>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<table class="table table-bordered table-condensed table-striped">
|
|
35
|
+
<tbody>
|
|
36
|
+
<% @event_managers.each do |user| %>
|
|
37
|
+
<tr>
|
|
38
|
+
<td><%= user.full_name %></td>
|
|
39
|
+
</tr>
|
|
40
|
+
<% end %>
|
|
41
|
+
</tbody>
|
|
42
|
+
</table>
|
|
43
|
+
<% end %>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
<script>
|
|
47
|
+
$(document).ready(function() {
|
|
48
|
+
$('.permission_btn').on("ajax:success", function(e, content) {
|
|
49
|
+
if ($(this).is(".active")) {
|
|
50
|
+
$(this).addClass("btn-default");
|
|
51
|
+
$(this).removeClass("active").removeClass("btn-success");
|
|
52
|
+
} else {
|
|
53
|
+
$(this).addClass("active").addClass("btn-success");
|
|
54
|
+
$(this).removeClass("btn-default");
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
</script
|
|
@@ -5,11 +5,24 @@
|
|
|
5
5
|
<div class="btn-group">
|
|
6
6
|
<button class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"><i class="icon-cog"></i> <span class="caret"></span></button>
|
|
7
7
|
<ul class="dropdown-menu dropdown-menu-right icons-right">
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
<% if can?(:manage_event_registrations, @workshop) %>
|
|
9
|
+
<li class="divider"></li>
|
|
10
|
+
<li><%= link_to label_icon('Show Duplicates', 'icon-copy'), admin_workshop_url(@workshop, duplicates: '1') %></li>
|
|
11
|
+
<li><%= link_to label_icon('Lost Users', 'icon-users'), lost_users_admin_workshop_url(@workshop) %></li>
|
|
12
|
+
<li><%= link_to 'Export Registrations (.csv)', admin_workshop_url(@workshop, format: 'csv') %></li>
|
|
13
|
+
<% end %>
|
|
14
|
+
<% if can?(:manage_events, @workshop) %>
|
|
15
|
+
<li class="divider"></li>
|
|
16
|
+
<li><%= link_to label_icon('Edit Workshop', :edit), edit_admin_workshop_url(@workshop) %></li>
|
|
17
|
+
<% end %>
|
|
18
|
+
<% if can?(:manage_event_finances, @workshop) %>
|
|
19
|
+
<li class="divider"></li>
|
|
20
|
+
<li><%= link_to label_icon('Financial Details', 'icon-coin'), financials_admin_workshop_url(@workshop) %></li>
|
|
21
|
+
<% end %>
|
|
22
|
+
<% if can?(:manage_events, :all) %>
|
|
23
|
+
<li class="divider"></li>
|
|
24
|
+
<li><%= link_to label_icon('Permissions', 'icon-lock'), permissions_admin_workshop_url(@workshop) %></li>
|
|
25
|
+
<% end %>
|
|
13
26
|
|
|
14
27
|
</ul>
|
|
15
28
|
</div>
|
|
@@ -19,7 +32,11 @@
|
|
|
19
32
|
<div class="row">
|
|
20
33
|
<div class="col-md-9">
|
|
21
34
|
<% toolbar = toolbar_btn(icons(:new), register_new_url(@workshop), target: '_blank', title: 'New Registration', class: "btn btn-link btn-icon") %>
|
|
22
|
-
<%
|
|
35
|
+
<% if can?(:manage_event_registrations, @workshop) || can?(:manage_event_finances, @workshop) %>
|
|
36
|
+
<% title = params[:duplicates].nil? ? 'Registrations' : 'Registrations (Duplicates)'%>
|
|
37
|
+
<% else %>
|
|
38
|
+
<% title = 'Registrations (only displaying personal registrations)' %>
|
|
39
|
+
<% end %>
|
|
23
40
|
<%= panel title: title, toolbar: toolbar, body: false do %>
|
|
24
41
|
<table id="registration_table" class="table table-striped table-bordered" data-source="<%= dm_event.admin_workshop_url(@workshop, duplicates: params[:duplicates]) %>">
|
|
25
42
|
<thead>
|
|
@@ -28,8 +45,8 @@
|
|
|
28
45
|
<th width=50>Receipt</th>
|
|
29
46
|
<th>Name</th>
|
|
30
47
|
<th width=25>Balance</th>
|
|
31
|
-
<th
|
|
32
|
-
<th
|
|
48
|
+
<th class="date">Registered</th>
|
|
49
|
+
<th class="date">Last Login</th>
|
|
33
50
|
</tr>
|
|
34
51
|
</thead>
|
|
35
52
|
<tbody>
|
|
@@ -38,10 +55,12 @@
|
|
|
38
55
|
<% end %>
|
|
39
56
|
</div>
|
|
40
57
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
<%=
|
|
44
|
-
|
|
45
|
-
|
|
58
|
+
<% if can?(:manage_event_registrations, @workshop) || can?(:manage_event_finances, @workshop) %>
|
|
59
|
+
<div class="col-md-3">
|
|
60
|
+
<%= panel header: false do %>
|
|
61
|
+
<%= render partial: 'registration_stats', locals: {workshop: @workshop} %>
|
|
62
|
+
<% end %>
|
|
63
|
+
</div>
|
|
64
|
+
<% end %>
|
|
46
65
|
</div>
|
|
47
66
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
ActiveMerchant::Billing::Base.mode = :test unless Rails.env.production?
|
|
1
|
+
ActiveMerchant::Billing::Base.mode = :test unless Rails.env.production?
|
data/config/routes.rb
CHANGED
|
@@ -8,6 +8,8 @@ DmEvent::Engine.routes.draw do
|
|
|
8
8
|
match 'edit_system_email/:email_type', action: 'edit_system_email', as: 'edit_system_email', via: [:get, :post, :patch]
|
|
9
9
|
get 'financials', action: 'financials'
|
|
10
10
|
match 'lost_users', action: 'lost_users', via: [:get, :post, :patch]
|
|
11
|
+
match 'permissions', action: 'permissions', via: [:get, :post, :patch]
|
|
12
|
+
patch 'ajax_toggle_permission/:user_id/:role', action: 'ajax_toggle_permission', as: 'ajax_toggle_permission'
|
|
11
13
|
patch 'send_payment_reminder_emails', action: 'send_payment_reminder_emails'
|
|
12
14
|
match 'additional_configuration', action: 'additional_configuration', via: [:get, :patch]
|
|
13
15
|
end
|
data/lib/dm_event/engine.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dm_event
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.2.
|
|
4
|
+
version: 4.2.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Brett Walker
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2016-
|
|
11
|
+
date: 2016-09-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: dm_core
|
|
@@ -16,28 +16,28 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - '='
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: 4.2.
|
|
19
|
+
version: 4.2.2
|
|
20
20
|
type: :runtime
|
|
21
21
|
prerelease: false
|
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
23
|
requirements:
|
|
24
24
|
- - '='
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: 4.2.
|
|
26
|
+
version: 4.2.2
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
28
|
name: dm_cms
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - '='
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 4.2.
|
|
33
|
+
version: 4.2.2
|
|
34
34
|
type: :runtime
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - '='
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: 4.2.
|
|
40
|
+
version: 4.2.2
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: activemerchant
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -239,6 +239,7 @@ files:
|
|
|
239
239
|
- app/views/dm_event/admin/workshops/index.html.erb
|
|
240
240
|
- app/views/dm_event/admin/workshops/lost_users.html.erb
|
|
241
241
|
- app/views/dm_event/admin/workshops/new.html.erb
|
|
242
|
+
- app/views/dm_event/admin/workshops/permissions.html.erb
|
|
242
243
|
- app/views/dm_event/admin/workshops/show.html.erb
|
|
243
244
|
- app/views/dm_event/admin/workshops/user_outstanding_balances.html.erb
|
|
244
245
|
- app/views/dm_event/liquid_tags/_funding_project_status.html.erb
|
|
@@ -414,7 +415,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
414
415
|
version: '0'
|
|
415
416
|
requirements: []
|
|
416
417
|
rubyforge_project:
|
|
417
|
-
rubygems_version: 2.5
|
|
418
|
+
rubygems_version: 2.4.5
|
|
418
419
|
signing_key:
|
|
419
420
|
specification_version: 4
|
|
420
421
|
summary: Part of MokshaCms, Event Engine
|