renalware-core 2.0.111 → 2.0.112

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +9 -0
  3. data/app/assets/javascripts/renalware/application.js.erb +7 -8
  4. data/app/assets/javascripts/renalware/charting/charting.js.erb +4 -0
  5. data/app/assets/javascripts/renalware/dialogs.js.erb +0 -11
  6. data/app/assets/javascripts/renalware/hd.js +59 -9
  7. data/app/assets/stylesheets/renalware/application.scss +2 -3
  8. data/app/assets/stylesheets/renalware/modules/_hd.scss +19 -0
  9. data/app/assets/stylesheets/renalware/modules/_patients.scss +7 -0
  10. data/app/assets/stylesheets/renalware/print/pathology_request_forms.scss +26 -0
  11. data/app/assets/stylesheets/renalware/protocol_pdf.scss +9 -4
  12. data/app/controllers/renalware/hd/mdm_patients_controller.rb +17 -6
  13. data/app/controllers/renalware/hd/protocols_controller.rb +22 -31
  14. data/app/controllers/renalware/hd/session_forms/batches_controller.rb +82 -0
  15. data/app/controllers/renalware/pathology/requests/requests_controller.rb +20 -6
  16. data/app/controllers/renalware/surveys/dashboards_controller.rb +24 -0
  17. data/app/jobs/renalware/hd/session_forms/batch_print_job.rb +40 -0
  18. data/app/models/concerns/renalware/pdf_compilation.rb +60 -0
  19. data/app/models/renalware/clinical/allergy_status_form.rb +1 -1
  20. data/app/models/renalware/clinical/delete_allergy.rb +1 -1
  21. data/app/models/renalware/clinics/appointment_query.rb +1 -5
  22. data/app/models/renalware/hd.rb +6 -0
  23. data/app/models/renalware/hd/patient_listener.rb +1 -1
  24. data/app/models/renalware/hd/session_forms/batch.rb +26 -0
  25. data/app/models/renalware/hd/session_forms/batch_compile_pdfs.rb +86 -0
  26. data/app/models/renalware/hd/session_forms/batch_item.rb +15 -0
  27. data/app/models/renalware/hd/session_forms/form.rb +16 -0
  28. data/app/models/renalware/hd/session_forms/pdf_renderer.rb +74 -0
  29. data/app/models/renalware/letters/batch.rb +2 -0
  30. data/app/models/renalware/letters/printing/batch_compile_pdfs.rb +0 -3
  31. data/app/models/renalware/medications/patient_listener.rb +1 -1
  32. data/app/models/renalware/pathology/ordered_patient_query.rb +1 -1
  33. data/app/models/renalware/pathology/request_for_patient_request_description_query.rb +1 -1
  34. data/app/models/renalware/pd/apd/non_tidal_regime_calculations.rb +1 -1
  35. data/app/models/renalware/pd/apd/tidal_regime_calculations.rb +1 -1
  36. data/app/models/renalware/snippets/snippet_query.rb +1 -1
  37. data/app/models/renalware/surveys.rb +9 -0
  38. data/app/models/renalware/surveys/eq5d_pivoted_response.rb +11 -0
  39. data/app/models/renalware/surveys/eq5d_summary_part.rb +51 -0
  40. data/app/models/renalware/surveys/pos_s_pivoted_response.rb +11 -0
  41. data/app/models/renalware/surveys/pos_s_summary_part.rb +51 -0
  42. data/app/models/renalware/surveys/question.rb +22 -0
  43. data/app/models/renalware/surveys/response.rb +28 -0
  44. data/app/models/renalware/surveys/survey.rb +17 -0
  45. data/app/models/renalware/ukrdc.rb +3 -0
  46. data/app/models/renalware/ukrdc/incoming/file_list.rb +21 -0
  47. data/app/models/renalware/ukrdc/incoming/import_survey.rb +57 -0
  48. data/app/models/renalware/ukrdc/incoming/import_surveys.rb +77 -0
  49. data/app/models/renalware/ukrdc/incoming/paths.rb +30 -0
  50. data/app/models/renalware/ukrdc/incoming/xml_document.rb +68 -0
  51. data/app/models/renalware/ukrdc/transmission_log.rb +14 -3
  52. data/app/policies/renalware/hd/session_forms/batch_policy.rb +13 -0
  53. data/app/policies/renalware/surveys/survey_policy.rb +10 -0
  54. data/app/presenters/renalware/hd/session_presenter.rb +1 -1
  55. data/app/views/renalware/clinics/appointments/index.html.slim +22 -11
  56. data/app/views/renalware/hd/dashboards/_page_actions.html.slim +1 -1
  57. data/app/views/renalware/hd/diary_slots/_form.html.slim +0 -3
  58. data/app/views/renalware/hd/mdm_patients/_filters.html.slim +11 -0
  59. data/app/views/renalware/hd/mdm_patients/_page_actions.html.slim +0 -0
  60. data/app/views/renalware/hd/mdm_patients/index.html.slim +9 -1
  61. data/app/views/renalware/hd/protocols/{show.pdf.slim → _protocol.pdf.slim} +1 -7
  62. data/app/views/renalware/hd/protocols/index.pdf.slim +4 -0
  63. data/app/views/renalware/hd/session_forms/batches/_create.html.slim +25 -0
  64. data/app/views/renalware/hd/session_forms/batches/create.js.erb +3 -0
  65. data/app/views/renalware/hd/sessions/_row.html.slim +1 -1
  66. data/app/views/renalware/hd/sessions/_thead.html.slim +1 -1
  67. data/app/views/renalware/pathology/historical_observation_results/_table.html.slim +1 -1
  68. data/app/views/renalware/pathology/recent_observation_results/_table.html.slim +1 -1
  69. data/app/views/renalware/pathology/requests/requests/create.pdf.slim +2 -1
  70. data/app/views/renalware/pathology/requests/requests/new.html.slim +18 -13
  71. data/app/views/renalware/pathology/requests/requests/request_form/_crs.pdf.slim +1 -0
  72. data/app/views/renalware/pathology/requests/requests/request_form/_crs_form.html.slim +46 -45
  73. data/app/views/renalware/pathology/requests/requests/request_form/_manual_form_global.html.slim +9 -8
  74. data/app/views/renalware/pathology/requests/requests/request_form/_manual_form_patient.html.slim +9 -8
  75. data/app/views/renalware/pathology/requests/requests/show.pdf.slim +2 -1
  76. data/app/views/renalware/patients/side_menu/_general.html.slim +4 -0
  77. data/app/views/renalware/surveys/_eq5d_summary_part.html.slim +26 -0
  78. data/app/views/renalware/surveys/_pos_s_summary_part.html.slim +26 -0
  79. data/app/views/renalware/surveys/dashboards/show.html.slim +32 -0
  80. data/config/initializers/chartkick.rb +6 -0
  81. data/config/initializers/core_extensions.rb +4 -4
  82. data/config/initializers/inflections.rb +3 -0
  83. data/config/locales/renalware/patients/side_menu.en.yml +1 -0
  84. data/config/routes/hd.rb +5 -1
  85. data/config/routes/patients.rb +4 -0
  86. data/db/migrate/20190927124840_create_hd_session_form_batches.rb +16 -0
  87. data/db/migrate/20190927130911_create_hd_session_form_batch_items.rb +17 -0
  88. data/db/migrate/20191008010839_create_surveys.rb +70 -0
  89. data/db/migrate/20191008024636_create_eq5d_views.rb +8 -0
  90. data/db/migrate/20191008030154_add_validation_regex_to_patient_survey_questions.rb +7 -0
  91. data/db/migrate/20191008045159_allow_null_patient_in_ukrdc_transmission_logs.rb +8 -0
  92. data/db/seeds/default/patients/seeds.rb +2 -0
  93. data/db/seeds/default/patients/surveys/eq5d_5l.rb +22 -0
  94. data/db/seeds/default/patients/surveys/eq5d_5l_questions.csv +7 -0
  95. data/db/seeds/default/patients/surveys/pos_s.rb +22 -0
  96. data/db/seeds/default/patients/surveys/pos_s_questions.csv +23 -0
  97. data/db/views/survey_eq5d_pivoted_responses_v01.sql +41 -0
  98. data/db/views/survey_pos_s_pivoted_responses_v01.sql +36 -0
  99. data/lib/core_extensions/active_record/migration_helpers.rb +1 -1
  100. data/lib/core_extensions/active_support/duration.rb +1 -1
  101. data/lib/core_extensions/scenic.rb +1 -1
  102. data/lib/renalware/engine.rb +4 -4
  103. data/lib/renalware/version.rb +1 -1
  104. data/lib/tasks/ukrdc.rake +9 -0
  105. data/spec/factories/patients/surveys.rb +24 -0
  106. data/spec/support/ukrdc_helpers.rb +16 -0
  107. metadata +98 -59
  108. data/app/views/renalware/letters/batches/show.html.slim +0 -7
  109. data/app/views/renalware/pathology/requests/requests/_pdf_header.html.slim +0 -13
  110. data/vendor/assets/javascripts/renalware/masonry.min.js +0 -9
  111. data/vendor/assets/javascripts/renalware/print.min.js +0 -1
  112. data/vendor/assets/stylesheets/renalware/balloon.css +0 -383
  113. data/vendor/assets/stylesheets/renalware/print.min.css +0 -1
  114. data/vendor/assets/stylesheets/renalware/select2/css/select2.css +0 -431
  115. data/vendor/assets/stylesheets/renalware/select2/css/select2.min.css +0 -1
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+ require "attr_extras"
5
+
6
+ module Renalware
7
+ module UKRDC
8
+ module Incoming
9
+ class ImportSurveys
10
+ pattr_initialize [:paths, :logger]
11
+ attr_reader :batch_uuid
12
+
13
+ def initialize(paths: nil, logger: nil)
14
+ @paths = paths || Renalware::UKRDC::Incoming::Paths.new
15
+ @logger = logger || Rails.logger
16
+ @batch_uuid = SecureRandom.uuid # to group logging output
17
+ end
18
+
19
+ def call
20
+ Incoming::FileList.new(paths: paths).each_file do |filepath|
21
+ import_surveys_from_file(filepath)
22
+ end
23
+ rescue StandardError => e
24
+ Renalware::Engine.exception_notifier.notify(e)
25
+ raise e
26
+ end
27
+
28
+ private
29
+
30
+ # Import all surverys (they will be for the same patient) in the XML file.
31
+ # Note that #with_logging yields a block that will catch and save any error to
32
+ # ukrdc_transmission_logs
33
+ # rubocop:disable Lint/HandleExceptions, Metrics/AbcSize
34
+ def import_surveys_from_file(file)
35
+ # Important to create the log before we do anything that might cause an error
36
+ # eg parse the xml etc.
37
+ TransmissionLog.with_logging(nil, batch_uuid, log_options(file)) do |log|
38
+ doc = XmlDocument.new(file)
39
+ patient = find_patient(doc.nhs_number)
40
+ log.update!(patient_id: patient.id)
41
+ doc.surveys.each do |survey_hash|
42
+ import_survey(survey_hash, patient)
43
+ end
44
+ log.update!(status: :imported)
45
+ end
46
+ rescue StandardError
47
+ # noop - errors have been logged inside with_logging
48
+ ensure
49
+ FileUtils.mv file, paths.archive.join(file.basename)
50
+ end
51
+ # rubocop:enable Lint/HandleExceptions, Metrics/AbcSize
52
+
53
+ def import_survey(survey_hash, patient)
54
+ ImportSurvey.new(
55
+ patient: patient,
56
+ survey_hash: survey_hash
57
+ ).call
58
+ end
59
+
60
+ def find_patient(nhs_number)
61
+ Renalware::Patient.find_by!(nhs_number: nhs_number)
62
+ end
63
+
64
+ # rubocop:disable Style/RescueModifier
65
+ def log_options(file)
66
+ {
67
+ status: :undefined,
68
+ file_path: file.to_s,
69
+ direction: :in,
70
+ payload: (File.read(file) rescue nil)
71
+ }
72
+ end
73
+ # rubocop:enable Style/RescueModifier
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+
5
+ module Renalware
6
+ module UKRDC
7
+ module Incoming
8
+ class Paths
9
+ def initialize
10
+ FileUtils.mkdir_p incoming
11
+ FileUtils.mkdir_p archive
12
+ end
13
+
14
+ def incoming
15
+ @incoming ||= working_path.join("incoming")
16
+ end
17
+
18
+ def archive
19
+ @archive ||= working_path.join("archive", "incoming")
20
+ end
21
+
22
+ private
23
+
24
+ def working_path
25
+ Pathname(Renalware.config.ukrdc_working_path)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/ukrdc"
4
+ require "attr_extras"
5
+
6
+ module Renalware
7
+ module UKRDC
8
+ module Incoming
9
+ # Encapsulates the structure of the UKRDC XML Document.
10
+ # Assumes one patient per file.
11
+ class XmlDocument
12
+ XPATHS = {
13
+ dob: "string(Patient[1]/BirthTime)",
14
+ family_name: "string(Patient[1]/Names[1]/Name/Family)",
15
+ nhs_number: <<-XPATH.squish
16
+ string(
17
+ Patient[1]/
18
+ PatientNumbers/
19
+ PatientNumber[Organization[text()='NHS']][NumberType[text()='MRN']][1]/
20
+ Number
21
+ )
22
+ XPATH
23
+ }.freeze
24
+
25
+ attr_reader :root
26
+
27
+ def initialize(file)
28
+ xml_document = File.open(file) { |f| Nokogiri::XML(f) }
29
+ @root = xml_document.root
30
+ end
31
+
32
+ # Accessing eg XmlDocument.new(file).nhs_number will search the document with looked-up
33
+ # entry in the XPATHS constant, to save us having to write attributes for the things we
34
+ # need.
35
+ def method_missing(method_name, *_args, &_block)
36
+ xpath = XPATHS[method_name]
37
+ return root.xpath(xpath) if xpath
38
+
39
+ super
40
+ end
41
+
42
+ def respond_to_missing?(method_name, *_args)
43
+ XPATHS.key?(method_name)
44
+ end
45
+
46
+ # Turn the surveys XML into a hash becuase it is easier to consume
47
+ def surveys
48
+ root.xpath("Surveys/Survey").each_with_object([]) do |survey_node, arr|
49
+ hash = {}
50
+ hash[:code] = survey_node.xpath("string(SurveyType/Code)")
51
+ hash[:time] = survey_node.xpath("string(SurveyTime)")
52
+ hash[:responses] = question_hash_from(survey_node)
53
+ arr << hash
54
+ end
55
+ end
56
+
57
+ def question_hash_from(survey_node)
58
+ question_nodes = survey_node.xpath("Questions/Question")
59
+ question_nodes.each_with_object({}) do |question_node, responses|
60
+ code = question_node.xpath("string(QuestionType/Code)")
61
+ response = question_node.xpath("string(Response)")
62
+ responses[code] = response
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -8,11 +8,22 @@ module Renalware
8
8
  validates :sent_at, presence: true
