effective_cpd 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +117 -0
- data/Rakefile +18 -0
- data/app/assets/config/effective_cpd_manifest.js +2 -0
- data/app/assets/javascripts/effective_cpd.js +2 -0
- data/app/assets/javascripts/effective_cpd/activities.js +49 -0
- data/app/assets/javascripts/effective_cpd/activities_new.js +21 -0
- data/app/assets/stylesheets/effective_cpd.scss +1 -0
- data/app/assets/stylesheets/effective_cpd/_activities.scss +19 -0
- data/app/controllers/admin/cpd_activities_controller.rb +13 -0
- data/app/controllers/admin/cpd_categories_controller.rb +13 -0
- data/app/controllers/admin/cpd_cycles_controller.rb +13 -0
- data/app/controllers/admin/cpd_rules_controller.rb +13 -0
- data/app/controllers/admin/cpd_statements_controller.rb +13 -0
- data/app/controllers/effective/cpd_cycles_controller.rb +19 -0
- data/app/controllers/effective/cpd_statement_activities_controller.rb +27 -0
- data/app/controllers/effective/cpd_statements_controller.rb +71 -0
- data/app/datatables/admin/effective_cpd_activities_datatable.rb +31 -0
- data/app/datatables/admin/effective_cpd_categories_datatable.rb +24 -0
- data/app/datatables/admin/effective_cpd_cycles_datatable.rb +22 -0
- data/app/datatables/admin/effective_cpd_rules_datatable.rb +43 -0
- data/app/datatables/admin/effective_cpd_statements_datatable.rb +30 -0
- data/app/datatables/effective_cpd_datatable.rb +30 -0
- data/app/datatables/effective_cpd_statements_datatable.rb +23 -0
- data/app/helpers/effective_cpd_helper.rb +37 -0
- data/app/mailers/effective/cpd_mailer.rb +7 -0
- data/app/models/effective/cpd_activity.rb +41 -0
- data/app/models/effective/cpd_category.rb +35 -0
- data/app/models/effective/cpd_cycle.rb +113 -0
- data/app/models/effective/cpd_rule.rb +108 -0
- data/app/models/effective/cpd_scorer.rb +158 -0
- data/app/models/effective/cpd_statement.rb +95 -0
- data/app/models/effective/cpd_statement_activity.rb +78 -0
- data/app/views/admin/cpd_activities/_form.html.haml +20 -0
- data/app/views/admin/cpd_categories/_form.html.haml +21 -0
- data/app/views/admin/cpd_categories/_form_cpd_category.html.haml +5 -0
- data/app/views/admin/cpd_cycles/_form.html.haml +17 -0
- data/app/views/admin/cpd_cycles/_form_content.html.haml +32 -0
- data/app/views/admin/cpd_cycles/_form_cpd_cycle.html.haml +21 -0
- data/app/views/admin/cpd_cycles/_form_cpd_rules.html.haml +56 -0
- data/app/views/admin/cpd_statements/_form.html.haml +6 -0
- data/app/views/effective/cpd_statement_activities/_form.html.haml +70 -0
- data/app/views/effective/cpd_statements/_activities.html.haml +64 -0
- data/app/views/effective/cpd_statements/_activities_new.html.haml +39 -0
- data/app/views/effective/cpd_statements/_agreements.html.haml +6 -0
- data/app/views/effective/cpd_statements/_cpd_statement.html.haml +5 -0
- data/app/views/effective/cpd_statements/_layout.html.haml +37 -0
- data/app/views/effective/cpd_statements/_summary.html.haml +36 -0
- data/app/views/effective/cpd_statements/activities.html.haml +25 -0
- data/app/views/effective/cpd_statements/agreements.html.haml +14 -0
- data/app/views/effective/cpd_statements/complete.html.haml +13 -0
- data/app/views/effective/cpd_statements/start.html.haml +13 -0
- data/app/views/effective/cpd_statements/submit.html.haml +20 -0
- data/app/views/layouts/effective_cpd_mailer_layout.html.haml +7 -0
- data/config/effective_cpd.rb +29 -0
- data/config/routes.rb +28 -0
- data/db/migrate/01_create_effective_cpd.rb.erb +98 -0
- data/db/seeds.rb +472 -0
- data/lib/effective_cpd.rb +18 -0
- data/lib/effective_cpd/engine.rb +11 -0
- data/lib/effective_cpd/version.rb +3 -0
- data/lib/generators/effective_cpd/install_generator.rb +46 -0
- data/lib/generators/templates/effective_cpd_mailer_preview.rb +4 -0
- data/lib/tasks/effective_cpd_tasks.rake +6 -0
- metadata +233 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 96dbf47b702128c10b5b8f1ee07f9fb4798efdd77220b506b75124737e55e8ec
|
4
|
+
data.tar.gz: a5e0a5a658c43ffef382a8becb65b7a84b61a24a01f701dbb7daaecf63aa391f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3ee41586315d02240cbdaa075b91aec80122db0c6820db8f5c79595af3e45a617fcabbe5284d67ef149209bd998870dd9684bf3d3bce0c88ddfec836e7e82e6b
|
7
|
+
data.tar.gz: ab8a10bd1aed88b3971d596a22bae191a6e9d77c20ba1f7343bc8888d9930feb57ab8d57cc2cb3aded11b938d5c83e8689ed2c54f85bd28cdd76291921c7fc7e
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2021 Code and Effect Inc.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
# Effective CPD
|
2
|
+
|
3
|
+
Continuing professional development.
|
4
|
+
|
5
|
+
An admin creates a set of categories, activites and rules. User enters number of hours or work done to have a scored statement. Audits.
|
6
|
+
|
7
|
+
Works with action_text for content bodies, and active_storage for file uploads.
|
8
|
+
|
9
|
+
## Getting Started
|
10
|
+
|
11
|
+
This requires Rails 6+ and Twitter Bootstrap 4 and just works with Devise.
|
12
|
+
|
13
|
+
Please first install the [effective_datatables](https://github.com/code-and-effect/effective_datatables) gem.
|
14
|
+
|
15
|
+
Please download and install the [Twitter Bootstrap4](http://getbootstrap.com)
|
16
|
+
|
17
|
+
Add to your Gemfile:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
gem 'haml-rails' # or try using gem 'hamlit-rails'
|
21
|
+
gem 'effective_cpd'
|
22
|
+
```
|
23
|
+
|
24
|
+
Run the bundle command to install it:
|
25
|
+
|
26
|
+
```console
|
27
|
+
bundle install
|
28
|
+
```
|
29
|
+
|
30
|
+
Then run the generator:
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
rails generate effective_cpd:install
|
34
|
+
```
|
35
|
+
|
36
|
+
The generator will install an initializer which describes all configuration options and creates a database migration.
|
37
|
+
|
38
|
+
If you want to tweak the table names, manually adjust both the configuration file and the migration now.
|
39
|
+
|
40
|
+
Then migrate the database:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
rake db:migrate
|
44
|
+
```
|
45
|
+
|
46
|
+
Render the "available statements for current_user" datatable on your user dashboard:
|
47
|
+
|
48
|
+
```haml
|
49
|
+
%h2 Continuing Professional Development
|
50
|
+
|
51
|
+
%p Please submit a CPD statement for the following available #{cpd_cycles_label}:
|
52
|
+
= render_datatable(EffectiveCpdDatatable.new, simple: true)
|
53
|
+
|
54
|
+
- datatable = EffectiveCpdStatementsDatatable.new(self)
|
55
|
+
- if datatable.present?
|
56
|
+
.mt-4
|
57
|
+
%p You completed these statements:
|
58
|
+
= render_datatable(datatable, simple: true)
|
59
|
+
|
60
|
+
```
|
61
|
+
|
62
|
+
Add a link to the admin menu:
|
63
|
+
|
64
|
+
```haml
|
65
|
+
- if can? :admin, :effective_cpd
|
66
|
+
= link_to 'CPD Categories', effective_cpd.admin_cpd_categories_path
|
67
|
+
= link_to 'CPD Cycles', effective_cpd.admin_cpd_cycles_path
|
68
|
+
= link_to 'CPD Statements', effective_cpd.admin_cpd_statements_path
|
69
|
+
```
|
70
|
+
|
71
|
+
## Authorization
|
72
|
+
|
73
|
+
All authorization checks are handled via the effective_resources gem found in the `config/initializers/effective_resources.rb` file.
|
74
|
+
|
75
|
+
## Permissions
|
76
|
+
|
77
|
+
The permissions you actually want to define are as follows (using CanCan):
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
# Regular signed up user. Guest users not supported.
|
81
|
+
if user.persisted?
|
82
|
+
can :new, Effective::CpdStatement
|
83
|
+
can [:index, :show, :update], Effective::CpdStatement, user_id: user.id
|
84
|
+
can [:index, :show], Effective::CpdCycle
|
85
|
+
can([:create, :update, :destroy], Effective::CpdStatementActivity) { |sa| sa.cpd_statement.user_id == user.id }
|
86
|
+
end
|
87
|
+
|
88
|
+
if user.admin?
|
89
|
+
can :admin, :effective_cpd
|
90
|
+
can :manage, Effective::CpdActivity
|
91
|
+
can :manage, Effective::CpdCategory
|
92
|
+
can :manage, Effective::CpdCycle
|
93
|
+
can :manage, Effective::CpdRule
|
94
|
+
can :manage, Effective::CpdStatement
|
95
|
+
end
|
96
|
+
```
|
97
|
+
|
98
|
+
## License
|
99
|
+
|
100
|
+
MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
|
101
|
+
|
102
|
+
## Testing
|
103
|
+
|
104
|
+
Run tests by:
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
rails test
|
108
|
+
```
|
109
|
+
|
110
|
+
## Contributing
|
111
|
+
|
112
|
+
1. Fork it
|
113
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
114
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
115
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
116
|
+
5. Bonus points for test coverage
|
117
|
+
6. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "bundler/setup"
|
2
|
+
|
3
|
+
APP_RAKEFILE = File.expand_path("test/dummy/Rakefile", __dir__)
|
4
|
+
load "rails/tasks/engine.rake"
|
5
|
+
|
6
|
+
load "rails/tasks/statistics.rake"
|
7
|
+
|
8
|
+
require "bundler/gem_tasks"
|
9
|
+
|
10
|
+
require "rake/testtask"
|
11
|
+
|
12
|
+
Rake::TestTask.new(:test) do |t|
|
13
|
+
t.libs << 'test'
|
14
|
+
t.pattern = 'test/**/*_test.rb'
|
15
|
+
t.verbose = false
|
16
|
+
end
|
17
|
+
|
18
|
+
task default: :test
|
@@ -0,0 +1,49 @@
|
|
1
|
+
const initialize_effective_cpd_activities = function() {
|
2
|
+
const $obj = $('.cpd-statement-activities:not(.initialized)')
|
3
|
+
|
4
|
+
if($obj.length > 0) {
|
5
|
+
$(document).on('mousedown touchstart', function(event) { collapse_effective_cpd_activities() })
|
6
|
+
|
7
|
+
// When we click outside the New Activity or Edit Activity
|
8
|
+
$(document).on('mousedown touchstart', '.activities-new', function(event) { event.stopPropagation() });
|
9
|
+
$(document).on('mousedown touchstart', '.statement-activity', function(event) { event.stopPropagation() });
|
10
|
+
|
11
|
+
$obj.addClass('initialized')
|
12
|
+
}
|
13
|
+
};
|
14
|
+
|
15
|
+
// Collapse the New Activity and all Edit Activity forms
|
16
|
+
const collapse_effective_cpd_activities = function() {
|
17
|
+
const $activities = $('#cpd-statement-activities')
|
18
|
+
$activities.children('.activities-new').hide()
|
19
|
+
$activities.children('.activities-index').show()
|
20
|
+
|
21
|
+
const $statementActivities = $('.cpd-statement-activities')
|
22
|
+
$statementActivities.find('.statement-activity-content').show()
|
23
|
+
$statementActivities.find('.statement-activity-form').hide()
|
24
|
+
};
|
25
|
+
|
26
|
+
// When we click the New Activity button, use the whole screen
|
27
|
+
$(document).on('click', '[data-cpd-new-activity]', function(event) {
|
28
|
+
event.preventDefault()
|
29
|
+
event.stopPropagation()
|
30
|
+
|
31
|
+
const $statement = $('#cpd-statement-activities')
|
32
|
+
$statement.children('.activities-index').hide()
|
33
|
+
$statement.children('.activities-new').show()
|
34
|
+
});
|
35
|
+
|
36
|
+
// When we click the Edit Activity
|
37
|
+
$(document).on('click', '[data-cpd-edit-activity]', function(event) {
|
38
|
+
event.preventDefault()
|
39
|
+
|
40
|
+
collapse_effective_cpd_activities()
|
41
|
+
|
42
|
+
const $activity = $(event.currentTarget).closest('.statement-activity')
|
43
|
+
$activity.children('.statement-activity-content').hide()
|
44
|
+
$activity.children('.statement-activity-form').show()
|
45
|
+
});
|
46
|
+
|
47
|
+
// Initializers
|
48
|
+
$(document).ready(function() { initialize_effective_cpd_activities() });
|
49
|
+
$(document).on('turbolinks:load', function() { initialize_effective_cpd_activities() });
|
@@ -0,0 +1,21 @@
|
|
1
|
+
// In the New Activity Form
|
2
|
+
$(document).on('click', '[data-cpd-show-activity]', function(event) {
|
3
|
+
event.preventDefault()
|
4
|
+
|
5
|
+
let $obj = $(event.currentTarget)
|
6
|
+
let $form = $obj.siblings('.statement-activity-form')
|
7
|
+
let $tabContent = $obj.closest('.tab-content').children('.statement-activity-content')
|
8
|
+
|
9
|
+
$tabContent.html($form.html())
|
10
|
+
$tabContent.siblings('.active').removeClass('active')
|
11
|
+
$tabContent.addClass('active')
|
12
|
+
});
|
13
|
+
|
14
|
+
$(document).on('click', '[data-cpd-back-activity]', function(event) {
|
15
|
+
event.preventDefault()
|
16
|
+
|
17
|
+
let $activities = $(event.currentTarget).closest('.activities-new')
|
18
|
+
let anchor = $activities.find('.nav[role=tablist]').find('a.nav-link.active').first().attr('href')
|
19
|
+
|
20
|
+
$(anchor).siblings('.active').removeClass('active').end().addClass('active')
|
21
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
@import 'effective_cpd/activities';
|
@@ -0,0 +1,19 @@
|
|
1
|
+
.cpd-statement-activities {
|
2
|
+
.statement-activity-category {
|
3
|
+
.progress { height: 3px; }
|
4
|
+
}
|
5
|
+
|
6
|
+
.statement-activity-content {
|
7
|
+
a { color: inherit; }
|
8
|
+
}
|
9
|
+
|
10
|
+
.carry-forward {
|
11
|
+
text-align: right;
|
12
|
+
padding-right: 2rem;
|
13
|
+
}
|
14
|
+
|
15
|
+
.score {
|
16
|
+
text-align: right;
|
17
|
+
}
|
18
|
+
|
19
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Admin
|
2
|
+
class CpdActivitiesController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_cpd) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
def permitted_params
|
9
|
+
params.require(:effective_cpd_activity).permit!
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Admin
|
2
|
+
class CpdCategoriesController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_cpd) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
def permitted_params
|
9
|
+
params.require(:effective_cpd_category).permit!
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Admin
|
2
|
+
class CpdCyclesController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_cpd) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
def permitted_params
|
9
|
+
params.require(:effective_cpd_cycle).permit!
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Admin
|
2
|
+
class CpdRulesController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_cpd) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
def permitted_params
|
9
|
+
params.require(:effective_cpd_rule).permit!
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Admin
|
2
|
+
class CpdStatementsController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
before_action { EffectiveResources.authorize!(self, :admin, :effective_cpd) }
|
5
|
+
|
6
|
+
include Effective::CrudController
|
7
|
+
|
8
|
+
# def permitted_params
|
9
|
+
# params.require(:effective_cpd_statement).permit!
|
10
|
+
# end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Effective
|
2
|
+
class CpdCyclesController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
|
5
|
+
def show
|
6
|
+
cycle = Effective::CpdCycle.find(params[:id])
|
7
|
+
EffectiveResources.authorize!(self, :show, cycle)
|
8
|
+
|
9
|
+
statement = Effective::CpdStatement.where(cpd_cycle: cycle, user: current_user).first
|
10
|
+
|
11
|
+
if statement.present?
|
12
|
+
redirect_to effective_cpd.cpd_cycle_cpd_statement_build_path(cycle, statement, statement.next_step)
|
13
|
+
else
|
14
|
+
redirect_to effective_cpd.cpd_cycle_cpd_statement_build_path(cycle, :new, :start)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Effective
|
2
|
+
class CpdStatementActivitiesController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
|
5
|
+
include Effective::CrudController
|
6
|
+
|
7
|
+
resource_scope -> { CpdStatement.find(params[:cpd_statement_id]).cpd_statement_activities }
|
8
|
+
|
9
|
+
# Score all statements when we change any activity
|
10
|
+
after_save do
|
11
|
+
CpdScorer.new(user: resource.cpd_statement.user, from: resource.cpd_statement).score!
|
12
|
+
end
|
13
|
+
|
14
|
+
# Redirect the remote form back to the activities page
|
15
|
+
on :save, redirect: -> {
|
16
|
+
statement = resource.cpd_statement
|
17
|
+
effective_cpd.cpd_cycle_cpd_statement_build_path(statement.cpd_cycle, statement, :activities)
|
18
|
+
}
|
19
|
+
|
20
|
+
def permitted_params
|
21
|
+
params.require(:effective_cpd_statement_activity).permit(
|
22
|
+
:id, :cpd_category_id, :cpd_activity_id, :amount, :amount2, :description, files: []
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Effective
|
2
|
+
class CpdStatementsController < ApplicationController
|
3
|
+
before_action(:authenticate_user!) if defined?(Devise)
|
4
|
+
|
5
|
+
include Effective::WizardController
|
6
|
+
|
7
|
+
resource_scope do
|
8
|
+
cycle = Effective::CpdCycle.find(params[:cpd_cycle_id])
|
9
|
+
Effective::CpdStatement.deep.where(cpd_cycle: cycle, user: current_user)
|
10
|
+
end
|
11
|
+
|
12
|
+
after_save(if: -> { step == :start }) do
|
13
|
+
CpdScorer.new(user: resource.user).score!
|
14
|
+
end
|
15
|
+
|
16
|
+
# Enforce one statement per user per cycle. Redirect them to an existing statement for this cycle.
|
17
|
+
before_action(only: [:new, :show]) do
|
18
|
+
cycle = Effective::CpdCycle.find(params[:cpd_cycle_id])
|
19
|
+
existing = Effective::CpdStatement.where(cpd_cycle: cycle, user: current_user).where.not(id: resource).first
|
20
|
+
|
21
|
+
if existing&.completed?
|
22
|
+
flash[:danger] = "You have already completed a statement for this #{cpd_cycle_label}."
|
23
|
+
redirect_to(root_path)
|
24
|
+
elsif existing.present?
|
25
|
+
flash[:success] = "You have been redirected to the #{resource_wizard_step_title(existing.next_step)} step."
|
26
|
+
redirect_to effective_cpd.cpd_cycle_cpd_statement_build_path(existing.cpd_cycle, existing, existing.next_step)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Enforce cycle availability
|
31
|
+
before_action(only: [:show, :update]) do
|
32
|
+
cycle = resource.cpd_cycle
|
33
|
+
|
34
|
+
unless cycle.available?
|
35
|
+
flash[:danger] = begin
|
36
|
+
if cycle.ended?
|
37
|
+
"This #{cpd_cycle_label} has ended"
|
38
|
+
elsif !cycle.started?
|
39
|
+
"This #{cpd_cycle_label} has not yet started"
|
40
|
+
else
|
41
|
+
"This #{cpd_cycle_label} is unavailable"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
redirect_to(root_path)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def permitted_params
|
50
|
+
case step
|
51
|
+
when :start
|
52
|
+
params.require(:effective_cpd_statement).permit(:current_step)
|
53
|
+
when :activities
|
54
|
+
params.require(:effective_cpd_statement).permit(:current_step)
|
55
|
+
when :agreements
|
56
|
+
params.require(:effective_cpd_statement).permit(
|
57
|
+
:current_step, :confirm_read, :confirm_factual, files: []
|
58
|
+
)
|
59
|
+
when :submit
|
60
|
+
params.require(:effective_cpd_statement).permit(
|
61
|
+
:current_step, :confirm_readonly
|
62
|
+
)
|
63
|
+
when :complete
|
64
|
+
raise('unexpected post to complete')
|
65
|
+
else
|
66
|
+
raise('unexpected step')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|