diff --git a/app/controllers/submit_form_metadata_controller.rb b/app/controllers/submit_form_metadata_controller.rb
new file mode 100644
index 00000000..49bf8666
--- /dev/null
+++ b/app/controllers/submit_form_metadata_controller.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+class SubmitFormMetadataController < ApplicationController
+ skip_before_action :authenticate_user!
+ skip_authorization_check
+
+ def index
+ submitter = Submitter.find_by!(slug: params[:submit_form_slug])
+
+ return head :not_found if submitter.declined_at? ||
+ submitter.completed_at? ||
+ submitter.submission.archived_at? ||
+ submitter.submission.expired? ||
+ submitter.submission.template&.archived_at? ||
+ submitter.account.archived_at? ||
+ !Submitters::AuthorizedForForm.call(submitter, current_user, request)
+
+ submission = submitter.submission
+ values = submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) }
+ schema = Submissions.filtered_conditions_schema(submission, values:, include_submitter_uuid: submitter.uuid)
+
+ documents = schema.filter_map do |item|
+ submission.schema_documents.find { |a| a.uuid == item['attachment_uuid'] }
+ end
+
+ ActiveRecord::Associations::Preloader.new(records: documents, associations: %i[blob record]).call
+
+ text_runs = documents.to_h do |document|
+ [
+ document.uuid,
+ DocumentMetadatas.find_or_create_for_document(document, account_id: document.record.account_id).text_runs
+ ]
+ end
+
+ render json: { text_runs: }
+ end
+end
diff --git a/app/javascript/elements/scroll_buttons.js b/app/javascript/elements/scroll_buttons.js
index 09e4796e..08ca40ab 100644
--- a/app/javascript/elements/scroll_buttons.js
+++ b/app/javascript/elements/scroll_buttons.js
@@ -47,13 +47,13 @@ export default class extends HTMLElement {
this.classList.remove('hidden', '-translate-y-10', 'opacity-0')
this.classList.add('translate-y-0', 'opacity-100')
- this.querySelectorAll('[tabindex]').forEach((el) => { el.tabIndex = 0 })
+ this.inert = false
}
hideButtons () {
this.classList.remove('translate-y-0', 'opacity-100')
this.classList.add('-translate-y-10', 'opacity-0')
- this.querySelectorAll('[tabindex]').forEach((el) => { el.tabIndex = -1 })
+ this.inert = true
setTimeout(() => {
if (this.classList.contains('-translate-y-10')) {
diff --git a/app/javascript/submission_form/accessibility_areas.vue b/app/javascript/submission_form/accessibility_areas.vue
new file mode 100644
index 00000000..6e720e93
--- /dev/null
+++ b/app/javascript/submission_form/accessibility_areas.vue
@@ -0,0 +1,434 @@
+
+
+
+
+
+
+
+ {{ item.text }}
+ {{ run.text }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/javascript/submission_form/area.vue b/app/javascript/submission_form/area.vue
index a3e83b62..e3138254 100644
--- a/app/javascript/submission_form/area.vue
+++ b/app/javascript/submission_form/area.vue
@@ -4,11 +4,11 @@
dir="auto"
:style="[computedStyle, fontStyle]"
:class="{ 'cursor-default': !submittable, 'border border-red-100 bg-red-100 cursor-pointer': submittable, 'border border-red-100': !isActive && submittable, 'bg-opacity-80': !isActive && !isValueSet && submittable, 'outline-red-500 outline-dashed outline-2 z-10 field-area-active': isActive && submittable, 'bg-opacity-40': (isActive || isValueSet) && submittable }"
- :role="submittable && field.type !== 'checkbox' && field.type !== 'radio' && field.type !== 'multiple' ? 'button' : undefined"
- :tabindex="submittable ? 0 : undefined"
- :aria-label="submittable ? fieldAreaLabel : undefined"
- @keydown.enter.prevent="submittable ? $el.click() : undefined"
- @keydown.space.prevent="submittable ? $el.click() : undefined"
+ :role="submittable && !isNativeInputField ? 'button' : undefined"
+ :tabindex="submittable && !isNativeInputField ? 0 : undefined"
+ :aria-label="submittable && !isNativeInputField ? fieldAreaLabel : undefined"
+ @keydown.enter.prevent="submittable && !isNativeInputField ? $el.click() : undefined"
+ @keydown.space.prevent="submittable && !isNativeInputField ? $el.click() : undefined"
>
@@ -155,6 +156,7 @@
v-if="submittable"
type="radio"
:value="false"
+ :name="`radio-area-${field.uuid}`"
:aria-label="optionValue(option)"
class="aspect-square checked:checkbox checked:checkbox-xs"
:class="{ 'base-radio': !modelValue || modelValue !== optionValue(option), '!w-auto !h-full': area.w > area.h, '!w-full !h-auto': area.w <= area.h }"
@@ -408,6 +410,9 @@ export default {
kba: this.t('kba')
}
},
+ isNativeInputField () {
+ return ['checkbox', 'radio', 'multiple'].includes(this.field.type)
+ },
fieldAreaLabel () {
const name = this.field.name || this.fieldNames[this.field.type] || this.field.type
if (this.area.option_uuid && this.option) {
diff --git a/app/javascript/submission_form/attachment_step.vue b/app/javascript/submission_form/attachment_step.vue
index 0379c242..691f5491 100644
--- a/app/javascript/submission_form/attachment_step.vue
+++ b/app/javascript/submission_form/attachment_step.vue
@@ -1,6 +1,10 @@
-
+
@@ -35,7 +39,7 @@
>
diff --git a/app/javascript/submission_form/completed.vue b/app/javascript/submission_form/completed.vue
index f86ac111..6c07a09c 100644
--- a/app/javascript/submission_form/completed.vue
+++ b/app/javascript/submission_form/completed.vue
@@ -4,12 +4,12 @@
class="mx-auto max-w-md flex flex-col completed-form"
dir="auto"
role="status"
- aria-live="assertive"
tabindex="-1"
>
@@ -47,7 +47,10 @@
class="animate-spin"
aria-hidden="true"
/>
-
+
{{ t('send_copy_via_email') }}
@@ -63,7 +66,10 @@
class="animate-spin"
aria-hidden="true"
/>
-
+
{{ t('download') }}
diff --git a/app/javascript/submission_form/date_step.vue b/app/javascript/submission_form/date_step.vue
index 8c27925a..ba4a8dce 100644
--- a/app/javascript/submission_form/date_step.vue
+++ b/app/javascript/submission_form/date_step.vue
@@ -30,7 +30,10 @@
class="btn btn-outline btn-sm !normal-case font-normal set-current-date-button"
@click.prevent="[setCurrentDate(), $emit('focus')]"
>
-
+
{{ t('set_today') }}
diff --git a/app/javascript/submission_form/form.vue b/app/javascript/submission_form/form.vue
index 3a93f37d..2d948bc3 100644
--- a/app/javascript/submission_form/form.vue
+++ b/app/javascript/submission_form/form.vue
@@ -1,5 +1,52 @@
+
+
+
+
+
+
+
@@ -597,6 +646,7 @@