9
9
  validates :status, presence: true
10
10
  belongs_to :patient, class_name: "Renalware::Patient"
11
- enum status: { undefined: 0, error: 1, unsent_no_change_since_last_send: 2, sent: 3 }
11
+ enum status: {
12
+ undefined: 0,
13
+ error: 1,
14
+ unsent_no_change_since_last_send: 2,
15
+ sent: 3,
16
+ imported: 4
17
+ }
18
+ enum direction: [:out, :in]
12
19
  scope :ordered, -> { order(sent_at: :asc) }
13
20
 
14
- def self.with_logging(patient, request_uuid)
15
- log = new(patient: patient, sent_at: Time.zone.now, request_uuid: request_uuid)
21
+ def self.with_logging(patient, request_uuid, **options)
22
+ log = new(
23
+ patient: patient,
24
+ sent_at: Time.zone.now,
25
+ request_uuid: request_uuid,
26
+ **options)
16
27
  yield log if block_given?
17
28
  log.save!
18
29
  rescue StandardError => e
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Renalware
4
+ module HD
5
+ module SessionForms
6
+ class BatchPolicy < BasePolicy
7
+ def status?
8
+ show?
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency "renalware/surveys"
4
+
5
+ module Renalware
6
+ module Surveys
7
+ class SurveyPolicy < BasePolicy
8
+ end
9
+ end
10
+ end
@@ -100,7 +100,7 @@ module Renalware
100
100
  when ::Float then (post - pre).round(1)
