renalware-core 2.0.87 → 2.0.88
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/renalware/modules/_patients.scss +42 -1
- data/app/assets/stylesheets/renalware/partials/_forms.scss +14 -0
- data/app/controllers/renalware/patients/primary_care_physician_controller.rb +2 -0
- data/app/helpers/renalware/clipboard_helper.rb +1 -1
- data/app/models/renalware/renal/registry/preflight_checks/patients_query.rb +1 -3
- data/app/models/renalware/system/api_log.rb +0 -1
- data/app/policies/renalware/base_policy.rb +2 -2
- data/app/policies/renalware/drugs/drug_policy.rb +1 -1
- data/app/policies/renalware/letters/letter_policy.rb +1 -1
- data/app/presenters/renalware/pathology/observation_set_presenter.rb +0 -1
- data/app/presenters/renalware/patients/summary_part.rb +51 -0
- data/app/presenters/renalware/renal/clinical_summary_presenter.rb +7 -2
- data/app/presenters/renalware/summary_part.rb +1 -1
- data/app/views/renalware/api/ukrdc/patients/procedures/_transplant_operation.xml.builder +2 -0
- data/app/views/renalware/dashboard/dashboards/_content.html.slim +1 -1
- data/app/views/renalware/patients/_summary_part.html.slim +32 -0
- data/app/views/renalware/patients/bookmarks/_new.html.slim +1 -1
- data/app/views/renalware/patients/clinical_summaries/show.html.slim +1 -2
- data/app/views/renalware/shared/_fieldset.html.slim +4 -1
- data/app/views/renalware/transplants/recipient_followups/_form.html.slim +19 -9
- data/config/initializers/devise_security.rb +44 -0
- data/config/initializers/simple_form_clock_picker.rb +0 -1
- data/config/initializers/simple_form_datepicker.rb +0 -3
- data/config/initializers/simple_form_foundation.rb +0 -1
- data/config/initializers/simple_form_wrappers.rb +2 -1
- data/config/locales/devise.security_extension.en.yml +20 -7
- data/db/migrate/20190104095254_create_active_storage_tables.active_storage.rb +19 -17
- data/db/migrate/20190612124015_create_transplant_rejection_episodes.rb +14 -10
- data/db/migrate/20190617121528_create_transplant_rejection_treatments.rb +14 -12
- data/lib/core_extensions/active_support/duration.rb +1 -1
- data/lib/renalware/configuration.rb +1 -0
- data/lib/renalware/engine.rb +1 -0
- data/lib/renalware/version.rb +1 -1
- metadata +19 -4
- data/app/models/concerns/renalware/clinics/most_recent_measurement_scopes.rb.dead +0 -43
- data/app/views/renalware/patients/side_menu/_options.html.slim.redundant +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b307ab9e2206ff86c1d62380d3b6dfc77839512a51f5ad7957f8e98e2c7e29a
|
4
|
+
data.tar.gz: c722f3506055163495fabcf33d586d83597be269f5b40998cec8605236e6400a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68c6187d34c761393b070b05bbdb8fed13485739f3deab2cc5feb397a6a4c2a6a86d0c2d67a7f1681dcb7d0e8e36fa181f416c6c7ec9655a55c870dcf88034ed
|
7
|
+
data.tar.gz: 8f954eeaebce032662556e9b2bb2b4984479f7b13c27ee814e63b17a154836a5c91f596107cbc2e0961c2c32daf3849045f29caea5f39805483ae9ffff3a9d77
|
@@ -376,8 +376,49 @@ form {
|
|
376
376
|
@include grid-column(6);
|
377
377
|
}
|
378
378
|
}
|
379
|
-
}
|
380
379
|
|
380
|
+
.summary-part--bookmark-notes,
|
381
|
+
.summary-part--worryboard-notes {
|
382
|
+
@include grid-column(12);
|
383
|
+
|
384
|
+
@media #{$medium-up} {
|
385
|
+
@include grid-column(6);
|
386
|
+
}
|
387
|
+
|
388
|
+
p {
|
389
|
+
padding: .2rem 0 0 0;
|
390
|
+
}
|
391
|
+
|
392
|
+
.urgent {
|
393
|
+
background-color: $nhs-yellow;
|
394
|
+
padding: .05rem .6rem;
|
395
|
+
display: inline-block;
|
396
|
+
border-radius: 0.3rem;
|
397
|
+
margin-right: .4rem;
|
398
|
+
}
|
399
|
+
|
400
|
+
.lozenge {
|
401
|
+
margin: 0;
|
402
|
+
padding: 0;
|
403
|
+
font-size: .9rem;
|
404
|
+
display: inline-block;
|
405
|
+
|
406
|
+
ul {
|
407
|
+
margin: 0;
|
408
|
+
padding: 0;
|
409
|
+
display: inline-block;
|
410
|
+
|
411
|
+
li {
|
412
|
+
padding: 0 .4rem;
|
413
|
+
background-color: $nhs-green;
|
414
|
+
line-height: 1.4rem;
|
415
|
+
color: $white;
|
416
|
+
margin-right: .3rem;
|
417
|
+
}
|
418
|
+
}
|
419
|
+
}
|
420
|
+
}
|
421
|
+
}
|
381
422
|
|
382
423
|
#select2-practice-search-results {
|
383
424
|
li {
|
@@ -461,3 +461,17 @@ fieldset {
|
|
461
461
|
}
|
462
462
|
}
|
463
463
|
}
|
464
|
+
|
465
|
+
label.label-emphasis {
|
466
|
+
font-weight: bold;
|
467
|
+
}
|
468
|
+
|
469
|
+
legend .legend-note {
|
470
|
+
right: 0;
|
471
|
+
top: 0;
|
472
|
+
position: absolute;
|
473
|
+
margin: .5rem 1rem;
|
474
|
+
font-weight: normal;
|
475
|
+
font-size: .9rem;
|
476
|
+
color: $steel;
|
477
|
+
}
|
@@ -86,10 +86,12 @@ module Renalware
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
89
|
+
# TODO: move to a query object
|
89
90
|
def find_practice_memberships_for(practice_id)
|
90
91
|
PracticeMembership
|
91
92
|
.eager_load(:primary_care_physician)
|
92
93
|
.where(practice_id: practice_id)
|
94
|
+
.where("#{PrimaryCarePhysician.table_name}.deleted_at is NULL")
|
93
95
|
.order(
|
94
96
|
"#{PracticeMembership.table_name}.left_on desc,"\
|
95
97
|
"#{PrimaryCarePhysician.table_name}.name asc"
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Renalware
|
4
4
|
module ClipboardHelper
|
5
5
|
# A helper to create a clipboard.js button https://clipboardjs.com/
|
6
|
-
def clipboard_button_for(target, width: "13rem"
|
6
|
+
def clipboard_button_for(target, width: "13rem")
|
7
7
|
content_tag :button,
|
8
8
|
data: { "clipboard-action" => "copy", "clipboard-target" => target },
|
9
9
|
class: "button compact low-key clipboard-btn" do
|
@@ -11,13 +11,11 @@ module Renalware
|
|
11
11
|
MODALITY_NAMES = %w(HD PD Transplant).freeze
|
12
12
|
attr_reader :relation, :query_params
|
13
13
|
|
14
|
-
# rubocop:disable Lint/UnusedMethodArgument
|
15
14
|
def initialize(relation: nil, query_params: {})
|
16
|
-
@relation
|
15
|
+
@relation = relation || default_relation
|
17
16
|
@query_params = query_params
|
18
17
|
@query_params[:s] = "modality_descriptions_name ASC" if @query_params[:s].blank?
|
19
18
|
end
|
20
|
-
# rubocop:enable Lint/UnusedMethodArgument
|
21
19
|
|
22
20
|
# The way I understand Ransack is that if you use a query like profile_esrf_gt
|
23
21
|
# (that's the RenalProfile in this case as we are dealing with a Renal::Patient)
|
@@ -29,7 +29,7 @@ module Renalware
|
|
29
29
|
return true if user_is_devops? || user_is_super_admin?
|
30
30
|
return permission_for_restricted? if restricted?
|
31
31
|
|
32
|
-
|
32
|
+
write_privileges?
|
33
33
|
end
|
34
34
|
|
35
35
|
def update?
|
@@ -73,7 +73,7 @@ module Renalware
|
|
73
73
|
permission_configuration.has_permission?(user)
|
74
74
|
end
|
75
75
|
|
76
|
-
def
|
76
|
+
def write_privileges?
|
77
77
|
user_is_super_admin? || user_is_admin? || user_is_clinical?
|
78
78
|
end
|
79
79
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Renalware
|
4
|
+
module Patients
|
5
|
+
class SummaryPart < Renalware::SummaryPart
|
6
|
+
delegate :worry, to: :patient
|
7
|
+
|
8
|
+
def to_partial_path
|
9
|
+
"renalware/patients/summary_part"
|
10
|
+
end
|
11
|
+
|
12
|
+
def on_worryboard?
|
13
|
+
worry.present?
|
14
|
+
end
|
15
|
+
|
16
|
+
def worryboard_notes
|
17
|
+
worry&.notes
|
18
|
+
end
|
19
|
+
|
20
|
+
def bookmarked?
|
21
|
+
bookmark.present?
|
22
|
+
end
|
23
|
+
|
24
|
+
def bookmark_notes
|
25
|
+
bookmark&.notes
|
26
|
+
end
|
27
|
+
|
28
|
+
def bookmark
|
29
|
+
return if current_user.blank?
|
30
|
+
|
31
|
+
patients_user.bookmark_for_patient(patient)
|
32
|
+
end
|
33
|
+
|
34
|
+
def patients_user
|
35
|
+
Patients.cast_user(current_user)
|
36
|
+
end
|
37
|
+
|
38
|
+
def bookmark_tags
|
39
|
+
return [] if bookmark.blank?
|
40
|
+
return [] if bookmark.tags.blank?
|
41
|
+
|
42
|
+
bookmark
|
43
|
+
.tags
|
44
|
+
.split(",")
|
45
|
+
.reject(&:blank?)
|
46
|
+
.map(&:strip)
|
47
|
+
.uniq
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -9,8 +9,13 @@ module Renalware
|
|
9
9
|
rattr_initialize :patient
|
10
10
|
|
11
11
|
# Host application may override the order or add other summary presenters
|
12
|
-
def summary_parts
|
13
|
-
Renalware
|
12
|
+
def summary_parts(current_user)
|
13
|
+
Renalware
|
14
|
+
.config
|
15
|
+
.page_layouts[:clinical_summary]
|
16
|
+
.map(&:constantize)
|
17
|
+
.map { |klass| klass.new(patient, current_user) }
|
18
|
+
.select(&:render?)
|
14
19
|
end
|
15
20
|
end
|
16
21
|
end
|
@@ -8,7 +8,7 @@ module Renalware
|
|
8
8
|
# of various SummaryParts
|
9
9
|
class SummaryPart
|
10
10
|
DATE_FORMAT = "%Y%m%d%H%M%S%L"
|
11
|
-
rattr_initialize :patient
|
11
|
+
rattr_initialize :patient, :current_user
|
12
12
|
attr_implement :to_partial_path
|
13
13
|
|
14
14
|
# If the subclass defines a cache_key Rails will cache the partial
|
@@ -0,0 +1,32 @@
|
|
1
|
+
- if summary_part.bookmarked?
|
2
|
+
- bookmark = summary_part.bookmark
|
3
|
+
.summary-part--bookmark-notes
|
4
|
+
article
|
5
|
+
header
|
6
|
+
h2 Bookmark
|
7
|
+
= link_to("Remove",
|
8
|
+
bookmark_path(bookmark),
|
9
|
+
method: :delete,
|
10
|
+
data: { confirm: "Are you sure?" },
|
11
|
+
class: :button)
|
12
|
+
- if bookmark.urgent?
|
13
|
+
span.urgent Urgent
|
14
|
+
- if summary_part.bookmark_tags.any?
|
15
|
+
.lozenge
|
16
|
+
ul
|
17
|
+
- summary_part.bookmark_tags.each do |tag|
|
18
|
+
li= tag
|
19
|
+
p= summary_part.bookmark_notes
|
20
|
+
|
21
|
+
- if summary_part.on_worryboard?
|
22
|
+
.summary-part--worryboard-notes
|
23
|
+
article
|
24
|
+
header
|
25
|
+
h2 Worryboard notes
|
26
|
+
= link_to("Remove",
|
27
|
+
patient_worry_path( summary_part.patient, summary_part.worry),
|
28
|
+
method: :delete,
|
29
|
+
data: { confirm: "Are you sure you want to remove the patient from the worryboard?" },
|
30
|
+
class: :button)
|
31
|
+
|
32
|
+
p= summary_part.worryboard_notes
|
@@ -10,7 +10,7 @@
|
|
10
10
|
url: patient_bookmarks_path(patient_id: patient) do |f|
|
11
11
|
h2= t(".title")
|
12
12
|
= f.input :urgent, as: :boolean, boolean_style: :inline
|
13
|
-
= f.input :tags, label: "Tags"
|
13
|
+
= f.input :tags, label: "Tags", placeholder: "Optional comma-delimited list"
|
14
14
|
= f.input :notes, as: :text, input_html: { autofocus: :autofocus }
|
15
15
|
= f.submit t(".save"), class: :button
|
16
16
|
span= " or "
|
@@ -7,6 +7,5 @@
|
|
7
7
|
= within_patient_layout(title: "Clinical Summary") do
|
8
8
|
.row
|
9
9
|
- patient = clinical_summary.patient
|
10
|
-
- summary_parts = clinical_summary.summary_parts.
|
11
|
-
- summary_parts.select(&:render?).each do |summary_part|
|
10
|
+
- summary_parts = clinical_summary.summary_parts(current_user).each do |summary_part|
|
12
11
|
= render summary_part
|
@@ -9,32 +9,42 @@ ruby:
|
|
9
9
|
|
10
10
|
.form-content
|
11
11
|
= f.simple_fields_for :document, f.object.document do |fd|
|
12
|
-
|
13
12
|
= render layout: "renalware/shared/fieldset",
|
14
|
-
locals: { legend: "Transplant Outcomes",
|
15
|
-
|
16
|
-
|
13
|
+
locals: { legend: "Transplant Outcomes",
|
14
|
+
name: "transplant_failure",
|
15
|
+
legend_note: "Bold items required for NHSBT" } do
|
16
|
+
= f.input :graft_function_onset, wrapper: :horizontal_small, label_html: { class: "label-emphasis" }
|
17
|
+
= f.input :last_post_transplant_dialysis_on, as: :date_picker, wrapper: :horizontal_datepicker, label_html: { class: "label-emphasis" }
|
17
18
|
= f.input :stent_removed_on, as: :date_picker, wrapper: :horizontal_datepicker
|
18
|
-
= f.input :return_to_regular_dialysis_on, as: :date_picker, wrapper: :horizontal_datepicker
|
19
|
+
= f.input :return_to_regular_dialysis_on, as: :date_picker, wrapper: :horizontal_datepicker, label_html: { class: "label-emphasis" }
|
19
20
|
/ readonly: nil here is required to prevent the No option being created with readonly=readonly
|
20
21
|
/ which causes Capybara to fail because it cannot change the value of read-only element
|
21
22
|
= f.input :transplant_failed,
|
22
23
|
as: :inline_radio_buttons,
|
23
24
|
wrapper: :horizontal_small,
|
24
|
-
readonly: nil
|
25
|
-
|
25
|
+
readonly: nil,
|
26
|
+
label_html: { class: "label-emphasis" }
|
27
|
+
= f.input :transplant_failed_on,
|
28
|
+
as: :date_picker,
|
29
|
+
wrapper: :horizontal_datepicker,
|
30
|
+
label_html: { class: "label-emphasis" }
|
26
31
|
= f.input :transplant_failure_cause_description_id,
|
27
32
|
as: :grouped_select,
|
28
33
|
collection: Renalware::Transplants::FailureCauseDescriptionGroup.all,
|
29
34
|
group_method: :ordered_descriptions,
|
30
35
|
group_label_method: :name,
|
31
36
|
value_method: :id,
|
37
|
+
wrapper: :horizontal_medium,
|
38
|
+
label_html: { class: "label-emphasis" }
|
39
|
+
= f.input :transplant_failure_cause_other,
|
32
40
|
wrapper: :horizontal_medium
|
33
|
-
= f.input :transplant_failure_cause_other, wrapper: :horizontal_medium
|
34
41
|
= f.input :transplant_failure_notes,
|
35
42
|
input_html: { rows: 5 },
|
36
43
|
wrapper: :horizontal_large
|
37
|
-
= f.input :graft_nephrectomy_on,
|
44
|
+
= f.input :graft_nephrectomy_on,
|
45
|
+
as: :date_picker,
|
46
|
+
wrapper: :horizontal_datepicker,
|
47
|
+
label_html: { class: "label-emphasis" }
|
38
48
|
|
39
49
|
= render layout: "renalware/shared/fieldset",
|
40
50
|
locals: { legend: "Cardiovascular Complication",
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Devise.setup do |config|
|
4
|
+
# ==> Security Extension
|
5
|
+
# Configure security extension for devise
|
6
|
+
|
7
|
+
# Should the password expire (e.g 3.months)
|
8
|
+
# config.expire_password_after = false
|
9
|
+
|
10
|
+
# Need 1 char of A-Z, a-z and 0-9
|
11
|
+
# config.password_complexity = { digit: 1, lower: 1, symbol: 1, upper: 1 }
|
12
|
+
|
13
|
+
# How many passwords to keep in archive
|
14
|
+
# config.password_archiving_count = 5
|
15
|
+
|
16
|
+
# Deny old passwords (true, false, number_of_old_passwords_to_check)
|
17
|
+
# Examples:
|
18
|
+
# config.deny_old_passwords = false # allow old passwords
|
19
|
+
# config.deny_old_passwords = true # will deny all the old passwords
|
20
|
+
# config.deny_old_passwords = 3 # will deny new passwords that matches with the last 3 passwords
|
21
|
+
# config.deny_old_passwords = true
|
22
|
+
|
23
|
+
# enable email validation for :secure_validatable. (true, false, validation_options)
|
24
|
+
# dependency: see https://github.com/devise-security/devise-security/blob/master/README.md#e-mail-validation
|
25
|
+
# config.email_validation = true
|
26
|
+
|
27
|
+
# captcha integration for recover form
|
28
|
+
# config.captcha_for_recover = true
|
29
|
+
|
30
|
+
# captcha integration for sign up form
|
31
|
+
# config.captcha_for_sign_up = true
|
32
|
+
|
33
|
+
# captcha integration for sign in form
|
34
|
+
# config.captcha_for_sign_in = true
|
35
|
+
|
36
|
+
# captcha integration for unlock form
|
37
|
+
# config.captcha_for_unlock = true
|
38
|
+
|
39
|
+
# captcha integration for confirmation form
|
40
|
+
# config.captcha_for_confirmation = true
|
41
|
+
|
42
|
+
# Time period for account expiry from last_activity_at
|
43
|
+
# config.expire_after = 90.days
|
44
|
+
end
|
@@ -6,7 +6,6 @@ SimpleForm.setup do |config|
|
|
6
6
|
class: :row,
|
7
7
|
hint_class: :field_with_hint,
|
8
8
|
error_class: :error do |b|
|
9
|
-
|
10
9
|
b.use :html5
|
11
10
|
b.use :placeholder
|
12
11
|
b.optional :maxlength
|
@@ -33,7 +32,6 @@ SimpleForm.setup do |config|
|
|
33
32
|
class: :row,
|
34
33
|
hint_class: :field_with_hint,
|
35
34
|
error_class: :error do |b|
|
36
|
-
|
37
35
|
b.use :html5
|
38
36
|
b.use :placeholder
|
39
37
|
b.optional :maxlength
|
@@ -54,7 +52,6 @@ SimpleForm.setup do |config|
|
|
54
52
|
class: :row,
|
55
53
|
hint_class: :field_with_hint,
|
56
54
|
error_class: :error do |b|
|
57
|
-
|
58
55
|
b.use :html5
|
59
56
|
b.use :placeholder
|
60
57
|
b.optional :maxlength
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
SimpleForm.setup do |config|
|
2
4
|
def configure_label(b)
|
3
5
|
b.use :html5
|
@@ -42,7 +44,6 @@ SimpleForm.setup do |config|
|
|
42
44
|
hint_class: :field_with_hint,
|
43
45
|
error_class: :error
|
44
46
|
) do |b|
|
45
|
-
|
46
47
|
configure_label(b)
|
47
48
|
|
48
49
|
b.wrapper :right_input_wrapper, tag: :div, class: "wrapper__input" do |ba|
|
@@ -1,16 +1,29 @@
|
|
1
1
|
en:
|
2
2
|
errors:
|
3
3
|
messages:
|
4
|
-
taken_in_past:
|
5
|
-
equal_to_current_password:
|
6
|
-
|
4
|
+
taken_in_past: 'was used previously.'
|
5
|
+
equal_to_current_password: 'must be different than the current password.'
|
6
|
+
password_complexity:
|
7
|
+
digit:
|
8
|
+
one: must contain at least one digit
|
9
|
+
other: must contain at least %{count} numerals
|
10
|
+
lower:
|
11
|
+
one: must contain at least one lower-case letter
|
12
|
+
other: must contain at least %{count} lower-case letters
|
13
|
+
symbol:
|
14
|
+
one: must contain at least one punctuation mark or symbol
|
15
|
+
other: must contain at least %{count} puncutation marks or symbols
|
16
|
+
upper:
|
17
|
+
one: must contain at least one upper-case letter
|
18
|
+
other: must contain at least %{count} upper-case letters
|
7
19
|
devise:
|
8
|
-
invalid_captcha:
|
20
|
+
invalid_captcha: 'The captcha input was invalid.'
|
21
|
+
invalid_security_question: 'The security question answer was invalid.'
|
9
22
|
paranoid_verify:
|
10
|
-
code_required:
|
23
|
+
code_required: 'Please enter the code our support team provided'
|
11
24
|
password_expired:
|
12
|
-
updated:
|
13
|
-
change_required:
|
25
|
+
updated: 'Your new password is saved.'
|
26
|
+
change_required: 'Your password is expired. Please renew your password.'
|
14
27
|
failure:
|
15
28
|
session_limited: 'Your login credentials were used in another browser. Please sign in again to continue in this browser.'
|
16
29
|
expired: 'Your account has expired due to inactivity. Please contact the site administrator.'
|
@@ -1,27 +1,29 @@
|
|
1
1
|
# This migration comes from active_storage (originally 20170806125915)
|
2
2
|
class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
|
3
3
|
def change
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
within_renalware_schema do
|
5
|
+
create_table :active_storage_blobs do |t|
|
6
|
+
t.string :key, null: false
|
7
|
+
t.string :filename, null: false
|
8
|
+
t.string :content_type
|
9
|
+
t.text :metadata
|
10
|
+
t.bigint :byte_size, null: false
|
11
|
+
t.string :checksum, null: false
|
12
|
+
t.datetime :created_at, null: false
|
12
13
|
|
13
|
-
|
14
|
-
|
14
|
+
t.index [:key], unique: true
|
15
|
+
end
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
create_table :active_storage_attachments do |t|
|
18
|
+
t.string :name, null: false
|
19
|
+
t.references :record, null: false, polymorphic: true, index: false
|
20
|
+
t.references :blob, null: false
|
20
21
|
|
21
|
-
|
22
|
+
t.datetime :created_at, null: false
|
22
23
|
|
23
|
-
|
24
|
-
|
24
|
+
t.index [:record_type, :record_id, :name, :blob_id], name: "index_active_storage_attachments_uniqueness", unique: true
|
25
|
+
t.foreign_key :active_storage_blobs, column: :blob_id
|
26
|
+
end
|
25
27
|
end
|
26
28
|
end
|
27
29
|
end
|
@@ -1,15 +1,19 @@
|
|
1
1
|
class CreateTransplantRejectionEpisodes < ActiveRecord::Migration[5.2]
|
2
2
|
def change
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
within_renalware_schema do
|
4
|
+
create_table :transplant_rejection_episodes do |t|
|
5
|
+
t.date :recorded_on, null: false
|
6
|
+
t.text :notes
|
7
|
+
t.references(
|
8
|
+
:followup,
|
9
|
+
foreign_key: { to_table: :transplant_recipient_followups },
|
10
|
+
null: false,
|
11
|
+
index: true
|
12
|
+
)
|
13
|
+
t.references :updated_by, foreign_key: { to_table: :users }, index: true, null: false
|
14
|
+
t.references :created_by, foreign_key: { to_table: :users }, index: true, null: false
|
15
|
+
t.timestamps null: false
|
16
|
+
end
|
13
17
|
end
|
14
18
|
end
|
15
19
|
end
|
@@ -1,17 +1,19 @@
|
|
1
1
|
class CreateTransplantRejectionTreatments < ActiveRecord::Migration[5.2]
|
2
2
|
def change
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
within_renalware_schema do
|
4
|
+
# The treatment given for an episode
|
5
|
+
create_table :transplant_rejection_treatments do |t|
|
6
|
+
t.text :name, null: false, index: :unique
|
7
|
+
t.integer :position, index: true, null: false, default: 0
|
8
|
+
t.timestamps null: false
|
9
|
+
end
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
add_reference(
|
12
|
+
:transplant_rejection_episodes,
|
13
|
+
:treatment,
|
14
|
+
foreign_key: { to_table: :transplant_rejection_treatments },
|
15
|
+
index: true
|
16
|
+
)
|
17
|
+
end
|
16
18
|
end
|
17
19
|
end
|
@@ -21,7 +21,7 @@ module CoreExtensions
|
|
21
21
|
.map { |unit, val| "#{val} #{val == 1 ? unit.to_s.chop : unit.to_s}" }
|
22
22
|
.to_sentence(locale: ::I18n.default_locale)
|
23
23
|
end
|
24
|
-
# rubocop:enable Style/Semicolon, Style/EachWithObject
|
24
|
+
# rubocop:enable Style/Semicolon, Style/EachWithObject
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
data/lib/renalware/engine.rb
CHANGED
data/lib/renalware/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: renalware-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.88
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Airslie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_type
|
@@ -206,6 +206,20 @@ dependencies:
|
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
208
|
version: 4.6.0
|
209
|
+
- !ruby/object:Gem::Dependency
|
210
|
+
name: devise-security
|
211
|
+
requirement: !ruby/object:Gem::Requirement
|
212
|
+
requirements:
|
213
|
+
- - "~>"
|
214
|
+
- !ruby/object:Gem::Version
|
215
|
+
version: 0.14.3
|
216
|
+
type: :runtime
|
217
|
+
prerelease: false
|
218
|
+
version_requirements: !ruby/object:Gem::Requirement
|
219
|
+
requirements:
|
220
|
+
- - "~>"
|
221
|
+
- !ruby/object:Gem::Version
|
222
|
+
version: 0.14.3
|
209
223
|
- !ruby/object:Gem::Dependency
|
210
224
|
name: dotenv-rails
|
211
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -1354,7 +1368,6 @@ files:
|
|
1354
1368
|
- app/models/application_record.rb
|
1355
1369
|
- app/models/concerns/renalware/accountable.rb
|
1356
1370
|
- app/models/concerns/renalware/broadcasting.rb
|
1357
|
-
- app/models/concerns/renalware/clinics/most_recent_measurement_scopes.rb.dead
|
1358
1371
|
- app/models/concerns/renalware/deviseable.rb
|
1359
1372
|
- app/models/concerns/renalware/explicit_state_model.rb
|
1360
1373
|
- app/models/concerns/renalware/feeds/job.rb
|
@@ -1999,6 +2012,7 @@ files:
|
|
1999
2012
|
- app/presenters/renalware/pathology/results_presenter.rb
|
2000
2013
|
- app/presenters/renalware/patient_presenter.rb
|
2001
2014
|
- app/presenters/renalware/patients/banner_presenter.rb
|
2015
|
+
- app/presenters/renalware/patients/summary_part.rb
|
2002
2016
|
- app/presenters/renalware/pd/dashboard_presenter.rb
|
2003
2017
|
- app/presenters/renalware/pd/delivery_interval_presenter.rb
|
2004
2018
|
- app/presenters/renalware/pd/mdm_presenter.rb
|
@@ -2547,6 +2561,7 @@ files:
|
|
2547
2561
|
- app/views/renalware/patients/_person_form_fields.html.slim
|
2548
2562
|
- app/views/renalware/patients/_search_form.html.slim
|
2549
2563
|
- app/views/renalware/patients/_side_menu.html.slim
|
2564
|
+
- app/views/renalware/patients/_summary_part.html.slim
|
2550
2565
|
- app/views/renalware/patients/alerts/_alert.html.slim
|
2551
2566
|
- app/views/renalware/patients/alerts/_create_alert_link.html.slim
|
2552
2567
|
- app/views/renalware/patients/alerts/_form.html.slim
|
@@ -2589,7 +2604,6 @@ files:
|
|
2589
2604
|
- app/views/renalware/patients/side_menu/_actions.html.slim
|
2590
2605
|
- app/views/renalware/patients/side_menu/_general.html.slim
|
2591
2606
|
- app/views/renalware/patients/side_menu/_modalities.html.slim
|
2592
|
-
- app/views/renalware/patients/side_menu/_options.html.slim.redundant
|
2593
2607
|
- app/views/renalware/patients/side_menu/_site_specific_actions.html.slim
|
2594
2608
|
- app/views/renalware/patients/side_menu/_site_specific_links.html.slim
|
2595
2609
|
- app/views/renalware/patients/side_menu/_transplants.html.slim
|
@@ -2895,6 +2909,7 @@ files:
|
|
2895
2909
|
- config/initializers/core_extensions.rb
|
2896
2910
|
- config/initializers/delayed_job.rb
|
2897
2911
|
- config/initializers/devise.rb
|
2912
|
+
- config/initializers/devise_security.rb
|
2898
2913
|
- config/initializers/devise_security_extension.rb
|
2899
2914
|
- config/initializers/inflections.rb
|
2900
2915
|
- config/initializers/kaminari.rb
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require_dependency "renalware/letters"
|
2
|
-
|
3
|
-
module Renalware
|
4
|
-
module Clinics
|
5
|
-
module MostRecentMeasurementScopes
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
ClinicalObservation = Struct.new(:date, :measurement)
|
9
|
-
|
10
|
-
class_methods do
|
11
|
-
# Returns [date, weight]
|
12
|
-
def most_recent_weight_for(patient)
|
13
|
-
result = ClinicVisit
|
14
|
-
.most_recent_for_patient(patient)
|
15
|
-
.where("weight is not null")
|
16
|
-
.pluck(:date, :weight).first || []
|
17
|
-
|
18
|
-
ClinicalObservation.new(result.first, result.last)
|
19
|
-
end
|
20
|
-
|
21
|
-
# Returns [date, height]
|
22
|
-
def most_recent_height_for(patient)
|
23
|
-
result = ClinicVisit
|
24
|
-
.most_recent_for_patient(patient)
|
25
|
-
.where("height is not null")
|
26
|
-
.pluck(:date, :height).first || []
|
27
|
-
|
28
|
-
ClinicalObservation.new(result.first, result.last)
|
29
|
-
end
|
30
|
-
|
31
|
-
# Returns [date, [systolic_bp, diastolic_bp]]
|
32
|
-
def most_recent_blood_pressure_for(patient)
|
33
|
-
result = ClinicVisit
|
34
|
-
.most_recent_for_patient(patient)
|
35
|
-
.where("systolic_bp is not null and diastolic_bp is not null")
|
36
|
-
.pluck(:date, :systolic_bp, :diastolic_bp).first || [nil, nil, nil]
|
37
|
-
|
38
|
-
ClinicalObservation.new(result[0], [result[1], result[2]])
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
li.divider
|
2
|
-
|
3
|
-
li.heading= t(".heading")
|
4
|
-
|
5
|
-
- bookmark = find_user_bookmark_for_patient(patient)
|
6
|
-
|
7
|
-
- if bookmark.present?
|
8
|
-
li.link= render partial: "renalware/patients/bookmarks/delete",
|
9
|
-
locals: { bookmark: bookmark, link_text: t(".delete_bookmark") }
|
10
|
-
- else
|
11
|
-
li.link= render partial: "renalware/patients/bookmarks/new",
|
12
|
-
locals: { patient: patient, link_text: t(".create_bookmark") }
|
13
|
-
|
14
|
-
- if patient.worry.present?
|
15
|
-
li.link= render partial: "renalware/patients/worries/delete",
|
16
|
-
locals: { patient: patient }
|
17
|
-
- else
|
18
|
-
li.link= render partial: "renalware/patients/worries/new",
|
19
|
-
locals: { patient: patient }
|
20
|
-
|
21
|
-
li.link.action
|
22
|
-
= render partial: "renalware/patients/alerts/create_alert_link",
|
23
|
-
locals: { patient: patient, link_text: t(".create_alert") }
|
24
|
-
= render "renalware/patients/alerts/modal_dialog_placeholder"
|