think_feel_do_engine 3.19.9 → 3.20.1
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/Rakefile +11 -3
- data/app/assets/config/manifest.js +3 -0
- data/app/assets/javascripts/think_feel_do_engine/activities/activity_tracker.js +3 -2
- data/app/controllers/think_feel_do_engine/application_controller.rb +4 -3
- data/app/controllers/think_feel_do_engine/bit_maker/content_modules_controller.rb +4 -3
- data/app/controllers/think_feel_do_engine/bit_maker/content_providers_controller.rb +2 -1
- data/app/controllers/think_feel_do_engine/bit_maker/slides_controller.rb +7 -5
- data/app/controllers/think_feel_do_engine/bit_maker/slideshow_anchors_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/bit_maker/slideshows_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/group_dashboard_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/memberships_controller.rb +7 -4
- data/app/controllers/think_feel_do_engine/coach/messages_controller.rb +2 -1
- data/app/controllers/think_feel_do_engine/coach/participant_activities_visualizations_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/participant_thoughts_visualizations_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/patient_dashboards_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/phq_assessments_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/received_messages_controller.rb +2 -1
- data/app/controllers/think_feel_do_engine/coach/sent_messages_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach/site_messages_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/coach_dashboard_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/concerns/browser_detective.rb +13 -12
- data/app/controllers/think_feel_do_engine/concerns/invalid_auth_token.rb +1 -0
- data/app/controllers/think_feel_do_engine/concerns/navigator_enabled.rb +1 -0
- data/app/controllers/think_feel_do_engine/keep_alive_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/lesson_slides_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/lessons_controller.rb +4 -3
- data/app/controllers/think_feel_do_engine/manage/groups_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/manage/tasks_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/memberships_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/navigator_controller.rb +7 -4
- data/app/controllers/think_feel_do_engine/participant_data_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/participants/activities_controller.rb +8 -11
- data/app/controllers/think_feel_do_engine/participants/assessments_controller.rb +4 -3
- data/app/controllers/think_feel_do_engine/participants/lessons_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/participants/media_access_events_controller.rb +3 -3
- data/app/controllers/think_feel_do_engine/participants/passwords_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/participants/public_slides_controller.rb +3 -2
- data/app/controllers/think_feel_do_engine/participants/sessions_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/participants/thoughts_controller.rb +4 -5
- data/app/controllers/think_feel_do_engine/password_entropy_bits_controller.rb +3 -1
- data/app/controllers/think_feel_do_engine/privacy_policies_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/quick_sign_ins_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/users/passwords_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/users/registrations_controller.rb +1 -0
- data/app/controllers/think_feel_do_engine/users/sessions_controller.rb +1 -0
- data/app/helpers/think_feel_do_engine/activities_helper.rb +2 -1
- data/app/helpers/think_feel_do_engine/application_helper.rb +2 -1
- data/app/helpers/think_feel_do_engine/brand_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/coach/activity_color_code_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/coach/dashboard_and_phq_table_helper.rb +6 -5
- data/app/helpers/think_feel_do_engine/coach/group_dashboard_helper.rb +5 -3
- data/app/helpers/think_feel_do_engine/coach/messages_helper.rb +3 -1
- data/app/helpers/think_feel_do_engine/coach/moods_and_phq_viz_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/coach/patient_dashboard_helper.rb +9 -8
- data/app/helpers/think_feel_do_engine/emotions_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/phq_assessment_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/presenters_helper.rb +1 -0
- data/app/helpers/think_feel_do_engine/slides_helper.rb +5 -2
- data/app/helpers/think_feel_do_engine/tasks_helper.rb +11 -9
- data/app/mailers/think_feel_do_engine/lesson_notification_mailer.rb +5 -2
- data/app/mailers/think_feel_do_engine/message_notifications.rb +1 -0
- data/app/mailers/think_feel_do_engine/site_message_mailer.rb +3 -1
- data/app/models/ability.rb +1 -0
- data/app/models/activity.rb +21 -10
- data/app/models/activity_type.rb +1 -0
- data/app/models/arm.rb +2 -2
- data/app/models/arm_validator.rb +3 -1
- data/app/models/available_content_module.rb +6 -2
- data/app/models/awake_period.rb +1 -0
- data/app/models/bit_core/slide_observer.rb +1 -0
- data/app/models/coach_assignment.rb +1 -0
- data/app/models/concerns/accessibility.rb +1 -0
- data/app/models/concerns/copier.rb +25 -17
- data/app/models/content_modules/lesson_module.rb +6 -5
- data/app/models/content_modules.rb +3 -2
- data/app/models/content_provider_decorator.rb +1 -0
- data/app/models/content_provider_policy.rb +1 -0
- data/app/models/content_providers/accomplished_activity_index_provider.rb +1 -0
- data/app/models/content_providers/activity_index_provider.rb +1 -0
- data/app/models/content_providers/augmented_thoughts_table_provider.rb +1 -0
- data/app/models/content_providers/awake_period_form.rb +1 -0
- data/app/models/content_providers/create_activity.rb +4 -3
- data/app/models/content_providers/edit_past_feel_provider.rb +1 -0
- data/app/models/content_providers/evaluate_thoughts_provider.rb +1 -0
- data/app/models/content_providers/fun_activity_checklist.rb +5 -4
- data/app/models/content_providers/harmful_thoughts_edit_form_provider.rb +1 -0
- data/app/models/content_providers/helpful_thoughts_index_provider.rb +1 -0
- data/app/models/content_providers/important_activity_checklist.rb +5 -4
- data/app/models/content_providers/index_past_feel_provider.rb +1 -0
- data/app/models/content_providers/input_new_activity_form.rb +1 -0
- data/app/models/content_providers/learn_lessons_index_provider.rb +5 -4
- data/app/models/content_providers/messages_index_provider.rb +2 -1
- data/app/models/content_providers/module_index_provider.rb +1 -0
- data/app/models/content_providers/new_complete_thought_form_provider.rb +1 -0
- data/app/models/content_providers/new_current_emotion_provider.rb +1 -0
- data/app/models/content_providers/new_current_feel_provider.rb +1 -0
- data/app/models/content_providers/new_harmful_thought_form_provider.rb +1 -0
- data/app/models/content_providers/new_message_form_provider.rb +1 -0
- data/app/models/content_providers/new_past_feel_provider.rb +1 -0
- data/app/models/content_providers/new_thought_form_provider.rb +1 -0
- data/app/models/content_providers/new_thoughts_form_provider.rb +1 -0
- data/app/models/content_providers/past_activity_form.rb +1 -0
- data/app/models/content_providers/past_activity_review_form.rb +1 -0
- data/app/models/content_providers/past_due_activities_viz.rb +1 -0
- data/app/models/content_providers/pleasurable_activity_index_provider.rb +1 -0
- data/app/models/content_providers/previous_planned_activities_provider.rb +1 -0
- data/app/models/content_providers/random_slide_provider.rb +1 -0
- data/app/models/content_providers/show_message_provider.rb +5 -3
- data/app/models/content_providers/thought_patterns_index_provider.rb +1 -0
- data/app/models/content_providers/thoughts_distortion_viz_provider.rb +1 -0
- data/app/models/content_providers/thoughts_table_provider.rb +1 -0
- data/app/models/content_providers/unhelpful_thoughts_list_provider.rb +5 -2
- data/app/models/content_providers/unhelpful_thoughts_reflection_provider.rb +1 -0
- data/app/models/content_providers/unplanned_activity_form.rb +1 -0
- data/app/models/content_providers/your_activities_provider.rb +4 -2
- data/app/models/delivered_message.rb +3 -1
- data/app/models/emotion.rb +3 -2
- data/app/models/emotional_rating.rb +1 -0
- data/app/models/engagement.rb +1 -0
- data/app/models/group.rb +2 -1
- data/app/models/group_metrics/weekly_activities_count.rb +1 -0
- data/app/models/group_metrics/weekly_comments_count.rb +1 -0
- data/app/models/group_metrics/weekly_count.rb +1 -0
- data/app/models/group_metrics/weekly_goals_count.rb +1 -0
- data/app/models/group_metrics/weekly_likes_count.rb +1 -0
- data/app/models/group_metrics/weekly_logins_count.rb +1 -0
- data/app/models/group_metrics/weekly_on_the_mind_statements_count.rb +1 -0
- data/app/models/group_metrics/weekly_thoughts_count.rb +1 -0
- data/app/models/media_access_event.rb +1 -0
- data/app/models/membership.rb +5 -3
- data/app/models/message.rb +1 -0
- data/app/models/message_sms_notification.rb +3 -1
- data/app/models/mood.rb +3 -1
- data/app/models/participant.rb +2 -1
- data/app/models/participant_login_event.rb +1 -0
- data/app/models/participant_metrics/weekly_count.rb +1 -0
- data/app/models/participant_metrics/weekly_logins_count.rb +1 -0
- data/app/models/participant_token.rb +3 -2
- data/app/models/phq_assessment.rb +3 -0
- data/app/models/phq_stepping.rb +5 -4
- data/app/models/phq_stepping_assessment.rb +12 -13
- data/app/models/planned_activity.rb +1 -0
- data/app/models/roles/clinician.rb +1 -0
- data/app/models/roles/content_author.rb +1 -0
- data/app/models/roles/researcher.rb +1 -0
- data/app/models/site_message.rb +1 -0
- data/app/models/slideshow_anchor.rb +2 -1
- data/app/models/task.rb +3 -1
- data/app/models/task_status.rb +4 -2
- data/app/models/think_feel_do_engine/addressable.rb +1 -0
- data/app/models/think_feel_do_engine/concerns/validate_password.rb +1 -0
- data/app/models/think_feel_do_engine/password_validator.rb +3 -1
- data/app/models/think_feel_do_engine/reports/emotional_rating.rb +1 -0
- data/app/models/think_feel_do_engine/reports/event.rb +3 -2
- data/app/models/think_feel_do_engine/reports/lesson_module.rb +4 -3
- data/app/models/think_feel_do_engine/reports/lesson_slide_view.rb +1 -0
- data/app/models/think_feel_do_engine/reports/lesson_viewing.rb +9 -8
- data/app/models/think_feel_do_engine/reports/login.rb +1 -0
- data/app/models/think_feel_do_engine/reports/messaging.rb +2 -1
- data/app/models/think_feel_do_engine/reports/module_page_view.rb +1 -0
- data/app/models/think_feel_do_engine/reports/module_session.rb +6 -5
- data/app/models/think_feel_do_engine/reports/patient_activity.rb +1 -0
- data/app/models/think_feel_do_engine/reports/patient_thought.rb +2 -1
- data/app/models/think_feel_do_engine/reports/phq_assessment.rb +1 -0
- data/app/models/think_feel_do_engine/reports/reporter.rb +2 -1
- data/app/models/think_feel_do_engine/reports/site_session.rb +1 -0
- data/app/models/think_feel_do_engine/reports/task_completion.rb +3 -2
- data/app/models/think_feel_do_engine/reports/tool_access.rb +1 -0
- data/app/models/think_feel_do_engine/reports/tool_module.rb +1 -0
- data/app/models/think_feel_do_engine/reports/user_agent.rb +1 -0
- data/app/models/think_feel_do_engine/reports/video_session.rb +1 -0
- data/app/models/think_feel_do_engine/reports/wai_assessment.rb +1 -0
- data/app/models/thought.rb +4 -2
- data/app/models/thought_pattern.rb +1 -0
- data/app/models/tool_nav_item.rb +2 -1
- data/app/models/tools/home.rb +1 -0
- data/app/models/tools/learn.rb +1 -0
- data/app/models/tools/messages.rb +1 -0
- data/app/models/tools/think.rb +1 -0
- data/app/models/unplanned_activities.rb +2 -2
- data/app/models/user.rb +1 -0
- data/app/models/user_role.rb +2 -1
- data/app/models/values/accomplishment.rb +1 -0
- data/app/models/values/emotional_rating.rb +1 -0
- data/app/models/values/mood.rb +1 -0
- data/app/models/values/pleasure.rb +1 -0
- data/app/models/wai_assessment.rb +4 -1
- data/app/presenters/think_feel_do_engine/harmful_thought_viz_presenter.rb +1 -0
- data/app/presenters/think_feel_do_engine/lesson_event/completion_data_presenter.rb +1 -0
- data/app/presenters/think_feel_do_engine/media_access_event_presenter.rb +1 -0
- data/app/support/mood_and_emotion_visualization_service.rb +22 -25
- data/lib/think_feel_do_engine/engine.rb +1 -0
- data/lib/think_feel_do_engine/version.rb +2 -1
- data/lib/think_feel_do_engine.rb +1 -0
- metadata +20 -6
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# PHQ-9 Stepping Assessment in a well-formatted testable object
|
|
2
3
|
class PhqSteppingAssessment
|
|
3
4
|
attr_accessor :date, :score, :week_of_assessment,
|
|
@@ -10,18 +11,18 @@ class PhqSteppingAssessment
|
|
|
10
11
|
# [5]the entire assessment object (first call from table)
|
|
11
12
|
@date = args[0]
|
|
12
13
|
@score = args[1]
|
|
13
|
-
if args[3].nil?
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@missing_but_copied =
|
|
19
|
-
@missing_with_no_fallback =
|
|
14
|
+
@week_of_assessment = if args[3].nil?
|
|
15
|
+
find_week_of_assessment(args[2])
|
|
16
|
+
else
|
|
17
|
+
args[3]
|
|
18
|
+
end
|
|
19
|
+
@missing_but_copied = !args[3].nil? ? args[4].nil? : false
|
|
20
|
+
@missing_with_no_fallback = !args[4].nil? ? args[4] : false
|
|
20
21
|
missing_answers_count = false
|
|
21
22
|
unless args[5].nil?
|
|
22
23
|
missing_answers_count = fill_in_unanswered_questions(args[5])
|
|
23
24
|
end
|
|
24
|
-
@missing_answers_count =
|
|
25
|
+
@missing_answers_count = !args[5].nil? ? missing_answers_count : 0
|
|
25
26
|
end
|
|
26
27
|
|
|
27
28
|
def self.convert_from_score(hash, study_start_date)
|
|
@@ -31,8 +32,7 @@ class PhqSteppingAssessment
|
|
|
31
32
|
date,
|
|
32
33
|
score,
|
|
33
34
|
study_start_date
|
|
34
|
-
)
|
|
35
|
-
)
|
|
35
|
+
))
|
|
36
36
|
end
|
|
37
37
|
converted_array
|
|
38
38
|
end
|
|
@@ -47,8 +47,7 @@ class PhqSteppingAssessment
|
|
|
47
47
|
nil,
|
|
48
48
|
false,
|
|
49
49
|
assessment
|
|
50
|
-
)
|
|
51
|
-
)
|
|
50
|
+
))
|
|
52
51
|
end
|
|
53
52
|
converted_array
|
|
54
53
|
end
|
|
@@ -69,7 +68,7 @@ class PhqSteppingAssessment
|
|
|
69
68
|
private
|
|
70
69
|
|
|
71
70
|
def fill_in_missing_value(question)
|
|
72
|
-
|
|
71
|
+
question.nil? ? 1.5 : question
|
|
73
72
|
end
|
|
74
73
|
|
|
75
74
|
def fill_in_unanswered_questions(assessment)
|
data/app/models/site_message.rb
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# Defines a relationship between a BitCore::Slideshow and a "target", which for
|
|
2
3
|
# now is limited to the home screen of a Participant.
|
|
3
4
|
class SlideshowAnchor < ActiveRecord::Base
|
|
4
|
-
TARGET_NAMES = %w(home_intro)
|
|
5
|
+
TARGET_NAMES = %w(home_intro).freeze
|
|
5
6
|
|
|
6
7
|
belongs_to :slideshow,
|
|
7
8
|
class_name: "BitCore::Slideshow",
|
data/app/models/task.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# Gives participants notifications on what needs to be completed
|
|
2
3
|
class Task < ActiveRecord::Base
|
|
3
4
|
belongs_to :group
|
|
@@ -97,6 +98,7 @@ class Task < ActiveRecord::Base
|
|
|
97
98
|
TaskStatus.create!(
|
|
98
99
|
membership_id: membership_id,
|
|
99
100
|
start_day: day,
|
|
100
|
-
task_id: id
|
|
101
|
+
task_id: id
|
|
102
|
+
)
|
|
101
103
|
end
|
|
102
104
|
end
|
data/app/models/task_status.rb
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# Holds the completion status of a task for each participant
|
|
2
3
|
class TaskStatus < ActiveRecord::Base
|
|
3
4
|
include Concerns::Accessibility
|
|
4
|
-
LESSON_MODULE_TYPE =
|
|
5
|
+
LESSON_MODULE_TYPE = ContentModules::LessonModule.to_s
|
|
5
6
|
|
|
6
7
|
belongs_to :membership
|
|
7
8
|
belongs_to :task
|
|
@@ -38,7 +39,8 @@ class TaskStatus < ActiveRecord::Base
|
|
|
38
39
|
joins(:task, task: :bit_core_content_module)
|
|
39
40
|
.where(
|
|
40
41
|
BitCore::ContentModule.arel_table[:type]
|
|
41
|
-
.eq(LESSON_MODULE_TYPE)
|
|
42
|
+
.eq(LESSON_MODULE_TYPE)
|
|
43
|
+
)
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
scope :available_by_day, lambda { |day_in_study|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
# Users Participant and User password validations
|
|
3
4
|
class PasswordValidator
|
|
@@ -41,7 +42,8 @@ module ThinkFeelDoEngine
|
|
|
41
42
|
def token
|
|
42
43
|
@token ||= Devise.token_generator.digest(
|
|
43
44
|
Devise, :reset_password_token,
|
|
44
|
-
password_token
|
|
45
|
+
password_token
|
|
46
|
+
)
|
|
45
47
|
end
|
|
46
48
|
|
|
47
49
|
def valid_entropy?
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Reports
|
|
3
4
|
# Scenario: a Participant clicks, causes a page to render,
|
|
@@ -9,9 +10,9 @@ module ThinkFeelDoEngine
|
|
|
9
10
|
|
|
10
11
|
def self.all
|
|
11
12
|
Participant.not_moderator
|
|
12
|
-
|
|
13
|
+
.select(:id, :study_id, :is_admin).map do |participant|
|
|
13
14
|
EventCapture::Event.where(participant_id: participant.id)
|
|
14
|
-
|
|
15
|
+
.map do |event|
|
|
15
16
|
{
|
|
16
17
|
participant_id: participant.study_id,
|
|
17
18
|
is_admin: participant.is_admin,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Reports
|
|
3
4
|
# Shared Lesson Module behavior.
|
|
@@ -17,7 +18,7 @@ module ThinkFeelDoEngine
|
|
|
17
18
|
path = navigator_location_path(module_id: m.id,
|
|
18
19
|
provider_id: first_provider_id,
|
|
19
20
|
content_position: 1)
|
|
20
|
-
[
|
|
21
|
+
[path, m.id]
|
|
21
22
|
end.compact
|
|
22
23
|
|
|
23
24
|
Hash[lessons]
|
|
@@ -28,7 +29,7 @@ module ThinkFeelDoEngine
|
|
|
28
29
|
lessons = ContentModules::LessonModule.all.map do |m|
|
|
29
30
|
path = navigator_location_path(module_id: m.id)
|
|
30
31
|
|
|
31
|
-
[
|
|
32
|
+
[path, m.id]
|
|
32
33
|
end
|
|
33
34
|
|
|
34
35
|
Hash[lessons]
|
|
@@ -38,7 +39,7 @@ module ThinkFeelDoEngine
|
|
|
38
39
|
|
|
39
40
|
def navigator_location_path(options)
|
|
40
41
|
ThinkFeelDoEngine::Engine.routes.url_helpers
|
|
41
|
-
|
|
42
|
+
.navigator_location_path(options)
|
|
42
43
|
end
|
|
43
44
|
end
|
|
44
45
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Reports
|
|
3
4
|
# Scenario: a Participant starts viewing a Lesson.
|
|
@@ -20,25 +21,25 @@ module ThinkFeelDoEngine
|
|
|
20
21
|
lessons_default = lessons_with_default_urls
|
|
21
22
|
|
|
22
23
|
Participant.not_moderator.select(:id, :study_id)
|
|
23
|
-
|
|
24
|
+
.where(id: participant_ids(ids)).map do |participant|
|
|
24
25
|
lesson_select_events =
|
|
25
26
|
EventCapture::Event
|
|
26
27
|
.where(participant_id: participant.id, kind: "render")
|
|
27
28
|
.select(:participant_id, :emitted_at, :payload)
|
|
28
29
|
.to_a.select do |e|
|
|
29
30
|
lessons.keys.include?(e.current_url.gsub(URL_ROOT_RE, "")) ||
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
lessons_default
|
|
32
|
+
.keys.include?(e.current_url.gsub(URL_ROOT_RE, "")) ||
|
|
33
|
+
lessons_default
|
|
34
|
+
.keys.include?(e.current_url.gsub(URL_ROOT_RE, "")[0...-1])
|
|
34
35
|
end
|
|
35
36
|
|
|
36
37
|
lesson_select_events.map do |e|
|
|
37
38
|
lesson_id = lessons[e.current_url.gsub(URL_ROOT_RE, "")] ||
|
|
38
39
|
lessons_default[e.current_url
|
|
39
|
-
|
|
40
|
+
.gsub(URL_ROOT_RE, "")] ||
|
|
40
41
|
lessons_default[e.current_url
|
|
41
|
-
|
|
42
|
+
.gsub(URL_ROOT_RE, "")[0...-1]]
|
|
42
43
|
last_page_opened = last_page_opened(e, lesson_id)
|
|
43
44
|
event_hash(participant, lesson_id, e, last_page_opened)
|
|
44
45
|
end
|
|
@@ -75,7 +76,7 @@ module ThinkFeelDoEngine
|
|
|
75
76
|
lessons_with_default_path = lesson_entries_map.each.map do |lesson|
|
|
76
77
|
default_lesson_url =
|
|
77
78
|
lesson[0].gsub(URL_ROOT_RE, "")
|
|
78
|
-
|
|
79
|
+
.gsub(DEFAULT_LESSON_MODULE_POSTFIX, "")
|
|
79
80
|
[default_lesson_url, lesson[1]]
|
|
80
81
|
end
|
|
81
82
|
Hash[lessons_with_default_path]
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Reports
|
|
3
4
|
# Metadata for Coach-Participant messaging.
|
|
@@ -102,7 +103,7 @@ module ThinkFeelDoEngine
|
|
|
102
103
|
|
|
103
104
|
def received_message
|
|
104
105
|
@received_message ||= @recipient.received_messages
|
|
105
|
-
|
|
106
|
+
.find_by_message_id(@message.id)
|
|
106
107
|
end
|
|
107
108
|
end
|
|
108
109
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Reports
|
|
3
4
|
# Scenario: A Participant starts using a Tool Module.
|
|
@@ -87,8 +88,8 @@ module ThinkFeelDoEngine
|
|
|
87
88
|
.drop_while { |e| e.id != first_session_event.id }
|
|
88
89
|
.take_while do |e|
|
|
89
90
|
e.emitted_at - latest_event_time < THRESHOLD &&
|
|
90
|
-
|
|
91
|
-
|
|
91
|
+
e.current_url.match(/modules\/#{ module_id }(\/.*)?$/) &&
|
|
92
|
+
(latest_event_time = e.emitted_at)
|
|
92
93
|
end
|
|
93
94
|
last_event = (module_events.last || first_session_event)
|
|
94
95
|
|
|
@@ -111,9 +112,9 @@ module ThinkFeelDoEngine
|
|
|
111
112
|
def self.is_last_module_page(url, module_id)
|
|
112
113
|
# last provider within module
|
|
113
114
|
last_provider = BitCore::ContentModule.find(module_id)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
.content_providers
|
|
116
|
+
.order(:position)
|
|
117
|
+
.last
|
|
117
118
|
|
|
118
119
|
if last_provider.nil?
|
|
119
120
|
false
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Reports
|
|
3
4
|
# Collect metadata for all Participant Thoughts.
|
|
@@ -8,7 +9,7 @@ module ThinkFeelDoEngine
|
|
|
8
9
|
|
|
9
10
|
def self.all
|
|
10
11
|
Participant.not_moderator
|
|
11
|
-
|
|
12
|
+
.select(:id, :study_id).map.map do |participant|
|
|
12
13
|
participant.thoughts.map do |thought|
|
|
13
14
|
{
|
|
14
15
|
participant_id: participant.study_id,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require "csv"
|
|
2
3
|
|
|
3
4
|
module ThinkFeelDoEngine
|
|
@@ -14,7 +15,7 @@ module ThinkFeelDoEngine
|
|
|
14
15
|
|
|
15
16
|
def self.file_path(name)
|
|
16
17
|
Rails.application.config.reports_root_path
|
|
17
|
-
|
|
18
|
+
.join("reports/#{name.to_s.scan(/[a-z]+/).join.downcase}.csv")
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
def initialize(collector)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
module ThinkFeelDoEngine
|
|
2
3
|
module Reports
|
|
3
4
|
# Scenario: a Participant completes a Task on the assigned day.
|
|
@@ -8,11 +9,11 @@ module ThinkFeelDoEngine
|
|
|
8
9
|
|
|
9
10
|
def self.all
|
|
10
11
|
Participant.not_moderator.select(:id, :study_id)
|
|
11
|
-
|
|
12
|
+
.includes(:memberships).map do |participant|
|
|
12
13
|
next unless participant.active_membership
|
|
13
14
|
|
|
14
15
|
TaskStatus.where(membership_id: participant.active_membership.id)
|
|
15
|
-
|
|
16
|
+
.map do |task_status|
|
|
16
17
|
next unless task_status.completed_at.try(:to_date) ==
|
|
17
18
|
participant.active_membership.start_date +
|
|
18
19
|
task_status.start_day - 1
|
data/app/models/thought.rb
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# A thought recorded by a Participant.
|
|
2
3
|
class Thought < ActiveRecord::Base
|
|
3
4
|
EFFECTS = {
|
|
4
5
|
helpful: "helpful",
|
|
5
6
|
harmful: "harmful",
|
|
6
7
|
neither: "neither"
|
|
7
|
-
}
|
|
8
|
+
}.freeze
|
|
8
9
|
IDENTIFIED = "Identified"
|
|
9
10
|
ASSIGNED_A_PATTERN = "Assigned a pattern to"
|
|
10
11
|
RESHAPED = "Reshaped"
|
|
@@ -39,7 +40,8 @@ class Thought < ActiveRecord::Base
|
|
|
39
40
|
scope :last_seven_days, lambda {
|
|
40
41
|
where(
|
|
41
42
|
arel_table[:created_at]
|
|
42
|
-
.gteq(Time.current.advance(days: -7).beginning_of_day)
|
|
43
|
+
.gteq(Time.current.advance(days: -7).beginning_of_day)
|
|
44
|
+
)
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
scope :for_day, lambda { |time|
|
data/app/models/tool_nav_item.rb
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# A nav item related to a Bit Core Tool.
|
|
2
3
|
class ToolNavItem
|
|
3
4
|
def self.for_participant(participant)
|
|
4
5
|
participant.active_group.arm.non_home_tools.order(:position)
|
|
5
|
-
|
|
6
|
+
.map { |t| new(participant, t) }
|
|
6
7
|
end
|
|
7
8
|
|
|
8
9
|
def initialize(participant, tool)
|
data/app/models/tools/home.rb
CHANGED
data/app/models/tools/learn.rb
CHANGED
data/app/models/tools/think.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# A collection of Activities that have not been scheduled by a Participant.
|
|
2
3
|
class UnplannedActivities
|
|
3
4
|
Errors = Struct.new(:full_messages)
|
|
@@ -14,8 +15,7 @@ class UnplannedActivities
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def build(attributes)
|
|
17
|
-
many_attributes =
|
|
18
|
-
when attributes[:activity_type_ids]
|
|
18
|
+
many_attributes = if attributes[:activity_type_ids]
|
|
19
19
|
(attributes[:activity_type_ids] || []).map do |type_id|
|
|
20
20
|
{ activity_type_id: type_id }
|
|
21
21
|
end
|
data/app/models/user.rb
CHANGED
data/app/models/user_role.rb
CHANGED
data/app/models/values/mood.rb
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
# Collected responses from one Participant WAI assessment session.
|
|
2
3
|
class WaiAssessment < ActiveRecord::Base
|
|
3
4
|
MIN_QUESTION_SCORE = 1
|
|
4
5
|
MAX_QUESTION_SCORE = 5
|
|
5
6
|
QUESTION_COUNT = 12
|
|
7
|
+
# rubocop:disable Style/MutableConstant
|
|
6
8
|
QUESTION_ATTRIBUTES = :q1, :q2, :q3, :q4, :q5, :q6, :q7, :q8, :q9, :q10, :q11,
|
|
7
9
|
:q12
|
|
10
|
+
# rubocop:enable Style/MutableConstant
|
|
8
11
|
|
|
9
12
|
belongs_to :participant
|
|
10
13
|
|
|
@@ -15,7 +18,7 @@ class WaiAssessment < ActiveRecord::Base
|
|
|
15
18
|
private
|
|
16
19
|
|
|
17
20
|
def scores_valid
|
|
18
|
-
return
|
|
21
|
+
return if remove_nils.empty?
|
|
19
22
|
|
|
20
23
|
if remove_nils.min < MIN_QUESTION_SCORE ||
|
|
21
24
|
remove_nils.max > MAX_QUESTION_SCORE
|