101
101
  when ::Integer then (post - pre)
102
102
  end
103
- rescue StandardError => e
103
+ rescue StandardError
104
104
  nil
105
105
  end
106
106
 
@@ -6,7 +6,7 @@
6
6
  method: :get do |f|
7
7
  .row
8
8
  .medium-3.large-2.columns
9
- = f.input :starts_at_eq, as: :date_picker, label: "Date"
9
+ = f.input :starts_on_eq, as: :date_picker, label: "Date"
10
10
  .medium-3.large-3.columns
11
11
  = f.input :clinic_id_eq, collection: clinics, label: "Clinic"
12
12
  .medium-3.large-3.columns
@@ -40,21 +40,32 @@
40
40
  |
41
41
  = link_to "(Uncheck all)", "#", id: "uncheck_all_appointments_link"
42
42
  th.col-width-medium-ish
43
- th.col-width-date
44
- = sort_link([:renalware, query], :starts_at, "Date", default_order: :asc)
45
- th.col-width-time
46
- = sort_link([:renalware, query], :start_time, "Time", default_order: :asc)
43
+ th.col-width-date-time
44
+ = sort_link([:renalware, query], :starts_at, "Date and Time", default_order: :asc)
47
45
  th.col-width-medium
48
- = sort_link([:renalware, query], :patient_family_name, "Patient", default_order: :asc)
46
+ = sort_link([:renalware, query],
47
+ :patient_family_name,
48
+ [:patient_family_name, "starts_at asc"],
49
+ "Patient",
50
+ default_order: :asc)
49
51
  th.col-width-tiny Sex
