renalware-core 2.0.67 → 2.0.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/stylesheets/renalware/partials/_forms.scss +33 -2
- data/app/assets/stylesheets/renalware/partials/_navigation.scss +4 -0
- data/app/controllers/renalware/hd/mdm_patients_controller.rb +19 -6
- data/app/controllers/renalware/pd/mdm_patients_controller.rb +9 -1
- data/app/controllers/renalware/research/studies_controller.rb +6 -1
- data/app/controllers/renalware/research/study_participants_controller.rb +13 -11
- data/app/models/renalware/hd/mdm_patients_form.rb +1 -0
- data/app/models/renalware/hd/mdm_patients_query.rb +20 -4
- data/app/models/renalware/patients/mdm_patients_query.rb +1 -1
- data/app/models/renalware/patients/search_query.rb +1 -1
- data/app/models/renalware/pd/mdm_patients_query.rb +18 -2
- data/app/models/renalware/transplants/mdm_patients_query.rb +1 -1
- data/app/views/renalware/clinics/appointments/new.html.slim +9 -8
- data/app/views/renalware/hd/mdm_patients/_filters.html.slim +3 -2
- data/app/views/renalware/hd/mdm_patients/_tabs.html.slim +8 -0
- data/app/views/renalware/hd/mdm_patients/index.html.slim +3 -0
- data/app/views/renalware/letters/printable_letters/_recipient_address_cover_sheet.html.slim +1 -1
- data/app/views/renalware/pd/mdm_patients/_tabs.html.slim +8 -0
- data/app/views/renalware/research/studies/_tabs.html.slim +12 -0
- data/app/views/renalware/research/studies/edit.html.slim +25 -1
- data/app/views/renalware/research/studies/index.html.slim +9 -15
- data/app/views/renalware/research/studies/show.html.slim +9 -13
- data/app/views/renalware/research/study_participants/_filters.html.slim +1 -1
- data/app/views/renalware/research/study_participants/_form.html.slim +18 -43
- data/app/views/renalware/research/study_participants/edit.html.slim +7 -1
- data/app/views/renalware/research/study_participants/index.html.slim +8 -22
- data/app/views/renalware/research/study_participants/new.html.slim +7 -1
- data/config/locales/renalware/hd/mdm_patients.yml +4 -0
- data/config/locales/renalware/pd/mdm.en.yml +4 -0
- data/config/routes.rb +8 -1
- data/db/migrate/20190104095254_create_active_storage_tables.active_storage.rb +27 -0
- data/lib/renalware/version.rb +1 -1
- data/spec/factories/hd/patients.rb +23 -1
- data/spec/factories/pd/modality_descriptions.rb +3 -0
- data/spec/factories/pd/patients.rb +23 -1
- data/spec/support/devise_spec_helper.rb +3 -0
- metadata +14 -16
- data/app/assets/javascripts/renalware/research.js +0 -18
- data/app/views/renalware/research/study_participants/create.js.erb +0 -3
- data/app/views/renalware/research/study_participants/new.js.erb +0 -4
- data/app/views/renalware/research/study_participants/update.js.erb +0 -3
- data/spec/support/capybara.rb +0 -23
- data/spec/support/select2_spec_helper.rb +0 -47
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c551c17f27d4ce7093dcacaa92bb5936b9d9131ecc452fabb288b11a409c42e8
         | 
| 4 | 
            +
              data.tar.gz: ce9f5588b3f29e82f900ac88d89ace8e11e0535c113b3479edf3d0745dd6d578
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: f0e617fd1c72cd5162a23f853647d568296a3dbeb32a023daeadc3b517abee63bc7fe30adc06d8a2328ab0099526afc06a0b98f2a5cc74d942a6db570cf4bce3
         | 
| 7 | 
            +
              data.tar.gz: 3b90fa1559317b7a89d94b879b147723b2aa47f87d46b84a0360025e49765934b6462ccfe6655fc5f52b22aee5c022555dfd81632126622aeb872751e1880fdb
         | 
| @@ -3,8 +3,18 @@ textarea::placeholder { | |
| 3 3 | 
             
              color: $form-hint-colour
         | 
| 4 4 | 
             
            }
         | 
| 5 5 |  | 
| 6 | 
            -
            .panel | 
| 7 | 
            -
               | 
| 6 | 
            +
            .panel {
         | 
| 7 | 
            +
              p {
         | 
| 8 | 
            +
                padding-left: 0;
         | 
| 9 | 
            +
              }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              &.compact {
         | 
| 12 | 
            +
                padding: 0.5rem 1rem;
         | 
| 13 | 
            +
              }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              .muted {
         | 
| 16 | 
            +
                color: $dashboard-muted-color;
         | 
| 17 | 
            +
              }
         | 
| 8 18 | 
             
            }
         | 
| 9 19 |  | 
| 10 20 | 
             
            textarea.monospace {
         | 
| @@ -434,3 +444,24 @@ fieldset { | |
| 434 444 | 
             
                }
         | 
| 435 445 | 
             
              }
         | 
| 436 446 | 
             
            }
         | 
| 447 | 
            +
             | 
| 448 | 
            +
            .panel.danger-zone {
         | 
| 449 | 
            +
              background-color: $white;
         | 
| 450 | 
            +
              color: $nhs-red;
         | 
| 451 | 
            +
             | 
| 452 | 
            +
              h4 {
         | 
| 453 | 
            +
                color: inherit;
         | 
| 454 | 
            +
              }
         | 
| 455 | 
            +
             | 
| 456 | 
            +
              a {
         | 
| 457 | 
            +
                color: inherit;
         | 
| 458 | 
            +
                font-weight: bold;
         | 
| 459 | 
            +
                background-color: $table-border-color;
         | 
| 460 | 
            +
             | 
| 461 | 
            +
                &:hover,
         | 
| 462 | 
            +
                &:active   {
         | 
| 463 | 
            +
                  background-color: $nhs-red;
         | 
| 464 | 
            +
                  color: $white;
         | 
| 465 | 
            +
                }
         | 
| 466 | 
            +
              }
         | 
| 467 | 
            +
            }
         | 
| @@ -6,12 +6,6 @@ module Renalware | |
| 6 6 | 
             
              module HD
         | 
| 7 7 | 
             
                class MDMPatientsController < Renalware::MDMPatientsController
         | 
| 8 8 | 
             
                  def index
         | 
| 9 | 
            -
                    filter_form = form_object_class.new(filter_form_params)
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                    query = HD::MDMPatientsQuery.new(
         | 
| 12 | 
            -
                      params: filter_form.ransacked_parameters.merge(query_params).with_indifferent_access
         | 
| 13 | 
            -
                    )
         | 
| 14 | 
            -
             | 
