think_feel_do_engine 3.19.9 → 3.20.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|