50
52
  th.col-width-tiny Age
51
- th.col-width-small
53
+ th.col-width-medium
52
54
  = sort_link([:renalware, query],
53
55
  :patient_current_modality_description_name,
56
+ [:patient_current_modality_description_name, "starts_at asc"],
54
57
  "Modality",
55
58
  default_order: :asc)
56
- th= sort_link([:renalware, query], :clinic_name, "Clinic", default_order: :asc)
57
- th= sort_link([:renalware, query], :user_family_name, "Consultant", default_order: :asc)
59
+ th= sort_link([:renalware, query],
60
+ :clinic_name,
61
+ [:clinic_name, "starts_at asc"],
62
+ "Clinic",
63
+ default_order: :asc)
64
+ th= sort_link([:renalware, query],
65
+ :consultant_name,
66
+ [:consultant_name, "starts_at asc"],
67
+ "Consultant",
68
+ default_order: :asc)
58
69
  th.show-for-large-up Outcome notes
59
70
  th.show-for-large-up DNA notes
60
71
 
@@ -77,8 +88,8 @@
77
88
  i.fas.fa-pencil-alt
78
89
  = " Create Clinic Visit"
79
90
 
80
- td= I18n.l appointment.starts_on
81
- td= appointment.start_time
91
+ td= I18n.l appointment.starts_at
92
+ /td= appointment.start_time
82
93
  td= default_patient_link(appointment.patient)