| 15 9 | 
             
                    render_index(filter_form: filter_form,
         | 
| 16 10 | 
             
                                 query: query,
         | 
| 17 11 | 
             
                                 page_title: t(".page_title"),
         | 
| @@ -21,6 +15,21 @@ module Renalware | |
| 21 15 |  | 
| 22 16 | 
             
                  private
         | 
| 23 17 |  | 
| 18 | 
            +
                  def query
         | 
| 19 | 
            +
                    @query ||= begin
         | 
| 20 | 
            +
                      MDMPatientsQuery.new(
         | 
| 21 | 
            +
                        params: filter_form.ransacked_parameters.merge(query_params).with_indifferent_access,
         | 
| 22 | 
            +
                        named_filter: named_filter
         | 
| 23 | 
            +
                      )
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  # Pass in the current path to the filter form so it can render the correct URI in form and
         | 
| 28 | 
            +
                  # reset links.
         | 
| 29 | 
            +
                  def filter_form
         | 
| 30 | 
            +
                    @filter_form ||= form_object_class.new(filter_form_params.merge(url: request.path))
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 24 33 | 
             
                  # Permit all attributes on the filter form object. Slightly messy
         | 
| 25 34 | 
             
                  def filter_form_params
         | 
| 26 35 | 
             
                    params.fetch(:filter, {}).permit(form_object_class.permittable_attributes)
         | 
| @@ -35,6 +44,10 @@ module Renalware | |
| 35 44 | 
             
                    params.fetch(:q, {}).permit(:s)
         | 
| 36 45 | 
             
                  end
         | 
| 37 46 |  | 
| 47 | 
            +
                  def named_filter
         | 
| 48 | 
            +
                    params[:named_filter]
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
             | 
| 38 51 | 
             
                  def render_index(filter_form:, **args)
         | 
| 39 52 | 
             
                    presenter = build_presenter(params: params, **args)
         | 
| 40 53 | 
             
                    authorize presenter.patients
         | 
| @@ -6,10 +6,18 @@ module Renalware | |
| 6 6 | 
             
              module PD
         | 
| 7 7 | 
             
                class MDMPatientsController < Renalware::MDMPatientsController
         | 
| 8 8 | 
             
                  def index
         | 
| 9 | 
            -
                    render_index(query:  | 
| 9 | 
            +
                    render_index(query: query,
         | 
| 10 10 | 
             
                                 page_title: t(".page_title"),
         | 
| 11 11 | 
             
                                 view_proc: ->(patient) { patient_pd_mdm_path(patient) })
         | 
| 12 12 | 
             
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def query
         | 
| 15 | 
            +
                    @query ||= MDMPatientsQuery.new(q: params[:q], named_filter: named_filter)
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def named_filter
         | 
| 19 | 
            +
                    params[:named_filter]
         | 
| 20 | 
            +
                  end
         | 
| 13 21 | 
             
                end
         | 
| 14 22 | 
             
              end
         | 
| 15 23 | 
             
            end
         | 
| @@ -14,6 +14,11 @@ module Renalware | |
| 14 14 | 
             
                    render locals: { studies: studies, query: query }
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 |  | 
| 17 | 
            +
                  def show
         | 
| 18 | 
            +
                    study = find_and_authorize_study
         | 
| 19 | 
            +
                    render locals: { study: study }
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
             | 
| 17 22 | 
             
                  def new
         | 
| 18 23 | 
             
                    study = Study.new
         | 
| 19 24 | 
             
                    authorize study
         | 
| @@ -38,7 +43,7 @@ module Renalware | |
| 38 43 | 
             
                  def update
         | 
| 39 44 | 
             
                    study = find_and_authorize_study
         | 
| 40 45 | 
             
                    if study.update_by(current_user, study_params)
         | 
| 41 | 
            -
                      redirect_to  | 
| 46 | 
            +
                      redirect_to research_study_path(study), notice: success_msg_for("clinical study")
         | 
| 42 47 | 
             
                    else
         | 
| 43 48 | 
             
                      render_edit(study)
         | 
| 44 49 | 
             
                    end
         | 
| @@ -9,7 +9,9 @@ module Renalware | |
| 9 9 |  | 
| 10 10 | 
             
                  def index
         | 
| 11 11 | 
             
                    authorize StudyParticipant, :index?
         | 
| 12 | 
            -
                     | 
| 12 | 
            +
                    query = StudyParticipantsQuery.new(study: study, options: params[:q])
         | 
| 13 | 
            +
                    participants = query.call.page(page).per(per_page)
         | 
| 14 | 
            +
                    render locals: { study: study, participants: participants, query: query.search }
         | 
| 13 15 | 
             
                  end
         | 
| 14 16 |  | 
| 15 17 | 
             
                  def show
         | 
| @@ -23,7 +25,10 @@ module Renalware | |
| 23 25 | 
             
                    authorize participant
         | 
| 24 26 |  | 
| 25 27 | 
             
                    if participant.save
         | 
| 26 | 
            -
                       | 
| 28 | 
            +
                      redirect_to(
         | 
| 29 | 
            +
                        research_study_participants_path(study),
         | 
| 30 | 
            +
                        notice: success_msg_for("participant")
         | 
| 31 | 
            +
                      )
         | 
| 27 32 | 
             
                    else
         | 
| 28 33 | 
             
                      render_new(participant)
         | 
| 29 34 | 
             
                    end
         | 
| @@ -50,7 +55,10 @@ module Renalware | |
| 50 55 | 
             
                  def update
         | 
| 51 56 | 
             
                    participant = find_and_authorise_participant
         | 
| 52 57 | 
             
                    if participant.update(participant_params_for_update)
         | 
| 53 | 
            -
                       | 
| 58 | 
            +
                      redirect_to(
         | 
| 59 | 
            +
                        research_study_participants_path(study),
         | 
| 60 | 
            +
                        notice: success_msg_for("participant")
         | 
| 61 | 
            +
                      )
         | 
| 54 62 | 
             
                    else
         | 
| 55 63 | 
             
                      render_edit(participant)
         | 
| 56 64 | 
             
                    end
         | 
| @@ -63,17 +71,11 @@ module Renalware | |
| 63 71 | 
             
                  end
         | 
| 64 72 |  | 
| 65 73 | 
             
                  def render_edit(participant)
         | 
| 66 | 
            -
                    render : | 
| 74 | 
            +
                    render :edit, locals: { participant: participant }
         | 
| 67 75 | 
             
                  end
         | 
| 68 76 |  | 
| 69 77 | 
             
                  def render_new(participant)
         | 
| 70 | 
            -
                    render :new, locals: { participant: participant } | 
| 71 | 
            -
                  end
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                  def render_current_action_with_locals
         | 
| 74 | 
            -
                    query = StudyParticipantsQuery.new(study: study, options: params[:q])
         | 
| 75 | 
            -
                    participants = query.call.page(page).per(per_page)
         | 
| 76 | 
            -
                    render locals: { study: study, participants: participants, query: query.search }
         | 
| 78 | 
            +
                    render :new, locals: { participant: participant }
         | 
| 77 79 | 
             
                  end
         | 
| 78 80 |  | 
| 79 81 | 
             
                  def study
         | 
| @@ -14,6 +14,7 @@ module Renalware | |
| 14 14 | 
             
                  attribute :hospital_unit_id, Integer
         | 
| 15 15 | 
             
                  attribute :named_nurse_id, Integer
         | 
| 16 16 | 
             
                  attribute :schedule_definition_ids, String # an Integer array in string form e.g. "[1 ,2]"
         | 
| 17 | 
            +
                  attribute :url
         | 
| 17 18 |  | 
| 18 19 | 
             
                  # The hash returned here is passed into the Ransack #search method later i the ouery object.
         | 
| 19 20 | 
             
                  def ransacked_parameters
         | 
| @@ -9,18 +9,19 @@ module Renalware | |
| 9 9 | 
             
                  include PatientPathologyScopes
         | 
| 10 10 | 
             
                  MODALITY_NAMES = "HD"
         | 
| 11 11 | 
             
                  DEFAULT_SEARCH_PREDICATE = "hgb_date desc"
         | 
| 12 | 
            -
                  attr_reader :params
         | 
| 12 | 
            +
                  attr_reader :params, :named_filter
         | 
| 13 13 |  | 
| 14 | 
            -
                  def initialize(params:)
         | 
| 14 | 
            +
                  def initialize(params:, named_filter:)
         | 
| 15 15 | 
             
                    @params = params || {}
         | 
| 16 16 | 
             
                    @params[:s] = DEFAULT_SEARCH_PREDICATE if @params[:s].blank?
         | 
| 17 | 
            +
                    @named_filter = named_filter || :none
         | 
| 17 18 | 
             
                  end
         | 
| 18 19 |  | 
| 19 20 | 
             
                  def call
         | 
| 20 21 | 
             
                    search.result
         | 
| 21 22 | 
             
                  end
         | 
| 22 23 |  | 
| 23 | 
            -
                  # rubocop:disable Metrics/MethodLength
         | 
| 24 | 
            +
                  # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
         | 
| 24 25 | 
             
                  def search
         | 
| 25 26 | 
             
                    @search ||= begin
         | 
| 26 27 | 
             
                      HD::Patient
         | 
| @@ -31,13 +32,15 @@ module Renalware | |
| 31 32 | 
             
                        .eager_load(hd_profile: [:hospital_unit])
         | 
| 32 33 | 
             
                        .extending(ModalityScopes)
         | 
| 33 34 | 
             
                        .extending(PatientPathologyScopes)
         | 
| 35 | 
            +
                        .extending(NamedFilterScopes)
         | 
| 34 36 | 
             
                        .with_current_pathology
         | 
| 35 37 | 
             
                        .with_registration_statuses
         | 
| 36 38 | 
             
                        .with_current_modality_matching(MODALITY_NAMES)
         | 
| 39 | 
            +
                        .public_send(named_filter.to_s)
         | 
| 37 40 | 
             
                        .ransack(params)
         | 
| 38 41 | 
             
                    end
         | 
| 39 42 | 
             
                  end
         | 
| 40 | 
            -
                  # rubocop:enable Metrics/MethodLength
         | 
| 43 | 
            +
                  # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
         | 
| 41 44 |  | 
| 42 45 | 
             
                  # Module to allow us to mixin ransackers
         | 
| 43 46 | 
             
                  module QueryablePatient
         | 
| @@ -63,5 +66,18 @@ module Renalware | |
| 63 66 | 
             
                    end
         | 
| 64 67 | 
             
                  end
         | 
| 65 68 | 
             
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                # Module to allow us to mixin named filters like on_worryboard which correspond to tabs
         | 
| 71 | 
            +
                # on the UI for example.
         | 
| 72 | 
            +
                module NamedFilterScopes
         | 
| 73 | 
            +
                  def none
         | 
| 74 | 
            +
                    self # NOOP - aka 'all'
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                  def patients_on_the_worry_board
         | 
| 78 | 
            +
                    joins("RIGHT OUTER JOIN patient_worries ON patient_worries.patient_id = patients.id")
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
                  alias_method :on_worryboard, :patients_on_the_worry_board
         | 
| 81 | 
            +
                end
         | 
| 66 82 | 
             
              end
         | 
| 67 83 | 
             
            end
         | 
| @@ -7,31 +7,47 @@ module Renalware | |
| 7 7 | 
             
                  include PatientPathologyScopes
         | 
| 8 8 | 
             
                  MODALITY_NAMES = "PD"
         | 
| 9 9 | 
             
                  DEFAULT_SEARCH_PREDICATE = "hgb_date desc"
         | 
| 10 | 
            -
                  attr_reader :q, :relation
         | 
| 10 | 
            +
                  attr_reader :q, :relation, :named_filter
         | 
| 11 11 |  | 
| 12 | 
            -
                  def initialize(relation: PD::Patient.all, q:)
         | 
| 12 | 
            +
                  def initialize(relation: PD::Patient.all, q:, named_filter: nil)
         | 
| 13 13 | 
             
                    @q = q || {}
         | 
| 14 14 | 
             
                    @q[:s] = DEFAULT_SEARCH_PREDICATE if @q[:s].blank?
         | 
| 15 15 | 
             
                    @relation = relation
         | 
| 16 | 
            +
                    @named_filter = named_filter || :none
         | 
| 16 17 | 
             
                  end
         | 
| 17 18 |  | 
| 18 19 | 
             
                  def call
         | 
| 19 20 | 
             
                    search.result
         | 
| 20 21 | 
             
                  end
         | 
| 21 22 |  | 
| 23 | 
            +
                  # rubocop:disable Metrics/MethodLength
         | 
| 22 24 | 
             
                  def search
         | 
| 23 25 | 
             
                    @search ||= begin
         | 
| 24 26 | 
             
                      relation
         | 
| 25 27 | 
             
                        .extending(PatientTransplantScopes)
         | 
| 26 28 | 
             
                        .extending(ModalityScopes)
         | 
| 27 29 | 
             
                        .extending(PatientPathologyScopes)
         | 
| 30 | 
            +
                        .extending(NamedFilterScopes)
         | 
| 28 31 | 
             
                        .with_current_modality_matching(MODALITY_NAMES)
         | 
| 29 32 | 
             
                        .with_current_pathology
         | 
| 30 33 | 
             
                        .with_registration_statuses
         | 
| 31 34 | 
             
                        .left_outer_joins(:current_observation_set)
         | 
| 35 | 
            +
                        .public_send(named_filter.to_s)
         | 
| 32 36 | 
             
                        .ransack(q)
         | 
| 33 37 | 
             
                    end
         | 
| 34 38 | 
             
                  end
         | 
| 39 | 
            +
                  # rubocop:enable Metrics/MethodLength
         | 
| 40 | 
            +
                end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                module NamedFilterScopes
         | 
| 43 | 
            +
                  def none
         | 
| 44 | 
            +
                    self # NOOP
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  def patients_on_the_worry_board
         | 
| 48 | 
            +
                    joins("RIGHT OUTER JOIN patient_worries ON patient_worries.patient_id = patients.id")
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                  alias_method :on_worryboard, :patients_on_the_worry_board
         | 
| 35 51 | 
             
                end
         | 
| 36 52 | 
             
              end
         | 
| 37 53 | 
             
            end
         | 
| @@ -9,7 +9,7 @@ module Renalware | |
| 9 9 | 
             
                class MDMPatientsQuery
         | 
| 10 10 | 
             
                  include ModalityScopes
         | 
| 11 11 | 
             
                  include PatientPathologyScopes
         | 
| 12 | 
            -
                  MODALITY_NAMES =  | 
| 12 | 
            +
                  MODALITY_NAMES = "Transplant"
         | 
| 13 13 | 
             
                  DEFAULT_SEARCH_PREDICATE = "hgb_date DESC"
         | 
| 14 14 | 
             
                  attr_reader :q, :relation, :named_filter
         | 
| 15 15 |  | 
| @@ -12,14 +12,15 @@ | |
| 12 12 | 
             
                / the blank option. Selecting index 1 fails silently if there is nothing there (no patient
         | 
| 13 13 | 
             
                / selected yet) otherwise it will display the selected patient who will always be
         | 
| 14 14 | 
             
                / at option index 1.
         | 
| 15 | 
            -
                 | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
                             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 15 | 
            +
                #patient-select2
         | 
| 16 | 
            +
                  = f.input :patient_id,
         | 
| 17 | 
            +
                            wrapper: :horizontal_medium,
         | 
| 18 | 
            +
                            collection: [[appointment.patient&.to_s(:long), appointment.patient&.id]],
         | 
| 19 | 
            +
                            selected: 1,
         | 
| 20 | 
            +
                            input_html: { \
         | 
| 21 | 
            +
                              class: "patient-id-select2 patient-ajax-search",
         | 
| 22 | 
            +
                              data: { "ajax--url" => search_patients_path(format: :json),
         | 
| 23 | 
            +
                                      placeholder: "Search by patient name or hospital/NHS no." } \
         | 
| 23 24 | 
             
                          }
         | 
| 24 25 |  | 
| 25 26 | 
             
                = f.input :clinic_id,
         | 
| @@ -1,6 +1,7 @@ | |
| 1 | 
            +
             | 
| 1 2 | 
             
            = simple_form_for filter_form,
         | 
| 2 3 | 
             
                              as: :filter,
         | 
| 3 | 
            -
                              url:  | 
| 4 | 
            +
                              url: filter_form.url,
         | 
| 4 5 | 
             
                              method: :get,
         | 
| 5 6 | 
             
                              html: { autocomplete: "off" },
         | 
| 6 7 | 
             
                              wrapper: :horizontal_form do |f|
         | 
| @@ -27,4 +28,4 @@ | |
| 27 28 | 
             
                .medium-2.columns.actions
         | 
| 28 29 | 
             
                  = f.submit t("helpers.submit.filter"), class: "button", name: nil
         | 
| 29 30 | 
             
                  span= " or "
         | 
| 30 | 
            -
                  = link_to t("helpers.reset"),  | 
| 31 | 
            +
                  = link_to t("helpers.reset"), filter_form.url
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            - named_filter_param = params[:named_filter]
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            dl.sub-nav
         | 
| 4 | 
            +
              dd(class=("active" unless named_filter_param.present?))
         | 
| 5 | 
            +
                 = link_to t(".tab.all"), hd_mdm_patients_path
         | 
| 6 | 
            +
              - %i(on_worryboard).each do |filter|
         | 
| 7 | 
            +
                dd(class=("active" if named_filter_param == filter.to_s))
         | 
| 8 | 
            +
                  = link_to t(".tab.#{filter}"), hd_filtered_mdm_patients_path(named_filter: filter)
         | 
| @@ -1,6 +1,9 @@ | |
| 1 1 | 
             
            = content_for(:filters) do
         | 
| 2 2 | 
             
              = render_if_exists "filters", presenter: presenter, filter_form: filter_form
         | 
| 3 3 |  | 
| 4 | 
            +
            = content_for(:tabs) do
         | 
| 5 | 
            +
              = render_if_exists "tabs", presenter: presenter
         | 
| 6 | 
            +
             | 
| 4 7 | 
             
            = within_admin_layout(title: presenter.page_title)
         | 
| 5 8 | 
             
              = render "table", presenter: presenter
         | 
| 6 9 | 
             
              = paginate presenter.patients
         | 
| @@ -0,0 +1,8 @@ | |
| 1 | 
            +
            - named_filter_param = params[:named_filter]
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            dl.sub-nav
         | 
| 4 | 
            +
              dd(class=("active" unless named_filter_param.present?))
         | 
| 5 | 
            +
                 = link_to t(".tab.all"), pd_mdm_patients_path
         | 
| 6 | 
            +
              - %i(on_worryboard).each do |filter|
         | 
| 7 | 
            +
                dd(class=("active" if named_filter_param == filter.to_s))
         | 
| 8 | 
            +
                  = link_to t(".tab.#{filter}"), pd_filtered_mdm_patients_path(named_filter: filter)
         | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            dl.sub-nav
         | 
| 2 | 
            +
              dd= link_to "Summary", research_study_path(study)
         | 
| 3 | 
            +
              dd
         | 
| 4 | 
            +
                = link_to edit_research_study_path(study) do
         | 
| 5 | 
            +
                  i.fas.fa-cogs
         | 
| 6 | 
            +
                  | Settings
         | 
| 7 | 
            +
              dd
         | 
| 8 | 
            +
                = link_to research_study_participants_path(study) do
         | 
| 9 | 
            +
                  i.fas.fa-users
         | 
| 10 | 
            +
                  | Participants
         | 
| 11 | 
            +
              / dd(class=("active" if params.fetch(:q, {})[:expired]))
         | 
| 12 | 
            +
              /   = link_to "Members", admin_expired_users_path
         | 
| @@ -1,5 +1,29 @@ | |
| 1 | 
            -
            =  | 
| 1 | 
            +
            = content_for(:tabs) do
         | 
| 2 | 
            +
              = render "tabs", study: study
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            = within_admin_layout(title: study.code,
         | 
| 2 5 | 
             
                                  breadcrumbs: breadcrumb_for("Clinical Studies",
         | 
| 3 6 | 
             
                                               research_studies_path)) do
         | 
| 4 7 |  | 
| 5 8 | 
             
              = render "form", study: study
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              br
         | 
| 11 | 
            +
              hr
         | 
| 12 | 
            +
              br
         | 
| 13 | 
            +
              .panel.danger-zone
         | 
| 14 | 
            +
                h4 Danger zone
         | 
| 15 | 
            +
                br
         | 
| 16 | 
            +
                - super_admin = current_user.has_role?(:super_admin)
         | 
| 17 | 
            +
                - if super_admin
         | 
| 18 | 
            +
                  p= link_to "Delete this study",
         | 
| 19 | 
            +
                          research_study_path(study),
         | 
| 20 | 
            +
                          method: :delete,
         | 
| 21 | 
            +
                          data: { confirm: "Are you sure you want to delete this study?", disable: true },
         | 
| 22 | 
            +
                          class: "button"
         | 
| 23 | 
            +
                - else
         | 
| 24 | 
            +
                  p= link_to "Delete this study",
         | 
| 25 | 
            +
                          "#",
         | 
| 26 | 
            +
                          class: "button",
         | 
| 27 | 
            +
                          disabled: true
         | 
| 28 | 
            +
                  p
         | 
| 29 | 
            +
                    i You need to have the super_admin role to delete a study
         | 
| @@ -8,30 +8,24 @@ | |
| 8 8 | 
             
              table
         | 
| 9 9 | 
             
                thead
         | 
| 10 10 | 
             
                  tr
         | 
| 11 | 
            -
                    th | 
| 12 | 
            -
                    th.col-width-date= sort_link(query, :terminated_on, "Terminated")
         | 
| 11 | 
            +
                    th
         | 
| 13 12 | 
             
                    th.col-width-small= sort_link(query, :code, "Code")
         | 
| 14 13 | 
             
                    th Description
         | 
| 15 14 | 
             
                    th= sort_link(query, :code, "Leader")
         | 
| 16 15 | 
             
                    th Participants
         | 
| 17 | 
            -
                    th
         | 
| 16 | 
            +
                    th.col-width-date= sort_link(query, :started_on, "Started")
         | 
| 17 | 
            +
                    th.col-width-date= sort_link(query, :terminated_on, "Terminated")
         | 
| 18 | 
            +
             | 
| 18 19 | 
             
                tbody
         | 
| 19 20 | 
             
                  - studies.each do |study|
         | 
| 20 21 | 
             
                    tr
         | 
| 21 | 
            -
                      td | 
| 22 | 
            -
             | 
| 22 | 
            +
                      td.actions.left
         | 
| 23 | 
            +
                        = link_to "View", research_study_path(study)
         | 
| 23 24 | 
             
                      td= study.code
         | 
| 24 | 
            -
                      td= study.description
         | 
| 25 | 
            +
                      td= study.description.truncate(60)
         | 
| 25 26 | 
             
                      td= study.leader
         | 
| 26 27 | 
             
                      td= study.participants.count
         | 
| 27 | 
            -
                      td. | 
| 28 | 
            -
             | 
| 29 | 
            -
                                  research_study_path(study),
         | 
| 30 | 
            -
                                  method: :delete,
         | 
| 31 | 
            -
                                  data: { confirm: "Are you sure you want to delete this study?" }
         | 
| 32 | 
            -
                        = " | "
         | 
| 33 | 
            -
                        = link_to "Edit", edit_research_study_path(study)
         | 
| 34 | 
            -
                        = " | "
         | 
| 35 | 
            -
                        = link_to "View Participants", research_study_participants_path(study)
         | 
| 28 | 
            +
                      td= l(study.started_on)
         | 
| 29 | 
            +
                      td= l(study.terminated_on)
         | 
| 36 30 |  | 
| 37 31 | 
             
              = paginate studies
         | 
| @@ -1,18 +1,14 @@ | |
| 1 | 
            -
            = content_for(: | 
| 2 | 
            -
              =  | 
| 1 | 
            +
            = content_for(:tabs) do
         | 
| 2 | 
            +
              = render "tabs", study: study
         | 
| 3 3 |  | 
| 4 4 | 
             
            = within_admin_layout(title: study.code,
         | 
| 5 5 | 
             
                                  breadcrumbs: breadcrumb_for("Clinical Studies",
         | 
| 6 6 | 
             
                                               research_studies_path)) do
         | 
| 7 7 |  | 
| 8 | 
            -
               | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
                   | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                tbody
         | 
| 16 | 
            -
                  - study.participants.each do |participant|
         | 
| 17 | 
            -
                    tr
         | 
| 18 | 
            -
                      td= participant
         | 
| 8 | 
            +
              - if study.description.present?
         | 
| 9 | 
            +
                p.panel.radius.compact
         | 
| 10 | 
            +
                  = "Description: #{study.description}"
         | 
| 11 | 
            +
                  br
         | 
| 12 | 
            +
                  = "Started on: #{l(study.started_on)}"
         | 
| 13 | 
            +
                  br
         | 
| 14 | 
            +
                  = "Leader: #{study.leader}"
         | 
| @@ -8,6 +8,6 @@ | |
| 8 8 | 
             
                    = f.input :identity_match, label: "Search by Hosp/NHS no or name"
         | 
| 9 9 |  | 
| 10 10 | 
             
                  .columns.medium-4.actions.end
         | 
| 11 | 
            -
                    = f.submit t("helpers.submit.filter"), class: "button", name: nil
         | 
| 11 | 
            +
                    = f.submit t("helpers.submit.filter"), class: "button secondary", name: nil
         | 
| 12 12 | 
             
                    span= " or "
         | 
| 13 13 | 
             
                    = link_to t("helpers.reset"), research_study_participants_path(study)
         | 
| @@ -1,44 +1,19 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 1 | 
            +
            = simple_form_for(participant,
         | 
| 2 | 
            +
                              url: url,
         | 
| 3 | 
            +
                              html: { autocomplete: "off" },
         | 
| 4 | 
            +
                              wrapper: :horizontal_form) do |f|
         | 
| 5 | 
            +
              - if participant.persisted?
         | 
| 6 | 
            +
                h5= participant.patient.to_s(:long)
         | 
| 7 | 
            +
              - else
         | 
| 8 | 
            +
                #patient-select2
         | 
| 9 | 
            +
                  = f.input :participant_id,
         | 
| 10 | 
            +
                                collection: [],
         | 
| 11 | 
            +
                                input_html: { \
         | 
| 12 | 
            +
                                  class: "patient-id-select2 patient-ajax-search",
         | 
| 13 | 
            +
                                  data: { "ajax--url" => search_patients_path(format: :json),
         | 
| 14 | 
            +
                                          placeholder: "Search by patient name or hospital/NHS no." } \
         | 
| 15 | 
            +
                                }
         | 
| 11 16 |  | 
| 12 | 
            -
              . | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                = simple_form_for(participant,
         | 
| 16 | 
            -
                                  url: url,
         | 
| 17 | 
            -
                                  remote: true,
         | 
| 18 | 
            -
                                  html: { autocomplete: "off" },
         | 
| 19 | 
            -
                                  wrapper: :horizontal_form) do |f|
         | 
| 20 | 
            -
                  - if participant.persisted?
         | 
| 21 | 
            -
                    h5= participant.patient.to_s(:long)
         | 
| 22 | 
            -
                  - else
         | 
| 23 | 
            -
                    = f.input :participant_id,
         | 
| 24 | 
            -
                                  collection: [],
         | 
| 25 | 
            -
                                  input_html: { \
         | 
| 26 | 
            -
                                    class: "patient-id-select2 patient-ajax-search",
         | 
| 27 | 
            -
                                    data: { "ajax--url" => search_patients_path(format: :json),
         | 
| 28 | 
            -
                                            placeholder: "Search by patient name or hospital/NHS no." } \
         | 
| 29 | 
            -
                                  }
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  = f.input :joined_on, as: :date_picker
         | 
| 32 | 
            -
                  = f.input :left_on, as: :date_picker
         | 
| 33 | 
            -
             | 
| 34 | 
            -
                  = f.submit "Add", class: :button
         | 
| 35 | 
            -
                  span= " or "
         | 
| 36 | 
            -
                  = link_to "Cancel",
         | 
| 37 | 
            -
                           "#",
         | 
| 38 | 
            -
                           "aria-label" => "Close",
         | 
| 39 | 
            -
                            class: "reveal-modal-close"
         | 
| 40 | 
            -
             | 
| 41 | 
            -
              .modal__footer
         | 
| 42 | 
            -
             | 
| 43 | 
            -
            javascript:
         | 
| 44 | 
            -
              $(document).ready(Renalware.Research.init);
         | 
| 17 | 
            +
              = f.input :joined_on, as: :date_picker
         | 
| 18 | 
            +
              = f.input :left_on, as: :date_picker
         | 
| 19 | 
            +
              = save_or_cancel(form: f, back_path: research_study_participants_path(participant.study))
         | 
| @@ -1 +1,7 @@ | |
| 1 | 
            -
            =  | 
| 1 | 
            +
            = within_admin_layout(title: "Edit",
         | 
| 2 | 
            +
                                  breadcrumbs: breadcrumb_for("Clinical Studies",
         | 
| 3 | 
            +
                                               research_studies_path)) do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              = render "form",
         | 
| 6 | 
            +
                       participant: participant,
         | 
| 7 | 
            +
                       url: research_study_participant_path(participant.study, participant)
         | 
| @@ -1,28 +1,14 @@ | |
| 1 | 
            -
            = content_for(:actions) do
         | 
| 2 | 
            -
              = link_to("Add",
         | 
| 3 | 
            -
                        new_research_study_participant_path,
         | 
| 4 | 
            -
                        id: "add-study-participants",
         | 
| 5 | 
            -
                        class: :button,
         | 
| 6 | 
            -
                        data: { "reveal-id" => "study-participant-modal", "reveal-ajax" => "true" })
         | 
| 7 | 
            -
             | 
| 8 1 | 
             
            = content_for(:filters) do
         | 
| 2 | 
            +
              = link_to(new_research_study_participant_path, class: :button) do
         | 
| 3 | 
            +
                i.fas.fa-plus
         | 
| 4 | 
            +
                | Add
         | 
| 9 5 | 
             
              = render "filters", study: study, query: query
         | 
| 10 6 |  | 
| 11 | 
            -
            =  | 
| 12 | 
            -
               | 
| 13 | 
            -
              breadcrumbs: [\
         | 
| 14 | 
            -
                breadcrumb_for("Clinical Studies", research_studies_path),
         | 
| 15 | 
            -
                breadcrumb_for(study.code, edit_research_study_path(study))\
         | 
| 16 | 
            -
              ]) do
         | 
| 7 | 
            +
            = content_for(:tabs) do
         | 
| 8 | 
            +
              = render "renalware/research/studies/tabs", study: study
         | 
| 17 9 |  | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
                  br
         | 
| 22 | 
            -
                  = "Started on: #{l(study.started_on)}"
         | 
| 23 | 
            -
                  br
         | 
| 24 | 
            -
                  = "Leader: #{study.leader}"
         | 
| 10 | 
            +
            = within_admin_layout(\
         | 
| 11 | 
            +
              title: study.code,
         | 
| 12 | 
            +
              breadcrumbs: breadcrumb_for("Clinical Studies", research_studies_path)) do
         | 
| 25 13 |  | 
| 26 14 | 
             
              = render "table", study: study, participants: participants, query: query
         | 
| 27 | 
            -
             | 
| 28 | 
            -
              #study-participant-modal.reveal-modal.small(data-reveal)
         | 
| @@ -1 +1,7 @@ | |
| 1 | 
            -
            =  | 
| 1 | 
            +
            = within_admin_layout(title: "Add Participant",
         | 
| 2 | 
            +
                                  breadcrumbs: breadcrumb_for("Clinical Studies",
         | 
| 3 | 
            +
                                               research_studies_path)) do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              = render "form",
         | 
| 6 | 
            +
                       participant: participant,
         | 
| 7 | 
            +
                       url: research_study_participants_path(participant.study)
         | 
    
        data/config/routes.rb
    CHANGED
    
    | @@ -95,7 +95,7 @@ Renalware::Engine.routes.draw do | |
| 95 95 | 
             
              end
         | 
| 96 96 |  | 
| 97 97 | 
             
              namespace :research do
         | 
| 98 | 
            -
                resources :studies | 
| 98 | 
            +
                resources :studies do
         | 
| 99 99 | 
             
                  resources :participants, controller: :study_participants
         | 
| 100 100 | 
             
                end
         | 
| 101 101 | 
             
              end
         | 
| @@ -162,6 +162,10 @@ Renalware::Engine.routes.draw do | |
| 162 162 | 
             
                resources :dialysates, except: :show
         | 
| 163 163 | 
             
                resource :ongoing_sessions, only: :show
         | 
| 164 164 | 
             
                resources :mdm_patients, only: :index
         | 
| 165 | 
            +
                resources :mdm_patients, only: :index
         | 
| 166 | 
            +
                constraints(named_filter: /(on_worryboard)/) do
         | 
| 167 | 
            +
                  get "mdm_patients/:named_filter", to: "mdm_patients#index", as: :filtered_mdm_patients
         | 
| 168 | 
            +
                end
         | 
| 165 169 | 
             
                resources :unmet_preferences, only: :index
         | 
| 166 170 | 
             
                resources :units, only: [] do
         | 
| 167 171 | 
             
                  resources :stations do
         | 
| @@ -240,6 +244,9 @@ Renalware::Engine.routes.draw do | |
| 240 244 | 
             
                resources :bag_types, except: [:show]
         | 
| 241 245 | 
             
                resources :infection_organisms
         | 
| 242 246 | 
             
                resources :mdm_patients, only: :index
         | 
| 247 | 
            +
                constraints(named_filter: /(on_worryboard)/) do
         | 
| 248 | 
            +
                  get "mdm_patients/:named_filter", to: "mdm_patients#index", as: :filtered_mdm_patients
         | 
| 249 | 
            +
                end
         | 
| 243 250 | 
             
              end
         | 
| 244 251 |  | 
| 245 252 | 
             
              namespace :renal do
         | 
| @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            # This migration comes from active_storage (originally 20170806125915)
         | 
| 2 | 
            +
            class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
         | 
| 3 | 
            +
              def change
         | 
| 4 | 
            +
                create_table :active_storage_blobs do |t|
         | 
| 5 | 
            +
                  t.string   :key,        null: false
         | 
| 6 | 
            +
                  t.string   :filename,   null: false
         | 
| 7 | 
            +
                  t.string   :content_type
         | 
| 8 | 
            +
                  t.text     :metadata
         | 
| 9 | 
            +
                  t.bigint   :byte_size,  null: false
         | 
| 10 | 
            +
                  t.string   :checksum,   null: false
         | 
| 11 | 
            +
                  t.datetime :created_at, null: false
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  t.index [:key], unique: true
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                create_table :active_storage_attachments do |t|
         | 
| 17 | 
            +
                  t.string     :name,     null: false
         | 
| 18 | 
            +
                  t.references :record,   null: false, polymorphic: true, index: false
         | 
| 19 | 
            +
                  t.references :blob,     null: false
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  t.datetime :created_at, null: false
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  t.index [:record_type, :record_id, :name, :blob_id], name: "index_active_storage_attachments_uniqueness", unique: true
         | 
| 24 | 
            +
                  t.foreign_key :active_storage_blobs, column: :blob_id
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
            end
         | 
    
        data/lib/renalware/version.rb
    CHANGED
    
    
| @@ -1,5 +1,27 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            FactoryBot.define do
         | 
| 4 | 
            -
              factory :hd_patient, class: "Renalware::HD::Patient", parent: :patient
         | 
| 4 | 
            +
              factory :hd_patient, class: "Renalware::HD::Patient", parent: :patient do
         | 
| 5 | 
            +
                trait :with_hd_modality do
         | 
| 6 | 
            +
                  after(:create) do |instance|
         | 
| 7 | 
            +
                    # This a rather clumsy approach to trying to re-use the set_modality helper
         | 
| 8 | 
            +
                    # in PatientsSpecHelper; we can't include the module here so I am creating
         | 
| 9 | 
            +
                    # a contrived class so I can mix in PatientsSpecHelper.
         | 
| 10 | 
            +
                    # Other options here
         | 
| 11 | 
            +
                    # https://github.com/thoughtbot/factory_bot/issues/564#issuecomment-157669866
         | 
| 12 | 
            +
                    class ModalityMaker
         | 
| 13 | 
            +
                      include PatientsSpecHelper
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                      def call(patient)
         | 
| 16 | 
            +
                        set_modality(
         | 
| 17 | 
            +
                          patient: patient,
         | 
| 18 | 
            +
                          modality_description: FactoryBot.create(:hd_modality_description),
         | 
| 19 | 
            +
                          by: patient.created_by
         | 
| 20 | 
            +
                        )
         | 
| 21 | 
            +
                      end
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                    ModalityMaker.new.call(instance)
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 5 27 | 
             
            end
         | 
| @@ -1,5 +1,27 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            FactoryBot.define do
         | 
| 4 | 
            -
              factory :pd_patient, class: "Renalware::PD::Patient", parent: :patient
         | 
| 4 | 
            +
              factory :pd_patient, class: "Renalware::PD::Patient", parent: :patient do
         | 
| 5 | 
            +
                trait :with_pd_modality do
         | 
| 6 | 
            +
                  after(:create) do |instance|
         | 
| 7 | 
            +
                    # This a rather clumsy approach to trying to re-use the set_modality helper
         | 
| 8 | 
            +
                    # in PatientsSpecHelper; we can't include the module here so I am creating
         | 
| 9 | 
            +
                    # a contrived class so I can mix in PatientsSpecHelper.
         | 
| 10 | 
            +
                    # Other options here
         | 
| 11 | 
            +
                    # https://github.com/thoughtbot/factory_bot/issues/564#issuecomment-157669866
         | 
| 12 | 
            +
                    class ModalityMaker
         | 
| 13 | 
            +
                      include PatientsSpecHelper
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                      def call(patient)
         | 
| 16 | 
            +
                        set_modality(
         | 
| 17 | 
            +
                          patient: patient,
         | 
| 18 | 
            +
                          modality_description: FactoryBot.create(:pd_modality_description),
         | 
| 19 | 
            +
                          by: patient.created_by
         | 
| 20 | 
            +
                        )
         | 
| 21 | 
            +
                      end
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
                    ModalityMaker.new.call(instance)
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
              end
         | 
| 5 27 | 
             
            end
         | 
| @@ -8,6 +8,9 @@ RSpec.configure do |config| | |
| 8 8 | 
             
              config.include LoginMacros, type: :controller
         | 
| 9 9 |  | 
| 10 10 | 
             
              config.include Warden::Test::Helpers, type: :feature
         | 
| 11 | 
            +
              config.include Warden::Test::Helpers, type: :system
         | 
| 12 | 
            +
              config.include Devise::Test::IntegrationHelpers, type: :system
         | 
| 13 | 
            +
              config.include LoginMacros, type: :system
         | 
| 11 14 | 
             
              config.include LoginMacros, type: :feature
         | 
| 12 15 |  | 
| 13 16 | 
             
              config.include Warden::Test::Helpers, type: :request
         | 
    
        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.68
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Airslie
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019-01- | 
| 11 | 
            +
            date: 2019-01-09 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: active_type
         | 
| @@ -30,14 +30,14 @@ dependencies: | |
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - "~>"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: 0. | 
| 33 | 
            +
                    version: 0.28.0
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - "~>"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: 0. | 
| 40 | 
            +
                    version: 0.28.0
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: ahoy_matey
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -282,14 +282,14 @@ dependencies: | |
| 282 282 | 
             
                requirements:
         | 
| 283 283 | 
             
                - - "~>"
         | 
| 284 284 | 
             
                  - !ruby/object:Gem::Version
         | 
| 285 | 
            -
                    version: 5. | 
| 285 | 
            +
                    version: 5.6.1
         | 
| 286 286 | 
             
              type: :runtime
         | 
| 287 287 | 
             
              prerelease: false
         | 
| 288 288 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 289 289 | 
             
                requirements:
         | 
| 290 290 | 
             
                - - "~>"
         | 
| 291 291 | 
             
                  - !ruby/object:Gem::Version
         | 
| 292 | 
            -
                    version: 5. | 
| 292 | 
            +
                    version: 5.6.1
         | 
| 293 293 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 294 294 | 
             
              name: foundation-rails
         | 
| 295 295 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -310,14 +310,14 @@ dependencies: | |
| 310 310 | 
             
                requirements:
         | 
| 311 311 | 
             
                - - "~>"
         | 
| 312 312 | 
             
                  - !ruby/object:Gem::Version
         | 
| 313 | 
            -
                    version: 5.2. | 
| 313 | 
            +
                    version: 5.2.5
         | 
| 314 314 | 
             
              type: :runtime
         | 
| 315 315 | 
             
              prerelease: false
         | 
| 316 316 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 317 317 | 
             
                requirements:
         | 
| 318 318 | 
             
                - - "~>"
         | 
| 319 319 | 
             
                  - !ruby/object:Gem::Version
         | 
| 320 | 
            -
                    version: 5.2. | 
| 320 | 
            +
                    version: 5.2.5
         | 
| 321 321 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 322 322 | 
             
              name: hashdiff
         | 
| 323 323 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -758,14 +758,14 @@ dependencies: | |
| 758 758 | 
             
                requirements:
         | 
| 759 759 | 
             
                - - "~>"
         | 
| 760 760 | 
             
                  - !ruby/object:Gem::Version
         | 
| 761 | 
            -
                    version: 2.0. | 
| 761 | 
            +
                    version: 2.0.5
         | 
| 762 762 | 
             
              type: :runtime
         | 
| 763 763 | 
             
              prerelease: false
         | 
| 764 764 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 765 765 | 
             
                requirements:
         | 
| 766 766 | 
             
                - - "~>"
         | 
| 767 767 | 
             
                  - !ruby/object:Gem::Version
         | 
| 768 | 
            -
                    version: 2.0. | 
| 768 | 
            +
                    version: 2.0.5
         | 
| 769 769 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 770 770 | 
             
              name: slim-rails
         | 
| 771 771 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -986,7 +986,6 @@ files: | |
| 986 986 | 
             
            - app/assets/javascripts/renalware/problems.js
         | 
| 987 987 | 
             
            - app/assets/javascripts/renalware/renal.js
         | 
| 988 988 | 
             
            - app/assets/javascripts/renalware/reporting.js.erb
         | 
| 989 | 
            -
            - app/assets/javascripts/renalware/research.js
         | 
| 990 989 | 
             
            - app/assets/javascripts/renalware/searchables.js
         | 
| 991 990 | 
             
            - app/assets/javascripts/renalware/select2-ajax-search.js
         | 
| 992 991 | 
             
            - app/assets/javascripts/renalware/session_timeout_redirect.js.erb
         | 
| @@ -2240,6 +2239,7 @@ files: | |
| 2240 2239 | 
             
            - app/views/renalware/hd/mdm_patients/_filters.html.slim
         | 
| 2241 2240 | 
             
            - app/views/renalware/hd/mdm_patients/_patient.html.slim
         | 
| 2242 2241 | 
             
            - app/views/renalware/hd/mdm_patients/_table.html.slim
         | 
| 2242 | 
            +
            - app/views/renalware/hd/mdm_patients/_tabs.html.slim
         | 
| 2243 2243 | 
             
            - app/views/renalware/hd/mdm_patients/index.html.slim
         | 
| 2244 2244 | 
             
            - app/views/renalware/hd/ongoing_sessions/_filters.html.slim
         | 
| 2245 2245 | 
             
            - app/views/renalware/hd/ongoing_sessions/_session.html.slim
         | 
| @@ -2587,6 +2587,7 @@ files: | |
| 2587 2587 | 
             
            - app/views/renalware/pd/infection_organisms/update.js.erb
         | 
| 2588 2588 | 
             
            - app/views/renalware/pd/mdm/_summary.html.slim
         | 
| 2589 2589 | 
             
            - app/views/renalware/pd/mdm/_top.html.slim
         | 
| 2590 | 
            +
            - app/views/renalware/pd/mdm_patients/_tabs.html.slim
         | 
| 2590 2591 | 
             
            - app/views/renalware/pd/peritonitis_episodes/_details.html.slim
         | 
| 2591 2592 | 
             
            - app/views/renalware/pd/peritonitis_episodes/_fields.html.slim
         | 
| 2592 2593 | 
             
            - app/views/renalware/pd/peritonitis_episodes/_form.html.slim
         | 
| @@ -2663,6 +2664,7 @@ files: | |
| 2663 2664 | 
             
            - app/views/renalware/research/_alerts.html.slim
         | 
| 2664 2665 | 
             
            - app/views/renalware/research/studies/_filters.html.slim
         | 
| 2665 2666 | 
             
            - app/views/renalware/research/studies/_form.html.slim
         | 
| 2667 | 
            +
            - app/views/renalware/research/studies/_tabs.html.slim
         | 
| 2666 2668 | 
             
            - app/views/renalware/research/studies/edit.html.slim
         | 
| 2667 2669 | 
             
            - app/views/renalware/research/studies/index.html.slim
         | 
| 2668 2670 | 
             
            - app/views/renalware/research/studies/new.html.slim
         | 
| @@ -2670,12 +2672,9 @@ files: | |
| 2670 2672 | 
             
            - app/views/renalware/research/study_participants/_filters.html.slim
         | 
| 2671 2673 | 
             
            - app/views/renalware/research/study_participants/_form.html.slim
         | 
| 2672 2674 | 
             
            - app/views/renalware/research/study_participants/_table.html.slim
         | 
| 2673 | 
            -
            - app/views/renalware/research/study_participants/create.js.erb
         | 
| 2674 2675 | 
             
            - app/views/renalware/research/study_participants/edit.html.slim
         | 
| 2675 2676 | 
             
            - app/views/renalware/research/study_participants/index.html.slim
         | 
| 2676 2677 | 
             
            - app/views/renalware/research/study_participants/new.html.slim
         | 
| 2677 | 
            -
            - app/views/renalware/research/study_participants/new.js.erb
         | 
| 2678 | 
            -
            - app/views/renalware/research/study_participants/update.js.erb
         | 
| 2679 2678 | 
             
            - app/views/renalware/shared/_attributes_group.html.slim
         | 
| 2680 2679 | 
             
            - app/views/renalware/shared/_attributes_list.html.slim
         | 
| 2681 2680 | 
             
            - app/views/renalware/shared/_error_messages.html.slim
         | 
| @@ -3384,6 +3383,7 @@ files: | |
| 3384 3383 | 
             
            - db/migrate/20181126090401_add_warnings_to_hd_transmission_logs.rb
         | 
| 3385 3384 | 
             
            - db/migrate/20181126123745_refresh_hd_grouped_transmission_logs_view.rb
         | 
| 3386 3385 | 
             
            - db/migrate/20181217124025_change_ukrdc_transmission_log_error_type.rb
         | 
| 3386 | 
            +
            - db/migrate/20190104095254_create_active_storage_tables.active_storage.rb
         | 
| 3387 3387 | 
             
            - db/seeds.rb
         | 
| 3388 3388 | 
             
            - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.csv
         | 
| 3389 3389 | 
             
            - db/seeds/default/accesses/access_pd_catheter_insertion_techniques.rb
         | 
| @@ -3705,7 +3705,6 @@ files: | |
| 3705 3705 | 
             
            - spec/factories/transplants/registrations.rb
         | 
| 3706 3706 | 
             
            - spec/factories/virology/patients.rb
         | 
| 3707 3707 | 
             
            - spec/factories/virology/vaccinations.rb
         | 
| 3708 | 
            -
            - spec/support/capybara.rb
         | 
| 3709 3708 | 
             
            - spec/support/capybara_helper.rb
         | 
| 3710 3709 | 
             
            - spec/support/database_functions_spec_helper.rb
         | 
| 3711 3710 | 
             
            - spec/support/date_helpers.rb
         | 
| @@ -3726,7 +3725,6 @@ files: | |
| 3726 3725 | 
             
            - spec/support/patients_spec_helper.rb
         | 
| 3727 3726 | 
             
            - spec/support/pundit_matcher.rb
         | 
| 3728 3727 | 
             
            - spec/support/roles_spec_helper.rb
         | 
| 3729 | 
            -
            - spec/support/select2_spec_helper.rb
         | 
| 3730 3728 | 
             
            - spec/support/select_date_spec_helper.rb
         | 
| 3731 3729 | 
             
            - spec/support/shared_contexts/a_global_rule_set.rb
         | 
| 3732 3730 | 
             
            - spec/support/shared_examples/accountable_examples.rb
         | 
| @@ -1,18 +0,0 @@ | |
| 1 | 
            -
            var Renalware = typeof Renalware === 'undefined' ? {} : Renalware;
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            Renalware.Research = (function() {
         | 
| 4 | 
            -
              var focusPatientInput = function() {
         | 
| 5 | 
            -
                $('.patient-ajax-search').select2('open');
         | 
| 6 | 
            -
                $('select2-patient-ajax-search-container .select2-search__field').focus();
         | 
| 7 | 
            -
              };
         | 
| 8 | 
            -
             | 
| 9 | 
            -
              return {
         | 
| 10 | 
            -
                init: function () {
         | 
| 11 | 
            -
                  initDatepickersIn(".modal");
         | 
| 12 | 
            -
                  Renalware.PatientSearch.init();
         | 
| 13 | 
            -
                  focusPatientInput();
         | 
| 14 | 
            -
                }
         | 
| 15 | 
            -
              };
         | 
| 16 | 
            -
            }());
         | 
| 17 | 
            -
             | 
| 18 | 
            -
            $(document).on('opened.fndtn.reveal', '#study-participant-modal', Renalware.Research.init);
         | 
| @@ -1,4 +0,0 @@ | |
| 1 | 
            -
            // We render this view if there was a validation error submitting the foundation reveal modal.
         | 
| 2 | 
            -
            // Replace the original content so that error messages are displayed.
         | 
| 3 | 
            -
            var modal = $("#study-participant-modal")
         | 
| 4 | 
            -
            $(modal).html("<%= j(render 'form', participant: participant) %>");
         | 
    
        data/spec/support/capybara.rb
    DELETED
    
    | @@ -1,23 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            # # frozen_string_literal: true
         | 
| 4 | 
            -
            if defined?(Capybara)
         | 
| 5 | 
            -
              Capybara.register_driver(:headless_chrome) do |app|
         | 
| 6 | 
            -
                capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
         | 
| 7 | 
            -
                  chromeOptions: { args: %w(headless disable-gpu window-size=1366,1768) }
         | 
| 8 | 
            -
                )
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                Capybara::Selenium::Driver.new(
         | 
| 11 | 
            -
                  app,
         | 
| 12 | 
            -
                  browser: :chrome,
         | 
| 13 | 
            -
                  desired_capabilities: capabilities
         | 
| 14 | 
            -
                )
         | 
| 15 | 
            -
              end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
              if RUBY_PLATFORM.match?(/darwin/)
         | 
| 18 | 
            -
                Capybara::Screenshot.register_driver(:headless_chrome) do |driver, path|
         | 
| 19 | 
            -
                  driver.browser.save_screenshot(path)
         | 
| 20 | 
            -
                end
         | 
| 21 | 
            -
              end
         | 
| 22 | 
            -
              Capybara.javascript_driver = :headless_chrome
         | 
| 23 | 
            -
            end
         | 
| @@ -1,47 +0,0 @@ | |
| 1 | 
            -
            # frozen_string_literal: true
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            module Select2SpecHelper
         | 
| 4 | 
            -
              def select2(value, opts)
         | 
| 5 | 
            -
                scope = opts[:from]
         | 
| 6 | 
            -
                select2_container = first("#{scope} + .select2-container")
         | 
| 7 | 
            -
                select2_container.first(".select2-selection").click
         | 
| 8 | 
            -
             | 
| 9 | 
            -
                first("input.select2-search__field").set(value)
         | 
| 10 | 
            -
                page.execute_script(%|$("#{scope} ~ input.select2-search__field:visible").keyup();|)
         | 
| 11 | 
            -
                body = find(:xpath, "//body")
         | 
| 12 | 
            -
                matches = body.find_all(".select2-results li", text: value)
         | 
| 13 | 
            -
                matches.last.click
         | 
| 14 | 
            -
              end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
              # select2_ajax helper to make capybara work with ajax-enabled Select2 elements
         | 
| 17 | 
            -
              # assumes 'placeholder' option is used in Select2 (if it is using ajax, it should be)
         | 
| 18 | 
            -
              #
         | 
| 19 | 
            -
              # usage:
         | 
| 20 | 
            -
              #
         | 
| 21 | 
            -
              #    it "should have a select2 field for searching by team name" do
         | 
| 22 | 
            -
              #        @team = Factory :team
         | 
| 23 | 
            -
              #        select2_ajax @team.name, from: "Select a Team", minlength: 4
         | 
| 24 | 
            -
              #        click_button "Join"
         | 
| 25 | 
            -
              #        page.should have_content "You are now on '#{@team.name}'."
         | 
| 26 | 
            -
              #    end
         | 
| 27 | 
            -
              # Thx to https://gist.github.com/sbeam/3849340
         | 
| 28 | 
            -
              def select2_ajax(value, options = {})
         | 
| 29 | 
            -
                if !options.is_a?(Hash) || !options.key?(:from)
         | 
| 30 | 
            -
                  raise "Must pass a hash containing 'from'"
         | 
| 31 | 
            -
                end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
                placeholder = options[:from]
         | 
| 34 | 
            -
                minlength = options[:minlength] || 4
         | 
| 35 | 
            -
             | 
| 36 | 
            -
                # click_link placeholder
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                page.find(:xpath, "//*[text()='#{placeholder}']").click
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                js = %Q|container = $('.select2-container:contains("#{placeholder}")');
         | 
| 41 | 
            -
                        $('input[type=text]', container).val('#{value[0, minlength]}').trigger('keyup');
         | 
| 42 | 
            -
                        window.setTimeout( function() {
         | 
| 43 | 
            -
                          $('li:contains("#{value}")', container).click();
         | 
| 44 | 
            -
                        }, 5000);|
         | 
| 45 | 
            -
                page.execute_script(js)
         | 
| 46 | 
            -
              end
         | 
| 47 | 
            -
            end
         |