metadata_presenter 0.11.0 → 0.13.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f28074c7149c34365903ebb2d3f63f679fe15a9365d9d8d52212bf46781506ae
4
- data.tar.gz: b5c02391b3978aaadc551076f9b0823c6e73f585d7e401ac5980d976d6e568f2
3
+ metadata.gz: f61c08ab0dfb4a0f2d07168015012f35efd105f2bcaea0d9ce547bd291eeabd5
4
+ data.tar.gz: b602b6f0043d681f73e09720c0fdc61b308a751536b7b5df11e4023fdbd470c9
5
5
  SHA512:
6
- metadata.gz: 2b94a8004d81073a597b09b27844d16d5833a8b68a458423afb330fe1fd880d3a4feea508d7f5ec00e290ce75b7f73e8dc3b5094b5276f75c8477241068ba14a
7
- data.tar.gz: fb7392086d34f13606a4def4b0347190ec45a90fd2f3ec66271b1ef517a2923496e0ce131323ef8b6084491a93d570282204b33a4bf21d4515c0c1185d05fa3e
6
+ metadata.gz: c4a4278f4867f2edf69b87097f0bd384e37f85fcf059c56884c8e52ce19f2f045b9ee294ab173387e427d6dee022ceb6141970ce64ea1a35f15017fbd7a6a084
7
+ data.tar.gz: bace9ee8b5f8c5226819c5f61292612074b7fa140d51fdae77aaf6ea210b86953935c04e71300dda35239b5a1770d8df436bc8a44e635533fcd2b30b106c9134
@@ -8,7 +8,9 @@ module MetadataPresenter
8
8
  def back_link
9
9
  return if @page.blank?
10
10
 
11
- @back_link ||= service.previous_page(current_page: @page)&.url
11
+ previous_page = service.previous_page(current_page: @page)&.url
12
+
13
+ @back_link ||= File.join(request.script_name, previous_page) if previous_page
12
14
  end
13
15
  helper_method :back_link
14
16
 
@@ -11,5 +11,14 @@ module MetadataPresenter
11
11
  not_found
12
12
  end
13
13
  end
14
+
15
+ def page_answers_presenters
16
+ PageAnswersPresenter.map(
17
+ view: view_context,
18
+ pages: service.pages,
19
+ answers: @user_data
20
+ )
21
+ end
22
+ helper_method :page_answers_presenters
14
23
  end
15
24
  end
@@ -14,32 +14,6 @@ module MetadataPresenter
14
14
  end
15
15
  end
16
16
 
17
- ## Display user answers on the view
18
- ## When the user doesn't answered yet the component will be blank
19
- # or with data otherwise, so doing the if in every output is not
20
- # pratical.
21
- #
22
- # The below example search for 'first_name' in the user data instance
23
- # variable as long your load_user_data in the controller sets the variable.
24
- #
25
- # @example
26
- # <%=a 'first_name' %>
27
- #
28
- def a(component_key)
29
- if @user_data.present?
30
- @user_data[component_key]
31
- end
32
- end
33
- alias answer a
34
-
35
- ## Display user answers on the view formatted.
36
- ##
37
- def formatted_answer(component_key)
38
- user_answer = answer(component_key)
39
-
40
- simple_format(user_answer) if user_answer.present?
41
- end
42
-
43
17
  # Renders markdown given a text.
44
18
  #
45
19
  # @example
@@ -0,0 +1,19 @@
1
+ module MetadataPresenter
2
+ class DateField
3
+ attr_reader :day, :month, :year
4
+
5
+ def initialize(day:, month:, year:)
6
+ @day = day
7
+ @month = month
8
+ @year = year
9
+ end
10
+
11
+ def present?
12
+ !blank?
13
+ end
14
+
15
+ def blank?
16
+ @day.blank? || @month.blank? || @year.blank?
17
+ end
18
+ end
19
+ end
@@ -17,11 +17,33 @@ module MetadataPresenter
17
17
  end
18
18
 
19
19
  def respond_to_missing?(method_name, include_private = false)
20
- answers[method_name.to_s].present?
20
+ method_name.to_s.in?(components.map(&:id))
21
21
  end