83
94
  td= appointment.patient.sex.code
84
95
  td= appointment.patient.age
@@ -1,7 +1,7 @@
1
1
  = link_to(patient_hd_mdm_path(patient), class: "button with-icon secondary") do
2
2
  i.fas.fa-users
3
3
  = t(".mdm")
4
- = link_to(patient_hd_protocol_path(patient), class: "button with-icon secondary") do
4
+ = link_to(patient_hd_protocol_path(patient), class: "button with-icon secondary", target: "_blank") do
5
5
  i.fas.fa-print
6
6
  = t(".protocol")
7
7
  a.button.dropdown.with-icon(href="#"
@@ -87,9 +87,6 @@ javascript:
87
87
 
88
88
  function resizeSelect2ToFitModalWidth(container) {
89
89
  $('.select2', container).css('width', "100%");
90
- $('#tabs').on('tabsactivate', function(event, ui) {
91
- $('.select2').css('width', "100%");
92
- });
93
90
  }
94
91
 
95
92
  function refreshSelect2s(change_type) {
@@ -28,3 +28,14 @@
28
28
  = f.submit t("helpers.submit.filter"), class: "button", name: nil
29
29
  span= " or "
30
30
  = link_to t("helpers.reset"), filter_form.url
31
+
32
+ - if Renalware.config.batch_printing_enabled
33
+ = simple_form_for batch_print_form,
34
+ as: :batch,
35
+ url: hd_session_forms_batches_path,
36
+ method: :post,
37
+ remote: true do |f|
38
+ = f.input :patient_ids, as: :hidden
39
+ = f.submit "Batch Print #{presenter.patients.total_count} HD Session Forms",
40
+ class: "button",
41
+ disabled: presenter.patients.none?
@@ -1,5 +1,11 @@
1
+ / = content_for(:actions) do
2
+ / = render "page_actions", presenter: presenter, form: filter_form
3
+
1
4
  = content_for(:filters) do
2
- = render_if_exists "filters", presenter: presenter, filter_form: filter_form
5
+ = render "filters",
6
+ presenter: presenter,
7
+ filter_form: filter_form,
8
+ batch_print_form: batch_print_form
3
9
 
4
10
  = content_for(:tabs) do
5
11
  = render_if_exists "tabs", presenter: presenter
@@ -7,3 +13,5 @@
7
13
  = within_admin_layout(title: presenter.page_title)
8
14
  = render "table", presenter: presenter
9
15
  = paginate presenter.patients
16
+
17
+ #hd-session-form-batch-print-modal.reveal-modal.small(data-reveal)
@@ -37,15 +37,9 @@
37
37
  = render "renalware/hd/sessions/thead"
38
38
  tbody
39
39
  - 1..3.times do
40
- = render "renalware/hd/sessions/empty_row", session: session
40
+ = render "renalware/hd/sessions/empty_row"
41
41
  - protocol.sessions.each_with_index do |session, index|
42
42
  - stripe_class = index % 2 == 0 ? "even" : "odd"
43
43
  = render "renalware/hd/sessions/row",
44
44
  session: session,
45
45
  stripe_class: stripe_class
46
-
47
- .page-break
48
-
49
- - protocol.with_format("html") do
50
- .protocol
51
- h2 Acute observations
@@ -0,0 +1,4 @@
1
+ - protocols.each_with_index do |protocol, index|
2
+ = render "protocol", protocol: protocol
3
+ - if (index + 1) < protocols.size
4
+ .page-break
@@ -0,0 +1,25 @@
1
+ .modal
2
+ .modal__header
3
+ h1= "Compiling #{batch.batch_items_count} HD Session Forms"
4
+ .percent_complete
5
+ .modal__body
6
+ .content
7
+ .batch_results_container
8
+ .preparing
9
+ = image_tag("renalware/loading-gears-animation.gif", height: "116")
10
+
11
+ .generated-batch-print-pdf-container(style="display:none")
12
+ = link_to hd_session_forms_batch_path(batch, format: :pdf),
13
+ target: "_blank",
14
+ class: "print-batch-letter" do
15
+ i.far.fa-check-circle
16
+ | Open PDF in a new tab
17
+
18
+ .modal__footer
19
+ .left
20
+ = "##{batch.id}"
21
+ .right
22
+ = link_to "Cancel",
23
+ "#",
24
+ "aria-label" => "Close",
25
+ class: "reveal-modal-close cancel-link"
@@ -0,0 +1,3 @@
1
+ <%= refresh("#hd-session-form-batch-print-modal", partial: "create", locals: local_assigns) %>
2
+ $("#hd-session-form-batch-print-modal").foundation('reveal', 'open');
3
+ Renalware.HD.pollBatchStatus('<%= hd_session_forms_batch_status_path(batch) %>');
@@ -5,7 +5,7 @@ tr.hd-session-row(class=[session.state, stripe_class])
5
5
  data: { behaviour: "toggler" })
6
6
  = pipe_separator
7
7
  = session.edit_or_view_url
8
- td.text-left(rowspan=2)= session.performed_on
8
+ td.col-width-date(rowspan=2)= session.performed_on
9
9
  td= session.hospital_unit_unit_code
10
10
 
11
11
  td= session.start_time
@@ -4,7 +4,7 @@ thead
4
4
  th.col-width-date(rowspan=3 valign="top")= t(".date")
5
5
  th.col-width-small= t(".site")
6
6
  th.col-width-time.text-center= t(".time")
7
- th.col-width-tiny(rowspan=3)= t(".duration")
7
+ th.col-width-time(rowspan=3)= t(".duration")
8
8
  th.col-width-tiny= t(".weight")
9
9
  th.col-width-tiny= t(".pulse")
10
10
  th.col-width-tiny= t(".temperature")
@@ -14,7 +14,7 @@ table#observations.column_hover
14
14
  - table.observation_descriptions.each do |desc|
15
15
  - code = desc.code
16
16
  - if row.comment_for(code).present?
17
- td(class=code.downcase data-balloon=row.comment_for(code) data-balloon-pos="up")
17
+ td(class=code.downcase aria-label=row.comment_for(code) data-balloon-pos="up")
18
18
  .triangle-top-right
19
19
  = row.result_for(code)
20
20
  - else