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
|