22
22
 
23
23
  def method_missing(method_name, *args, &block)
24
- answers[method_name.to_s]
24
+ component = components.find { |component| component.id == method_name.to_s }
25
+
26
+ if component && component.type == 'date'
27
+ date_answer(component.id)
28
+ else
29
+ answers[method_name.to_s]
30
+ end
31
+ end
32
+
33
+ def date_answer(component_id)
34
+ date = raw_date_answer(component_id)
35
+
36
+ MetadataPresenter::DateField.new(day: date[0], month: date[1], year: date[2])
37
+ end
38
+
39
+ def raw_date_answer(component_id)
40
+ [
41
+ GOVUKDesignSystemFormBuilder::Elements::Date::SEGMENTS[:day],
42
+ GOVUKDesignSystemFormBuilder::Elements::Date::SEGMENTS[:month],
43
+ GOVUKDesignSystemFormBuilder::Elements::Date::SEGMENTS[:year]
44
+ ].map do |segment|
45
+ answers["#{component_id.to_s}(#{segment})"]
46
+ end
25
47
  end
26
48
 
27
49
  private
@@ -0,0 +1,57 @@
1
+ module MetadataPresenter
2
+ class PageAnswersPresenter
3
+ def self.map(view:, pages:, answers:)
4
+ pages.map do |page|
5
+ Array(page.components).map do |component|
6
+ new(
7
+ view: view,
8
+ component: component,
9
+ page: page,
10
+ answers: answers
11
+ )
12
+ end
13
+ end.flatten
14
+ end
15
+
16
+ attr_reader :view, :component, :page, :answers
17
+ delegate :url, to: :page
18
+ delegate :humanised_title, to: :component
19
+
20
+ def initialize(view:, component:, page:, answers:)
21
+ @view = view
22
+ @component = component
23
+ @page = page
24
+ @answers = answers
25
+
26
+ @page_answers = PageAnswers.new(page, answers)
27
+ end
28
+
29
+ def answer
30
+ value = @page_answers.send(component.id)
31
+
32
+ return '' if value.blank?
33
+ if self.class.private_method_defined?(component.type.to_sym)
34
+ send(component.type.to_sym, value)
35
+ else
36
+ value
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def date(value)
43
+ I18n.l(
44
+ Date.civil(value.year.to_i, value.month.to_i, value.day.to_i),
45
+ format: '%d %B %Y'
46
+ )
47
+ end
48
+
49
+ def textarea(value)
50
+ view.simple_format(value, {}, wrapper_tag: 'span')
51
+ end
52
+
53
+ def checkboxes(value)
54
+ value.reject(&:blank?).join("<br>").html_safe
55
+ end
56
+ end
57
+ end
@@ -38,7 +38,7 @@ module MetadataPresenter
38
38
  end
39
39
 
40
40
  def valid?
41
- return true if user_answer.blank? && allow_blank?
41
+ return true if allow_blank?
42
42
 
43
43
  if invalid_answer?
44
44
  error_message = custom_error_message || default_error_message
@@ -63,7 +63,12 @@ module MetadataPresenter
63
63
  # @return [String] user answer for the specific component
64
64
  #
65
65
  def user_answer
66
- page_answers.send(component.name)
66
+ value = page_answers.send(component.name)
67
+ if component.type == 'checkboxes'
68
+ Array(value).reject(&:blank?)
69
+ else
70
+ value
71
+ end
67
72
  end
68
73
 
69
74
  # The default error message will be look using the schema key.
@@ -127,7 +132,7 @@ module MetadataPresenter
127
132
  # @return [TrueClass]
128
133
  #
129
134
  def allow_blank?
130
- true unless self.class.name.demodulize.include?('RequiredValidator')
135
+ user_answer.blank? && !self.class.name.demodulize.include?('RequiredValidator')
131
136
  end
132
137
  end
133
138
  end
