renalware-core 2.0.0.pre.beta9 → 2.0.0.pre.beta10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (473) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/app/assets/javascripts/renalware/application.js.erb +2 -0
  4. data/app/assets/javascripts/renalware/dialogs.js.erb +17 -1
  5. data/app/assets/javascripts/renalware/patient_ajax_search.js +48 -0
  6. data/app/assets/javascripts/renalware/research.js +18 -0
  7. data/app/assets/stylesheets/renalware/application.scss +1 -0
  8. data/app/assets/stylesheets/renalware/base/_variables.scss +13 -0
  9. data/app/assets/stylesheets/renalware/hd_diary_pdf.scss +57 -0
  10. data/app/assets/stylesheets/renalware/lib/_foundation_and_overrides.scss +18 -0
  11. data/app/assets/stylesheets/renalware/modules/_admissions.scss +26 -0
  12. data/app/assets/stylesheets/renalware/modules/_hd.scss +203 -0
  13. data/app/assets/stylesheets/renalware/modules/_renal.scss +30 -0
  14. data/app/assets/stylesheets/renalware/partials/_animation.scss +8 -0
  15. data/app/assets/stylesheets/renalware/partials/_layout.scss +11 -0
  16. data/app/assets/stylesheets/renalware/partials/_tables.scss +12 -2
  17. data/app/assets/stylesheets/renalware/partials/_tabs.scss +45 -0
  18. data/app/controllers/renalware/admin/users_controller.rb +5 -4
  19. data/app/controllers/renalware/admissions/consults_controller.rb +88 -0
  20. data/app/controllers/renalware/clinical/body_compositions_controller.rb +1 -1
  21. data/app/controllers/renalware/concerns/pageable.rb +1 -1
  22. data/app/controllers/renalware/hd/current_profile_controller.rb +1 -1
  23. data/app/controllers/renalware/hd/diaries_controller.rb +87 -0
  24. data/app/controllers/renalware/hd/diary_slots_controller.rb +172 -0
  25. data/app/controllers/renalware/hd/patients_controller.rb +43 -0
  26. data/app/controllers/renalware/hd/preference_sets_controller.rb +4 -1
  27. data/app/controllers/renalware/hd/sessions_controller.rb +1 -1
  28. data/app/controllers/renalware/hd/stations_controller.rb +1 -1
  29. data/app/controllers/renalware/hospitals/units_controller.rb +1 -2
  30. data/app/controllers/renalware/hospitals/wards_controller.rb +18 -0
  31. data/app/controllers/renalware/renal/registry_preflight_checks_controller.rb +44 -0
  32. data/app/controllers/renalware/reporting/audits_controller.rb +4 -8
  33. data/app/controllers/renalware/research/studies_controller.rb +70 -0
  34. data/app/controllers/renalware/research/study_participants_controller.rb +85 -0
  35. data/app/documents/renalware/hd/profile_document.rb +0 -1
  36. data/app/documents/renalware/hd/session_document.rb +0 -1
  37. data/app/helpers/renalware/application_helper.rb +5 -1
  38. data/app/helpers/renalware/dropdown_button_helper.rb +4 -4
  39. data/app/helpers/renalware/form_helper.rb +8 -0
  40. data/app/inputs/select_container_input.rb +15 -0
  41. data/app/models/concerns/renalware/accountable.rb +5 -0
  42. data/app/models/concerns/renalware/patients_ransack_helper.rb +6 -6
  43. data/app/models/renalware/admissions/consult.rb +25 -0
  44. data/app/models/renalware/admissions/consult_query.rb +21 -0
  45. data/app/models/renalware/clinical/modality_description.rb +1 -0
  46. data/app/models/renalware/hd/archive_yesterdays_slots_job.rb +68 -0
  47. data/app/models/renalware/hd/dialysate.rb +16 -0
  48. data/app/models/renalware/hd/diary.rb +39 -0
  49. data/app/models/renalware/hd/diary_slot.rb +80 -0
  50. data/app/models/renalware/hd/diurnal_period_code.rb +5 -0
  51. data/app/models/renalware/hd/find_or_create_diary_by_week_query.rb +48 -0
  52. data/app/models/renalware/hd/find_or_create_master_diary.rb +24 -0
  53. data/app/models/renalware/hd/master_diary.rb +31 -0
  54. data/app/models/renalware/hd/patient_listener.rb +1 -1
  55. data/app/models/renalware/hd/patients_dialysing_by_day_and_period_query.rb +39 -0
  56. data/app/models/renalware/hd/patients_dialysing_by_day_query.rb +32 -0
  57. data/app/models/renalware/hd/patients_dialysing_by_schedule_query.rb +26 -0
  58. data/app/models/renalware/hd/patients_with_unmet_preferences_query.rb +2 -2
  59. data/app/models/renalware/hd/preference_set.rb +2 -2
  60. data/app/models/renalware/hd/profile.rb +3 -1
  61. data/app/models/renalware/hd/schedule_definition.rb +44 -0
  62. data/app/models/renalware/hd/session.rb +1 -0
  63. data/app/models/renalware/hd/session/closed.rb +3 -2
  64. data/app/models/renalware/hd/session_factory.rb +2 -2
  65. data/app/models/renalware/hd/station.rb +1 -10
  66. data/app/models/renalware/hd/station_location.rb +10 -0
  67. data/app/models/renalware/hd/weekly_diary.rb +43 -0
  68. data/app/models/renalware/hospitals/unit.rb +0 -1
  69. data/app/models/renalware/medications/prescriptions_by_drug_type_query.rb +1 -0
  70. data/app/models/renalware/messaging.rb +2 -0
  71. data/app/models/renalware/messaging/patient.rb +2 -2
  72. data/app/models/renalware/patient.rb +25 -23
  73. data/app/models/renalware/patients/search_query.rb +7 -3
  74. data/app/models/renalware/patients/summary.rb +1 -0
  75. data/app/models/renalware/pd/revise_regime.rb +3 -1
  76. data/app/models/renalware/renal/patient.rb +3 -0
  77. data/app/models/renalware/renal/registry/preflight_checks/deaths_query.rb +41 -0
  78. data/app/models/renalware/renal/registry/preflight_checks/patients_query.rb +65 -0
  79. data/app/models/renalware/reporting/{generate_audit_json.rb → fetch_audit_json.rb} +10 -9
  80. data/app/models/renalware/research.rb +7 -0
  81. data/app/models/renalware/research/study.rb +19 -0
  82. data/app/models/renalware/research/study_participant.rb +30 -0
  83. data/app/policies/renalware/admissions/consult_policy.rb +8 -0
  84. data/app/policies/renalware/hd/diary_policy.rb +6 -0
  85. data/app/policies/renalware/renal/registry_preflight_check_policy.rb +15 -0
  86. data/app/policies/renalware/research/study_participant_policy.rb +8 -0
  87. data/app/policies/renalware/research/study_policy.rb +8 -0
  88. data/app/presenters/false_class_presenter.rb +2 -0
  89. data/app/presenters/renalware/admissions/consult_presenter.rb +28 -0
  90. data/app/presenters/renalware/hd/diary_presenter.rb +77 -0
  91. data/app/presenters/renalware/hd/diary_slot_presenter.rb +69 -0
  92. data/app/presenters/renalware/hd/null_slot.rb +38 -0
  93. data/app/presenters/renalware/hd/patient_presenter.rb +2 -3
  94. data/app/presenters/renalware/hd/profile_presenter.rb +12 -10
  95. data/app/presenters/renalware/hd/station_presenter.rb +5 -0
  96. data/app/presenters/renalware/hd/unmet_preferences_presenter.rb +1 -1
  97. data/app/presenters/renalware/pathology/observation_presenter.rb +1 -1
  98. data/app/presenters/renalware/patient_presenter.rb +2 -2
  99. data/app/presenters/renalware/ukrdc/pathology_observation_presenter.rb +16 -0
  100. data/app/presenters/renalware/ukrdc/patient_presenter.rb +6 -1
  101. data/app/presenters/true_class_presenter.rb +2 -0
  102. data/app/views/renalware/accesses/plans/new.html.slim +0 -1
  103. data/app/views/renalware/accesses/procedures/_form.html.slim +1 -1
  104. data/app/views/renalware/accesses/profiles/_form.html.slim +0 -1
  105. data/app/views/renalware/addresses/_form.html.slim +0 -2
  106. data/app/views/renalware/admin/users/edit.html.slim +0 -1
  107. data/app/views/renalware/admin/users/index.html.slim +3 -1
  108. data/app/views/renalware/admissions/consults/_filters.html.slim +23 -0
  109. data/app/views/renalware/admissions/consults/_form.html.slim +93 -0
  110. data/app/views/renalware/admissions/consults/_table.html.slim +61 -0
  111. data/app/views/renalware/admissions/consults/edit.html.slim +6 -0
  112. data/app/views/renalware/admissions/consults/index.html.slim +12 -0
  113. data/app/views/renalware/admissions/consults/new.html.slim +6 -0
  114. data/app/views/renalware/admissions/requests/_create_request_link.html.slim +2 -1
  115. data/app/views/renalware/admissions/requests/_request.html.slim +4 -4
  116. data/app/views/renalware/api/ukrdc/patients/_lab_orders.xml.builder +6 -4
  117. data/app/views/renalware/api/ukrdc/patients/_name.xml.builder +1 -1
  118. data/app/views/renalware/api/ukrdc/patients/_sending_facility.xml.builder +1 -1
  119. data/app/views/renalware/api/ukrdc/patients/encounters/_hd_session.xml.builder +3 -3
  120. data/app/views/renalware/api/ukrdc/patients/lab_orders/_lab_order.xml.builder +4 -4
  121. data/app/views/renalware/api/ukrdc/patients/lab_orders/_result_item.xml.builder +7 -5
  122. data/app/views/renalware/clinical/allergies/_new.html.slim +0 -1
  123. data/app/views/renalware/clinical/body_compositions/_form.html.slim +0 -1
  124. data/app/views/renalware/clinical/dry_weights/new.html.slim +0 -1
  125. data/app/views/renalware/clinical/profiles/show.html.slim +0 -1
  126. data/app/views/renalware/clinics/appointments/index.html.slim +4 -2
  127. data/app/views/renalware/clinics/visits/_filters.html.slim +0 -1
  128. data/app/views/renalware/clinics/visits/_table.html.slim +0 -1
  129. data/app/views/renalware/dashboard/bookmarks/_bookmark.html.slim +9 -6
  130. data/app/views/renalware/dashboard/bookmarks/_table.html.slim +2 -1
  131. data/app/views/renalware/deaths/index.html.slim +6 -8
  132. data/app/views/renalware/devise/registrations/new.html.slim +0 -1
  133. data/app/views/renalware/directory/people/_form.html.slim +0 -1
  134. data/app/views/renalware/events/events/_event.html.slim +3 -1
  135. data/app/views/renalware/events/events/_filters.html.slim +0 -1
  136. data/app/views/renalware/events/events/_form.html.slim +4 -4
  137. data/app/views/renalware/events/events/simple/_event.html.slim +3 -1
  138. data/app/views/renalware/hd/cannulation_types/edit.html.slim +1 -1
  139. data/app/views/renalware/hd/cannulation_types/new.html.slim +1 -1
  140. data/app/views/renalware/hd/current_profile/_form.html.slim +4 -3
  141. data/app/views/renalware/hd/dashboards/_page_actions.html.slim +6 -6
  142. data/app/views/renalware/hd/dialysers/_form.html.slim +0 -1
  143. data/app/views/renalware/hd/diaries/_page_actions.html.slim +23 -0
  144. data/app/views/renalware/hd/diaries/_table.html.slim +12 -0
  145. data/app/views/renalware/hd/diaries/_weekly_diary.html.slim +10 -0
  146. data/app/views/renalware/hd/diaries/edit.html.slim +58 -0
  147. data/app/views/renalware/hd/diaries/index.html.slim +9 -0
  148. data/app/views/renalware/hd/diaries/show.pdf.slim +32 -0
  149. data/app/views/renalware/hd/diary_slots/_form.html.slim +111 -0
  150. data/app/views/renalware/hd/diary_slots/_slot.html.slim +21 -0
  151. data/app/views/renalware/hd/diary_slots/_tab.html.slim +27 -0
  152. data/app/views/renalware/hd/diary_slots/create.js.erb +11 -0
  153. data/app/views/renalware/hd/diary_slots/destroy.js.erb +11 -0
  154. data/app/views/renalware/hd/diary_slots/edit.html.slim +26 -0
  155. data/app/views/renalware/hd/diary_slots/new.html.slim +12 -0
  156. data/app/views/renalware/hd/diary_slots/new.js.erb +6 -0
  157. data/app/views/renalware/hd/diary_slots/show.js.erb +5 -0
  158. data/app/views/renalware/hd/diary_slots/update.js.erb +11 -0
  159. data/app/views/renalware/hd/historical_profiles/_summary.html.slim +0 -1
  160. data/app/views/renalware/hd/mdm_patients/_filters.html.slim +2 -2
  161. data/app/views/renalware/hd/mdm_patients/_patient.html.slim +3 -4
  162. data/app/views/renalware/hd/mdm_patients/_table.html.slim +4 -6
  163. data/app/views/renalware/hd/preference_sets/_form.html.slim +5 -4
  164. data/app/views/renalware/hd/preference_sets/_summary.html.slim +1 -1
  165. data/app/views/renalware/hd/sessions/_form.html.slim +1 -2
  166. data/app/views/renalware/hd/sessions/_show.html.slim +2 -1
  167. data/app/views/renalware/hd/sessions/dna/_row.html.slim +0 -1
  168. data/app/views/renalware/hd/stations/_form.html.slim +3 -1
  169. data/app/views/renalware/hd/stations/_station.html.slim +1 -1
  170. data/app/views/renalware/hd/stations/index.html.slim +0 -1
  171. data/app/views/renalware/hd/unmet_preferences/_filters.html.slim +2 -2
  172. data/app/views/renalware/hd/unmet_preferences/_table.html.slim +2 -2
  173. data/app/views/renalware/hospitals/units/_form.html.slim +0 -1
  174. data/app/views/renalware/hospitals/units/index.html.slim +16 -13
  175. data/app/views/renalware/letters/contacts/index.js.erb +0 -1
  176. data/app/views/renalware/letters/electronic_receipts/_table.html.slim +10 -6
  177. data/app/views/renalware/letters/electronic_receipts/sent.html.slim +9 -4
  178. data/app/views/renalware/letters/formatted_letters/_letter.html.slim +0 -3
  179. data/app/views/renalware/letters/letters/_actions.html.slim +0 -1
  180. data/app/views/renalware/letters/letters/_form.html.slim +1 -1
  181. data/app/views/renalware/letters/letters/_main_recipient.html.slim +0 -1
  182. data/app/views/renalware/letters/letters/_preview.html.slim +0 -1
  183. data/app/views/renalware/mdm/_top_navigation.html.slim +0 -1
  184. data/app/views/renalware/mdm_patients/_patient.html.slim +2 -2
  185. data/app/views/renalware/mdm_patients/_table.html.slim +1 -1
  186. data/app/views/renalware/medications/prescriptions/index.pdf.slim +0 -2
  187. data/app/views/renalware/messaging/internal/messages/_form.html.slim +1 -1
  188. data/app/views/renalware/messaging/internal/receipts/_receipt.html.slim +7 -9
  189. data/app/views/renalware/messaging/internal/receipts/_sent_receipt.html.slim +5 -2
  190. data/app/views/renalware/messaging/internal/receipts/_sent_table.html.slim +1 -0
  191. data/app/views/renalware/messaging/internal/receipts/_table.html.slim +3 -3
  192. data/app/views/renalware/messaging/internal/receipts/sent.html.slim +0 -1
  193. data/app/views/renalware/modalities/reasons/index.html.slim +0 -1
  194. data/app/views/renalware/navigation/_mdms.html.slim +0 -1
  195. data/app/views/renalware/navigation/_patients_admin.html.slim +6 -10
  196. data/app/views/renalware/navigation/_renal.html.slim +3 -0
  197. data/app/views/renalware/navigation/_sign_out.html.slim +0 -1
  198. data/app/views/renalware/pathology/requests/requests/create.pdf.slim +0 -1
  199. data/app/views/renalware/pathology/requests/requests/request_form/_manual_form_patient.html.slim +0 -1
  200. data/app/views/renalware/patients/_mini_profile.html.slim +0 -1
  201. data/app/views/renalware/patients/_search_form.html.slim +1 -1
  202. data/app/views/renalware/patients/alerts/_form.html.slim +1 -1
  203. data/app/views/renalware/patients/bookmarks/_delete.html.slim +3 -4
  204. data/app/views/renalware/patients/clinical_summaries/_problems.html.slim +0 -1
  205. data/app/views/renalware/patients/clinical_summaries/show.html.slim +0 -1
  206. data/app/views/renalware/patients/patients/_form.html.slim +3 -2
  207. data/app/views/renalware/patients/patients/_patient.html.slim +1 -5
  208. data/app/views/renalware/patients/patients/_table.html.slim +1 -2
  209. data/app/views/renalware/patients/patients/show/_hospital_numbers.html.slim +0 -1
  210. data/app/views/renalware/patients/patients/show/_patient_demographics.html.slim +0 -2
  211. data/app/views/renalware/patients/primary_care_physician/_form.html.slim +2 -1
  212. data/app/views/renalware/patients/primary_care_physician/edit.html.slim +3 -5
  213. data/app/views/renalware/patients/primary_care_physicians/edit.html.slim +1 -1
  214. data/app/views/renalware/patients/primary_care_physicians/new.html.slim +1 -1
  215. data/app/views/renalware/patients/worryboard/_table.html.slim +2 -2
  216. data/app/views/renalware/patients/worryboard/_worry.html.slim +2 -5
  217. data/app/views/renalware/pd/_apd_regimes.html.slim +0 -1
  218. data/app/views/renalware/pd/_capd_regimes.html.slim +0 -1
  219. data/app/views/renalware/pd/_exit_site_infections.html.slim +0 -1
  220. data/app/views/renalware/pd/_peritonitis_episodes.html.slim +0 -1
  221. data/app/views/renalware/pd/_pet_adequacies.html.slim +0 -1
  222. data/app/views/renalware/pd/assessments/show.html.slim +13 -13
  223. data/app/views/renalware/pd/dashboards/show/_page_actions.html.slim +7 -7
  224. data/app/views/renalware/pd/regimes/show.html.slim +0 -1
  225. data/app/views/renalware/problems/notes/form.js.erb +0 -1
  226. data/app/views/renalware/problems/problems/_current_list.html.slim +0 -1
  227. data/app/views/renalware/renal/aki_alerts/edit.html.slim +2 -3
  228. data/app/views/renalware/renal/profiles/_form.html.slim +2 -6
  229. data/app/views/renalware/renal/profiles/edit.html.slim +9 -0
  230. data/app/views/renalware/renal/registry_preflight_checks/_navigation.html.slim +3 -0
  231. data/app/views/renalware/renal/registry_preflight_checks/_table.html.slim +20 -0
  232. data/app/views/renalware/renal/registry_preflight_checks/deaths.html.slim +4 -0
  233. data/app/views/renalware/renal/registry_preflight_checks/patients.html.slim +4 -0
  234. data/app/views/renalware/reporting/audits/show.html.slim +3 -5
  235. data/app/views/renalware/research/studies/_form.html.slim +9 -0
  236. data/app/views/renalware/research/studies/edit.html.slim +5 -0
  237. data/app/views/renalware/research/studies/index.html.slim +32 -0
  238. data/app/views/renalware/research/studies/new.html.slim +5 -0
  239. data/app/views/renalware/research/studies/show.html.slim +19 -0
  240. data/app/views/renalware/research/study_participants/_form.html.slim +45 -0
  241. data/app/views/renalware/research/study_participants/_table.html.slim +32 -0
  242. data/app/views/renalware/research/study_participants/create.js.erb +3 -0
  243. data/app/views/renalware/research/study_participants/edit.html.slim +1 -0
  244. data/app/views/renalware/research/study_participants/index.html.slim +25 -0
  245. data/app/views/renalware/research/study_participants/new.html.slim +1 -0
  246. data/app/views/renalware/research/study_participants/new.js.erb +4 -0
  247. data/app/views/renalware/research/study_participants/update.js.erb +3 -0
  248. data/app/views/renalware/shared/documents/_age.html.slim +1 -1
  249. data/app/views/renalware/shared/documents/_blood_group.html.slim +1 -1
  250. data/app/views/renalware/shared/documents/_blood_pressure.html.slim +1 -1
  251. data/app/views/renalware/shared/documents/_dated_test.html.slim +1 -1
  252. data/app/views/renalware/transplants/donor_dashboards/show.html.slim +0 -1
  253. data/app/views/renalware/transplants/donor_followups/show.html.slim +0 -1
  254. data/app/views/renalware/transplants/donor_operations/_form.html.slim +0 -1
  255. data/app/views/renalware/transplants/donor_operations/_list.html.slim +0 -2
  256. data/app/views/renalware/transplants/donor_stages/_list.html.slim +0 -1
  257. data/app/views/renalware/transplants/donor_workups/_form.html.slim +0 -1
  258. data/app/views/renalware/transplants/recipient_dashboards/_page_actions.html.slim +3 -3
  259. data/app/views/renalware/transplants/recipient_followups/_form.html.slim +0 -1
  260. data/app/views/renalware/transplants/recipient_operations/_form.html.slim +0 -1
  261. data/app/views/renalware/transplants/recipient_operations/_list.html.slim +0 -2
  262. data/app/views/renalware/transplants/recipient_operations/_operation.html.slim +0 -1
  263. data/config/initializers/application_controller_renderer.rb +1 -1
  264. data/config/initializers/backtrace_silencers.rb +1 -1
  265. data/config/initializers/null_object.rb +2 -0
  266. data/config/locales/renalware/admissions/consults.en.yml +29 -0
  267. data/config/locales/renalware/dashboard/dashboard.yml +1 -0
  268. data/config/locales/renalware/hd/diary_slots.en.yml +13 -0
  269. data/config/locales/renalware/hd/mdm_patients.yml +1 -2
  270. data/config/locales/renalware/hd/preference_set.yml +0 -10
  271. data/config/locales/renalware/hd/profile.yml +2 -14
  272. data/config/locales/renalware/hd/session.en.yml +1 -7
  273. data/config/locales/renalware/hospitals/unit.yml +0 -1
  274. data/config/locales/renalware/mdm.yml +1 -1
  275. data/config/locales/renalware/messaging/internal/messages.en.yml +1 -0
  276. data/config/locales/renalware/navigation/renal.en.yml +2 -0
  277. data/config/locales/renalware/renal/registry.en.yml +12 -0
  278. data/config/locales/renalware/research/study_participant.en.yml +11 -0
  279. data/config/routes.rb +31 -1
  280. data/db/migrate/20170831082043_create_hd_diaries.rb +57 -0
  281. data/db/migrate/20170831084331_create_hd_diary_slots.rb +36 -0
  282. data/db/migrate/20170831142819_enable_crosstab_extension.rb +9 -0
  283. data/db/migrate/20170915090544_create_hd_station_locations.rb +12 -0
  284. data/db/migrate/20170915115228_add_schedule_diurnal_period_id_to_hd_profiles.rb +52 -0
  285. data/db/migrate/20170916121019_remove_number_of_hd_stations_from_hospital_units.rb +5 -0
  286. data/db/migrate/20170917185426_add_indexes_to_diary_slots.rb +19 -0
  287. data/db/migrate/20171004092235_create_hd_dialysates.rb +13 -0
  288. data/db/migrate/20171004110909_add_dialysate_id_to_profile_and_session.rb +9 -0
  289. data/db/migrate/20171012110133_create_research_studies.rb +22 -0
  290. data/db/migrate/20171012143050_create_research_study_participants.rb +30 -0
  291. data/db/migrate/20171013145849_set_patients_secure_id.rb +17 -0
  292. data/db/migrate/20171016152223_add_index_to_diary_slots.rb +17 -0
  293. data/db/migrate/20171017132738_add_unique_indexes_to_local_patient_ids.rb +13 -0
  294. data/db/migrate/20171017171625_update_hd_overall_audit_view.rb +8 -0
  295. data/db/migrate/20171101121130_create_function_to_render_audit_view_as_json.rb +38 -0
  296. data/db/migrate/20171101162244_create_consults.rb +24 -0
  297. data/db/migrate/20171106100216_create_pd_audit_view.rb +5 -0
  298. data/db/seeds/default/hd/{hd_cannulation_types.csv → cannulation_types.csv} +0 -0
  299. data/db/seeds/default/hd/cannulation_types.rb +1 -1
  300. data/db/seeds/default/hd/{hd_dialysers.csv → dialysers.csv} +0 -0
  301. data/db/seeds/default/hd/dialysers.rb +1 -1
  302. data/db/seeds/default/hd/seeds.rb +0 -1
  303. data/db/seeds/default/modalities/descriptions.rb +0 -13
  304. data/db/seeds/default/pathology/seeds.rb +0 -3
  305. data/db/seeds/default/reporting/audits.yml +265 -49
  306. data/db/views/reporting_anaemia_audit_v01.sql +1 -1
  307. data/db/views/reporting_hd_overall_audit_v05.sql +13 -0
  308. data/db/views/reporting_pd_audit_v01.sql +26 -0
  309. data/lib/dropdown_button_item.rb +51 -0
  310. data/lib/renalware/configuration.rb +1 -0
  311. data/lib/renalware/engine.rb +1 -0
  312. data/lib/renalware/version.rb +1 -1
  313. data/lib/renalware/week_period.rb +58 -0
  314. data/spec/factories/accesses/patients.rb +1 -1
  315. data/spec/factories/accesses/plans.rb +1 -1
  316. data/spec/factories/accesses/plans_types.rb +1 -1
  317. data/spec/factories/accesses/procedures.rb +1 -1
  318. data/spec/factories/accesses/profiles.rb +1 -1
  319. data/spec/factories/accesses/sites.rb +1 -1
  320. data/spec/factories/accesses/types.rb +1 -1
  321. data/spec/factories/admissions/consults.rb +7 -0
  322. data/spec/factories/admissions/request_reasons.rb +1 -1
  323. data/spec/factories/admissions/requests.rb +1 -1
  324. data/spec/factories/clinical/allergies.rb +1 -1
  325. data/spec/factories/clinical/body_compositions.rb +1 -1
  326. data/spec/factories/clinical/dry_weights.rb +1 -1
  327. data/spec/factories/clinical/patients.rb +1 -1
  328. data/spec/factories/clinics/appointments.rb +1 -1
  329. data/spec/factories/clinics/clinic_visits.rb +1 -1
  330. data/spec/factories/clinics/clinics.rb +1 -1
  331. data/spec/factories/deaths/cause.rb +1 -1
  332. data/spec/factories/deaths/modality_descriptions.rb +2 -2
  333. data/spec/factories/directory/people.rb +1 -1
  334. data/spec/factories/drugs/drug.rb +1 -1
  335. data/spec/factories/drugs/drug_types.rb +1 -1
  336. data/spec/factories/events/events.rb +1 -1
  337. data/spec/factories/events/events_types.rb +1 -1
  338. data/spec/factories/hd/cannulation_types.rb +1 -1
  339. data/spec/factories/hd/dialysates.rb +10 -0
  340. data/spec/factories/hd/dialysers.rb +1 -1
  341. data/spec/factories/hd/diaries.rb +12 -0
  342. data/spec/factories/hd/diurnal_period_codes.rb +18 -0
  343. data/spec/factories/hd/hd_session_document.rb +3 -4
  344. data/spec/factories/hd/modality_descriptions.rb +1 -1
  345. data/spec/factories/hd/patient_statistics.rb +1 -1
  346. data/spec/factories/hd/patients.rb +1 -1
  347. data/spec/factories/hd/preference_sets.rb +2 -2
  348. data/spec/factories/hd/profiles.rb +2 -1
  349. data/spec/factories/hd/schedule_definitions.rb +20 -0
  350. data/spec/factories/hd/sessions.rb +2 -1
  351. data/spec/factories/hd/slots.rb +7 -0
  352. data/spec/factories/hd/station_locations.rb +6 -0
  353. data/spec/factories/hd/stations.rb +1 -1
  354. data/spec/factories/hospitals/centres.rb +1 -1
  355. data/spec/factories/hospitals/units.rb +1 -3
  356. data/spec/factories/hospitals/wards.rb +1 -1
  357. data/spec/factories/letters/archives.rb +1 -1
  358. data/spec/factories/letters/contact_descriptions.rb +1 -1
  359. data/spec/factories/letters/contacts.rb +1 -1
  360. data/spec/factories/letters/descriptions.rb +1 -1
  361. data/spec/factories/letters/electronic_receipts.rb +1 -1
  362. data/spec/factories/letters/letterheads.rb +1 -1
  363. data/spec/factories/letters/letters.rb +1 -1
  364. data/spec/factories/letters/patients.rb +1 -1
  365. data/spec/factories/letters/primary_care_physicians.rb +1 -1
  366. data/spec/factories/letters/recipients.rb +1 -1
  367. data/spec/factories/medications/medication_route.rb +1 -1
  368. data/spec/factories/medications/prescription.rb +1 -1
  369. data/spec/factories/medications/prescription_terminations.rb +1 -1
  370. data/spec/factories/medications/prescription_version.rb +1 -1
  371. data/spec/factories/messaging/internal/authors.rb +1 -1
  372. data/spec/factories/messaging/internal/messages.rb +1 -1
  373. data/spec/factories/messaging/internal/receipts.rb +1 -1
  374. data/spec/factories/messaging/internal/recipients.rb +1 -1
  375. data/spec/factories/messaging/patients.rb +1 -1
  376. data/spec/factories/modalities/modalities.rb +1 -1
  377. data/spec/factories/modalities/modality_descriptions.rb +1 -1
  378. data/spec/factories/modalities/modality_reasons.rb +1 -1
  379. data/spec/factories/pathology/consultant.rb +1 -1
  380. data/spec/factories/pathology/lab.rb +1 -1
  381. data/spec/factories/pathology/measurement_units.rb +1 -1
  382. data/spec/factories/pathology/observation_descriptions.rb +1 -1
  383. data/spec/factories/pathology/observation_requests.rb +1 -1
  384. data/spec/factories/pathology/observations.rb +1 -1
  385. data/spec/factories/pathology/patients.rb +1 -1
  386. data/spec/factories/pathology/request_descriptions.rb +1 -1
  387. data/spec/factories/pathology/requests/drug_category.rb +1 -1
  388. data/spec/factories/pathology/requests/global_rule.rb +1 -1
  389. data/spec/factories/pathology/requests/global_rule_set.rb +1 -1
  390. data/spec/factories/pathology/requests/patient_rule.rb +1 -1
  391. data/spec/factories/pathology/requests/request.rb +1 -1
  392. data/spec/factories/patients/alerts.rb +1 -1
  393. data/spec/factories/patients/bookmarks.rb +1 -1
  394. data/spec/factories/patients/ethnicities.rb +1 -1
  395. data/spec/factories/patients/languages.rb +1 -1
  396. data/spec/factories/patients/patients.rb +2 -2
  397. data/spec/factories/patients/practices.rb +2 -2
  398. data/spec/factories/patients/primary_care_physicians.rb +2 -2
  399. data/spec/factories/patients/religions.rb +1 -1
  400. data/spec/factories/patients/users.rb +1 -1
  401. data/spec/factories/pd/assessments.rb +1 -1
  402. data/spec/factories/pd/bag_types.rb +1 -1
  403. data/spec/factories/pd/episode_types.rb +1 -1
  404. data/spec/factories/pd/exit_site_infections.rb +1 -1
  405. data/spec/factories/pd/fluid_descriptions.rb +1 -1
  406. data/spec/factories/pd/infection_organisms.rb +1 -1
  407. data/spec/factories/pd/modality_descriptions.rb +1 -1
  408. data/spec/factories/pd/organism_codes.rb +1 -1
  409. data/spec/factories/pd/patients.rb +1 -1
  410. data/spec/factories/pd/pd_regimes.rb +1 -1
  411. data/spec/factories/pd/peritonitis_episode_type_descriptions.rb +1 -1
  412. data/spec/factories/pd/peritonitis_episodes.rb +1 -1
  413. data/spec/factories/pd/pet_adequacies.rb +1 -1
  414. data/spec/factories/pd/regime_bags.rb +1 -1
  415. data/spec/factories/pd/systems.rb +1 -1
  416. data/spec/factories/pd/training_sessions.rb +1 -1
  417. data/spec/factories/pd/training_sites.rb +1 -1
  418. data/spec/factories/pd/training_types.rb +1 -1
  419. data/spec/factories/problems/problems.rb +1 -1
  420. data/spec/factories/renal/aki_alert_actions.rb +1 -1
  421. data/spec/factories/renal/aki_alerts.rb +1 -1
  422. data/spec/factories/renal/patients.rb +1 -1
  423. data/spec/factories/renal/prd_description.rb +1 -1
  424. data/spec/factories/renal/profiles.rb +17 -1
  425. data/spec/factories/reporting/audits.rb +1 -1
  426. data/spec/factories/research/studies.rb +11 -0
  427. data/spec/factories/research/study_participants.rb +7 -0
  428. data/spec/factories/shared/accountable.rb +2 -2
  429. data/spec/factories/snippets/snippets.rb +1 -1
  430. data/spec/factories/snippets/users.rb +1 -1
  431. data/spec/factories/system/addresses.rb +1 -1
  432. data/spec/factories/system/countries.rb +1 -1
  433. data/spec/factories/system/roles.rb +1 -1
  434. data/spec/factories/system/templates.rb +1 -1
  435. data/spec/factories/system/users.rb +1 -1
  436. data/spec/factories/transplants/donations.rb +1 -1
  437. data/spec/factories/transplants/donor_stage.rb +1 -1
  438. data/spec/factories/transplants/donor_stage_position.rb +1 -1
  439. data/spec/factories/transplants/donor_stage_status.rb +1 -1
  440. data/spec/factories/transplants/live_donor_modality_description.rb +1 -1
  441. data/spec/factories/transplants/modality_descriptions.rb +1 -1
  442. data/spec/factories/transplants/patients.rb +1 -1
  443. data/spec/factories/transplants/recipient_followups.rb +1 -1
  444. data/spec/factories/transplants/recipient_operations.rb +1 -1
  445. data/spec/factories/transplants/registration_status_descriptions.rb +1 -1
  446. data/spec/factories/transplants/registration_statuses.rb +1 -1
  447. data/spec/factories/transplants/registrations.rb +1 -1
  448. data/spec/support/{factory_girl.rb → factory_bot.rb} +3 -3
  449. metadata +130 -51
  450. data/app/models/concerns/renalware/hd/has_schedule.rb +0 -24
  451. data/app/views/renalware/clinical/body_compositions/_navigation.html.slim +0 -0
  452. data/app/views/renalware/clinical/dry_weights/_navigation.html.slim +0 -0
  453. data/app/views/renalware/clinical/profiles/_navigation.html.slim +0 -0
  454. data/app/views/renalware/dashboard/dashboards/_navigation.html.slim +0 -0
  455. data/app/views/renalware/devise/registrations/_navigation.html.slim +0 -0
  456. data/app/views/renalware/hd/sessions/_sections_nav.html.slim +0 -0
  457. data/app/views/renalware/letters/letters/_navigation.html.slim +0 -4
  458. data/app/views/renalware/patients/primary_care_physician/_navigation.html.slim +0 -0
  459. data/app/views/renalware/pd/peritonitis_episodes/_navigation.html.slim +0 -7
  460. data/db/seeds/default/hd/diurnal_period_codes.csv +0 -4
  461. data/db/seeds/default/hd/diurnal_period_codes.rb +0 -13
  462. data/db/seeds/default/pathology/pathology_labs.csv +0 -9
  463. data/db/seeds/default/pathology/pathology_labs.rb +0 -12
  464. data/db/seeds/default/pathology/pathology_observation_descriptions.csv +0 -1741
  465. data/db/seeds/default/pathology/pathology_observation_descriptions.rb +0 -16
  466. data/db/seeds/default/pathology/pathology_request_descriptions.csv +0 -196
  467. data/db/seeds/default/pathology/pathology_request_descriptions.rb +0 -27
  468. data/db/structure.sql +0 -9775
  469. data/vendor/assets/fonts/foundation-icons.eot +0 -0
  470. data/vendor/assets/fonts/foundation-icons.scss +0 -594
  471. data/vendor/assets/fonts/foundation-icons.svg +0 -970
  472. data/vendor/assets/fonts/foundation-icons.ttf +0 -0
  473. data/vendor/assets/fonts/foundation-icons.woff +0 -0
