metadata_presenter 2.7.1 → 2.7.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1fdd31511c6eb1cc78b19a16d64843881679854e2481c86fd878ce66017b4c3a
4
- data.tar.gz: 8e42b7bea3d117b46e049714f44b2ae3140bffeef11dbac9eda34b65a74e4083
3
+ metadata.gz: 48503ea21820959e21824490a615c78e27fd5b7eece419141b8105a0e91f4ad6
4
+ data.tar.gz: ad0c43095f40f524e6cec36e339a0deadc490f50d0686324cb9666827fa979ca
5
5
  SHA512:
6
- metadata.gz: 1a3f106ada407c1789b53cd6d414fc958eccac06e183a073778aadf8e1708b99876496e5191189f51cf5a2d313a63ef820059bf826ef74c367aa56077e32068e
7
- data.tar.gz: b50bb6c4d5652a8a0dfb1b3b3aaee2a52181f4bac04816f51bde201869e37c0a3fc79e1d0496491294f3ccf9ee78a582a92578abc098583dec65ec1aaeb74a36
6
+ metadata.gz: 35b20dc2f7539ae53d0360845513bb0c0859281c54c4dd21542a650636a5fb545132322e325bdc4511e176d60c629f78b46d1cd4a4fc6791c2fe573c9beb9316
7
+ data.tar.gz: 482185c1044b0013f3875255c4a94482de1882adbecb749352f4cb797c9d5a762ede00f4d3c4348c4d8c124ee5f36ddbd85fc7905ea53765965c0cafe69ff3fb
@@ -1,10 +1,23 @@
1
1
  module MetadataPresenter
2
2
  class Spacer < OpenStruct
3
+ def type
4
+ 'flow.spacer'
5
+ end
6
+ end
7
+
8
+ class Pointer < OpenStruct
9
+ def type
10
+ 'flow.pointer'
11
+ end
3
12
  end
4
13
 
5
14
  class Grid
6
- def initialize(service)
15
+ attr_reader :start_from
16
+
17
+ def initialize(service, start_from: nil, main_flow: [])
7
18
  @service = service
19
+ @start_from = start_from
20
+ @main_flow = main_flow
8
21
  @ordered = []
9
22
  @routes = []
10
23
  @traversed = []
@@ -21,9 +34,10 @@ module MetadataPresenter
21
34
  add_rows
22
35
  add_by_coordinates
23
36
  insert_expression_spacers
37
+ trim_pointers unless main_flow.empty?
24
38
  trim_spacers
25
39
 
26
- @ordered
40
+ @ordered = @ordered.reject(&:empty?)
27
41
  end
28
42
 
29
43
  def ordered_flow
@@ -32,12 +46,20 @@ module MetadataPresenter
32
46
  end
33
47
 
34
48
  def ordered_pages
35
- ordered_flow.reject(&:branch?)
49
+ @ordered_pages ||= ordered_flow.reject(&:branch?)
50
+ end
51
+
52
+ def flow_uuids
53
+ ordered_flow.map(&:uuid)
54
+ end
55
+
56
+ def page_uuids
57
+ ordered_pages.map(&:uuid)
36
58
  end
37
59
 
38
60
  private
39
61
 
40
- attr_reader :service
62
+ attr_reader :service, :main_flow
41
63
  attr_accessor :ordered, :traversed, :routes, :coordinates
42
64
 
43
65
  def setup_coordinates
@@ -48,21 +70,30 @@ module MetadataPresenter
48
70
  @route_from_start ||=
49
71
  MetadataPresenter::Route.new(
50
72
  service: service,
51
- traverse_from: service.start_page.uuid
73
+ traverse_from: start_from || service.start_page.uuid
52
74
  )
53
75
  end
54
76
 
55
77
  def make_grid
56
78
  traverse_all_routes
57
79
 