@@ -0,0 +1,14 @@
1
+ module MetadataPresenter
2
+ class DateValidator < BaseValidator
3
+ def invalid_answer?
4
+ Date.strptime(
5
+ "#{user_answer.year}-#{user_answer.month}-#{user_answer.day}",
6
+ '%Y-%m-%d'
7
+ )
8
+
9
+ false
10
+ rescue Date::Error
11
+ true
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,9 @@
1
+ <%=
2
+ f.govuk_collection_check_boxes component.id.to_sym,
3
+ component.items,
4
+ :id,
5
+ :name,
6
+ :description,
7
+ legend: { text: input_title },
8
+ hint: { text: component.hint }
9
+ %>
@@ -0,0 +1,5 @@
1
+ <%=
2
+ f.govuk_date_field component.id.to_sym,
3
+ hint: { text: component.hint },
4
+ legend: { text: input_title }
5
+ %>
@@ -26,7 +26,7 @@
26
26
  </div>
27
27
  <% if service.service_name.present? %>
28
28
  <div class="govuk-header__content">
29
- <a href="/" class="govuk-header__link govuk-header__link--service-name">
29
+ <a href="<%= root_path %>" class="govuk-header__link govuk-header__link--service-name">
30
30
  <%= service.service_name %>
31
31
  </a>
32
32
  <% end %>
@@ -27,27 +27,25 @@
27
27
  <%= form_for @page, url: reserved_submissions_path do |f| %>
28
28
  <div data-block-id="page.checkanswers.answers" data-block-type="answers">
29
29
  <dl class="fb-block fb-block-answers govuk-summary-list">
30
- <% @service.pages.each do |page| %>
31
- <% Array(page.components).each do |component| %>
32
- <div class="govuk-summary-list__row">
33
- <dt class="govuk-summary-list__key">
34
- <%= component.humanised_title %>
35
- </dt>
30
+ <% page_answers_presenters.each do |page_answers_presenter| %>
31
+ <div class="govuk-summary-list__row">
32
+ <dt class="govuk-summary-list__key">
33
+ <%= page_answers_presenter.humanised_title %>
34
+ </dt>
36
35
 
37
- <dd class="govuk-summary-list__value">
38
- <%= formatted_answer(component.name) %>
39
- </dd>
40
- <dd class="govuk-summary-list__actions">
41
- <%= link_to(
42
- change_answer_path(url: page.url),
43
- class: 'govuk-link'
44
- ) do %>
45
- Change<span class="govuk-visually-hidden"> Your answer for <%= component.label %></span>
46
- <% end %>
47
- </a>
48
- </dd>
49
- </div>
50
- <% end %>
36
+ <dd class="govuk-summary-list__value">
37
+ <%= page_answers_presenter.answer %>
38
+ </dd>
39
+ <dd class="govuk-summary-list__actions">
40
+ <%= link_to(
41
+ change_answer_path(url: page_answers_presenter.url),
42
+ class: 'govuk-link'
43
+ ) do %>
44
+ Change<span class="govuk-visually-hidden"> Your answer for <%= page_answers_presenter.humanised_title %></span>
45
+ <% end %>
46
+ </a>
47
+ </dd>
48
+ </div>
51
49
  <% end %>
52
50
  </dl>
53
51
  </div>
@@ -0,0 +1,24 @@
1
+ {
2
+ "_id": "component.checkboxes",
3
+ "_type": "checkboxes",
4
+ "errors": {},
5
+ "hint": "[Hint text (optional)]",
6
+ "items": [
7
+ {
8
+ "_id": "component_checkbox_1",
9
+ "_type": "checkbox",
10
+ "label": "Option",
11
+ "hint": "[Hint text (optional)]",
12
+ "value": "value-1"
13
+ },
14
+ {
15
+ "_id": "component_checkbox_2",
16
+ "_type": "checkbox",
17
+ "label": "Option",
18
+ "hint": "[Hint text (optional)]",
19
+ "value": "value-2"
20
+ }
21
+ ],
22
+ "name": "component-name",
23
+ "legend": "Question"
24
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "_id": "component.date",
3
+ "_type": "date",
4
+ "errors": {},
5
+ "hint": "Component hint",
6
+ "legend": "Component legend",
7
+ "name": "component-name",
8
+ "date_type": "day-month-year",
9
+ "validation": {
10
+ "date": true
11
+ }
12
+ }
@@ -2,8 +2,23 @@
2
2
  "_id": "component.radios",