@@ -0,0 +1,30 @@
1
+ .renal-registry-preflight-checks {
2
+ .missing-data {
3
+ span {
4
+ border-radius: 0.2rem;
5
+ padding: 0.15rem 0.4rem;
6
+ color: $white;
7
+ white-space: nowrap;
8
+ font-size: 0.9rem;
9
+ font-weight: normal;
10
+ background-color: $renal-reg-missing-data-default;
11
+ margin-right: .2rem;
12
+
13
+ &.comorbidities_at_esrf {
14
+ background-color: $renal-reg-missing-data-comorbidities-at-esrf;
15
+ }
16
+
17
+ &.prd {
18
+ background-color: $renal-reg-missing-data-prd;
19
+ }
20
+
21
+ &.first_seen_on {
22
+ background-color: $renal-reg-missing-data-first-seen-on;
23
+ }
24
+
25
+ &.ethnicity {
26
+ background-color: $renal-reg-missing-data-ethnicity;
27
+ }
28
+ }
29
+ }
30
+ }
@@ -0,0 +1,8 @@
1
+ @keyframes highlight {
2
+ 0% {
3
+ background: $nhs-yellow
4
+ }
5
+ 100% {
6
+ background: none;
7
+ }
8
+ }
@@ -32,6 +32,17 @@ footer {
32
32
  text-align: right;
33
33
  }
