-
-{% embed url="https://www.youtube-nocookie.com/embed/3Aojbp_1MPc" %}
-
-## Quick Links
-
-{% content-ref url="upgrading/manualupgrade.md" %}
-[manualupgrade.md](upgrading/manualupgrade.md)
-{% endcontent-ref %}
-
-{% content-ref url="editor/attaching-workflows/" %}
-[attaching-workflows](editor/attaching-workflows/)
-{% endcontent-ref %}
-
-{% content-ref url="developer/forms-in-the-database.md" %}
-[forms-in-the-database.md](developer/forms-in-the-database.md)
-{% endcontent-ref %}
diff --git a/10/umbraco-forms/SUMMARY.md b/10/umbraco-forms/SUMMARY.md
deleted file mode 100644
index 2961e49cc80..00000000000
--- a/10/umbraco-forms/SUMMARY.md
+++ /dev/null
@@ -1,67 +0,0 @@
-# Table of contents
-
-* [Umbraco Forms Documentation](README.md)
-* [Legacy Documentation](legacy-documentation.md)
-* [Release Notes](release-notes.md)
-
-## Installation
-
-* [Installing Umbraco Forms](installation/install.md)
-* [Licensing](installation/the-licensing-model.md)
-
-## Upgrading
-
-* [Upgrading Umbraco Forms](upgrading/manualupgrade.md)
-* [Version Specific Upgrade Notes](upgrading/version-specific.md)
-* [Migration IDs](upgrading/migration-ids.md)
-
-## Editor
-
-* [Creating a Form - The Basics](editor/creating-a-form/README.md)
- * [Form Settings](editor/creating-a-form/form-settings.md)
- * [Overview Of The Field Types](editor/creating-a-form/fieldtypes/README.md)
- * [Date](editor/creating-a-form/fieldtypes/date.md)
- * [File Upload](editor/creating-a-form/fieldtypes/fileupload.md)
- * [reCAPTCHA V2](editor/creating-a-form/fieldtypes/recaptcha2.md)
- * [reCAPTCHA V3](editor/creating-a-form/fieldtypes/recaptcha3.md)
- * [Setting-up Conditional Logic on Fields](editor/creating-a-form/conditional-logic.md)
-* [Attaching Workflows](editor/attaching-workflows/README.md)
- * [Workflow Types](editor/attaching-workflows/workflow-types.md)
-* [Viewing And Exporting Entries](editor/viewing-and-exporting-entries.md)
-* [Defining And Attaching Prevalue Sources](editor/defining-and-attaching-prevaluesources/README.md)
- * [Prevalue Source Types Overview](editor/defining-and-attaching-prevaluesources/prevalue-source-types.md)
-
-## Developer
-
-* [Preparing Your Frontend](developer/prepping-frontend.md)
-* [Rendering Forms](developer/rendering-forms.md)
-* [Rendering Forms Scripts](developer/rendering-scripts.md)
-* [Themes](developer/themes.md)
-* [Custom Markup](developer/custom-markup.md)
-* [Email Templates](developer/email-templates.md)
-* [Working With Record Data](developer/working-with-data.md)
-* [Umbraco Forms in the Database](developer/forms-in-the-database.md)
-* [Extending](developer/extending/README.md)
- * [Adding A Type To The Provider Model](developer/extending/adding-a-type.md)
- * [Adding A Field Type To Umbraco Forms](developer/extending/adding-a-fieldtype.md)
- * [Excluding a built-in field](developer/extending/excluding-a-built-in-field.md)
- * [Adding A Prevalue Source Type To Umbraco Forms](developer/extending/adding-a-prevaluesourcetype.md)
- * [Adding A Workflow Type To Umbraco Forms](developer/extending/adding-a-workflowtype.md)
- * [Adding An Export Type To Umbraco Forms](developer/extending/adding-a-exporttype.md)
- * [Adding a Magic String Format Function](developer/extending/adding-a-magic-string-format-function.md)
- * [Adding A Server-Side Notification Handler To Umbraco Forms](developer/extending/adding-an-event-handler.md)
- * [Adding a Validation Pattern](developer/extending/adding-a-validation-pattern.md)
- * [Customize Default Fields and Workflows For a Form](developer/extending/customize-default-workflows.md)
-* [Configuration](developer/configuration/README.md)
- * [Forms Provider Type Details](developer/configuration/type-details.md)
-* [Security](developer/security.md)
-* [Magic Strings](developer/magic-strings.md)
-* [Health Checks](developer/healthchecks/README.md)
- * [Apply keys and indexes](developer/healthchecks/apply-keys.md)
- * [Apply keys and indexes for forms in the database](developer/healthchecks/forms-in-the-database-apply-keys.md)
-* [Localization](developer/localization.md)
-* [Content Apps](developer/contentapps.md)
-* [Headless/AJAX Forms](developer/ajaxforms.md)
-* [Block List Filters](developer/blocklistfilters.md)
-* [Field Types](developer/field-types.md)
-* [Storing Prevalue Text Files With IPreValueTextFileStorage](developer/iprevaluetextfilestorage.md)
diff --git a/10/umbraco-forms/developer/ajaxforms.md b/10/umbraco-forms/developer/ajaxforms.md
deleted file mode 100644
index 43b40143714..00000000000
--- a/10/umbraco-forms/developer/ajaxforms.md
+++ /dev/null
@@ -1,448 +0,0 @@
----
-meta.Title: Headless/Asynchronous JavaScript and XML (AJAX) Forms
----
-
-# Headless/AJAX Forms
-
-Umbraco Forms provides an API for client-side rendering and submission of forms. This will be useful when you want to handle forms in a headless style scenario.
-
-## Enabling the API
-
-The Forms API is disabled by default. To enable it, set the `Umbraco:Forms:Options:EnableFormsApi` configuration key to `true`.
-
-For example:
-
-```json
- "Umbraco": {
- "Forms": {
- "Options": {
- "EnableFormsApi": true
- }
- }
- }
-```
-
-## API Definition
-
-The API supports two endpoints, one for rendering a form and one for submitting it.
-
-{% swagger src="./../.gitbook/assets/umbraco_forms_swagger.json" path="/umbraco/forms/api/v1.0/definitions/{id}" method="get" %}
-[umbraco_forms_swagger.json](./../.gitbook/assets/umbraco_forms_swagger.json)
-{% endswagger %}
-
-{% swagger src="./../.gitbook/assets/umbraco_forms_swagger.json" path="/umbraco/forms/api/v1.0/entries/{id}" method="post" %}
-[umbraco_forms_swagger.json](./../.gitbook/assets/umbraco_forms_swagger.json)
-{% endswagger %}
-
-As well as this documentation, the definition of the API can also be reviewed via the Swagger UI, available at the following path: `/umbraco/forms/api/swagger/index.html`.
-
-The Open API specification is available from: `/umbraco/forms/api/openapi.json`
-
-### Requesting a Form Definition
-
-To request the definition of a form, the following request can be made:
-
-```
-GET /umbraco/forms/api/v1.0/definitions/{id}?contentId={contentId}
-```
-
-The GET request requires the Guid identifying the form.
-
-An optional `contentId` parameter can be provided, which can either be the integer or GUID identifier for the current page. If provided, the content item identified will be used for Forms features requiring information from the page the form is hosted on. This includes the parsing of ["magic string" placeholders](magic-strings.md).
-
-A `culture` parameter can also be provided, expected as an ISO code identifying a language used in the Umbraco installation (for example, `en-US`). This will be used to ensure the correct translation for dictionary keys is used. It will also retrieve page content from the appropriate language variant. If the parameter is not provided in the request, the default Umbraco language will be used.
-
-If the requested form is not found, a 404 status code will be returned.
-
-A successful request will return a 200 status code. An example response is as follows. It will differ depending on the pages, fields and other settings available for the form.
-
-```json
-{
- "disableDefaultStylesheet": false,
- "fieldIndicationType": "MarkMandatoryFields",
- "hideFieldValidation": false,
- "id": "34ef4a19-efa7-40c1-b8b6-2fd7257f2ed3",
- "indicator": "*",
- "messageOnSubmit": "Thanks for submitting the form",
- "name": "Simple Comment Form",
- "nextLabel": "Next",
- "pages": [
- {
- "caption": "Your comment",
- "fieldsets": [
- {
- "caption": "",
- "columns": [
- {
- "caption": "",
- "width": 12,
- "fields": [
- {
- "alias": "name",
- "caption": "Name",
- "condition": {
- "actionType": "Show",
- "logicType": "All",
- "rules": []
- },
- "helpText": "[#message] from [#pageName]",
- "id": "25185934-9a61-491c-9610-83dfe774662c",
- "pattern": "",
- "patternInvalidErrorMessage": "Please provide a valid value for Name",
- "placeholder": "",
- "preValues": [],
- "required": true,
- "requiredErrorMessage": "Please provide a value for Name",
- "settings": {
- "defaultValue": "",
- "placeholder": "Please enter your name.",
- "showLabel": "",
- "maximumLength": "",
- "fieldType": "",
- "autocompleteAttribute": ""
- },
- "type": {
- "id": "3f92e01b-29e2-4a30-bf33-9df5580ed52c",
- "name": "Short answer"
- }
- },
- {
- "alias": "email",
- "caption": "Email",
- "condition": {
- "actionType": "Show",
- "logicType": "All",
- "rules": []
- },
- "helpText": "",
- "id": "816fdf3b-a796-4677-a317-943a54bf9d55",
- "pattern": "^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$",
- "patternInvalidErrorMessage": "Please provide a valid value for Email",
- "placeholder": "",
- "preValues": [],
- "required": true,
- "requiredErrorMessage": "Please provide a value for Email",
- "settings": {
- "defaultValue": "",
- "placeholder": "",
- "showLabel": "",
- "maximumLength": "",
- "fieldType": "email",
- "autocompleteAttribute": ""
- },
- "type": {
- "id": "3f92e01b-29e2-4a30-bf33-9df5580ed52c",
- "name": "Short answer"
- }
- },
- {
- "alias": "comment",
- "caption": "Comment",
- "condition": {
- "actionType": "Show",
- "logicType": "All",
- "rules": []
- },
- "helpText": "",
- "id": "9d723100-ec34-412f-aaa5-516634d7c833",
- "pattern": "",
- "patternInvalidErrorMessage": "Please provide a valid value for Comment",
- "placeholder": "",
- "preValues": [],
- "required": false,
- "requiredErrorMessage": "Please provide a value for Comment",
- "settings": {
- "defaultValue": "",
- "placeholder": "",
- "showLabel": "",
- "autocompleteAttribute": "",
- "numberOfRows": "2",
- "maximumLength": ""
- },
- "type": {
- "id": "023f09ac-1445-4bcb-b8fa-ab49f33bd046",
- "name": "Long answer"
- }
- },
- {
- "alias": "country",
- "caption": "Country",
- "condition": {
- "actionType": "Show",
- "logicType": "All",
- "rules": []
- },
- "helpText": "",
- "id": "30ff8f37-28d4-47df-f281-422b36c62e73",
- "pattern": "",
- "patternInvalidErrorMessage": "Please provide a valid value for Country",
- "placeholder": "",
- "preValues": [
- {
- "caption": "France",
- "value": "fr"
- },
- {
- "caption": "Italy",
- "value": "it"
- },
- {
- "caption": "Span",
- "value": "es"
- },
- {
- "caption": "United Kingdom",
- "value": "gb"
- }
- ],
- "required": false,
- "requiredErrorMessage": "Please provide a value for Country",
- "settings": {
- "defaultValue": "",
- "allowMultipleSelections": "",
- "showLabel": "",
- "autocompleteAttribute": "",
- "selectPrompt": "Please select"
- },
- "type": {
- "id": "0dd29d42-a6a5-11de-a2f2-222256d89593",
- "name": "Dropdown"
- }
- },
- {
- "alias": "favouriteColour",
- "caption": "Favourite Colour",
- "condition": {
- "actionType": "Show",
- "logicType": "All",
- "rules": []
- },
- "helpText": "",
- "id": "a6e2e27f-097d-476a-edb9-4aa79449ab5c",
- "pattern": "",
- "patternInvalidErrorMessage": "Please provide a valid value for Favourite Colour",
- "placeholder": "",
- "preValues": [
- {
- "caption": "Red",
- "value": "red"
- },
- {
- "caption": "Green",
- "value": "green"
- },
- {
- "caption": "Yellow",
- "value": "yello"
- }
- ],
- "required": false,
- "requiredErrorMessage": "Please provide a value for Favourite Colour",
- "settings": {
- "defaultValue": "",
- "showLabel": ""
- },
- "type": {
- "id": "fab43f20-a6bf-11de-a28f-9b5755d89593",
- "name": "Multiple choice"
- }
- },
- {
- "alias": "dataConsent",
- "caption": "Data consent",
- "condition": {
- "actionType": "Show",
- "logicType": "All",
- "rules": []
- },
- "helpText": "Please indicate if it's OK to store your data.",
- "id": "9f25acaf-4ac4-4105-9afe-eb0bb0c03b31",
- "pattern": "",
- "patternInvalidErrorMessage": "Please provide a valid value for Data consent",
- "placeholder": "",
- "preValues": [],
- "required": true,
- "requiredErrorMessage": "Please confirm your data consent",
- "settings": {
- "acceptCopy": "Yes, I give permission to store and process my data.",
- "showLabel": ""
- },
- "type": {
- "id": "a72c9df9-3847-47cf-afb8-b86773fd12cd",
- "name": "Data Consent"
- }
- },
- {
- "alias": "tickToAddMoreInfo",
- "caption": "Tick to add more info",
- "condition": {
- "actionType": "Show",
- "logicType": "All",
- "rules": []
- },
- "helpText": "",
- "id": "6ce0cf78-5102-47c1-85c6-9530d9e9c6a6",
- "pattern": "",
- "patternInvalidErrorMessage": "Please provide a valid value for Tick to add more info",
- "placeholder": "",
- "preValues": [],
- "required": false,
- "requiredErrorMessage": "Please provide a value for Tick to add more info",
- "settings": {
- "defaultValue": ""
- },
- "type": {
- "id": "d5c0c390-ae9a-11de-a69e-666455d89593",
- "name": "Checkbox"
- }
- },
- {
- "alias": "moreInfo",
- "caption": "More info",
- "condition": {
- "actionType": "Show",
- "logicType": "All",
- "rules": [
- {
- "field": "6ce0cf78-5102-47c1-85c6-9530d9e9c6a6",
- "operator": "Is",
- "value": "on"
- }
- ]
- },
- "helpText": "",
- "id": "5b4100ed-cc5e-4113-943c-ee5a8f4e448d",
- "pattern": "",
- "patternInvalidErrorMessage": "Please provide a valid value for More info",
- "placeholder": "",
- "preValues": [],
- "required": false,
- "requiredErrorMessage": "Please provide a value for More info",
- "settings": {
- "defaultValue": "",
- "placeholder": "",
- "showLabel": "",
- "maximumLength": "",
- "fieldType": "",
- "autocompleteAttribute": ""
- },
- "type": {
- "id": "3f92e01b-29e2-4a30-bf33-9df5580ed52c",
- "name": "Short answer"
- }
- }
- ],
- "width": 0
- }
- ],
- "id": "d677b96f-488d-4052-b00d-fb852b35e9c5"
- }
- ]
- }
- ],
- "previousLabel": "Previous",
- "showValidationSummary": false,
- "submitLabel": "Submit"
-}
-```
-
-### Submitting a Form Entry
-
-To submit a form entry, the following request can be made:
-
-```
-POST /umbraco/forms/api/v1.0/entries/{id}
-```
-
-The POST request requires the Guid identifying the form.
-
-It also requires a `Content-Type` header of `application/json` and accepts a body as per this example:
-
-```json
-{
- "values": {
- "name": "Fred",
- "email": "fred@test.com",
- "comment": "Test",
- "country": "it",
- "favouriteColours": ["red", "green"],
- "dataConsent": "on"
- },
- "contentId": "ca4249ed-2b23-4337-b522-63cabe5587d1",
- "culture": "en-US"
-}
-```
-
-The `values` collection consists of a set of name/value pairs, where the name is the alias of a form field. The value is the value of the submitted field, which can either be a string, or an array of strings. In this way we support fields that accept multiple values, such as checkbox lists.
-
-The `contentId` and `culture` parameters are optional. If provided they will be used to customize the response for the current page and language respectively.
-
-In the case of a validation error, a 422 "Unprocessable Entity" status code will be returned, along with a response similar to the following:
-
-```json
-{
- "errors": {
- "name": [
- "Please provide a value for Name"
- ]
- },
- "extensions": {},
- "status": 422,
- "title": "One or more validation errors occurred."
-}
-```
-
-A successful response will return a 202 "Accepted" status code.
-
-## Securing the API
-
-### Antiforgery Protection
-
-When posting forms in the traditional way, via a full page post back, an anti-forgery token is generated and validated. This provides protection against Cross-Site Request Forgery (CSRF) attacks.
-
-The same protection is available for forms submitted via AJAX techniques.
-
-In order to generate the token and provide it in the form post, the following code can be applied to the .cshtml template:
-
-```csharp
-@using Microsoft.AspNetCore.Antiforgery
-
-@inject IAntiforgery antiforgery
-
-@{
- var tokenSet = antiforgery.GetAndStoreTokens(Context);
-}
-```
-
-When posting the form, the header value generated can be provided, where it will be validated server-side before accepting the request.
-
-```javascript
- let response = await fetch("/umbraco/forms/api/v1.0/entries/" + formId, {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- "@tokenSet.HeaderName" : "@tokenSet.RequestToken"
- },
- body: JSON.stringify(data),
- });
-```
-
-### API Key
-
-The antiforgery token security approach is valid when building a client-side integration with API calls made from the browser.
-
-Providing the token isn't possible though in other headless situations such as server-to-server requests. In these situations, an alternative approach to securing the API is available.
-
-Firstly, with server-to-server integrations you will want to disable the antiforgery token protection.
-
-This is done by setting the `Umbraco:Forms:Security:EnableAntiForgeryTokenForFormsApi` configuration key to a value of `false`.
-
-You should then configure an API key `Umbraco:Forms:Security:FormsApiKey`. The string value can be anything, but it should not be susceptible to a brute force attack.
-
-With this in place any request to the Forms API will be rejected unless the configured value is provided in an HTTP header named `Api-Key`.
-
-## Rendering and Submitting forms with JavaScript
-
-For an illustrative example showing how a form can be rendered, validated and submitted using the API and vanilla JavaScript, please [see this gist](https://gist.github.com/AndyButland/9371175d6acf24a5307b053398f08448).
-
-Examples demonstrating how to handle a file upload and use reCAPTCHA fields are included.
\ No newline at end of file
diff --git a/10/umbraco-forms/developer/blocklistfilters.md b/10/umbraco-forms/developer/blocklistfilters.md
deleted file mode 100644
index 72e85aaa95a..00000000000
--- a/10/umbraco-forms/developer/blocklistfilters.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-meta.Title: Block List Filters
----
-
-# Block List Filters
-
-When working with the Block List editor, [the editor experience is enhanced](https://docs.umbraco.com/umbraco-cms/fundamentals/backoffice/property-editors/built-in-umbraco-property-editors/block-editor/block-list-editor#editor-appearance) by defining a label for the appearance of the Block.
-
-These labels can contain AngularJS filters.
-
-From Forms 10.2, a filter `umbFormsFormName` is available for use.
-
-If you add a reference to a property containing a form to the block's label, it will render with the form's Id.
-
-For example, assuming a property containing a picked form with an alias of `contactForm`:
-
-```
-{{contactForm}}
-```
-
-By using the filter as follows, the form's name will be displayed instead.
-
-```
-{{contactForm | umbFormsFormName}}
-```
diff --git a/10/umbraco-forms/developer/configuration/README.md b/10/umbraco-forms/developer/configuration/README.md
deleted file mode 100644
index 8842e95e5de..00000000000
--- a/10/umbraco-forms/developer/configuration/README.md
+++ /dev/null
@@ -1,499 +0,0 @@
----
-meta.Title: Umbraco Forms configuration
-description: >-
- In Umbraco Forms it's possible to customize the functionality with various
- configuration values.
----
-
-# Configuration
-
-With Umbraco Forms it's possible to customize the functionality with various configuration values.
-
-## Editing configuration values
-
-All configuration for Umbraco Forms is held in the `appSettings.json` file found at the root of your Umbraco website. If the configuration has been customized to use another source, then the same keys and values discussed in this article can be applied there.
-
-The convention for Umbraco configuration is to have package based options stored as a child structure below the `Umbraco` element, and as a sibling of `CMS`. Forms configuration follows this pattern, i.e.:
-
-```json
-{
- ...
- "Umbraco": {
- "CMS": {
- ...
- },
- "Forms": {
- ...
- }
- }
-}
-```
-
-All configuration for Forms is optional. In other words, all values have defaults that will be applied if no configuration is available for a particular key.
-
-For illustration purposes, the following structure represents the full set of options for configuration of Forms, along with the default values. This will help when you need to provide a different setting to understand where it should be applied.
-
-```json
- "Forms": {
- "FormDesign": {
- "DisableAutomaticAdditionOfDataConsentField": false,
- "DisableDefaultWorkflow": false,
- "MaxNumberOfColumnsInFormGroup": 12,
- "DefaultTheme": "default",
- "DefaultEmailTemplate": "Forms/Emails/Example-Template.cshtml",
- "Defaults": {
- "ManualApproval": false,
- "DisableStylesheet": false,
- "MarkFieldsIndicator": "NoIndicator",
- "Indicator": "*",
- "RequiredErrorMessage": "Please provide a value for {0}",
- "InvalidErrorMessage": "Please provide a valid value for {0}",
- "ShowValidationSummary": false,
- "HideFieldValidationLabels": false,
- "NextPageButtonLabel": "Next",
- "PreviousPageButtonLabel": "Previous",
- "SubmitButtonLabel": "Submit",
- "MessageOnSubmit": "Thank you",
- "StoreRecordsLocally": true,
- "AutocompleteAttribute": "",
- "DaysToRetainSubmittedRecordsFor": 0,
- "DaysToRetainApprovedRecordsFor": 0
- },
- "RemoveProvidedEmailTemplate": false,
- "RemoveProvidedFormTemplates": false,
- "FormElementHtmlIdPrefix": "",
- "SettingsCustomization": {
- "DataSourceTypes": {},
- "FieldTypes": {},
- "PrevalueSourceTypes": {},
- "WorkflowTypes": {},
- }
- },
- "Options": {
- "IgnoreWorkFlowsOnEdit": "True",
- "ExecuteWorkflowAsync": "False",
- "AllowEditableFormSubmissions": false,
- "AppendQueryStringOnRedirectAfterFormSubmission": false,
- "CultureToUseWhenParsingDatesForBackOffice": "",
- "TriggerConditionsCheckOn": "change",
- "ScheduledRecordDeletion": {
- "Enabled": false,
- "FirstRunTime": "",
- "Period": "1.00:00:00"
- },
- "DisableRecordIndexing": false,
- "EnableFormsApi": false,
- "EnableRecordingOfIpWithFormSubmission": true,
- "UseSemanticFieldsetRendering": false,
- "DisableRelationTracking": false,
- "TrackRenderedFormsStorageMethod": "TempData"
- },
- "Security": {
- "DisallowedFileUploadExtensions": "config,exe,dll,asp,aspx",
- "EnableAntiForgeryToken": true,
- "SavePlainTextPasswords": false,
- "DisableFileUploadAccessProtection": false,
- "DefaultUserAccessToNewForms": "Grant",
- "ManageSecurityWithUserGroups": false,
- "GrantAccessToNewFormsForUserGroups": "admin,editor",
- "FormsApiKey": "",
- "EnableAntiForgeryTokenForFormsApi": true,
- },
- "FieldTypes": {
- "DatePicker": {
- "DatePickerYearRange": 10
- },
- "Recaptcha2": {
- "PublicKey": "",
- "PrivateKey": ""
- },
- "Recaptcha3": {
- "SiteKey": "",
- "PrivateKey": "",
- "Domain": "Google"
- },
- "RichText": {
- "DataTypeId": "ca90c950-0aff-4e72-b976-a30b1ac57dad"
- },
- "TitleAndDescription": {
- "AllowUnsafeHtmlRendering": true
- }
- }
- }
-```
-
-## Form design configuration
-
-### DisableAutomaticAdditionOfDataConsentField
-
-This configuration value expects a `true` or `false` value and can be used to disable the feature where all new forms are provided with a default "Consent for storing submitted data" field on creation. Defaults to `false`.
-
-### DisableDefaultWorkflow
-
-This configuration value expects a `true` or `false` value and can be used to toggle if new forms that are created adds an email workflow to send the result of the form to the current user who created the form. Defaults to `false`.
-
-### MaxNumberOfColumnsInFormGroup
-
-This setting controls the maximum number of columns that can be created by editors when they configure groups within a form. The default value used if the setting value is not provided is 12.
-
-### DefaultTheme
-
-This setting allows you to configure the name of the theme to use when an editor has not specifically selected one for a form. If empty or missing, the default value of "default" is used. If a custom default theme is configured, it will be used for rendering forms where the requested file exists, and where not, will fall back to the out of the box default theme.
-
-### DefaultEmailTemplate
-
-When creating an empty form, a single workflow is added that will send an email to the current user's address. By default, the template shipped with Umbraco Forms is available at `Forms/Emails/Example-Template.cshtml` is used.
-
-If you have created a custom template and would like to use that as the default instead, you can set the path here using this configuration setting.
-
-### RemoveProvidedEmailTemplate
-
-From Forms 10.2, the provided template can be removed from the selection if you have created email templates for the "send Razor email" workflow. To do this, set this value to `true`.
-
-### RemoveProvidedFormTemplates
-
-Similarly, from Forms 10.2, the provided form templates available from the form creation dialog can be removed from selection. To do this, set this configuration value to `true`.
-
-### FormElementHtmlIdPrefix
-
-By default the value of HTML `id` attribute rendered for fieldsets and fields using the default theme is the GUID associated with the form element. Although [this is valid](https://developer.mozilla.org/en-US/docs/Web/HTML/Global\_attributes/id), some browsers, particularly Safari, may report issues with this if the identifier begins with a number. To avoid such issues, from Forms 10.2, the attribute values can be prefixed with the value provided in this configuration element.
-
-For example, providing a value of `"f_"` will apply a prefix of "f\_" to each fieldset and field `id` attribute.
-
-### SettingsCustomization
-
-Forms 10.2 introduced the ability to configure settings for the field, workflow, data source, and prevalue sources. The default behavior, when a new field or workflow is added to a form, is for each setting to be empty. The values are then completed by the editor. All settings defined on the type are displayed for entry.
-
-In some situations, you may want to hide certain settings from entry, so they always take an empty value. In others, you may want to provide a default value that the editor can accept or amend. And lastly, you may have a requirement for a fixed, non-empty value, that's enforced by the organization and not editable. Each of these scenarios can be supported by this configuration setting.
-
-It consists of four dictionaries, one for each type:
-
-* `DataSourceTypes`
-* `FieldTypes`
-* `PrevalueSourceTypes`
-* `WorkflowTypes`
-
-Each dictionary can be identified using the GUID or alias of the type as the key. The value is set to the following structure that contains three settings:
-
-```json
-{
- "IsHidden": true|false,
- "DefaultValue": "",
- "IsReadOnly": true|false
-}
-```
-
-* `IsHidden` - if provided and set to true the setting will be hidden and will always have an empty value.
-* `DefaultValue` - if provided the value will be pre-filled when a type using it is created.
-* `IsReadOnly` - used in conjunction with the above, if set the field won't be editable and hence whatever is set as the `DefaultValue` won't be able to be changed. If set to false (or omitted) the editor can change the value from the default.
-
-In this example, the sender address field on a workflow for sending emails can be hidden, such that the system configured value is always used:
-
-```json
- "SettingsCustomization": {
- "WorkflowTypes": {
- "sendEmailWithRazorTemplate": {
- "SenderEmail": {
- "IsHidden": true
- }
- }
- },
- }
-```
-
-Here an organization-approved reCAPTCHA score threshold is defined, that can't be changed by editors:
-
-```json
- "SettingsCustomization": {
- "FieldTypes": {
- "recaptcha3": {
- "ScoreThreshold": {
- "DefaultValue": "0.8",
- "IsReadOnly": true
- }
- }
- },
- }
-```
-
-In order to configure this setting, you will need to know the GUID or alias for the type and the property name for each setting. You can find [these values for the built-in Forms types here](type-details.md).
-
-Take care to not hide any settings that are required for the particular field or workflow type (for example, the `Subject` field for email workflows). If you do that, the item will fail validation when an editor tries to create it.
-
-The default value and read-only settings apply to most setting types. There is an exception for complex ones where a default string value isn't appropriate. An example of one of these is the field mapper used in the "Send to URL" workflow.
-
-### Form default settings configuration
-
-The following configured values are applied to all forms as they are created. They can then be amended on a per-form basis via the Umbraco backoffice.
-
-Once the form has been created, the values are set explicitly on the form, so subsequent changes to the defaults in configuration won't change the settings used on existing forms.
-
-#### ManualApproval
-
-This setting needs to be a `true` or `false` value and will allow you to toggle if a form allows submissions to be post moderated. Most use cases are for publicly shown entries such as blog post comments or submissions for a social campaign. Defaults to `false`.
-
-#### DisableStylesheet
-
-This setting needs to be a `true` or `false` value and will allow you to toggle if the form will include some default styling with the Umbraco Forms CSS stylesheet. Defaults to `false`.
-
-#### MarkFieldsIndicator
-
-This setting can have the following values to allow you to toggle the mode of marking mandatory or optional fields:
-
-* `NoIndicator` (default)
-* `MarkMandatoryFields`
-* `MarkOptionalFields`
-
-#### Indicator
-
-This setting is used to mark the mandatory or optional fields based on the setting above. By default this is an asterisk `*`.
-
-#### RequiredErrorMessage
-
-This allows you to configure the required error validation message. By default this is `Please provide a value for {0}` where the `{0}` is used to replace the name of the field that is required.
-
-#### InvalidErrorMessage
-
-This allows you to configure the invalid error validation message. By default this is `Please provide a valid value for {0}` where the `{0}` is used to replace the name of the field that is invalid.
-
-#### ShowValidationSummary
-
-This setting needs to be a `true` or `false` value and will allow you to toggle if the form will display all form validation error messages in a validation summary together. Defaults to `false`.
-
-#### HideFieldValidationLabels
-
-This setting needs to be a `true` or `false` value and will allow you to toggle if the form will show inline validation error messages next to the form field that is invalid. Defaults to `false`.
-
-#### NextPageButtonLabel, PreviousPageButtonLabel, SubmitButtonLabel
-
-These settings configure the default next, previous, and submit button labels. By default, these are `Next`, `Previous`, and `Submit` respectively. These labels can be amended on a form-by-form basis via the form's **Settings** section.
-
-#### MessageOnSubmit
-
-This allows you to configure what text is displayed when a form is submitted and is not being redirected to a different content node. Defaults to `Thank you`.
-
-#### StoreRecordsLocally
-
-This setting needs to be a `True` or `False` value and will allow you to toggle if form submission data should be stored in the Umbraco Forms database tables. By default this is set to `True`.
-
-#### AutocompleteAttribute
-
-This setting provides a value to be used for the `autocomplete` attribute for newly created forms. By default the value is empty, but can be set to `on` or `off` to have that value applied as the attribute value used when rendering the form.
-
-#### DaysToRetainSubmittedRecordsFor
-
-Introduced in 10.2, this setting controls the initial value of the number of days to retain form submission records for newly created forms. By default the value is 0, which means records will not be deleted at any time and are retained forever.
-
-If set to a positive number, a date value calculated by taking away the number of days configured from the current date is found. Records in the 'submitted' state, that are older than this date, will be flagged for removal.
-
-#### DaysToRetainApprovedRecordsFor
-
-Applies as per `DaysToRetainSubmittedRecordsFor` but for records in the 'approved' state.
-
-## Package options configuration
-
-### IgnoreWorkFlowsOnEdit
-
-This configuration expects a `True` or `False` string value, or a comma-separated list of form names, and allows you to toggle if a form submission is edited again, that the workflows on the form will re-fire after an update to the form submission. This is used in conjunction with the `AllowEditableFormSubmissions` configuration value. Defaults to `True`.
-
-### ExecuteWorkflowAsync
-
-This configuration key is _experimental_ and will allow Workflows to be executed in an asynchronous manner. The value can be a `True` or `False` string value, or a comma-separated list of form names. Defaults to `False`.
-
-### AllowEditableFormSubmissions
-
-This configuration value expects a `true` or `false` value and can be used to toggle the functionality to allow a form submission to be editable and re-submitted. When the value is set to `true` it allows Form Submissions to be edited using the following querystring for the page containing the form on the site. `?recordId=GUID` Replace `GUID` with the GUID of the form submission. Defaults to `false`.
-
-{% hint style="info" %}
-There was a typo in this setting where it had been named as `AllowEditableFormSubmissions`. This is the name that needs to be used in configuration for Forms 9. In Forms 10 this was be corrected to the now documented value of `AllowEditableFormSubmissions`.
-{% endhint %}
-
-{% hint style="warning" %}
-Enable this feature ONLY if you understand the security implications.
-{% endhint %}
-
-### AppendQueryStringOnRedirectAfterFormSubmission
-
-When redirecting following a form submission, a `TempData` value is set that is used to ensure the submission message is displayed rather than the form itself. In certain situations, such as hosting pages with forms in IFRAMEs from other websites, this value is not persisted between requests.
-
-By setting the following value to True, a querystring value of `formSubmitted=`, will be used to indicate a form submitted on the previous request.
-
-### CultureToUseWhenParsingDatesForBackOffice
-
-This setting has been added in 9.5 and 10.1, to help resolve an issue with multi-lingual setups.
-
-When Umbraco Forms stores data for a record, it saves the values submitted for each field into a dedicated table for each type (string, date etc.). It also saves a second copy of the record in a JSON structure which is more suitable for fast look-up and display in the backoffice. Date values are serialized using the culture used by the front-end website when the form entry is stored.
-
-When displaying the data in the backoffice, the date value needs to be parsed back into an actual date object for formatting. And this can cause a problem if the backoffice user is using a different language, and hence culture setting, than that used when the value was stored.
-
-From 9.5 and 10.1 onwards, the culture used when storing the form entry is recorded, thus we can ensure the correct value is used when parsing the date. However, this doesn't help for historically stored records. To at least partially mitigate the problem, when you have editors using different languages to a single language presented on the website front-end, you can set this value to match the culture code used on the website. This ensures the date fields in the backoffice are correctly presented.
-
-Taking an example of a website globalization culture code setting of "en-US" (and a date format of `m/d/y`), but an editor uses "en-GB" (which formats dates as of `d/m/y`). By setting the value of this configuration key to "en-US", you can ensure that the culture when parsing dates for presentation in the backoffice will match that used when the value was stored.
-
-If no value is set, and no culture value was stored alongside the form entry, the culture based on the language associated with the current backoffice user will be used.
-
-### TriggerConditionsCheckOn
-
-This configuration setting provides control over the client-side event used to trigger conditions. The `change` event is the default used if this setting is empty. It can also be set to a value of `input`. The main difference seen here relates to text fields, with the "input" event firing on each key press, and the "change" only when the field loses focus.
-
-### ScheduledRecordDeletion
-
-Scheduled deletion of records older than a specified number of days was a feature introduced in Forms 10.2. It uses a background task to run the cleanup operation, which can be customized with the following settings.
-
-#### Enabled
-
-By default this value is `false` and no data will be removed. Even if forms are configured to have submitted data cleaned up, no records will be deleted. A note will be displayed in the backoffice indicating this status.
-
-Set to `true` to enabled the background task.
-
-#### FirstRunTime
-
-This will configure when the record deletion process will run for the first time. If the value is not configured the health checks will run after a short delay following the website start. The value is specified as a string in crontab format. For example, a value of `"* 4 * * *"` will first run the operation at 4 a.m.
-
-#### Period
-
-Defines how often the record deletion process will run. The default value is `1.00:00:00` which is equivalent to once every 24 hours. Shorter or longer periods can be set using different datetime strings.
-
-### DisableRecordIndexing
-
-Set this value to `true` to disable the default behavior of indexing the form submissions into the Examine index.
-
-If indexing has already occurred, you will still need to manually remove the files (found in `App_Data\TEMP\ExamineIndexes\UmbracoFormsRecords`). They will be recreated if indexing is subsequently re-enabled.
-
-### EnableFormsApi
-
-Set this value to `true` to enable the Forms API supporting headless and AJAX forms.
-
-### EnableRecordingOfIpWithFormSubmission
-
-The user's IP address is recorded by default when a form is submitted and stored in the `UFRecords` database table.
-
-To remove this behavior set this value to `false`.
-
-If recording IPs and your site is behind a proxy, load balancer or CDN, we recommend using [ASP.NET's forwarded headers middleware](https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-7.0) to ensure the correct value for the client IP is resolved.
-
-### UseSemanticFieldsetRendering
-
-In Forms 10.5 amends were made to the default theme for Forms that improved accessibility. Specifically we provide the option to use alternative markup for rendering checkbox and radio button lists. These use the more semantically correct `fieldset` and `legend` elements, instead of the previously used `div` and `label`.
-
-Although this semantic markup is preferred, it could be a presentational breaking change for those styling the default theme. As such we have made this markup improvement optional. You can opt into using it by setting this configuration value to `true`.
-
-In Umbraco 13 this configuration option will be removed and the semantic rendering made the only option.
-
-### DisableRelationTracking
-
-Forms will by default track relations between forms and the content pages they are used on. This allows editors to see where forms are being used in their Umbraco website.
-
-If you would like to disable this feature, you can set the value of this setting to `false`.
-
-## TrackRenderedFormsStorageMethod
-
-Forms tracks the forms rendered on a page in order that the associated scripts can be placed in a different location within the HTML. Usually this is used to [render the scripts](../rendering-scripts.md)) at the bottom of the page.
-
-By default, `TempData` is used as the storage mechanism for this tracking.
-
-This can cause some issues when applying a Content Delivery Network (CDN) to your website, and as such an alternative is available using `HttpContext.Items`.
-
-To switch to this storage mechanism change the value of this setting from the default of `TempData` to `HttpContextItems`.
-
-We expect `HttpContextItems` to be the default option from Forms 14 onwards.
-
-## Security configuration
-
-### DisallowedFileUploadExtensions
-
-When using the File Upload field in a form, editors can choose which file extensions they want to accept. When an image is expected, they can for example specify that only `.jpg` or `.png` files are uploaded.
-
-There are certain file extensions that in almost all cases should never be allowed, which are held in this configuration value. This means that even if an editor has selected to allow all files, any files that match the extensions listed here will be blocked.
-
-By default, .NET related code files like `.config` and `.aspx` are included in this deny list. You can add or - if you are sure - remove values from this list to meet your needs.
-
-### EnableAntiForgeryToken
-
-This setting needs to be a `true` or `false` value and will enable the ASP.NET Anti Forgery Token and we recommend that you enable this option. Defaults to `true`.
-
-In certain circumstances, including hosting pages with forms in IFRAMEs from other websites, this may need to be set to `false`.
-
-### SavePlainTextPasswords
-
-This setting needs to be a `true` or `false` value and controls whether password fields provided in forms will be saved to the database. Defaults to `false`.
-
-### DisableFileUploadAccessProtection
-
-In Umbraco Forms 9.2.0, protection was added to uploaded files to prevent users from accessing them if they aren't logged into the backoffice and have permission to manage the form for which the file was submitted. As a policy of being "secure by default", the out of the box behavior is that this access protection is in place.
-
-If for any reason you need to revert to the previous behavior, or have other reasons where you want to permit unauthenticated users from accessing the files, you can turn off this protection by setting this configuration value to `true`.
-
-### DefaultUserAccessToNewForms
-
-In Umbraco Forms 9.3.0, this setting was added to add control over access to new forms. The default behavior is for all users to be granted access to newly created forms. To amend that to deny access, the setting can be updated to a value of `Deny`. A value of `Grant` or configuration with the setting absent preserves the default behavior.
-
-### ManageSecurityWithUserGroups
-
-Umbraco Forms 9.3.0 introduced the ability to administer access to Umbraco Forms using Umbraco's user groups. This can be used instead or in addition to the legacy administration which is at the level of the individual user. Set this option to `true` to enable the user group permission management functionality.
-
-### GrantAccessToNewFormsForUserGroups
-
-Also introduced in Umbraco Forms 9.3.0, this setting takes a comma-separated list of user group aliases which will be granted access automatically to newly created forms. This setting only takes effect when `ManageSecurityWithUserGroups` is set to `true`.
-
-There are two "special" values that can be applied within or instead of the comma-separated list.
-
-A value of `all` will give access to the form to all user groups.
-
-A value of `form-creator` will give access to all the user groups that the user who created the form is part of.
-
-### FormsApiKey and EnableAntiForgeryTokenForFormsApi
-
-Available from Forms 10.2.1, the `FormsApiKey` configuration setting can be used to secure the Forms Headless API in server-to-server integrations. When set, API calls will be rejected unless the value of this setting is provided in an HTTP header.
-
-Setting the value of `EnableAntiForgeryTokenForFormsApi` to `false` will disable the anti-forgery protection for the Forms Headless/AJAX API. You need to do this for server-to-server integrations where it's not possible to provide a valid anti-forgery token in the request.
-
-For more information, see the [Headless/AJAX Forms](../ajaxforms.md) article.
-
-## Field type specific configuration
-
-### Date picker field type configuration
-
-#### DatePickerYearRange
-
-This setting is used to configure the Date Picker form field range of years that is available in the date picker. By default this is a small range of 10 years.
-
-### reCAPTCHA v2 field type configuration
-
-#### PublicKey & PrivateKey
-
-Both of these configuration values are needed in order to use the "_Recaptcha2_" field type implementing legacy ReCaptcha V2 from Google. You can obtain both of these values after signing up to create a ReCaptcha key here - [https://www.google.com/recaptcha/admin](https://www.google.com/recaptcha/admin)
-
-Google has renamed these recently and the `Site Key` refers to `RecaptchaPublicKey` and `Secret Key` is to be used for `RecaptchaPrivateKey`
-
-### reCAPTCHA v3 field type configuration
-
-#### SiteKey & PrivateKey
-
-Both of these configuration values are needed in order to use the "_reCAPTCHA V3 with Score_" field type implementing ReCaptcha V3 from Google.
-
-You can obtain both of these values after signing up to create a ReCaptcha key here: [https://www.google.com/recaptcha/admin](https://www.google.com/recaptcha/admin).
-
-#### Domain
-
-This setting defines the domain from which the client-side assets for using the reCAPTCHA service are requested.
-
-Valid options are `Google` (the default) or `Recaptcha`. You may want to use the latter for control of which domains are setting cookies on your site. [Read more at the reCAPTCHA documentation](https://developers.google.com/recaptcha/docs/faq#does-recaptcha-use-cookies).
-
-### Rich text field type configuration
-
-#### DataTypeId
-
-Sets the Data Type Guid to use to obtain the configuration for the rich text field type. If the setting is absent, the value of the default rich text Data Type created by Umbraco on a new install is used.
-
-### Title and description field type configuration
-
-#### AllowUnsafeHtmlRendering
-
-When using the "title and description" field type, editors can provide HTML in the "description" field and have that rendered on the website.
-
-As a tightened security measure, you can set this value to `false` which will ensure HTML is no longer rendered.
-
-As some installations may be relying on HTML rendering, to preserve backward compatible behavior the default value of this setting is `true`.
-
-We expect to make the default value of this option `false` from Forms 14 onwards.
\ No newline at end of file
diff --git a/10/umbraco-forms/developer/configuration/type-details.md b/10/umbraco-forms/developer/configuration/type-details.md
deleted file mode 100644
index f7739702b8f..00000000000
--- a/10/umbraco-forms/developer/configuration/type-details.md
+++ /dev/null
@@ -1,522 +0,0 @@
----
-meta.Title: Forms Provider Type Details
-description: Provides details of the built-in provider types available with Umbraco Forms
----
-
-# Forms Provider Type Details
-
-This page provides some details of the provider types available in Umbraco Forms.
-
-The intention is to be able to make available details such as IDs, aliases and property names, that may be necessary when configuring the product.
-
-## Field Types
-
-
-
-Checkbox
-
-**ID:** `D5C0C390-AE9A-11DE-A69E-666455D89593`
-
-**Alias:** `checkbox`
-
-**Settings:**
-
-* `DefaultValue`
-
-
-
-
-
-Data Consent
-
-**ID:** `A72C9DF9-3847-47CF-AFB8-B86773FD12CD`
-
-**Alias:** `dataConsent`
-
-**Settings:**
-
-* `AcceptCopy`
-* `ShowLabel`
-
-
-
-
-
-Date
-
-**ID:** `F8B4C3B8-AF28-11DE-9DD8-EF5956D89593`
-
-**Alias:** `date`
-
-**Settings:**
-
-* `Placeholder`
-
-
-
-
-
-Dropdown List
-
-**ID:** `0DD29D42-A6A5-11DE-A2F2-222256D89593`
-
-**Alias:** `dropdown`
-
-**Settings:**
-
-* `DefaultValue`
-* `AllowMultipleSelections`
-* `ShowLabel`
-* `AutocompleteAttribute`
-* `SelectPrompt`
-
-
-
-
-
-File Upload
-
-**ID:** `84A17CF8-B711-46a6-9840-0E4A072AD000`
-
-**Alias:** `fileUpload`
-
-**Settings:**
-
-* `SelectedFilesListHeading`
-
-
-
-
-
-Long Answer
-
-**ID:** `023F09AC-1445-4bcb-B8FA-AB49F33BD046`
-
-**Alias:** `longAnswer`
-
-**Settings:**
-
-* `DefaultValue`
-* `Placeholder`
-* `ShowLabel`
-* `AutocompleteAttribute`
-* `NumberOfRows`
-* `MaximumLength`
-
-
-
-
-
-Hidden Field
-
-**ID:** `DA206CAE-1C52-434E-B21A-4A7C198AF877`
-
-**Alias:** `hidden`
-
-**Settings:**
-
-* `DefaultValue`
-
-
-
-
-
-Multiple Choice
-
-**ID:** `FAB43F20-A6BF-11DE-A28F-9B5755D89593`
-
-**Alias:** `multipleChoice`
-
-**Settings:**
-
-* `DefaultValue`
-* `ShowLabel`
-
-
-
-
-
-Password
-
-**ID:** `FB37BC60-D41E-11DE-AEAE-37C155D89593`
-
-**Alias:** `password`
-
-**Settings:**
-
-* `Placeholder`
-
-
-
-
-
-reCAPTCHA 2
-
-**ID:** `B69DEAEB-ED75-4DC9-BFB8-D036BF9D3730`
-
-**Alias:** `recaptcha2`
-
-**Settings:**
-
-* `Theme`
-* `Size`
-* `ErrorMessage`
-
-
-
-
-
-reCAPTCHA 3
-
-**ID:** `663AA19B-423D-4F38-A1D6-C840C926EF86`
-
-**Alias:** `recaptcha3`
-
-**Settings:**
-
-* `ScoreThreshold`
-* `ErrorMessage`
-* `SaveScore`
-
-
-
-
-
-Rich Text
-
-**ID:** `1F8D45F8-76E6-4550-A0F5-9637B8454619`
-
-**Alias:** `richText`
-
-**Settings:**
-
-* `Html`
-* `ShowLabel`
-
-
-
-
-
-Single Choice
-
-**ID:** `903DF9B0-A78C-11DE-9FC1-DB7A56D89593`
-
-**Alias:** `singleChoice`
-
-**Settings:**
-
-* `DefaultValue`
-* `ShowLabel`
-
-
-
-
-
-Short Answer
-
-**ID:** `3F92E01B-29E2-4a30-BF33-9DF5580ED52C`
-
-**Alias:** `shortAnswer`
-
-**Settings:**
-
-* `DefaultValue`
-* `Placeholder`
-* `ShowLabel`
-* `MaximumLength`
-* `FieldType`
-* `AutocompleteAttribute`
-
-
-
-
-
-Title and Description
-
-**ID:** `e3fbf6c4-f46c-495e-aff8-4b3c227b4a98`
-
-**Alias:** `titleAndDescription`
-
-**Settings:**
-
-* `CaptionTag`
-* `Caption`
-* `BodyText`
-* `ShowLabel`
-
-
-
-## Workflow Types
-
-
-
-Change Record State
-
-**ID:** `4C40A092-0CB5-481d-96A7-A02D8E7CDB2F`
-
-**Alias:** `changeRecordState`
-
-**Settings:**
-
-* `Words`
-* `Action`
-
-
-
-
-
-Post as XML
-
-**ID:** `470EEB3A-CB15-4b08-9FC0-A2F091583332`
-
-**Alias:** `postAsXml`
-
-**Settings:**
-
-* `Url`
-* `Method`
-* `XsltFile`
-* `Fields`
-* `Username`
-* `Password`
-
-
-
-
-
-Save As Umbraco Content Node
-
-**ID:** `89FB1E31-9F36-4e08-9D1B-AF1180D340DB`
-
-**Alias:** `saveAsUmbracoContentNode`
-
-**Settings:**
-
-* `Fields`
-* `Publish`
-* `RootNode`
-
-
-
-
-
-Save As XML File
-
-**ID:** `9CC5854D-61A2-48f6-9F4A-8F3BDFAFB521`
-
-**Alias:** `saveAsAnXmlFile`
-
-**Settings:**
-
-* `Path`
-* `Extension`
-* `XsltFile`
-
-
-
-
-
-Send Email
-
-**ID:** `E96BADD7-05BE-4978-B8D9-B3D733DE70A5`
-
-**Alias:** `sendEmail`
-
-**Settings:**
-
-* `Email`
-* `CcEmail`
-* `BccEmail`
-* `SenderEmail`
-* `ReplyToEmail`
-* `Subject`
-* `Message`
-* `Attachment`
-
-
-
-
-
-Send Email With Razor Template
-
-**ID:** `17c61629-d984-4e86-b43b-a8407b3efea9`
-
-**Alias:** `sendEmailWithRazorTemplate`
-
-**Settings:**
-
-* `Email`
-* `CcEmail`
-* `BccEmail`
-* `SenderEmail`
-* `ReplyToEmail`
-* `Subject`
-* `RazorViewFilePath`
-* `Attachment`
-
-
-
-
-
-Send Email With Extensible Stylesheet Language Transformations (XSLT) Template
-
-**ID:** `616edfeb-badf-414b-89dc-d8655eb85998`
-
-**Alias:** `sendEmailWithXsltTemplate`
-
-**Settings:**
-
-* `Email`
-* `CcEmail`
-* `BccEmail`
-* `SenderEmail`
-* `ReplyToEmail`
-* `Subject`
-* `XsltFile`
-
-
-
-
-
-Send Form To URL
-
-**ID:** `FD02C929-4E7D-4f90-B9FA-13D074A76688`
-
-**Alias:** `sendFormToUrl`
-
-**Settings:**
-
-* `Url`
-* `Method`
-* `StandardFields`
-* `Fields`
-* `Username`
-* `Password`
-
-
-
-
-
-Slack
-
-**ID:** `bc52ab28-d3ff-42ee-af75-a5d49be83040`
-
-**Alias:** `slack`
-
-**Settings:**
-
-* `WebhookUrl`
-
-
-
-
-
-Slack (Legacy)
-
-**ID:** `ccbfb0d5-adaa-4729-8b4c-4bb439dc0202`
-
-**Alias:** `slackLegacy`
-
-**Settings:**
-
-* `Token`
-* `Channel`
-* `Username`
-* `AvatarUrl`
-
-
-
-## Prevalue Source Types
-
-
-
-Datasource
-
-**ID:** `cc9f9b2a-a746-11de-9e17-681b56d89593`
-
-**Alias:** `dataSource`
-
-
-
-
-
-Get Values From Text File
-
-**ID:** `35C2053E-CBF7-4793-B27C-6E97B7671A2D`
-
-**Alias:** `getValuesFromTextFile`
-
-**Settings:**
-
-* `TextFile`
-
-
-
-
-
-SQL Database
-
-**ID:** `F1F5BD4D-E6AE-44ed-86CB-97661E4660B2`
-
-**Alias:** `sqlDatabase`
-
-**Settings:**
-
-* `Connection`
-* `ConnectionString`
-* `Table`
-* `KeyColumn`
-* `ValueColumn`
-* `CaptionColumn`
-
-
-
-
-
-Umbraco Datatype Prevalues
-
-**ID:** `EA773CAF-FEF2-491B-B5B7-6A3552B1A0E2`
-
-**Alias:** `umbracoDataTypePreValues`
-
-**Settings:**
-
-* `DataTypeId`
-
-
-
-
-
-Umbraco Documents
-
-**ID:** `de996870-c45a-11de-8a39-0800200c9a66`
-
-**Alias:** `umbracoDocuments`
-
-**Settings:**
-
-* `RootNode`
-* `UseCurrentPage`
-* `DocType`
-* `ValueField`
-* `ListGrandChildren`
-* `OrderBy`
-
-
-
-## Data Source Types
-
-
-
-SQL Database
-
-**ID:** `F19506F3-EFEA-4b13-A308-89348F69DF91`
-
-**Alias:** `sqlDatabase`
-
-**Settings:**
-
-* `Connection`
-* `Table`
-
-
diff --git a/10/umbraco-forms/developer/contentapps.md b/10/umbraco-forms/developer/contentapps.md
deleted file mode 100644
index f58bf30b3c3..00000000000
--- a/10/umbraco-forms/developer/contentapps.md
+++ /dev/null
@@ -1,102 +0,0 @@
----
-meta.Title: Content Apps
----
-
-# Content Apps
-
-[Umbraco Content Apps](https://docs.umbraco.com/umbraco-cms/extending/content-apps) can be configured to appear alongside forms in the Umbraco Forms backoffice section.
-
-They will appear after the default "Design" and "Settings" apps when editing a form in the backoffice:
-
-![Umbraco Forms Content App]()
-
-A content app such as the following would display only in the forms section:
-
-```csharp
- public class TestFormsContentApp : IContentAppFactory
- {
- public ContentApp GetContentAppFor(object source, IEnumerable userGroups)
- {
- // Only show app on forms
- if (source is FormDesign)
- {
- return new ContentApp
- {
- Alias = "testFormsContentApp",
- Name = "Test App",
- Icon = "icon-calculator",
- View = "/App_Plugins/TestFormsContentApp/testformscontentapp.html",
- Weight = 0,
- };
- }
-
- return null;
- }
- }
-```
-
-Within the `/App_Plugins/TestFormsContentApp/` folder we need the client-side files, for which an example is shown below:
-
-`package.manifest`:
-
-```json
-{
- "contentApps": [
- {
- "name": "Test Forms Content App",
- "alias": "TestFormsContentApp",
- "weight": 0,
- "icon": "icon-calculator",
- "view": "~/App_Plugins/TestFormsContentApp/testformscontentapp.html",
- "show": [
- "+content/*",
- "+media/*",
- "+member/*",
- "+forms/*"
- ]
- }
- ],
- "javascript": [
- "~/App_Plugins/TestFormsContentApp/testformscontentapp.controller.js"
- ]
-}
-```
-
-`testformscontentapp.html`:
-
-```html
-
-
-
-
-
Current form: {{vm.formName}}
-
-
-
-```
-
-`testformscontentapp.controller.js`:
-
-```js
-angular.module("umbraco")
- .controller("My.TestFormsContentApp", function ($routeParams, formResource) {
- var vm = this;
- formResource.getWithWorkflowsByGuid($routeParams.id)
- .then(function (response) {
- vm.formName = response.data.name;
- });
- });
-```
-
-Finally, it needs to be registered via a composer:
-
-```csharp
- public class TestSiteComposer : IComposer
- {
- public void Compose(IUmbracoBuilder builder)
- {
- builder.ContentApps().Append();
- }
- }
-}
-```
diff --git a/10/umbraco-forms/developer/custom-markup.md b/10/umbraco-forms/developer/custom-markup.md
deleted file mode 100644
index 6f3b6a7339e..00000000000
--- a/10/umbraco-forms/developer/custom-markup.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-meta.Title: Umbraco Forms custom markup
-description: >-
- With Umbraco Forms it's possible to customize the outputted markup of a Form,
- which means you have complete control over what Forms will output.
----
-
-# Custom Markup
-
-With Umbraco Forms, it is possible to customize the output markup of a Form, which means you have complete control over what Forms will display.
-
-{% hint style="warning" %}
-We recommend using [Themes](themes.md) to customize your Forms. This will ensure that nothing is overwritten when you upgrade Forms to a newer version.
-{% endhint %}
-
-## Customizing the Default Views
-
-The razor macro uses some razor views to output the Form:
-
-* 1 view for each fieldtype
-* 1 view for the scripts
-* 1 view for the rest of the Form
-
-You can find the default views in the `~\Views\Partials\Forms\Themes\default` folder.
-
-To avoid your custom changes to the default views from being overwritten, you need to copy the view you want to customize into your theme folder, e.g. `~\Views\Partials\Forms\Themes\YourTheme`, and edit the file in `YourTheme` folder.
-
-### Form.cshtml
-
-This is the main view responsible for rendering the Form markup.
-
-The view is separated into two parts, one is the actual Form and the other will be shown if the Form is submitted.
-
-This view can be customized, if you do so it will be customized for all your Forms.
-
-### Script.cshtml
-
-This view renders the JavaScript that will take care of the conditional logic, customization won't be needed here.
-
-### FieldType.\*.cshtml
-
-The rest of the views start with FieldType, like `FieldType.Textfield.cshtml` and those will output the fields. There is a view for each default fieldtype like _textfield_, _textarea_, _checkbox_, etc)
-
-Contents of the `FieldType.Textfield.cshtml` view (from the default theme):
-
-```csharp
-@model Umbraco.Forms.Mvc.Models.FieldViewModel
-@using Umbraco.Forms.Mvc
-
-placeholder="@Model.PlaceholderText"}}
- @{if(Model.Mandatory || Model.Validate){data-val="true"}}
- @{if (Model.Mandatory) { data-val-required="@Model.RequiredErrorMessage"}}
- @{if (Model.Validate) { data-val-regex="@Model.InvalidErrorMessage" data-val-regex-pattern="@Html.Raw(Model.Regex)"}}
-/>
-```
-
-Umbraco Forms uses ASP.NET Unobtrusive Validation which is why you see attributes like `data-val` and `data-val-required`.
-
-This can be customized but it's important to keep the ID of the control to `@Model.Id` since that is used to match the value to the Form field. For fields that are conditionally hidden, without an ID of `@Model.Id` the control won't be shown when the conditions to show the field are met. An ID needs to be added to text controls such as headings and paragraphs.
-
-The view model for the partial view for a field is `FieldViewModel`. This defines properties that may be useful when creating new themes or custom fields, some of which are shown in the code samples above. Others include:
-
-* `AdditionalSettings` - a dictionary of the settings keys and values populated for the form field. These can be retrieved in typed form by key using e.g. `Model.GetSettingValue("MaximumLength", 255);`.
-
-The following are available on the model but only populated for fields that support file upload:
-
-* `AllowAllUploadExtensions`- a boolean indicating whether all file extensions are permitted for upload.
-* `AllowedUploadExtensions`- a collection of strings indicating the file extensions that are permitted for upload.
-* `AllowMultipleFileUploads`- a boolean indicating whether selecting multiple files for upload is allowed.
-
-### Customizing for a Specific Form
-
-It is also possible to customize the markup for a specific Form.
-
-You will need to create folder using the ID of the Form: `~\Views\Partials\Forms\{FormId}` (find the id of the Form in the URL when you are viewing the Form in the backoffice.)
-
-![Form GUID]()
-
-As an example if your Form ID is 0d3e6b2d-db8a-43e5-8f28-36241d712487 then you can overwrite the Form view by adding the `Form.cshtml` file to the directory. Start by copying the default one and then making your custom changes: `~\Views\Partials\Forms\0d3e6b2d-db8a-43e5-8f28-36241d712487\Form.cshtml`.
-
-You can also overwrite views for one or more fieldtypes by adding the views to the `Fieldtypes` folder: `~\Views\Partials\Forms\0d3e6b2d-db8a-43e5-8f28-36241d712487\Fieldtypes\Fieldtype.Textfield.cshtml`.
diff --git a/10/umbraco-forms/developer/email-templates.md b/10/umbraco-forms/developer/email-templates.md
deleted file mode 100644
index d3a894114cf..00000000000
--- a/10/umbraco-forms/developer/email-templates.md
+++ /dev/null
@@ -1,246 +0,0 @@
----
-meta.Title: Umbraco Forms Email Templates
-description: Creating an email template for Umbraco Forms.
----
-
-# Email Templates
-
-We include a Workflow **Send email with template (Razor)** that allows you to pick a Razor view file that can be used to send out a _pretty HTML email_ for Form submissions.
-
-## Creating an Email Template
-
-If you wish to have one or more templates to choose from the **Send email with template (Razor)**, you will need to place all email templates into the `~/Views/Partials/Forms/Emails/` folder.
-
-The Razor view must inherit from FormsHtmlModel:
-
-```csharp
-@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage
-```
-
-You now have a model that contains your Form fields which can be used in your email HTML markup, along with the UmbracoHelper methods such as `Umbraco.TypedContent` and `Umbraco.TypedMedia` etc.
-
-Below is an example of an email template from the `~/Views/Partials/Forms/Emails/` folder:
-
-```csharp
-@inherits Umbraco.Cms.Web.Common.Views.UmbracoViewPage
-
-@{
- //This is an example email template where you can use Razor Views to send HTML emails
-
- //You can use Umbraco.TypedContent & Umbraco.TypedMedia etc to use Images & content from your site
- //directly in your email templates too
-
- //Strongly Typed
- //@Model.GetValue("aliasFormField")
- //@foreach (var color in Model.GetValues("checkboxField")){}
-
- //Dynamics
- //@Model.DynamicFields.aliasFormField
- //@foreach(var color in Model.DynamicFields.checkboxField
-
- //Images need to be absolute - so fetching domain to prefix with images
- var siteDomain = Context.Request.Scheme + "://" + Context.Request.Host;
- var assetUrl = siteDomain + "/App_plugins/UmbracoForms/Assets/Email-Example";
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
diff --git a/10/umbraco-forms/developer/extending/README.md b/10/umbraco-forms/developer/extending/README.md
deleted file mode 100644
index 7ab60b54097..00000000000
--- a/10/umbraco-forms/developer/extending/README.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-meta.Title: "Extending Umbraco Forms"
----
-
-# Extending
-
-Umbraco Forms functionality can be extended in different ways. In this section we focus on techniques available to a back-end/C# developer.
-
-For front-end extensions, specifically via theming, see the [Themes](../themes.md) section.
-
-## Developing Custom Providers
-
-The Forms package comes with many field, workflow, and other built-in types. If you have a requirement that isn't served by any of these, you can create and develop your own.
-
-### [Provider model](adding-a-type.md)
-
-Many features of Forms use a provider model, which makes it quicker to add new parts to the application.
-
-The model uses the notion that everything must have a type to exist. The type defines the capabilities of the item. For instance a Textfield on a form has a FieldType, this particular field type enables it to render an input field and save text strings. The same goes for workflows, which have a workflow type, datasources which have a datasource type and so on. Using the model you can seamlessly add new types and thereby extend the application.
-
-It is possible to add new Field types, Data Source Types, Prevalue Source Types, Export Types, and Workflow Types.
-
-### [Field types](adding-a-fieldtype.md)
-
-A field type handles rendering of the UI for a field in a form. It renders a standard ASP.NET Razor partial view and is able to return a list of values when the form is saved.
-
-The concept of provider settings, common to the field and other types, is also discussed in this section.
-
-### Data Source Types
-
-A data source type enables Umbraco Forms to connect to a custom source of data. A data source consists of any kind of storage if it is possible to return a list of fields Umbraco Forms can map values to. For example: a Database data source can return a list of columns Forms can send data to. This enables Umbraco Forms to map a form to a data source. A data source type is responsible for connecting Forms to external storage.
-
-### [Prevalue Source Types](adding-a-prevaluesourcetype.md)
-
-A prevalue source type connects to 3rd party storage to retrieve values. These values are used on fields supporting prevalues. The source fetches the collection of values.
-
-### [Workflow Types](adding-a-workflowtype.md)
-
-A workflow can be executed each time a form changes state (when it is submitted for instance). A workflow is responsible for executing logic which can modify the record or notify 3rd party systems.
-
-### [Export Types](adding-a-exporttype.md)
-
-Export types are responsible for turning form records into any other data format, which is then returned as a file.
-
-### [Magic String Format Functions](adding-a-magic-string-format-function.md)
-
-Custom magic string format functions to add to the [ones shipped with Umbraco Forms](../magic-strings.md#formatting-magic-strings) can be created in code.
-
-### [Validation Patterns](adding-a-validation-pattern.md)
-
-When creating a text field in Umbraco Forms, a validation pattern in the form of a regular expression can be applied. Default patterns can be removed or re-ordered, and custom ones created and added.
-
-## Handling Forms Events
-
-Another option for extension via custom code is to hook into one of the many events available.
-
-### [Validation](adding-an-event-handler.md)
-
-Form events are raised during the submission life cycle and can be handled for executing custom logic.
-
-### [Default Fields and Workflows](customize-default-workflows.md)
-
-When a new form is created, the default behavior is to add a single workflow. This workflow will send a copy of the form to the current backoffice user's email address.
-
-A single "data consent" field will also be added unless it has been disabled via configuration.
-
-It's possible to amend this behavior and change it to fit your needs.
-
-## Responding to State Values
-
-In the course of submitting a form, Umbraco Forms will set values in `TempData` and/or `HttpContext.Items`, that you can use to customize the website functionality.
-
-### Customizing Post-Submission Behavior
-
-Whether displaying a message or redirecting, a developer can customize the page viewed after the form is submitted based on the presence of `TempData` variables.
-
-One variable with a key of `UmbracoFormSubmitted` has a value containing the Guid identifier for the submitted form.
-
-A second variable contains the Guid identifier of the record created from the form submission. You can find this using the `Forms_Current_Record_id` key.
-
-In order to redirect to an external URL rather than a selected page on the Umbraco website, you will need to use a [custom workflow](../../developer/extending/adding-a-workflowtype.md). Within this workflow you can set the required redirect URL on the `HttpContext.Items` dictionary using the key `FormsRedirectAfterFormSubmitUrl` (defined in the constant `Umbraco.Forms.Core.Constants.ItemKeys.RedirectAfterFormSubmitUrl`).
-
-For example, using an injected instance of `IHttpContextAccessor`:
-
-```c#
-_httpContextAccessor.HttpContext.Items[Constants.ItemKeys.RedirectAfterFormSubmitUrl] = "https://www.umbraco.com";
-```
diff --git a/10/umbraco-forms/developer/extending/adding-a-exporttype.md b/10/umbraco-forms/developer/extending/adding-a-exporttype.md
deleted file mode 100644
index 4d2e63f20b8..00000000000
--- a/10/umbraco-forms/developer/extending/adding-a-exporttype.md
+++ /dev/null
@@ -1,223 +0,0 @@
----
-meta.Title: "Adding an Export type to Umbraco Forms"
----
-
-# Adding an Export type to Umbraco Forms
-
-*This builds on the "[adding a type to the provider model](adding-a-type.md)" chapter and applies to Umbraco Forms version 4.4.1 and higher*
-
-Add a new class to your project and have it inherit from `Umbraco.Forms.Core.ExportType` and you have two options when implementing the class.
-
-## Basic Example
-
-When implementing the method `public override string ExportRecords(RecordExportFilter filter)` in your export provider class. You need to return the final string you wish to write to a file. Such as .txt file or .csv and you can perform your logic to build up a comma separated string for a CSV file in the `ExportRecords` method.
-
-{% hint style="info" %}
-In the constructor of your provider, you will need a further two properties, `FileExtension` and `Icon`.
-{% endhint %}
-
-The FileExtension property is the file extension such as `zip`, `txt` or `csv` of the file you will be generating & serving from the file system as the export file.
-
-In this example below we will create a single HTML file which takes all the submissions/entries to be displayed as a HTML report. We will do this in conjunction with a Razor partial view to help build up our HTML and thus merge it with the form submission data to generate a string of HTML.
-
-### Provider Class
-
-```csharp
-using System;
-using Umbraco.Cms.Core.Hosting;
-using Umbraco.Forms.Core;
-using Umbraco.Forms.Core.Models;
-using Umbraco.Forms.Core.Searchers;
-using Umbraco.Forms.Web.Helpers;
-
-namespace MyFormsExtensions
-{
- public class ExportToHtmlReport : ExportType
- {
- private readonly IFormRecordSearcher _formRecordSearcher;
-
- public ExportToHtmlReport(
- IHostingEnvironment hostingEnvironment,
- IFormRecordSearcher formRecordSearcher)
- : base(hostingEnvironment)
- {
- _formRecordSearcher = formRecordSearcher;
-
- this.Name = "Export as HTML";
- this.Description = "Export entries as a single HTML report";
- this.Id = new Guid("4117D352-FB41-4A4C-96F5-F6EF35B384D2");
- this.FileExtension = "html";
- this.Icon = "icon-article"; }
-
- public override string ExportRecords(RecordExportFilter filter)
- {
- var view = "~/Views/Partials/Forms/Export/html-report.cshtml";
- EntrySearchResultCollection model = _formRecordSearcher.QueryDataBase(filter);
- return ViewHelper.RenderPartialViewToString(view, model);
- }
- }
-}
-```
-
-### Razor Partial View
-
-```csharp
-@model Umbraco.Forms.Web.Models.Backoffice.EntrySearchResultCollection
-
-@{
- var submissions = Model.Results.ToList();
- var schemaItems = Model.schema.ToList();
-}
-
-
Form Submissions
-
-@foreach (var submission in submissions)
-{
- var values = submission.Fields.ToList();
-
- for (int i = 0; i < schemaItems.Count; i++)
- {
- @schemaItems[i].Name @values[i]
- }
-
-
-}
-```
-
-## Advanced Example
-
-This approach gives us more flexibility in creating the file we wish to serve as the exported file. We do this for the export to Excel file export provider we ship in Umbraco Forms. With this we can use a library to create the Excel file and store it in a temporary location before we send back the filepath for the browser to stream down the export file.
-
-In this example we will create a collection of text files, one for each submission which is then zipped up into a single file and served as the export file.
-
-```csharp
-using System;
-using System.IO;
-using System.IO.Compression;
-using System.Linq;
-using Umbraco.Cms.Core.Hosting;
-using Umbraco.Forms.Core;
-using Umbraco.Forms.Core.Models;
-using Umbraco.Forms.Core.Searchers;
-
-namespace MyFormsExtensions
-{
- public class ExportToTextFiles : ExportType
- {
- private readonly IFormRecordSearcher _formRecordSearcher;
-
- public ExportToTextFiles(
- IHostingEnvironment hostingEnvironment,
- IFormRecordSearcher formRecordSearcher)
- : base(hostingEnvironment)
- {
- _formRecordSearcher = formRecordSearcher;
-
- this.Name = "Export as text files";
- this.Description = "Export entries as text files inside a zip file";
- this.Id = new Guid("171CABC9-2207-4575-83D5-2A77E824D5DB");
- this.FileExtension = "zip";
- this.Icon = "icon-zip";
- }
-
- ///
- /// We do not implement this method from the interface
- /// As this method is called from ExportToFile that we also override here & is expecting the file contents as a string to be written as a stream to a file
- /// Which would be OK if we were creating a CSV or a single based file that can have a simple string written as a string such as one large HTML report or XML file perhaps
- ///
- public override string ExportRecords(RecordExportFilter filter) => throw new NotImplementedException();
-
- ///
- /// This gives us greater control of the export process
- ///
- ///
- /// This filter contains the date range & other search parameters to limit the entries we are exporting
- ///
- ///
- /// The filepath that the export file is expecting to be served from
- /// So ensure that the zip of text files is saved at this location
- ///
- /// The final file path to serve up as the export - this is unlikely to change through the export logic
- public override string ExportToFile(RecordExportFilter filter, string filepath)
- {
- // Before Save - Check Path, Directory & Previous File export does not exist
- string pathToSaveZipFile = filepath;
-
- // Check our path does not contain \\
- // If not, use the filePath
- if (filepath.Contains('\\') == false)
- {
- pathToSaveZipFile = HostingEnvironment.MapPathContentRoot(filepath);
- }
-
- // Get the directory (strip out \\ if it exists)
- var dir = filepath.Substring(0, filepath.LastIndexOf('\\'));
- var tempFileDir = Path.Combine(dir, "text-files");
-
-
- // If the path does not end with our file extension, ensure it's added
- if (pathToSaveZipFile.EndsWith("." + FileExtension) == false)
- {
- pathToSaveZipFile += "." + FileExtension;
- }
-
- // Check that the directory where we will save the ZIP file temporarily exists
- // If not just create it
- if (Directory.Exists(tempFileDir) == false)
- {
- Directory.CreateDirectory(tempFileDir);
- }
-
- // Check if the zip file exists already - if so delete it, as we have a new update
- if (File.Exists(pathToSaveZipFile))
- {
- File.Delete(pathToSaveZipFile);
- }
-
- // Query the DB for submissions to export based on the filter
- EntrySearchResultCollection submissions = _formRecordSearcher.QueryDataBase(filter);
-
- // Get the schema objects to a list so we can get items using position index
- var schemaItems = submissions.schema.ToList();
-
- // We will use this to store our contents of our file to save as a text file
- var fileContents = string.Empty;
-
- // For each submission we have build up a string to save to a text file
- foreach (EntrySearchResult submission in submissions.Results)
- {
- // The submitted data for the form submission
- var submissionData = submission.Fields.ToList();
-
- // For loop to match the schema position to the submission data
- for (int i = 0; i < schemaItems.Count; i++)
- {
- // Concat a string of the name of the field & its stored data
- fileContents += schemaItems[i].Name + ": " + submissionData[i] + Environment.NewLine;
- }
-
- // Now save the contents to a text file
- // Base it on the format of the record submission unique id
- var textFileName = Path.Combine(tempFileDir, submission.UniqueId + ".txt");
- File.WriteAllText(textFileName, fileContents);
-
- // Reset fileContents to be empty again
- fileContents = string.Empty;
- }
-
- // Now we have a temp folder full of text files
- // Generate a zip file containing them & save that
- ZipFile.CreateFromDirectory(tempFileDir, pathToSaveZipFile);
-
- // Tidy up after ourselves & delete the temp folder of text files
- if (Directory.Exists(tempFileDir))
- {
- Directory.Delete(tempFileDir, true);
- }
-
- // Return the path where we saved the zip file containing the text files
- return pathToSaveZipFile;
- }
- }
-}
-```
diff --git a/10/umbraco-forms/developer/extending/adding-a-fieldtype.md b/10/umbraco-forms/developer/extending/adding-a-fieldtype.md
deleted file mode 100644
index 41c78acf0ff..00000000000
--- a/10/umbraco-forms/developer/extending/adding-a-fieldtype.md
+++ /dev/null
@@ -1,190 +0,0 @@
----
-meta.Title: Adding a field type to Umbraco Forms
----
-
-# Adding A Field Type To Umbraco Forms
-
-_This builds on the "_[_adding a type to the provider model_](adding-a-type.md)_" chapter_
-
-## C\#
-
-Add a new class to the Visual Studio solution, make it inherit from `Umbraco.Forms.Core.FieldType` and fill in the constructor:
-
-```csharp
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using Microsoft.AspNetCore.Http;
-using Umbraco.Forms.Core.Enums;
-using Umbraco.Forms.Core.Models;
-using Umbraco.Forms.Core.Services;
-
-namespace MyFormsExtensions
-{
- public class MyCustomField : Umbraco.Forms.Core.FieldType
- {
- public MyCustomField()
- {
- Id = new Guid("08b8057f-06c9-4ca5-8a42-fd1fc2a46eff"); // Replace this!
- Name = "My Custom Field";
- Description = "Render a custom text field.";
- Icon = "icon-autofill";
- DataType = FieldDataType.String;
- SortOrder = 10;
- SupportsRegex = true;
- FieldTypeViewName = "FieldType.MyCustomField.cshtml";
- }
-
- // You can do custom validation in here which will occur when the form is submitted.
- // Any strings returned will cause the submission to be considered invalid.
- // Returning an empty collection of strings will indicate that it's valid to proceed.
- public override IEnumerable ValidateField(Form form, Field field, IEnumerable