3
3
  "_type": "radios",
4
4
  "errors": {},
5
- "hint": "Component hint",
6
- "items": [],
5
+ "hint": "[Hint text (optional)]",
6
+ "items": [
7
+ {
8
+ "_id": "component_radio_1",
9
+ "_type": "radio",
10
+ "label": "Option",
11
+ "hint": "[Hint text (optional)]",
12
+ "value": "value-1"
13
+ },
14
+ {
15
+ "_id": "component_radio_2",
16
+ "_type": "radio",
17
+ "label": "Option",
18
+ "hint": "[Hint text (optional)]",
19
+ "value": "value-2"
20
+ }
21
+ ],
7
22
  "name": "component-name",
8
- "legend": "Required legend"
23
+ "legend": "Question"
9
24
  }
@@ -0,0 +1,7 @@
1
+ {
2
+ "_id": "definition.checkbox",
3
+ "_type": "checkbox",
4
+ "label": "Option",
5
+ "hint": "[Hint text (optional)]",
6
+ "value": "checkbox-value"
7
+ }
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "_id": "definition.radio",
3
3
  "_type": "radio",
4
- "label": "Required label",
4
+ "label": "Option",
5
+ "hint": "[Hint text (optional)]",
5
6
  "value": "radio-value"
6
7
  }
@@ -0,0 +1,6 @@
1
+ {
2
+ "_id": "error.date",
3
+ "_type": "string.error",
4
+ "description": "Input (date) is not a valid date",
5
+ "value": "Enter a valid date for %{control}"
6
+ }
@@ -201,6 +201,71 @@
201
201
  "heading": "Radio buttons",
202
202
  "url": "/do-you-like-star-wars"
203
203
  },
