diff --git a/README.md b/README.md
index 3094801d4..6e36cfa6e 100644
--- a/README.md
+++ b/README.md
@@ -191,26 +191,26 @@ example using our [live templates for a form screen](#applying-live-templates-to
+ th:replace="~{fragments/cardHeader :: cardHeader(header='Tell us about yourself')}"/>
-
-
+
+
```
@@ -407,8 +407,8 @@ Thymeleaf templates. Template code can run conditions via this object, like so:
```html
-
Conditionally show this element
+ th:with="showCondition=${conditionManager.runCondition('ConditionName', submission, 'data')}">
+ Conditionally show this element
```
@@ -925,18 +925,18 @@ The template HTML can look like:
@@ -979,15 +979,15 @@ Example form fragment:
```html
-
-
- INPUTS GO HERE
-
-
-
+ th:replace="~{fragments/form :: form(action=${formAction}, content=~{::exampleForm}, formId='exampleID')}">
+
+
+ INPUTS GO HERE
+
+
+
```
@@ -1236,12 +1236,12 @@ Below are examples of both types of checkboxes:
label='This label is actually a legend for the checkbox fieldset',
fieldsetHelpText='This help text will appear below the legend',
content=~{::vehiclesOwnedContent})}">
-
-
-
-
+
+
+
+
```
@@ -1256,7 +1256,7 @@ to `checkboxInSet()`:
```html
+ th:replace="'fragments/inputs/checkboxInSet' :: checkboxInSet(inputName='vehiclesOwned',value='None of the Above', label='None of the Above', noneOfTheAbove=true)"/>
```
Honeycrisp contains JavaScript logic that deselects the other checkboxes when "None of the Above" is
@@ -1307,24 +1307,24 @@ An example of a radio input:
label='What\'s your favorite color?',
fieldsetHelpText='This help text will appear under the legend',
content=~{::favoriteColorContent})}">
-
-
+
-
-
-
+
```
@@ -1353,17 +1353,17 @@ An example select input:
```html
-
-
-
-
-
-
+ th:replace="~{fragments/inputs/select :: select(inputName='favoriteFruit', label='What\'s your favorite fruit?', helpText='Mine is banana', content=~{::favoriteFruitContent})}">
+
+
+
+
+
+
```
@@ -1468,9 +1468,9 @@ Here is an example of using the `reveal` fragment:
linkLabel=~{::revealLabel2},
content=~{::revealContent2},
forceShowContent='true')}">
-
-
-
+
+
+
```
@@ -1511,12 +1511,35 @@ The library provides a file upload feature using the client side JavaScript
library [Dropzone JS](https://www.dropzone.dev/). File uploads need a configured AWS S3 Bucket to
upload to and provide functionality for uploading, retrieving and deleting files.
+### Cloud File Repository
+
+The library provides a method for integrating with cloud file repositories, like S3.
+Right now the library has only implemented an integration with S3.
+
+#### CloudFile
+
+As part of this cloud file repository integration, we provide a generic `CloudFile` path to
+hold the file information coming back from the could file repository.
+
+The `CloudFile` class has three fields:
+
+```java
+ Long fileSize;
+ byte[]fileBytes;
+ Map metadata;
+```
+
+The first two represent the file and file size information. The `metadata` field could
+be anything the implementation would like to store in this field.
+
+For example, the AWS S3 Cloud File Repository will put the S3 file's `tag` information
+in this metadata field, under the `tags` key.
+
### AWS S3
You will need a registered AWS account to set up an S3 bucket. Once you have registered your AWS
account you
-can [follow the instructions here to create an S3 bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)
-.
+can [follow the instructions here to create an S3 bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html).
Make sure to note your bucket's name and region as well as your AWS access and secret keys as you
will need these for configuring file uploads in the library. The bucket and region are configured in
@@ -1533,7 +1556,7 @@ input field the file was uploaded from, and a UUID. We then store it in S3, orga
submission it is a part of, like so:
```
- `{{submission_id}}/{{flow_name}}_{{input_name}}_UUID.{jpg, png, docx…} `
+ {{submission_id}}/{{flow_name}}_{{input_name}}_UUID.{jpg, png, docx…}
```
The `flow_name` is the flow the user was in when they uploaded the file and the `input_name` is the
@@ -1648,6 +1671,8 @@ permits.
### Virus Scanning
+#### ClamAV Server
+
File uploads made through form flow can be scanned for viruses. We provide a way to pass
files to a ClamAV server.
@@ -1670,6 +1695,29 @@ There is a field `virus_scanned` in the `user_files` table with `Boolean` as its
> ⚠️ If virus scanning is enabled and a virus is detected in a file, it is rejected and not saved in
> our systems.
+#### Cloud Storage Security in AWS
+
+Some projects have chosen to
+use [Cloud Storage Security](https://aws.amazon.com/marketplace/pp/prodview-q7oc4shdnpc4w?ref_=aws-mp-console-subscription-detail)
+right in AWS. It will allow a file to be scanned once it has been uploaded to AWS.
+
+When this option is used, the scanner will add a few tags directly to the files once they are scanned. By default
+configuration, if a virus is found the file is moved to a quarantine bucket. Please
+read the Cloud Storage Security information for more details about that.
+
+The tags added to the files are:
+
+* `scan-result` - this is generally set to `Clean` unless there was a virus
+* `date-scanned` - a date and time stamp; for example: `2024-03-27 12:38:35Z`
+
+If this virus scanning tool is used, these (and any other tags on the file) can be
+retrieved via the `CloudFile` object's `metadata` field. The key that this data is stored
+under is `tags`. The data type is `List`.
+
+Because of the asynchronous nature of this method of virus scanning, the `user_files` table
+is **not** updated with the virus scanning information and is **not** a reliable source for determining if a file has
+been scanned or not.
+
## Document Download
Form flow library allows users to either:
@@ -2160,7 +2208,7 @@ public class ApplicantDateOfBirthPreparer implements SubmissionFieldPreparer {
@Override
public Map prepareSubmissionFields(Submission submission,
- PdfMap pdfMap) {
+ PdfMap pdfMap) {
Map submissionFields = new HashMap<>();
String month = submission.getInputData().get("applicantBirthMonth").toString();
@@ -2211,7 +2259,7 @@ public class DataBaseFieldPreparer implements SubmissionFieldPreparer {
@Override
public Map prepareSubmissionFields(Submission submission,
- PdfMap pdfMap) {
+ PdfMap pdfMap) {
Map submissionFields = new HashMap<>();
ArrayList