58
- rows = @routes.map(&:row).max
59
- columns = @routes.map { |r| r.column + r.flow_uuids.count }.max
60
- columns.times.map { rows.times.map { MetadataPresenter::Spacer.new } }
80
+ max_potential_columns.times.map do
81
+ max_potential_rows.times.map { MetadataPresenter::Spacer.new }
82
+ end
83
+ end
84
+
85
+ def max_potential_rows
86
+ @max_potential_rows ||= @routes.map(&:row).max + 1
87
+ end
88
+
89
+ def max_potential_columns
90
+ @routes.map { |r| r.column + r.flow_uuids.count }.max + 1
61
91
  end
62
92
 
63
93
  def traverse_all_routes
64
- # Always traverse the route that begins from the start page first and get
65
- # the potential routes from any branching points that exist.
94
+ # Always traverse the route from the start_from uuid. Defaulting to the
95
+ # start page of the form unless otherwise specified.
96
+ # Get all the potential routes from any branching points that exist.
66
97
  route_from_start.traverse
67
98
  @routes.append(route_from_start)
68
99
  traversed_routes = route_from_start.routes
@@ -132,23 +163,58 @@ module MetadataPresenter
132
163
 
133
164
  def add_by_coordinates
134
165
  @coordinates.each do |uuid, position|
135
- # If row and column are nil then the object is detached
136
- next if position[:row].nil? || position[:column].nil?
166
+ next if detached?(position)
137
167
 
138
- flow_object = service.flow_object(uuid)
139
- @ordered[position[:column]][position[:row]] = flow_object
168
+ @ordered[position[:column]][position[:row]] = get_flow_object(uuid)
140
169
  end
141
170
  end
142
171
 
172
+ def detached?(position)
173
+ position[:row].nil? || position[:column].nil?
174
+ end
175
+
176
+ def get_flow_object(uuid)
177
+ # main_flow is always empty if the Grid is _actually_ building the main flow
178
+ return MetadataPresenter::Pointer.new(uuid: uuid) if main_flow.include?(uuid)
179
+
180
+ service.flow_object(uuid)
181
+ end
182
+
183
+ # A row should end at the first Pointer object it finds.
184
+ # Therefore replace any Pointers after the first one with Spacers.
185
+ def trim_pointers
186
+ max_potential_rows.times do |row|
187
+ first_index_of = first_pointer(row)
188
+ next unless first_index_of
189
+
190
+ next_column = first_index_of + 1
191
+ @ordered.drop(next_column).each do |column|
192
+ column[row] = MetadataPresenter::Spacer.new
193
+ end
194
+ end
195
+ end
196
+
197
+ def first_pointer(row)
198
+ row_objects = @ordered.map { |column| column[row] }
199
+ row_objects.find_index { |obj| obj.is_a?(MetadataPresenter::Pointer) }
200
+ end
201
+
143
202
  # Find the very last MetadataPresenter::Flow object in every column and
144
203
  # remove any Spacer objects after that.
145
204
  def trim_spacers
146
205
  @ordered.each_with_index do |column, index|
147
- last_index_of = column.rindex { |item| item.is_a?(MetadataPresenter::Flow) }
148
- @ordered[index] = @ordered[index][0..last_index_of]
206
+ last_index_of = column.rindex { |item| !item.is_a?(MetadataPresenter::Spacer) }
207
+ trimmed_column = @ordered[index][0..last_index_of]
208
+
209
+ # We do not need any columns that only contain Spacer objects
210
+ @ordered[index] = only_spacers?(trimmed_column) ? [] : trimmed_column
149
211
  end
150
212
  end
151
213
 
214
+ def only_spacers?(trimmed_column)
215
+ trimmed_column.all? { |item| item.is_a?(MetadataPresenter::Spacer) }
216
+ end
217
+
152
218
  # Each branch has a certain number of exits that require their own line
153
219
  # and arrow. Insert any spacers into the necessary row in the column after
154
220
  # the one the branch is located in.
@@ -1,3 +1,3 @@
1
1
  module MetadataPresenter
2
- VERSION = '2.7.1'.freeze
2
+ VERSION = '2.7.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metadata_presenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.1
4
+ version: 2.7.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - MoJ Forms
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-08 00:00:00.000000000 Z
11
+ date: 2021-10-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: govuk_design_system_formbuilder