204
+ {
205
+ "_id": "page.holiday",
206
+ "url": "holiday",
207
+ "_type":"page.singlequestion",
208
+ "_uuid":"ff4557b2-486b-481e-9eef-f315718639e8",
209
+ "heading":"Question",
210
+ "components": [
211
+ {
212
+ "_id": "holiday_date_1",
213
+ "hint": "Component hint",
214
+ "name": "holiday_date_1",
215
+ "_type": "date",
216
+ "legend": "What is the day that you like to take holidays?",
217
+ "errors": {},
218
+ "date_type": "day-month-year",
219
+ "validation": {
220
+ "date": true,
221
+ "required": true
222
+ }
223
+ }
224
+ ]
225
+ },
226
+ {
227
+ "_uuid": "7b748584-100e-4d81-a54a-5049190136cc",
228
+ "_id": "page.burgers",
229
+ "_type": "page.singlequestion",
230
+ "components": [
231
+ {
232
+ "_id": "burgers_checkboxes_1",
233
+ "_type": "checkboxes",
234
+ "errors": {},
235
+ "hint": "Select all that apply",
236
+ "legend": "What would you like on your burger?",
237
+ "items": [
238
+ {
239
+ "_id": "burgers_checkbox_1",
240
+ "_type": "checkbox",
241
+ "label": "Beef, cheese, tomato",
242
+ "hint": "Optional item hint",
243
+ "value": "beef-cheese-tomato"
244
+ },
245
+ {
246
+ "_id": "burgers_checkbox_2",
247
+ "_type": "checkbox",
248
+ "label": "Chicken, cheese, tomato",
249
+ "hint": "Optional item hint",
250
+ "value": "chicken-cheese-tomato"
251
+ },
252
+ {
253
+ "_id": "burgers_checkbox_3",
254
+ "_type": "checkbox",
255
+ "label": "Mozzarella, cheddar, feta",
256
+ "hint": "Optional item hint",
257
+ "value": "mozzarella-cheddar-feta"
258
+ }
259
+ ],
260
+ "name": "burgers_checkboxes_1",
261
+ "validation": {
262
+ "required": true
263
+ }
264
+ }
265
+ ],
266
+ "heading": "Checkboxes",
267
+ "url": "/burgers"
268
+ },
204
269
  {
205
270
  "_uuid": "e819d0c2-7062-4997-89cf-44d26d098404",
206
271
  "_id": "page._check-answers",
@@ -1,3 +1,3 @@
1
1
  module MetadataPresenter
2
- VERSION = '0.11.0'
2
+ VERSION = '0.13.3'
3
3
  end
@@ -0,0 +1,33 @@
1
+ {
2
+ "$id": "http://gov.uk/schema/v1.0.0/checkboxes",
3
+ "_name": "component.checkboxes",
4
+ "title": "Checkboxes",
5
+ "description": "Let users select one or more options from a list",
6
+ "type": "object",
7
+ "properties": {
8
+ "_type": {
9
+ "const": "checkboxes"
10
+ },
11
+ "items": {
12
+ "title": "Options",
13
+ "description": "Items that users can select",
14
+ "type": "array",
15
+ "items": {
16
+ "$ref": "definition.checkbox"
17
+ }
18
+ }
19
+ },
20
+ "allOf": [
21
+ {
22
+ "$ref": "definition.fieldset"
23
+ }
24
+ ],
25
+ "transforms": {
26
+ "namespace": {
27
+ "propagation": "items[?(@._type === 'checkbox')]"
28
+ }
29
+ },
30
+ "required": [
31
+ "items"
32
+ ]
33
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "$id": "http://gov.uk/schema/v1.0.0/date",
3
+ "_name": "component.date",
4
+ "title": "Date",
5
+ "description": "Let users enter an exact date",
6
+ "type": "object",
7
+ "properties": {
8
+ "_type": {
9
+ "const": "date"
10
+ },
11
+ "name": {
12
+ "inputType": "date"
13
+ },
14
+ "date_type": {
15
+ "title": "Date type",
16
+ "description": "The format for entering dates",
17
+ "type": "string",
18
+ "enum": [
19
+ "day-month-year",
20
+ "month-year",
21
+ "day-month",
22
+ "year"
23
+ ],
24
+ "default": "day-month-year"
25
+ }
26
+ },
27
+ "allOf": [
28
+ {
29
+ "$ref": "definition.fieldset"
30
+ },
31
+ {
32
+ "$ref": "validations#/definitions/date_bundle"
33
+ }
34
+ ],
35
+ "composite": [
36
+ "day",
37
+ "month",
38
+ "year"
39
+ ],
40
+ "definitions": {
41
+ "date_type_enum": {
42
+ "day-month-year": "Day / Month / Year",
43
+ "month-year": "Month / Year",
44
+ "year": "Year",
45
+ "day-month": "Day / Month"
46
+ }
47
+ }
48
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "$id": "http://gov.uk/schema/v1.0.0/checkbox",
3
+ "_name": "definition.checkbox",
4
+ "title": "Checkbox item",
5
+ "description": "Component that provides a checkbox item",
6
+ "type": "object",
7
+ "properties": {
8
+ "_type": {
9
+ "const": "checkbox"
10
+ },
11
+ "value": {
12
+ "default": "yes"
13
+ },
14
+ "label": {
15
+ "skipOptional": true
16
+ },
17
+ "hint": {
18
+ "title": "Hint text",
19
+ "description": "Text to help users understand an option - appears in grey under the label",
20
+ "type": "string",
21
+ "content": true
22
+ },
23
+ "conditional_component": {
24
+ "$ref": "definition.conditionalcomponent"
25
+ }
26
+ },
27
+ "allOf": [
28
+ {
29
+ "$ref": "definition.namespace"
30
+ },
31
+ {
32
+ "$ref": "definition.option"
33
+ },
34
+ {
35
+ "$ref": "definition.name"
36
+ }
37
+ ],
38
+ "required": [
39
+ "label"
40
+ ],
41
+ "transforms": {
42
+ "namespace": {
43
+ "propagation": "conditional_component"
44
+ }
45
+ }
46
+ }
@@ -25,6 +25,15 @@
25
25
  ],
26
26
  "default": true
27
27
  },
