effective_memberships 0.17.11 → 0.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -2
- data/app/controllers/admin/applicants_controller.rb +12 -0
- data/app/datatables/admin/effective_applicants_datatable.rb +3 -0
- data/app/datatables/effective_available_applicant_reviews_datatable.rb +4 -0
- data/app/mailers/effective/memberships_mailer.rb +2 -2
- data/app/models/concerns/effective_memberships_applicant.rb +22 -2
- data/app/models/concerns/effective_memberships_applicant_review.rb +2 -0
- data/app/views/admin/applicants/_form_flag.html.haml +7 -0
- data/app/views/admin/applicants/_form_process.html.haml +22 -2
- data/app/views/admin/applicants/_form_unflag.html.haml +7 -0
- data/app/views/effective/applicant_reviews/recommendation.html.haml +8 -0
- data/db/migrate/01_create_effective_memberships.rb.erb +5 -0
- data/lib/effective_memberships/version.rb +1 -1
- metadata +20 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72aa9c8faab61b20bcd7adfb56cae17f511d168c16707543ae3532be0a0f96e3
|
4
|
+
data.tar.gz: 87eea10d0571781ce2175bfbbd38a8cb8c175282ed7f85f5adbb154f20940c8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7e08dc7b8577ccee1602aa0a608c5a9daed8296d77a901c619ef8e2e94d12fb2de21fbf94b26c18934420491e86c413fa28c1de23a7372b32be68398b291d48
|
7
|
+
data.tar.gz: 6e49dc33467cda697043851ed8c9d7e67bfc9ad586a90c880efa5ff4c0142fb5cffce6f8b0f58d8c6b825a0e135f81f9b0811a8c12d241eb139c4306a6000ea4
|
data/README.md
CHANGED
@@ -52,7 +52,7 @@ Use the following datatables to display to your user their applicants dues:
|
|
52
52
|
|
53
53
|
```haml
|
54
54
|
%h2 Applications to Join
|
55
|
-
- datatable =
|
55
|
+
- datatable = EffectiveMembershipsApplicantsDatatable.new(self)
|
56
56
|
```
|
57
57
|
|
58
58
|
and
|
@@ -77,7 +77,7 @@ All authorization checks are handled via the effective_resources gem found in th
|
|
77
77
|
|
78
78
|
## Permissions
|
79
79
|
|
80
|
-
The permissions you actually want to define are as follows (using
|
80
|
+
The permissions you actually want to define are as follows (using CanCanCan):
|
81
81
|
|
82
82
|
```ruby
|
83
83
|
# Regular signed up user. Guest users not supported.
|
@@ -92,6 +92,11 @@ if user.admin?
|
|
92
92
|
end
|
93
93
|
```
|
94
94
|
|
95
|
+
## Custom Greetings
|
96
|
+
|
97
|
+
It's possible to change how the owner and reviewer names are displayed in emails by adding a `email_to_s` method or overriding the `to_s` method in the resource - your `User` model.
|
98
|
+
|
99
|
+
|
95
100
|
## License
|
96
101
|
|
97
102
|
MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
|
@@ -36,6 +36,18 @@ module Admin
|
|
36
36
|
].compact.join(' ')
|
37
37
|
}
|
38
38
|
|
39
|
+
submit :flag, 'Flag Applicant', success: -> {
|
40
|
+
[
|
41
|
+
"Successfully marked #{resource.owner} #{resource} as flagged"
|
42
|
+
].compact.join(' ')
|
43
|
+
}
|
44
|
+
|
45
|
+
submit :unflag, 'Unflag Applicant', success: -> {
|
46
|
+
[
|
47
|
+
"Successfully marked #{resource.owner} #{resource} as unflagged"
|
48
|
+
].compact.join(' ')
|
49
|
+
}
|
50
|
+
|
39
51
|
private
|
40
52
|
|
41
53
|
def permitted_params
|
@@ -13,6 +13,9 @@ module Admin
|
|
13
13
|
col :id, visible: false
|
14
14
|
|
15
15
|
col :status, search: effective_memberships_status_collection()
|
16
|
+
col :flagged
|
17
|
+
col :flagged_at, visible: false
|
18
|
+
col :flagged_reason, visible: false
|
16
19
|
|
17
20
|
col :created_at, label: 'Created', as: :date, visible: false
|
18
21
|
col :updated_at, label: 'Updated', visible: false
|
@@ -15,6 +15,10 @@ class EffectiveAvailableApplicantReviewsDatatable < Effective::Datatable
|
|
15
15
|
col :category, label: 'Category'
|
16
16
|
col :to_status, label: 'Status'
|
17
17
|
|
18
|
+
col :flagged
|
19
|
+
col :flagged_at, visible: false
|
20
|
+
col :flagged_reason, visible: false
|
21
|
+
|
18
22
|
col :reviews do |applicant|
|
19
23
|
pluralize(applicant.applicant_reviews.count { |review| review.submitted? }, 'review')
|
20
24
|
end
|
@@ -184,7 +184,7 @@ module Effective
|
|
184
184
|
raise('expected a owner') unless owner.class.respond_to?(:effective_memberships_owner?)
|
185
185
|
|
186
186
|
values = {
|
187
|
-
name: owner.to_s,
|
187
|
+
name: owner.try(:email_to_s) || owner.to_s,
|
188
188
|
email: owner.email
|
189
189
|
}
|
190
190
|
|
@@ -195,7 +195,7 @@ module Effective
|
|
195
195
|
raise('expected a owner') unless owner.class.respond_to?(:effective_memberships_owner?)
|
196
196
|
|
197
197
|
values = {
|
198
|
-
name: owner.to_s,
|
198
|
+
name: owner.try(:email_to_s) || owner.to_s,
|
199
199
|
email: owner.email
|
200
200
|
}
|
201
201
|
|
@@ -169,6 +169,11 @@ module EffectiveMembershipsApplicant
|
|
169
169
|
missing_info_at :datetime
|
170
170
|
missing_info_reason :text
|
171
171
|
|
172
|
+
# Flagged
|
173
|
+
flagged :boolean
|
174
|
+
flagged_at :datetime
|
175
|
+
flagged_reason :text
|
176
|
+
|
172
177
|
# Applicant Educations
|
173
178
|
applicant_educations_details :text
|
174
179
|
|
@@ -303,7 +308,7 @@ module EffectiveMembershipsApplicant
|
|
303
308
|
x.errors.add(:end_on, "can't overlap when full time")
|
304
309
|
y.errors.add(:start_on, "can't overlap when full time")
|
305
310
|
y.errors.add(:end_on, "can't overlap when full time")
|
306
|
-
self.errors.add(:applicant_experiences, "can't have
|
311
|
+
self.errors.add(:applicant_experiences, "can't have overlapping dates for full time experiences")
|
307
312
|
end
|
308
313
|
end
|
309
314
|
end
|
@@ -420,6 +425,13 @@ module EffectiveMembershipsApplicant
|
|
420
425
|
# Admin Missing Info
|
421
426
|
validates :missing_info_reason, presence: true, if: -> { missing_info? }
|
422
427
|
|
428
|
+
# Admin Flagged
|
429
|
+
validates :flagged_at, presence: true, if: -> { flagged? }
|
430
|
+
validates :flagged_reason, presence: true, if: -> { flagged? }
|
431
|
+
|
432
|
+
# Admin Unflagged
|
433
|
+
validates :flagged_at, absence: true, if: -> { !flagged? }
|
434
|
+
|
423
435
|
# These two try completed and try reviewed
|
424
436
|
# before_save(if: -> { submitted? }) { try_completed! }
|
425
437
|
# before_save(if: -> { completed? }) { try_reviewed! }
|
@@ -832,7 +844,7 @@ module EffectiveMembershipsApplicant
|
|
832
844
|
requirements['Transcripts'] = ('Not Required' unless transcripts_required?) || transcripts_received?
|
833
845
|
end
|
834
846
|
|
835
|
-
if all_steps.include?(:
|
847
|
+
if all_steps.include?(:endorsements) || applicant_endorsements_required?
|
836
848
|
requirements['Endorsements'] = ('Not Required' unless applicant_endorsements_required?) || (applicant_endorsements.count(&:completed?) >= min_applicant_endorsements)
|
837
849
|
end
|
838
850
|
|
@@ -1014,6 +1026,14 @@ module EffectiveMembershipsApplicant
|
|
1014
1026
|
true
|
1015
1027
|
end
|
1016
1028
|
|
1029
|
+
def flag!
|
1030
|
+
update!(flagged: true, flagged_at: Time.zone.now)
|
1031
|
+
end
|
1032
|
+
|
1033
|
+
def unflag!
|
1034
|
+
update!(flagged: false, flagged_at: nil)
|
1035
|
+
end
|
1036
|
+
|
1017
1037
|
private
|
1018
1038
|
|
1019
1039
|
def assign_applicant_experiences_months!
|
@@ -0,0 +1,7 @@
|
|
1
|
+
= effective_form_with(model: [:admin, applicant], engine: true) do |f|
|
2
|
+
%p This applicant will be marked as <strong>flagged</strong> with the following:
|
3
|
+
|
4
|
+
= f.hidden_field :flagged_at, value: Time.zone.now
|
5
|
+
= f.text_field :flagged_reason, required: true, label: 'Reason for flagging'
|
6
|
+
|
7
|
+
= f.submit 'Flag Applicant', border: false, center: true, 'data-confirm': "Flag #{f.object.owner}?"
|
@@ -1,9 +1,9 @@
|
|
1
|
+
%h5 Process applicant
|
2
|
+
|
1
3
|
%p
|
2
4
|
%span.badge.badge-secondary= applicant.status_label
|
3
5
|
= applicant.summary
|
4
6
|
|
5
|
-
%p Process applicant:
|
6
|
-
|
7
7
|
= accordion do
|
8
8
|
- if EffectiveResources.authorized?(self, :complete, applicant)
|
9
9
|
= collapse 'Complete this Applicant' do
|
@@ -20,3 +20,23 @@
|
|
20
20
|
- if EffectiveResources.authorized?(self, :decline, applicant)
|
21
21
|
= collapse 'Decline this Applicant' do
|
22
22
|
= render('admin/applicants/form_decline', applicant: applicant)
|
23
|
+
|
24
|
+
%h5.mt-3 Flag applicant
|
25
|
+
|
26
|
+
%p
|
27
|
+
- if applicant.flagged?
|
28
|
+
%small.text-muted This applicant was flagged at #{applicant.flagged_at.strftime('%B %d, %Y')} (#{time_ago_in_words(applicant.flagged_at)} ago) with reason: #{applicant.flagged_reason}
|
29
|
+
- else
|
30
|
+
%small.text-muted
|
31
|
+
This applicant is not currently flagged.
|
32
|
+
- if applicant.flagged_reason.present?
|
33
|
+
This applicant was previously flagged with reason: #{applicant.flagged_reason}
|
34
|
+
|
35
|
+
= accordion do
|
36
|
+
- if EffectiveResources.authorized?(self, :flag, applicant) && !applicant.flagged?
|
37
|
+
= collapse 'Flag this Applicant' do
|
38
|
+
= render('admin/applicants/form_flag', applicant: applicant)
|
39
|
+
|
40
|
+
- if EffectiveResources.authorized?(self, :unflag, applicant) && applicant.flagged?
|
41
|
+
= collapse 'Unflag this Applicant' do
|
42
|
+
= render('admin/applicants/form_unflag', applicant: applicant)
|
@@ -0,0 +1,7 @@
|
|
1
|
+
= effective_form_with(model: [:admin, applicant], engine: true) do |f|
|
2
|
+
%p This applicant will be marked as <strong>unflagged</strong>.
|
3
|
+
|
4
|
+
= f.hidden_field :flagged, value: false
|
5
|
+
= f.hidden_field :flagged_at, value: nil
|
6
|
+
|
7
|
+
= f.submit 'Unflag Applicant', border: false, center: true, 'data-confirm': "Unflag #{f.object.owner}?"
|
@@ -19,4 +19,12 @@
|
|
19
19
|
= f.radios :recommendation, EffectiveMemberships.ApplicantReview.recommendations, label: false
|
20
20
|
= f.text_area :comments, label: 'Reviewer comments'
|
21
21
|
|
22
|
+
- if EffectiveResources.authorized?(self, :flag, f.object.applicant)
|
23
|
+
= f.fields_for :applicant do |a|
|
24
|
+
= a.check_box :flagged, label: 'Flag this application'
|
25
|
+
|
26
|
+
= a.show_if :flagged, true do
|
27
|
+
= a.hidden_field :flagged_at, value: Time.zone.now
|
28
|
+
= a.text_area :flagged_reason, label: 'Reason for flagging'
|
29
|
+
|
22
30
|
= f.save 'Submit Recommendation'
|
@@ -253,6 +253,11 @@ class CreateEffectiveMemberships < ActiveRecord::Migration[6.0]
|
|
253
253
|
# Additional Information
|
254
254
|
t.text :additional_information
|
255
255
|
|
256
|
+
# Flagged
|
257
|
+
t.boolean :flagged, default: false
|
258
|
+
t.datetime :flagged_at
|
259
|
+
t.text :flagged_reason
|
260
|
+
|
256
261
|
t.datetime :updated_at
|
257
262
|
t.datetime :created_at
|
258
263
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_memberships
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -151,7 +151,7 @@ dependencies:
|
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0'
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
|
-
name: haml
|
154
|
+
name: haml
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
157
|
- - ">="
|
@@ -234,6 +234,20 @@ dependencies:
|
|
234
234
|
- - ">="
|
235
235
|
- !ruby/object:Gem::Version
|
236
236
|
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: psych
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - "<"
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '4'
|
244
|
+
type: :development
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - "<"
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '4'
|
237
251
|
description: Manage your professional association online. Membership categories, applications
|
238
252
|
to join and reclassify, annual dues payments and more.
|
239
253
|
email:
|
@@ -361,9 +375,11 @@ files:
|
|
361
375
|
- app/views/admin/applicants/_form_approve.html.haml
|
362
376
|
- app/views/admin/applicants/_form_complete.html.haml
|
363
377
|
- app/views/admin/applicants/_form_decline.html.haml
|
378
|
+
- app/views/admin/applicants/_form_flag.html.haml
|
364
379
|
- app/views/admin/applicants/_form_missing_info.html.haml
|
365
380
|
- app/views/admin/applicants/_form_process.html.haml
|
366
381
|
- app/views/admin/applicants/_form_transcripts.html.haml
|
382
|
+
- app/views/admin/applicants/_form_unflag.html.haml
|
367
383
|
- app/views/admin/applicants/_status.html.haml
|
368
384
|
- app/views/admin/categories/_fees_additional.html.haml
|
369
385
|
- app/views/admin/categories/_fees_applicant.html.haml
|
@@ -577,7 +593,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
577
593
|
- !ruby/object:Gem::Version
|
578
594
|
version: '0'
|
579
595
|
requirements: []
|
580
|
-
rubygems_version: 3.
|
596
|
+
rubygems_version: 3.3.7
|
581
597
|
signing_key:
|
582
598
|
specification_version: 4
|
583
599
|
summary: Manage your professional association online. Membership categories, applications
|