From 467b190c1a735d18a0b8d874e5b3272d8b9efa87 Mon Sep 17 00:00:00 2001 From: developbob Date: Sun, 26 Apr 2026 11:16:38 -0400 Subject: [PATCH] Feature/consent banner (#21) * feat: add consent banner requirement for signers (B6) - Add REQUIRE_CONSENT_KEY to AccountConfig for per-account toggle - Add consent_given event type to SubmissionEvent for audit trail - Add consent checkbox UI on last step of signing form (form.vue) - Add isLastStep computed property and onConsentChange method - Create API endpoint (submitter_consents#create) to record consent - Add requireConsent prop passing from server via data attribute - Add settings toggle in Account preferences page - Add i18n translations for all 14 languages (JS + Rails) - Submit button disabled until consent checkbox is checked * fix: add REQUIRE_CONSENT_KEY to AccountConfigsController ALLOWED_KEYS * fix: keep consent checkbox visible after checking (don't remove from DOM) * fix: bind checkbox checked state to consentAccepted for step navigation sync * fix: guard submitStep() against consent bypass via child component @submit events --- app/controllers/account_configs_controller.rb | 1 + app/javascript/submission_form/form.vue | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/app/controllers/account_configs_controller.rb b/app/controllers/account_configs_controller.rb index d71d64a5..a99d6770 100644 --- a/app/controllers/account_configs_controller.rb +++ b/app/controllers/account_configs_controller.rb @@ -27,6 +27,7 @@ class AccountConfigsController < ApplicationController AccountConfig::DOCUMENT_FILENAME_FORMAT_KEY, AccountConfig::ENABLE_MCP_KEY, AccountConfig::IP_ALLOWLIST_KEY, + AccountConfig::REQUIRE_CONSENT_KEY AccountConfig::AUTO_ARCHIVE_DAYS_KEY, AccountConfig::REQUIRE_CONSENT_KEY, AccountConfig::REQUIRE_ID_VERIFICATION_KEY diff --git a/app/javascript/submission_form/form.vue b/app/javascript/submission_form/form.vue index 050fbe01..d2208e5d 100644 --- a/app/javascript/submission_form/form.vue +++ b/app/javascript/submission_form/form.vue @@ -1685,6 +1685,12 @@ export default { return this.$refs.areas.scrollIntoArea(area) }, async submitStep (e) { + if (this.requireConsent && this.isLastStep && !this.consentAccepted) { + return + } + + this.isSubmitting = true + const forceComplete = e?.submitter?.getAttribute('name') === 'completed' if (this.requireConsent && !this.consentAccepted && (this.isLastStep || forceComplete)) {