metadata_presenter 1.2.1 → 1.5.0
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/controllers/metadata_presenter/answers_controller.rb +31 -4
- data/app/models/metadata_presenter/component.rb +5 -1
- data/app/models/metadata_presenter/condition.rb +13 -0
- data/app/models/metadata_presenter/criteria.rb +25 -0
- data/app/models/metadata_presenter/evaluate_conditions.rb +29 -0
- data/app/models/metadata_presenter/file_uploader.rb +24 -0
- data/app/models/metadata_presenter/flow.rb +17 -0
- data/app/models/metadata_presenter/next_page.rb +53 -8
- data/app/models/metadata_presenter/offline_upload_adapter.rb +10 -0
- data/app/models/metadata_presenter/page.rb +4 -0
- data/app/models/metadata_presenter/page_answers.rb +2 -0
- data/app/models/metadata_presenter/service.rb +6 -0
- data/app/models/metadata_presenter/uploaded_file.rb +14 -0
- data/app/operators/metadata_presenter/base_operator.rb +20 -0
- data/app/operators/metadata_presenter/is_answered_operator.rb +7 -0
- data/app/operators/metadata_presenter/is_not_answered_operator.rb +7 -0
- data/app/operators/metadata_presenter/is_not_operator.rb +11 -0
- data/app/operators/metadata_presenter/is_operator.rb +11 -0
- data/app/operators/metadata_presenter/operator.rb +29 -0
- data/app/views/metadata_presenter/component/_upload.html.erb +1 -1
- data/config/initializers/inflections.rb +3 -0
- data/config/routes.rb +4 -1
- data/default_metadata/component/upload.json +1 -0
- data/fixtures/branching.json +883 -0
- data/lib/metadata_presenter/version.rb +1 -1
- data/lib/tasks/metadata_presenter_tasks.rake +52 -4
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aaea9e08a797416b551fd731c80db49d05f02f75f4ac61ecf68c5861d55af9a3
|
4
|
+
data.tar.gz: e3938447849a5197cc3567c55caacdf0eea2e80e1e4eb05b42e175850d9b34cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f9ac675b0c24ca6ea9a1a9556b13a1151d499750e8aa16d3fbfc5981ac2a93cb99acc03939a188886eaf1254930bcdc1634fd44461b4345ec029a0243bd4d73
|
7
|
+
data.tar.gz: bf12bf7eefe0f0376fe67801fa74507d0a8267c08106b8c0198023f09999a093090127d4f6b3e8360d2e570cc90a49a36f4263ed77b63dc2e56587ad605a95fd
|
@@ -5,7 +5,7 @@ module MetadataPresenter
|
|
5
5
|
def create
|
6
6
|
@page_answers = PageAnswers.new(page, answers_params)
|
7
7
|
|
8
|
-
|
8
|
+
upload_files if upload?
|
9
9
|
|
10
10
|
if @page_answers.validate_answers
|
11
11
|
save_user_data # method signature
|
@@ -25,10 +25,11 @@ module MetadataPresenter
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def redirect_to_next_page
|
28
|
-
next_page = NextPage.new(
|
28
|
+
next_page = NextPage.new(
|
29
|
+
service: service,
|
29
30
|
session: session,
|
30
31
|
current_page_url: page_url
|
31
|
-
)
|
32
|
+
).find
|
32
33
|
|
33
34
|
if next_page.present?
|
34
35
|
redirect_to_page next_page.url
|
@@ -54,7 +55,33 @@ module MetadataPresenter
|
|
54
55
|
not_found if page.blank?
|
55
56
|
end
|
56
57
|
|
57
|
-
def
|
58
|
+
def upload_files
|
59
|
+
user_data = load_user_data
|
60
|
+
@page_answers.page.upload_components.each do |component|
|
61
|
+
answer = user_data[component.id]
|
62
|
+
|
63
|
+
@page_answers.uploaded_files.push(uploaded_file(answer, component))
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def uploaded_file(answer, component)
|
68
|
+
if answer.present?
|
69
|
+
@page_answers.answers[component.id] = answer
|
70
|
+
MetadataPresenter::UploadedFile.new(
|
71
|
+
file: @page_answers.send(component.id),
|
72
|
+
component: component
|
73
|
+
)
|
74
|
+
else
|
75
|
+
FileUploader.new(
|
76
|
+
session: session,
|
77
|
+
page_answers: @page_answers,
|
78
|
+
component: component,
|
79
|
+
adapter: upload_adapter
|
80
|
+
).upload
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def upload_adapter
|
58
85
|
super if defined?(super)
|
59
86
|
end
|
60
87
|
|
@@ -8,7 +8,7 @@ class MetadataPresenter::Component < MetadataPresenter::Metadata
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def items
|
11
|
-
metadata.items.map do |item|
|
11
|
+
Array(metadata.items).map do |item|
|
12
12
|
MetadataPresenter::Item.new(item, editor: editor?)
|
13
13
|
end
|
14
14
|
end
|
@@ -20,4 +20,8 @@ class MetadataPresenter::Component < MetadataPresenter::Metadata
|
|
20
20
|
def upload?
|
21
21
|
type == 'upload'
|
22
22
|
end
|
23
|
+
|
24
|
+
def find_item_by_uuid(uuid)
|
25
|
+
items.find { |item| item.uuid == uuid }
|
26
|
+
end
|
23
27
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class Condition < MetadataPresenter::Metadata
|
3
|
+
def ==(other)
|
4
|
+
metadata.to_h.deep_symbolize_keys == other.metadata.to_h.deep_symbolize_keys
|
5
|
+
end
|
6
|
+
|
7
|
+
def criterias
|
8
|
+
Array(metadata.criterias).map do |criteria|
|
9
|
+
MetadataPresenter::Criteria.new(criteria)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class Criteria < MetadataPresenter::Metadata
|
3
|
+
attr_accessor :service
|
4
|
+
|
5
|
+
def ==(other)
|
6
|
+
metadata == other.metadata
|
7
|
+
end
|
8
|
+
|
9
|
+
def criteria_page
|
10
|
+
service.find_page_by_uuid(page)
|
11
|
+
end
|
12
|
+
|
13
|
+
def criteria_component
|
14
|
+
criteria_page.find_component_by_uuid(component)
|
15
|
+
end
|
16
|
+
|
17
|
+
def criteria_field
|
18
|
+
criteria_component.find_item_by_uuid(field)
|
19
|
+
end
|
20
|
+
|
21
|
+
def field_label
|
22
|
+
criteria_field['label'] if criteria_field
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class EvaluateConditions
|
3
|
+
include ActiveModel::Model
|
4
|
+
attr_accessor :service, :flow, :user_data
|
5
|
+
|
6
|
+
def page
|
7
|
+
results = conditions.map do |condition|
|
8
|
+
condition.criterias.map do |criteria|
|
9
|
+
criteria.service = service
|
10
|
+
|
11
|
+
next unless Operator.new(
|
12
|
+
criteria.operator
|
13
|
+
).evaluate(criteria.field_label, user_data[criteria.criteria_component.id])
|
14
|
+
|
15
|
+
condition.next
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
page_uuid = results.flatten.uniq.compact
|
20
|
+
if page_uuid.present?
|
21
|
+
service.find_page_by_uuid(page_uuid.first)
|
22
|
+
else
|
23
|
+
service.find_page_by_uuid(flow.default_next)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
delegate :conditions, to: :flow
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class FileUploader
|
3
|
+
include ActiveModel::Model
|
4
|
+
attr_accessor :session, :page_answers, :component, :adapter
|
5
|
+
|
6
|
+
def upload
|
7
|
+
UploadedFile.new(file: upload_file, component: component)
|
8
|
+
end
|
9
|
+
|
10
|
+
def upload_file
|
11
|
+
return {} if file_details.blank?
|
12
|
+
|
13
|
+
adapter.new(
|
14
|
+
session: session,
|
15
|
+
file_details: file_details,
|
16
|
+
allowed_file_types: component.validation['accept']
|
17
|
+
).call
|
18
|
+
end
|
19
|
+
|
20
|
+
def file_details
|
21
|
+
page_answers.send(component.id)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class Flow < MetadataPresenter::Metadata
|
3
|
+
def branch?
|
4
|
+
type == 'branch'
|
5
|
+
end
|
6
|
+
|
7
|
+
def default_next
|
8
|
+
metadata['next']['default']
|
9
|
+
end
|
10
|
+
|
11
|
+
def conditions
|
12
|
+
Array(metadata['next']['conditions']).map do |condition_metadata|
|
13
|
+
Condition.new(condition_metadata)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,18 +1,63 @@
|
|
1
1
|
module MetadataPresenter
|
2
2
|
class NextPage
|
3
|
-
|
3
|
+
include ActiveModel::Model
|
4
|
+
attr_accessor :service, :session, :current_page_url
|
4
5
|
|
5
|
-
def
|
6
|
-
|
7
|
-
end
|
6
|
+
def find
|
7
|
+
return check_answers_page if return_to_check_you_answer?
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
service.
|
9
|
+
if conditions?
|
10
|
+
evaluate_conditions
|
11
|
+
elsif current_page_flow.present?
|
12
|
+
service.find_page_by_uuid(current_page_flow.default_next)
|
13
13
|
else
|
14
14
|
service.next_page(from: current_page_url)
|
15
15
|
end
|
16
16
|
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def check_answers_page
|
21
|
+
session[:return_to_check_you_answer] = nil
|
22
|
+
service.pages.find { |page| page.type == 'page.checkanswers' }
|
23
|
+
end
|
24
|
+
|
25
|
+
def return_to_check_you_answer?
|
26
|
+
session[:return_to_check_you_answer].present?
|
27
|
+
end
|
28
|
+
|
29
|
+
def conditions?
|
30
|
+
current_page_flow.present? &&
|
31
|
+
next_flow.present? &&
|
32
|
+
next_flow_branch_object?
|
33
|
+
end
|
34
|
+
|
35
|
+
def evaluate_conditions
|
36
|
+
EvaluateConditions.new(
|
37
|
+
service: service,
|
38
|
+
flow: next_flow,
|
39
|
+
user_data: session[:user_data]
|
40
|
+
).page
|
41
|
+
end
|
42
|
+
|
43
|
+
def current_page
|
44
|
+
service.find_page_by_url(current_page_url)
|
45
|
+
end
|
46
|
+
|
47
|
+
def current_page_uuid
|
48
|
+
current_page.uuid
|
49
|
+
end
|
50
|
+
|
51
|
+
def current_page_flow
|
52
|
+
service.flow(current_page_uuid)
|
53
|
+
end
|
54
|
+
|
55
|
+
def next_flow
|
56
|
+
service.flow(current_page_flow.default_next)
|
57
|
+
end
|
58
|
+
|
59
|
+
def next_flow_branch_object?
|
60
|
+
next_flow.branch?
|
61
|
+
end
|
17
62
|
end
|
18
63
|
end
|
@@ -18,6 +18,10 @@ module MetadataPresenter
|
|
18
18
|
to_h.reject { |k, _| k.in?(NOT_EDITABLE) }
|
19
19
|
end
|
20
20
|
|
21
|
+
def find_component_by_uuid(uuid)
|
22
|
+
all_components.find { |component| component.uuid == uuid }
|
23
|
+
end
|
24
|
+
|
21
25
|
def all_components
|
22
26
|
[components, extra_components].flatten.compact
|
23
27
|
end
|
@@ -27,6 +27,8 @@ module MetadataPresenter
|
|
27
27
|
date_answer(component.id)
|
28
28
|
elsif component && component.type == 'upload'
|
29
29
|
upload_answer(component.id)
|
30
|
+
elsif component && component.type == 'checkboxes'
|
31
|
+
answers[method_name.to_s].to_a
|
30
32
|
else
|
31
33
|
answers[method_name.to_s]
|
32
34
|
end
|
@@ -5,6 +5,12 @@ class MetadataPresenter::Service < MetadataPresenter::Metadata
|
|
5
5
|
end
|
6
6
|
end
|
7
7
|
|
8
|
+
def flow(page_uuid)
|
9
|
+
MetadataPresenter::Flow.new(metadata.flow[page_uuid])
|
10
|
+
rescue StandardError
|
11
|
+
nil
|
12
|
+
end
|
13
|
+
|
8
14
|
def standalone_pages
|
9
15
|
@standalone_pages ||= metadata.standalone_pages.map do |page|
|
10
16
|
MetadataPresenter::Page.new(page, editor: editor?)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class UploadedFile
|
3
|
+
include ActiveModel::Model
|
4
|
+
attr_accessor :file, :component
|
5
|
+
|
6
|
+
def ==(other)
|
7
|
+
file == other.file && component == other.component
|
8
|
+
end
|
9
|
+
|
10
|
+
def error_name
|
11
|
+
file.error_name if file.respond_to? :error_name
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class BaseOperator
|
3
|
+
attr_reader :actual, :expected
|
4
|
+
|
5
|
+
def initialize(actual, expected)
|
6
|
+
@actual = actual
|
7
|
+
@expected = expected
|
8
|
+
end
|
9
|
+
|
10
|
+
def evaluate?
|
11
|
+
raise NotImplementedError
|
12
|
+
end
|
13
|
+
|
14
|
+
# Method signature for collection components (a.k.a checkboxes)
|
15
|
+
#
|
16
|
+
def evaluate_collection?
|
17
|
+
evaluate?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module MetadataPresenter
|
2
|
+
class NoOperator < StandardError
|
3
|
+
end
|
4
|
+
|
5
|
+
class Operator
|
6
|
+
attr_reader :operator
|
7
|
+
|
8
|
+
def initialize(operator)
|
9
|
+
@operator = operator
|
10
|
+
end
|
11
|
+
|
12
|
+
def evaluate(actual, expected)
|
13
|
+
operator = klass.constantize.new(actual, expected)
|
14
|
+
|
15
|
+
if expected.is_a?(Array)
|
16
|
+
operator.evaluate_collection?
|
17
|
+
else
|
18
|
+
operator.evaluate?
|
19
|
+
end
|
20
|
+
rescue NameError
|
21
|
+
raise NoOperator,
|
22
|
+
"Operator '#{operator}' is not implemented. You need to create the class #{klass}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def klass
|
26
|
+
"MetadataPresenter::#{@operator.capitalize.classify}Operator"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<p><%= @page_answers.send(component.id)['original_filename'] %></p>
|
8
8
|
|
9
9
|
<p>
|
10
|
-
<%= link_to 'Remove file', remove_file_path(component.id),
|
10
|
+
<%= link_to 'Remove file', remove_file_path(component.id), class: 'govuk-link' %>
|
11
11
|
</p>
|
12
12
|
<% else %>
|
13
13
|
<%= f.govuk_file_field component.id.to_sym,
|