28
+ "date": {
29
+ "title": "Date",
30
+ "description": "Whether the user must answer with a valid date",
31
+ "oneOf": [
32
+ {
33
+ "$ref": "definition.conditional.boolean"
34
+ }
35
+ ]
36
+ },
28
37
  "errors_required": {
29
38
  "title": "Error messages for ‘Required’",
30
39
  "allOf": [
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: 0.11.0
4
+ version: 0.13.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - MoJ Online
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-12 00:00:00.000000000 Z
11
+ date: 2021-02-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -233,12 +233,15 @@ files:
233
233
  - app/helpers/metadata_presenter/application_helper.rb
234
234
  - app/jobs/metadata_presenter/application_job.rb
235
235
  - app/models/metadata_presenter/component.rb
236
+ - app/models/metadata_presenter/date_field.rb
236
237
  - app/models/metadata_presenter/metadata.rb
237
238
  - app/models/metadata_presenter/next_page.rb
238
239
  - app/models/metadata_presenter/page.rb
239
240
  - app/models/metadata_presenter/page_answers.rb
240
241
  - app/models/metadata_presenter/service.rb
242
+ - app/presenters/metadata_presenter/page_answers_presenter.rb
241
243
  - app/validators/metadata_presenter/base_validator.rb
244
+ - app/validators/metadata_presenter/date_validator.rb
242
245
  - app/validators/metadata_presenter/max_length_validator.rb
243
246
  - app/validators/metadata_presenter/min_length_validator.rb
244
247
  - app/validators/metadata_presenter/number_validator.rb
@@ -247,6 +250,8 @@ files:
247
250
  - app/validators/metadata_presenter/validate_schema.rb
248
251
  - app/views/errors/404.html
249
252
  - app/views/layouts/metadata_presenter/application.html.erb
253
+ - app/views/metadata_presenter/component/_checkboxes.html.erb
254
+ - app/views/metadata_presenter/component/_date.html.erb
250
255
  - app/views/metadata_presenter/component/_number.html.erb
251
256
  - app/views/metadata_presenter/component/_radios.html.erb
252
257
  - app/views/metadata_presenter/component/_text.html.erb
@@ -260,18 +265,22 @@ files:
260
265
  - config/initializers/default_metadata.rb
261
266
  - config/initializers/schemas.rb
262
267
  - config/routes.rb
268
+ - default_metadata/component/checkboxes.json
269
+ - default_metadata/component/date.json
263
270
  - default_metadata/component/number.json
264
271
  - default_metadata/component/radios.json
265
272
  - default_metadata/component/text.json
266
273
  - default_metadata/component/textarea.json
267
274
  - default_metadata/config/meta.json
268
275
  - default_metadata/config/service.json
276
+ - default_metadata/definition/checkbox.json
269
277
  - default_metadata/definition/radio.json
270
278
  - default_metadata/page/checkanswers.json
271
279
  - default_metadata/page/confirmation.json
272
280
  - default_metadata/page/singlequestion.json
273
281
  - default_metadata/page/start.json
274
282
  - default_metadata/service/base.json
283
+ - default_metadata/string/error.date.json
275
284
  - default_metadata/string/error.max_length.json
276
285
  - default_metadata/string/error.min_length.json
277
286
  - default_metadata/string/error.number.json
@@ -284,6 +293,8 @@ files:
284
293
  - lib/metadata_presenter/test_helpers.rb
285
294
  - lib/metadata_presenter/version.rb
286
295
  - lib/tasks/metadata_presenter_tasks.rake
296
+ - schemas/component/checkboxes.json
297
+ - schemas/component/date.json
287
298
  - schemas/component/number.json
288
299
  - schemas/component/radios.json
289
300
  - schemas/component/text.json
@@ -292,6 +303,7 @@ files:
292
303
  - schemas/config/meta.json
293
304
  - schemas/config/service.json
294
305
  - schemas/definition/block.json
306
+ - schemas/definition/checkbox.json
295
307
  - schemas/definition/component.json
296
308
  - schemas/definition/components.json
297
309
  - schemas/definition/condition.base.json