34
34
 
35
+ .page-heading {
36
+ .warning-block {
37
+ background-color: $table-toggled-content-colour;
38
+ margin: 0.7rem;
39
+
40
+ i {
41
+ margin-right: 0.5rem;
42
+ }
43
+ }
44
+ }
45
+
35
46
  .embedded-scroll {
36
47
  overflow: auto;
37
48
  }
@@ -109,6 +109,14 @@ table {
109
109
  max-width: 7rem;
110
110
  }
111
111
 
112
+ &.col-width-mediumish-with-ellipsis {
113
+ overflow: hidden;
114
+ white-space: nowrap;
115
+ text-overflow: ellipsis;
116
+ min-width: 7rem;
117
+ max-width: 9rem;
118
+ }
119
+
112
120
  &.col-width-large-with-ellipsis {
113
121
  overflow: hidden;
114
122
  white-space: nowrap;
@@ -117,7 +125,9 @@ table {
117
125
  max-width: 20rem;
118
126
  }
119
127
 
120
-
128
+ &.actions {
129
+ text-align: right;
130
+ }
121
131
  }
122
132
 
123
133
  tr th,
@@ -154,7 +164,7 @@ table {
154
164
  }
155
165
 
156
166
  &.col-width-nhs-no {
157
- width: 8rem;
167
+ width: 7rem;
158
168
  min-width: 7rem;
159
169
  white-space: nowrap;
160
170
  }
