From 3b38c198634ad143381d6be00e8731fc600fec6e Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Fri, 23 Jan 2026 17:20:11 +0000 Subject: [PATCH 01/11] CLDC-NONE: Update setup docs to reccommend WSL --- docs/setup.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/setup.md b/docs/setup.md index f022797ec..b85f4d6ee 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -18,6 +18,14 @@ We recommend using [RBenv](https://github.com/rbenv/rbenv) to manage Ruby versio We recommend using [nvm](https://github.com/nvm-sh/nvm) to manage NodeJS versions. +## Instructions for Windows users + +If you are working on a windows machine, you will want to install the tools on [WSL](https://learn.microsoft.com/en-us/windows/wsl/install) as some of them are not native to windows. The instructions in these docs assume a Debian-based distribution, such as Ubuntu. + +*You will see a significant performance degradation if you are running the server on WSL whilst the files are on windows.* Thus, make sure to clone the repository into your WSL instance. + +Some windows IDEs, such as [VSCode](https://code.visualstudio.com/docs/remote/wsl) and [RubyMine](jetbrains.com/help/ruby/remote-development-starting-page.html#run_in_wsl_ij) can connect you to WSL, which will allow you to develop as though the files were on the local windows filesystem. Ignore any reccommendations that you might see suggesting you keep the files on windows - our experience is that both tests and page loads are much slower when the files are on windows. + ## Pre-setup installation 1. Install PostgreSQL From 0d4fd27660cce1f8f77ecf48547be3d60ece085a Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Fri, 23 Jan 2026 18:58:05 +0000 Subject: [PATCH 02/11] CLDC-NONE: Documentation for creating a new question --- docs/adr/index.md | 2 +- docs/dev_tasks/index.md | 9 ++ docs/dev_tasks/new_sales_question.md | 119 +++++++++++++++++++++++++++ docs/documentation_website.md | 2 +- 4 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 docs/dev_tasks/index.md create mode 100644 docs/dev_tasks/new_sales_question.md diff --git a/docs/adr/index.md b/docs/adr/index.md index b4ee4f8ce..e8479c56e 100644 --- a/docs/adr/index.md +++ b/docs/adr/index.md @@ -1,6 +1,6 @@ --- has_children: true -nav_order: 14 +nav_order: 15 --- # Architecture decisions diff --git a/docs/dev_tasks/index.md b/docs/dev_tasks/index.md new file mode 100644 index 000000000..ca53fc7da --- /dev/null +++ b/docs/dev_tasks/index.md @@ -0,0 +1,9 @@ +--- +has_children: true +nav_order: 14 +--- + +# Common dev tasks + +A collection of guides for tasks that may have to be carried out repeatedly. + diff --git a/docs/dev_tasks/new_sales_question.md b/docs/dev_tasks/new_sales_question.md new file mode 100644 index 000000000..5b7c67032 --- /dev/null +++ b/docs/dev_tasks/new_sales_question.md @@ -0,0 +1,119 @@ +--- +parent: Common dev tasks +nav_order: 1 +--- + +# New Sales Log Questions + +Concerns adding a brand-new question to Sales Logs. This question will appear on the website as part of the Sales form and should be handled in Bulk Uploads. + +Guide is up-to-date as of 2026. + +## Basic checklist of tasks + +### 1. Create a migration to add the new field to the database + +This allows the answer to the new question to be saved. + +You can create a new empty migration file from the terminal if you are in the root of the project: + +``` +bin/rails generate migration NameOfMigration +``` + +The new migration file will be saved in `db/migrate`. + +Whilst the specifics will vary, the new migration file should look something like this: + +```ruby +class AddSexRegisteredAtBirthToSalesLogs < ActiveRecord::Migration[7.2] + def change + # Add a new column called "name" of type string to the sales_logs table + change_table :sales_logs, bulk: true do |t| + t.column :name, :string + end + end +end +``` + +See also: [Active record migrations](https://guides.rubyonrails.org/active_record_migrations.html) + +### 2. Run the new migration + +`bundle exec rake db:migrate` + +This will update `schema.rb`. You should not edit `schema.rb` directly. + +### 3. Create a new question class + +This will define the question that gets rendered on the online form. + +Existing question classes can be found in `app/models/form/sales/questions/`. Depending on the type of question (checkboxes, radio groups, free-text fields), there will almost certainly be an existing question class that you can refer to as a guide. + +For example, if you need to create a new radio form, then you may want to copy `armed_forces.rb`. + +See also: [Question]({% link form/question.md %}) + +### 4. Create a new page class + +This creates the page that your new question will be rendered on. + +Existing page classes can be found in `app/models/form/sales/pages`. + +Usually there is only one question per page, but in some cases there may be multiple. It may not be necessary to create a new page if the new question is being added to an existing one. + +See also: [Page]({% link form/page.md %}) + +### 5. Add new page to an existing subsection + +Without this step, your new page will not be inserted into the form! + +Subsections can be found in `app/models/form/sales/subsections`. + +You will want to add your new page to the appropriate place in the list returned by `def pages`. + +To make your new page only appear in the forms for the upcoming year, you wrap the page class in parentheses and add a conditional expression to the end, like so: + +```ruby +(Form::Sales::Pages::SexRegisteredAtBirth1.new(nil, nil, self) if form.start_year_2026_or_later?), +``` + +### 6. Update the locale file + +The locale files define some of the text for the new question, including hints and the question itself. + +Locale files can be found in `config/locales/forms//sales/` and there is one locale file for each form subsection. + +Copy the entry for an existing question and substitute in the text for your new one. + +### 7. Include the new field in exports + +The fields that get exported in CSVs and XMLs are defined in `app/services/exports/sales_log_export_constants.rb`. + +If there is not a set for POST__EXPORT_FIELDS, create one. Add your new field to the current year's set. + +You may also have to update the `sales_log_export_service.rb` to correctly filter the year-specific fields. + +### 8. Update the bulk upload row parser + +This will allow bulk upload files to save the new field to the database. + +You can find the relevant file at `app/services/bulk_upload/sales/year/row_parser.rb`. + +You will need to add a new `field_XXX` for the new field. In total, update the following places: + +- Add the new field to `QUESTIONS` with the text of the question. +- Add a new attribute alongside the existing ones neat the top of the file: + ```ruby + attribute :field_XXX, :type + ``` +- Add the new field to `field_mapping_for_errors` with the name of the field in the database. +- Add the new field to `attributes_for_log` with the name of the field in the database. + +You may also have to add some additional validation rules in this file. + +Validation for ensuring that the value uploaded is one of the permitted options is handled automatically, using the question class as the original source of truth. + +### 9. Update unit tests + +Create new test files for any new classes you have created. Update any test files for files that you have edited. diff --git a/docs/documentation_website.md b/docs/documentation_website.md index b306a6398..5032352b6 100644 --- a/docs/documentation_website.md +++ b/docs/documentation_website.md @@ -1,5 +1,5 @@ --- -nav_order: 15 +nav_order: 16 --- # This documentation website From b1db7501f922ea16001d848c72d56e1a75882f54 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Tue, 27 Jan 2026 18:51:43 +0000 Subject: [PATCH 03/11] CLDC-NONE: Update question doc --- docs/form/question.md | 121 +++++++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 48 deletions(-) diff --git a/docs/form/question.md b/docs/form/question.md index 7112596cf..a40509757 100644 --- a/docs/form/question.md +++ b/docs/form/question.md @@ -6,81 +6,106 @@ nav_order: 4 # Question +*Updated for 2026.* + Questions are under the page level of the form definition. An example question might look something like this: -``` -class Form::Sales::Questions::PostcodeKnown < ::Form::Question +```ruby +class Form::Sales::Questions::PreviousPostcodeKnown < ::Form::Question def initialize(id, hsh, page) super - @id = postcode_known - @hint_text = "" - @header = "Do you know the property postcode?" - @check_answer_label = "Do you know the property postcode?" + @id = "ppcodenk" + @copy_key = "sales.household_situation.last_accommodation.ppcodenk" @type = "radio" - @answer_options = { - "1" => { "value" => "Yes" }, - "0" => { "value" => "No" } - }, + @answer_options = ANSWER_OPTIONS @conditional_for = { - "postcode_full" => [1] - }, - @hidden_in_check_answers = true + "ppostcode_full" => [0], + } + @hidden_in_check_answers = { + "depends_on" => [ + { + "ppcodenk" => 0, + }, + { + "ppcodenk" => 1, + }, + ], + } + @question_number = QUESTION_NUMBER_FROM_YEAR[form.start_date.year] || QUESTION_NUMBER_FROM_YEAR[QUESTION_NUMBER_FROM_YEAR.keys.max] + @disable_clearing_if_not_routed_or_dynamic_answer_options = true end + + ANSWER_OPTIONS = { + "0" => { "value" => "Yes" }, + "1" => { "value" => "No" }, + }.freeze + + QUESTION_NUMBER_FROM_YEAR = { 2023 => 57, 2024 => 59, 2025 => 57 }.freeze end ``` -In the above example the the question has the id `postcode_known`. +Let's take a look at the properties in the `initialize` function. -The `check_answer_label` contains the text that will be displayed in the label of the table on the check answers page. +
+
id
+
The name of the field. This should correspond to a column in the database. In the example, the id is 'ppcodenk'.
-The header is text that is displayed for the question. +
copy_key
+
Unknown; requires investigation.
-Hint text is optional, but if provided it sits under the header and is normally given to provide the data inputters with guidance when answering the question, for example it might inform them about terms used in the question. +
type
+
Determines what type of question is rendered on the page. In the example, the question is a Radio Form so the app/views/form/_radio_question.html.erb partial will be rendered on the page when this question is displayed to the user
-The type is question type, which is used to determine the view rendered for the question. In the above example the question is a radio type so the `app/views/form/_radio_question.html.erb` partial will be rendered on the page when this question is displayed to the user. +
answer_options
+
Some types of question offer multiple options to pick from, which can be defined here. In the example, there are two options. The option that will be rendered with the label 'Yes' has the underlying value 0. The option with the label 'No' has the underlying value 1.
-The `conditional_for` contains the value needed to be selected by the data inputter in order to display another question that appears on the same page. In the example above the `postcode_full` question depends on the answer to `postcode_known` being selected as `1` or `Yes`, this would then display the `postcode_full` underneath the `Yes` option on the page, allowing the provide the provide the postcode if they have indicated they know it. If the user has JavaScript enabled then this realtime conditional display is handled by the `app/frontend/controllers/conditional_question_controller.js` file. +
conditional_for
+
Allows for additional questions to be rendered on the page if a certain value is chosen for the current question. In the example, if the value of this question is 0 (the 'Yes' option is selected), then the question with id 'ppostcode_full' will be rendered beneath the selected option.
If the user has JavaScript enabled then this realtime conditional display is handled by the app/frontend/controllers/conditional_question_controller.js file.
-the `hidden_in_check_answers` is used to hide a value from displaying on the check answers page. You only need to provide this if you want to set it to true in order to hide the value for some reason e.g. it's one of two questions appearing on a page and the other question is displayed on the check answers page. It's also worth noting that you can declare this as a with a `depends_on` which can be useful for conditionally displaying values on the check answers page. For example: +
hidden_in_check_answers
+
+ Allows us to hide the question on the 'check your answers' page. You only need to provide this if you want to set it to true in order to hide the value for some reason e.g. it's one of two questions appearing on a page and the other question is displayed on the check answers page. +
+ If depends_on is supplied, then whether this question is hidden can be made conditional on the answers provided to any question. In the example, the question is hidden if 'ppcodenk' (this question) has value 0 or 1. (As these are the only two possible answers, the question will always be hidden.) +
-``` -@hidden_in_check_answers = { - "depends_on" => [ - { "age6_known" => 0 }, - { "age6_known" => 1 } - ] -} -``` - -Would mean the question the above is attached to would be hidden in the check answers page if the value of age6_known is either `0` or `1`. +
question_number
+
+ Determines which number gets rendered next to the question text on the question page and in the 'check your answers' page. +
+ The convention that we use for the question number is that we only add to the 'QUESTION_NUMBER_FROM_YEAR' hash when the question number changes. So, if the example remains unchanged into 2026, 2027, etc., that means that it is still question 57. +
+
-The answer the data inputter provides to some questions allows us to infer the values of other questions we might have asked in the form, allowing us to save the data inputters some time. An example of how this might look is as follows: +Another example shows us some fields that are used when we want to infer the answers to one question based on a user's answers to another question. This can allow the user to have to answer fewer questions, lowering their total number of clicks. -``` -class Form::Sales::Questions::PostcodeFull < ::Form::Question +```ruby +class Form::Sales::Questions::PostcodeForFullAddress < ::Form::Question def initialize(id, hsh, page) super - @id = postcode_full - @hint_text = "" - @header = "What is the property’s postcode?"" - @check_answer_label = "Postcode"" - @type = "text" - @width = 5 + @id = "postcode_full" + @inferred_check_answers_value = [{ + "condition" => { + "pcodenk" => 1, + }, + "value" => "Not known", + }] @inferred_answers = { - "la" => { "is_la_inferred" => true } + "la" => { + "is_la_inferred" => true, + }, } - @inferred_check_answers_value => [{ - "condition" => { "postcode_known" => 0 }, - "value": "Not known" - }] + # Other fields omitted for brevity end end ``` -In the above example the width is an optional attribute and can be provided for text type questions to determine the width of the text box on the page when when the question is displayed to a user (this allows you to match the width of the text box on the page to that of the design for a question). - -The above example links to the first example as both of these questions would be on the same page. The `inferred_check_answers_value` is what should be displayed on the check answers page for this question if we infer it. If the value of `postcode_known` was given as `0` (which is a no), as seen in the condition part of `inferred_check_answers_value` then we can infer that the data inputter does not know the postcode and so we would display the value of `Not known` on the check answers page for the postcode. +
+
inferred_check_answers_value
+
Determines what gets shown on the 'check your answers' page if we infer the answer to this question. In the example, if the question 'pcodenk' has value 1 (indicating that the postcode is not known), then the answer shown for this question will be 'Not known'.
-In the above example the `inferred_answers` refers to a question where we can infer the answer based on the answer of this question. In this case the `la` question can be inferred from the postcode value given by the data inputter as we are able to lookup the local authority based on the postcode given. We then set a property on the lettings log `is_la_inferred` to true to indicate that this is an answer we've inferred. +
inferred_answers
+
Determines any questions whose answers can be inferred based on the answer to this question. In the example, the 'la' question (Local Authority) can be inferred from the Postcode. We set a property 'is_la_inferred' on the log to record this inferrance.
+
From 2a4616a04f8993699b62833db5cf214bf2dc1e30 Mon Sep 17 00:00:00 2001 From: Katherine Langford Date: Wed, 28 Jan 2026 10:11:50 +0000 Subject: [PATCH 04/11] CLDC-NONE: Lint fixes --- docs/dev_tasks/index.md | 1 - docs/dev_tasks/new_sales_question.md | 4 ++-- docs/form/question.md | 2 +- docs/setup.md | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/dev_tasks/index.md b/docs/dev_tasks/index.md index ca53fc7da..1eeea9e77 100644 --- a/docs/dev_tasks/index.md +++ b/docs/dev_tasks/index.md @@ -6,4 +6,3 @@ nav_order: 14 # Common dev tasks A collection of guides for tasks that may have to be carried out repeatedly. - diff --git a/docs/dev_tasks/new_sales_question.md b/docs/dev_tasks/new_sales_question.md index 5b7c67032..f249b871e 100644 --- a/docs/dev_tasks/new_sales_question.md +++ b/docs/dev_tasks/new_sales_question.md @@ -90,7 +90,7 @@ Copy the entry for an existing question and substitute in the text for your new The fields that get exported in CSVs and XMLs are defined in `app/services/exports/sales_log_export_constants.rb`. -If there is not a set for POST__EXPORT_FIELDS, create one. Add your new field to the current year's set. +If there is not a set for POST\_\_EXPORT_FIELDS, create one. Add your new field to the current year's set. You may also have to update the `sales_log_export_service.rb` to correctly filter the year-specific fields. @@ -112,7 +112,7 @@ You will need to add a new `field_XXX` for the new field. In total, update the f You may also have to add some additional validation rules in this file. -Validation for ensuring that the value uploaded is one of the permitted options is handled automatically, using the question class as the original source of truth. +Validation for ensuring that the value uploaded is one of the permitted options is handled automatically, using the question class as the original source of truth. ### 9. Update unit tests diff --git a/docs/form/question.md b/docs/form/question.md index a40509757..fff9dd52d 100644 --- a/docs/form/question.md +++ b/docs/form/question.md @@ -6,7 +6,7 @@ nav_order: 4 # Question -*Updated for 2026.* +_Updated for 2026._ Questions are under the page level of the form definition. diff --git a/docs/setup.md b/docs/setup.md index b85f4d6ee..52f1da3b0 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -20,9 +20,9 @@ We recommend using [nvm](https://github.com/nvm-sh/nvm) to manage NodeJS version ## Instructions for Windows users -If you are working on a windows machine, you will want to install the tools on [WSL](https://learn.microsoft.com/en-us/windows/wsl/install) as some of them are not native to windows. The instructions in these docs assume a Debian-based distribution, such as Ubuntu. +If you are working on a windows machine, you will want to install the tools on [WSL](https://learn.microsoft.com/en-us/windows/wsl/install) as some of them are not native to windows. The instructions in these docs assume a Debian-based distribution, such as Ubuntu. -*You will see a significant performance degradation if you are running the server on WSL whilst the files are on windows.* Thus, make sure to clone the repository into your WSL instance. +_You will see a significant performance degradation if you are running the server on WSL whilst the files are on windows._ Thus, make sure to clone the repository into your WSL instance. Some windows IDEs, such as [VSCode](https://code.visualstudio.com/docs/remote/wsl) and [RubyMine](jetbrains.com/help/ruby/remote-development-starting-page.html#run_in_wsl_ij) can connect you to WSL, which will allow you to develop as though the files were on the local windows filesystem. Ignore any reccommendations that you might see suggesting you keep the files on windows - our experience is that both tests and page loads are much slower when the files are on windows. From 8f656fd17830b89dd1a953ba7857f8716c639bbc Mon Sep 17 00:00:00 2001 From: Nat Dean-Lewis Date: Mon, 2 Feb 2026 11:43:48 +0000 Subject: [PATCH 05/11] CLDC-NONE: update node version to correct value in setup.md --- docs/setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/setup.md b/docs/setup.md index 52f1da3b0..fff730090 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -86,7 +86,7 @@ Some windows IDEs, such as [VSCode](https://code.visualstudio.com/docs/remote/ws 5. Install JavaScript dependencies - Note that we currently use node v16, which is no longer the latest LTS version so you will need to specify the version number when installing + Note that we currently use node v20, which is no longer the latest LTS version so you will need to specify the version number when installing macOS (using nvm): From 6ec78cdfbc9a86eca9f49b0720b06b118bf39847 Mon Sep 17 00:00:00 2001 From: Nat Dean-Lewis Date: Mon, 2 Feb 2026 12:12:31 +0000 Subject: [PATCH 06/11] CLDC-NONE: make clear sales steps are generic for lettings too --- docs/dev_tasks/{new_sales_question.md => new_question.md} | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) rename docs/dev_tasks/{new_sales_question.md => new_question.md} (90%) diff --git a/docs/dev_tasks/new_sales_question.md b/docs/dev_tasks/new_question.md similarity index 90% rename from docs/dev_tasks/new_sales_question.md rename to docs/dev_tasks/new_question.md index f249b871e..24dc01d4c 100644 --- a/docs/dev_tasks/new_sales_question.md +++ b/docs/dev_tasks/new_question.md @@ -5,7 +5,9 @@ nav_order: 1 # New Sales Log Questions -Concerns adding a brand-new question to Sales Logs. This question will appear on the website as part of the Sales form and should be handled in Bulk Uploads. +Concerns adding a brand-new question to Lettings Logs or Sales Logs. This question will appear on the website as part of the Sales form and should be handled in Bulk Uploads. + +Note: this document focuses on Sales Logs but the steps are equivalent for Lettings Logs by replacing `sales` with `lettings` in file paths etc. Guide is up-to-date as of 2026. @@ -88,7 +90,7 @@ Copy the entry for an existing question and substitute in the text for your new ### 7. Include the new field in exports -The fields that get exported in CSVs and XMLs are defined in `app/services/exports/sales_log_export_constants.rb`. +The fields that get exported in CSVs and XMLs are defined in `app/services/exports/sales_log_export_constants.rb`. If there is not a set for POST\_\_EXPORT_FIELDS, create one. Add your new field to the current year's set. From 9e335ae3852b8b13c5089d418065e115bc4f0aeb Mon Sep 17 00:00:00 2001 From: Nat Dean-Lewis Date: Mon, 2 Feb 2026 12:13:05 +0000 Subject: [PATCH 07/11] CLDC-NONE: make clear sales steps are generic for lettings too --- docs/dev_tasks/new_question.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev_tasks/new_question.md b/docs/dev_tasks/new_question.md index 24dc01d4c..e1106c1eb 100644 --- a/docs/dev_tasks/new_question.md +++ b/docs/dev_tasks/new_question.md @@ -3,7 +3,7 @@ parent: Common dev tasks nav_order: 1 --- -# New Sales Log Questions +# New Questions Concerns adding a brand-new question to Lettings Logs or Sales Logs. This question will appear on the website as part of the Sales form and should be handled in Bulk Uploads. From 5221d7ec733492edabae76ac9331f3b0f1dfcc25 Mon Sep 17 00:00:00 2001 From: Nat Dean-Lewis Date: Mon, 2 Feb 2026 12:23:29 +0000 Subject: [PATCH 08/11] CLDC-NONE: add explanation of copy_key --- docs/form/question.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/form/question.md b/docs/form/question.md index fff9dd52d..baea21d21 100644 --- a/docs/form/question.md +++ b/docs/form/question.md @@ -53,7 +53,7 @@ Let's take a look at the properties in the `initialize` function.
The name of the field. This should correspond to a column in the database. In the example, the id is 'ppcodenk'.
copy_key
-
Unknown; requires investigation.
+
This specifies copy from config/locales/forms/... that should be associated with the question
type
Determines what type of question is rendered on the page. In the example, the question is a Radio Form so the app/views/form/_radio_question.html.erb partial will be rendered on the page when this question is displayed to the user
From c6f77cc3bcdebc93c32f60210bf5aad9dcee6c95 Mon Sep 17 00:00:00 2001 From: Nat Dean-Lewis Date: Mon, 2 Feb 2026 12:28:48 +0000 Subject: [PATCH 09/11] CLDC-NONE: add note to update variable_definitions file --- docs/dev_tasks/new_question.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/dev_tasks/new_question.md b/docs/dev_tasks/new_question.md index e1106c1eb..fb6f00710 100644 --- a/docs/dev_tasks/new_question.md +++ b/docs/dev_tasks/new_question.md @@ -118,4 +118,6 @@ Validation for ensuring that the value uploaded is one of the permitted options ### 9. Update unit tests -Create new test files for any new classes you have created. Update any test files for files that you have edited. +- Create new test files for any new classes you have created. Update any test files for files that you have edited. +- Update `spec/fixtures/variable_definitions/sales_download_25_26.csv` (for sales/lettings and for the relevant collection year) with the new question's field name and definition. + From cdd884269b4e152ada23f6dbe8f10fa96c8b24b0 Mon Sep 17 00:00:00 2001 From: Nat Dean-Lewis Date: Mon, 2 Feb 2026 12:34:31 +0000 Subject: [PATCH 10/11] CLDC-NONE: add note about page ids --- docs/dev_tasks/new_question.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/dev_tasks/new_question.md b/docs/dev_tasks/new_question.md index fb6f00710..9c5c2003e 100644 --- a/docs/dev_tasks/new_question.md +++ b/docs/dev_tasks/new_question.md @@ -80,6 +80,8 @@ To make your new page only appear in the forms for the upcoming year, you wrap t (Form::Sales::Pages::SexRegisteredAtBirth1.new(nil, nil, self) if form.start_year_2026_or_later?), ``` +Note: the `@id` attribute of a page is what will be displayed in the url when visiting it. It must be unique within a collection year (i.e. two pages in 25/26 cannot share an ID, but two pages in different collection years can share an ID). + ### 6. Update the locale file The locale files define some of the text for the new question, including hints and the question itself. From 683dca0d1e9ec760513bac5bc9de0b9148e4981d Mon Sep 17 00:00:00 2001 From: Nat Dean-Lewis Date: Mon, 2 Feb 2026 13:49:13 +0000 Subject: [PATCH 11/11] CLDC-NONE: whitespace linting --- docs/dev_tasks/new_question.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/dev_tasks/new_question.md b/docs/dev_tasks/new_question.md index 9c5c2003e..083652873 100644 --- a/docs/dev_tasks/new_question.md +++ b/docs/dev_tasks/new_question.md @@ -80,7 +80,7 @@ To make your new page only appear in the forms for the upcoming year, you wrap t (Form::Sales::Pages::SexRegisteredAtBirth1.new(nil, nil, self) if form.start_year_2026_or_later?), ``` -Note: the `@id` attribute of a page is what will be displayed in the url when visiting it. It must be unique within a collection year (i.e. two pages in 25/26 cannot share an ID, but two pages in different collection years can share an ID). +Note: the `@id` attribute of a page is what will be displayed in the url when visiting it. It must be unique within a collection year (i.e. two pages in 25/26 cannot share an ID, but two pages in different collection years can share an ID). ### 6. Update the locale file @@ -92,7 +92,7 @@ Copy the entry for an existing question and substitute in the text for your new ### 7. Include the new field in exports -The fields that get exported in CSVs and XMLs are defined in `app/services/exports/sales_log_export_constants.rb`. +The fields that get exported in CSVs and XMLs are defined in `app/services/exports/sales_log_export_constants.rb`. If there is not a set for POST\_\_EXPORT_FIELDS, create one. Add your new field to the current year's set. @@ -122,4 +122,3 @@ Validation for ensuring that the value uploaded is one of the permitted options - Create new test files for any new classes you have created. Update any test files for files that you have edited. - Update `spec/fixtures/variable_definitions/sales_download_25_26.csv` (for sales/lettings and for the relevant collection year) with the new question's field name and definition. -