@@ -1,3 +1,48 @@
1
+ .ui-tabs-simple {
2
+ .ui-tabs {
3
+ border: none;
4
+ }
5
+
6
+ .ui-tabs-nav {
7
+ border-bottom: 1px solid #ccc;
8
+ }
9
+
10
+ .ui-widget-header {
11
+ padding: 0;
12
+ background: none;
13
+ border-width: 0;
14
+ }
15
+
16
+ .ui-tabs-tab.ui-tabs-active,
17
+ .ui-tabs-tab.ui-state-active {
18
+ background-color: $white;
19
+ border-color: $table-border-colour;
20
+ }
21
+
22
+ .ui-tabs-anchor {
23
+ outline: none;
24
+ }
25
+
26
+ .ui-state-active a,
27
+ .ui-state-active a:link,
28
+ .ui-state-active a:visited {
29
+ color: $dark-grey;
30
+ }
31
+ }
32
+
33
+ .ui-tabs-simple .ui-tabs-nav {
34
+ padding-left: 0px;
35
+ background: transparent;
36
+ border-width: 0px 0px 1px 0px;
37
+ -moz-border-radius: 0px;
38
+ -webkit-border-radius: 0px;
39
+ border-radius: 0px;
40
+ }
41
+
42
+ .ui-tabs-simple .ui-tabs-panel {
43
+ border-width: 0px 1px 1px 1px;
44
+ }
45
+
1
46
  .tab-strip {
2
47
  list-style-type: none;
3
48
  margin: 0 0 2px 0;
@@ -1,11 +1,12 @@
1
1
  module Renalware
2
2
  class Admin::UsersController < BaseController
3
+ include Renalware::Concerns::Pageable
3
4
 
4
5
  def index
5
- @search = User.search(params[:q])
6
- @users = @search.result(distinct: true)
7
-
8
- authorize @users
6
+ search = User.search(params[:q])
7
+ users = search.result(distinct: true).page(page).per(per_page)
8
+ authorize users
9
+ render locals: { users: users }
9
10
  end
10
11
 
11
12
  def edit
@@ -0,0 +1,88 @@
1
+ require "renalware/admissions"
2
+ require "collection_presenter"
3
+
4
+ module Renalware
5
+ module Admissions
6
+ class ConsultsController < BaseController
7
+ include Renalware::Concerns::Pageable
8
+
9
+ def index
10
+ query = ConsultQuery.new(params[:q])
11
+ consults = query.call.page(page).per(per_page)
12
+ authorize consults
13
+ render locals: {
14
+ consults: CollectionPresenter.new(consults, ConsultPresenter),
15
+ query: query.search
16
+ }
17
+ end
18
+
19
+ def new
20
+ consult = Consult.new(started_on: Time.zone.today)
21
+ authorize consult
22
+ render_new(consult)
23
+ end
24
+
25
+ def create
26
+ consult = Consult.new(consult_params)
27
+ authorize consult
28
+ if consult.save_by(current_user)
29
+ redirect_to admissions_consults_path, notice: success_msg_for("consult")
30
+ else
31
+ render_new(consult)
32
+ end
33
+ end
34
+
35
+ def edit
36
+ render_edit(find_and_authorize_consult)
37
+ end
38
+
39
+ def update
40
+ consult = find_and_authorize_consult
41
+ if consult.update_by(current_user, consult_params)
42
+ redirect_to admissions_consults_path, notice: success_msg_for("consult")
43
+ else
44
+ render_edit(consult)
45
+ end
46
+ end
47
+
48
+ def destroy
49
+ find_and_authorize_consult.destroy!
50
+ redirect_to admissions_consults_path, notice: success_msg_for("consult")
51
+ end
52
+
53
+ private
54
+
55
+ def present(consults)
56
+ CollectionPresenter.new(
57
+ Consult.all.order(created_at: :desc).page(page).per(per_page),
58
+ ConsultPresenter
59
+ )
60
+ end
61
+
62
+ def find_and_authorize_consult
63
+ Consult.find(params[:id]).tap do |consult|
64
+ authorize consult
65
+ end
66
+ end
67
+
68
+ def render_new(consult)
69
+ render :new, locals: { consult: consult }
70
+ end
71
+
72
+ def render_edit(consult)
73
+ render :edit, locals: { consult: consult }
74
+ end
75
+
76
+ def consult_params
77
+ params
78
+ .require(:admissions_consult)
79
+ .permit(
80
+ :hospital_unit_id, :hospital_ward_id, :patient_id, :q,
81
+ :decided_on, :transferred_on, :started_on, :ended_on, :decided_on,
82
+ :aki_risk, :transfer_priority, :seen_by_id, :consult_type,
83
+ :requires_aki_nurse, :description, :contact_number
84
+ )
85
+ end
86
+ end
87
+ end
88
+ end
@@ -23,7 +23,7 @@ module Renalware
23
23
  def create
24
24
  body_composition = build_body_composition
25
25
  if body_composition.save
26
- redirect_to patient_clinical_profile_path(@patient),
26
+ redirect_to patient_clinical_profile_path(patient),
27
27
  notice: t(".success", model_name: "body composition")
28
28
  else
29
29
  flash.now[:error] = t(".failed", model_name: "body composition")
@@ -10,7 +10,7 @@ module Renalware
10
10
  end
11
11
 
12
12
  def per_page
13
- params[:per_page]
13
+ params[:per_page] || 20
14
14
  end
15
15
  end
16
16
  end
@@ -61,7 +61,7 @@ module Renalware
61
61
 
62
62
  def attributes
63
63
  [
64
- :schedule, :other_schedule, :hospital_unit_id,
64
+ :schedule_definition_id, :other_schedule, :hospital_unit_id, :dialysate_id,
65
65
  :prescribed_time, :prescribed_on, :prescriber_id,
66
66
  :named_nurse_id, :transport_decider_id,
67
67
  document: []
@@ -0,0 +1,87 @@
1
+ require_dependency "renalware/hd/base_controller"
2
+
3
+ # The route to the edit route for this controller takes /:year/:week_number segments
4
+ # rather than an id. THat is because when we load the diary, and when we navigate back and forth
5
+ # through diaries, we are concerned with the week more then an id. Its easier to navigate to the
6
+ # next week with /2017/52 than by looking up the id of the next diary ahead of time.
7
+ module Renalware
8
+ module HD
9
+ class DiariesController < BaseController
10
+ include Renalware::Concerns::PdfRenderable
11
+ include Renalware::Concerns::Pageable
12
+
13
+ def edit
14
+ authorize weekly_diary, :show?
15
+ render locals: {
16
+ unit: unit,
17
+ diary: DiaryPresenter.new(current_user, weekly_diary)
18
+ }
19
+ end
20
+
21
+ # Renders a list of diaries for a hospital unit
22
+ def index
23
+ authorize WeeklyDiary, :index?
24
+ render locals: { unit: unit, diaries: weekly_diaries }
25
+ end
26
+
27
+ def show
28
+ diary = WeeklyDiary.find(params[:id])
29
+ respond_to do |format|
30
+ format.pdf do
31
+ authorize diary
32
+ options = default_pdf_options.merge!(
33
+ pdf: pdf_filename,
34
+ locals: { unit: unit, diary: DiaryPresenter.new(current_user, diary) }
35
+ )
36
+ render options
37
+ end
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ # TODO: give a sensible name
44
+ def pdf_filename
45
+ "hd_unit_diary"
46
+ end
47
+
48
+ def weekly_diary
49
+ @weekly_diary ||= begin
50
+ FindOrCreateDiaryByWeekQuery.new(
51
+ relation: WeeklyDiary.eager_load(
52
+ slots: [:patient, :station, :diurnal_period_code],
53
+ master_diary: { slots: [:patient, :station, :diurnal_period_code] }
54
+ ),
55
+ unit_id: unit_id,
56
+ week_period: week_period,
57
+ by: current_user
58
+ ).call
59
+ end
60
+ end
61
+
62
+ # The route segments are /:year/:week_number
63
+ # We use a WeekPeriod value object to wrap those two things.
64
+ def week_period
65
+ WeekPeriod.new(
66
+ week_number: params[:week_number],
67
+ year: params[:year]
68
+ )
69
+ end
70
+
71
+ def unit_id
72
+ params[:unit_id]
73
+ end
74
+
75
+ def unit
76
+ Hospitals::Unit.find(unit_id)
77
+ end
78
+
79
+ def weekly_diaries
80
+ WeeklyDiary
81
+ .where(hospital_unit_id: unit_id)
82
+ .ordered
83
+ .page(page).per(per_page)
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,172 @@
1
+ # rubocop:disable Metrics/ClassLength
2
+ require_dependency "renalware/hd/base_controller"
3
+
4
+ module Renalware
5
+ module HD
6
+ class DiarySlotsController < BaseController
7
+
8
+ # GET html - renders a form
9
+ # Here we will have been passed in the query string:
10
+ # - the unit id
11
+ # - the dirunal_period_code id
12
+ # - the week and year (and thus the diary)
13
+ # and from that lot we could look up the master and weekly diaries
14
+ def new
15
+ # Be default this assume we are going to add a slot to the weekly diary
16
+ # but in which button is clicked in the modal dialog determines which diary
17
+ # (master or weekly) the slot will be added to.
18
+ slot = DiarySlot.new(
19
+ diary: weekly_diary,
20
+ station_id: params[:station_id],
21
+ day_of_week: params[:day_of_week],
22
+ diurnal_period_code_id: params[:diurnal_period_code_id]
23
+ )
24
+ authorize slot
25
+ render locals: locals_for(slot), layout: false
26
+ end
27
+
28
+ # POST create js
29
+ # Here we may be adding a slot to the weekly or master diary.
30
+ # That should be transparent to us - we make the change and render
31
+ # create.js.erb which, on the client, will cause an ajax js call to #show. That secondary call
32
+ # is the one that refreshes the slot in the table with its latest state.
33
+ # We do this to avoid having to to a check (in each action in this controller) to see if we
34
+ # are on the master or weekly diary; if we always refresh the diary slot in the ui after any
35
+ # action, then it will always update correctly.
36
+ def create
37
+ diary = Diary.find(params[:diary_id])
38
+ slot = diary.slots.new(slot_params)
39
+ slot.patient_id = posted_patient_id
40
+ authorize slot
41
+ if slot.save_by(current_user)
42
+ render locals: { diary: diary, slot: diary.decorate_slot(slot) }
43
+ else
44
+ render :new, locals: { slot: DiarySlotPresenter.new(slot) }, layout: false
45
+ end
46
+ end
47
+
48
+ # GET .js refresh a slot in a *weekly* diary
49
+ # See comment on #create.
50
+ # See show.js.erb where we refresh the slot in the diary
51
+ # To get here we will have manufactured a url like this
52
+ # hd/diaries/2/slots/day/1/period/1/station/1
53
+ # as those bit are will we know.
54
+ # Basically we are saying find for this weekly diary, find the matching
55
+ # slot for the station/day/period combo and render the weekly slot if there is
56
+ # one, or the master behind it if there is one of those, otherwise render an Add button.
57
+ def show
58
+ authorize DiarySlot, :show?
59
+ slot = weekly_then_master_then_empty_slot
60
+ render layout: false, locals: { slot: DiarySlotPresenter.new(slot) }
61
+ end
62
+
63
+ def edit
64
+ authorize slot
65
+ render layout: false, locals: { slot: DiarySlotPresenter.new(slot) }
66
+ end
67
+
68
+ # DELETE js
69
+ # Delete the slot (we don't know if its on the master or weekly diary).
70
+ # NB as per #create and #update, the rendered js file (destroy.js.erb) will make a secondary
71
+ # back into #show to refresh the UI (i.e. we don't attempt to update the UI in destroy.js.erb)
72
+ def destroy
73
+ authorize slot
74
+ slot.destroy!
75
+ render locals: { slot: DiarySlotPresenter.new(slot) }
76
+ end
77
+
78
+ # PATCH js
79
+ # See also comments in #create and #destroy.
80
+ def update
81
+ authorize slot
82
+ slot.patient_id = slot_params[:patient_id]
83
+ slot.save_by!(current_user)
84
+ diary = slot.diary
85
+ render locals: { diary: diary, slot: diary.decorate_slot(slot) }
86
+ end
87
+
88
+ private
89
+
90
+ # Find the corresponding slot in the master if there is one, otherwise an empty slot
91
+ # with an 'Add' button ready to set up a new patient
92
+ def weekly_then_master_then_empty_slot
93
+ empty_slot = build_empty_weekly_slot
94
+ find_weekly_slot(empty_slot) || find_master_slot(empty_slot) || empty_slot
95
+ end
96
+
97
+ def find_master_slot(args)
98
+ slot = master_diary.slots.find_by(
99
+ diurnal_period_code_id: args.diurnal_period_code_id,
100
+ station_id: args.station_id,
101
+ day_of_week: args.day_of_week
102
+ )
103
+ slot && master_diary.decorate_slot(slot)
104
+ end
105
+
106
+ def find_weekly_slot(args)
107
+ slot = weekly_diary.slots.find_by(
108
+ diurnal_period_code_id: args.diurnal_period_code_id,
109
+ station_id: args.station_id,
110
+ day_of_week: args.day_of_week
111
+ )
112
+ slot && weekly_diary.decorate_slot(slot)
113
+ end
114
+
115
+ # Used for searching etc
116
+ def build_empty_weekly_slot
117
+ weekly_diary.slots.new(
118
+ day_of_week: params[:day_of_week],
119
+ station_id: params[:station_id],
120
+ diurnal_period_code_id: params[:diurnal_period_code_id]
121
+ )
122
+ end
123
+
124
+ def slot
125
+ @slot ||= HD::DiarySlot.find(params[:id])
126
+ end
127
+
128
+ # In the url the :diary_id param is always the weekly diary id!
129
+ def weekly_diary
130
+ @weekly_diary ||= WeeklyDiary.find(params[:diary_id])
131
+ end
132
+
133
+ def master_diary
134
+ weekly_diary.master_diary
135
+ end
136
+
137
+ def locals_for(slot)
138
+ {
139
+ slot: DiarySlotPresenter.new(slot),
140
+ weekly_diary: weekly_diary
141
+ }
142
+ end
143
+
144
+ # In the modal dialog that submits the patient_id there are several (select2) dropdown
145
+ # a user can use to choose the patient. Each one has the name patient_id[] so they are
146
+ # submitted in the form as an array. However the array can only hold one id value ie we
147
+ # might get posted patient_id: ["", "123", ""] but never ["2", "123", ""].
148
+ # Here we reduce that array down to one patient id.
149
+ def posted_patient_id
150
+ patient_ids = Array(slot_params[:patient_id]).reject(&:blank?).uniq
151
+ if patient_ids.length > 1
152
+ raise ArgumentError, "More than one id submitted in patient_id[] : #{patient_ids}"
153
+ end
154
+ patient_ids.first
155
+ end
156
+
157
+ def slot_params
158
+ params
159
+ .require(:hd_diary_slot)
160
+ .permit(
161
+ :master_slot,
162
+ :day_of_week,
163
+ :diurnal_period_code_id,
164
+ :station_id,
165
+ :target_diary_id,
166
+ :change_type,
167
+ patient_id: []
168
+ )
169
+ end
170
+ end
171
+ end
172
+ end