diff --git a/app/controllers/submit_form_controller.rb b/app/controllers/submit_form_controller.rb index 7cde8f695..2f3ab0cb2 100644 --- a/app/controllers/submit_form_controller.rb +++ b/app/controllers/submit_form_controller.rb @@ -31,24 +31,22 @@ class SubmitFormController < ApplicationController Submissions.preload_with_pages(submission) - Submitters::MaybeUpdateDefaultValues.call(@submitter, current_user) - @attachments_index = build_attachments_index(submission) + if current_user && current_user.email == @submitter.email + @current_user_data = current_user.as_json(only: %i[first_name last_name], methods: %i[full_name]) + + initials = UserConfigs.load_initials(current_user) + + @prefill_initials = Submitters.build_prefill_attachment_data(@submitter, initials) if initials + end + return unless @form_configs[:prefill_signature] - if (user_signature = UserConfigs.load_signature(current_user)) - @signature_attachment = ActiveStorage::Attachment.find_or_create_by!( - blob_id: user_signature.blob_id, - name: 'attachments', - record: @submitter - ) - end + signature = UserConfigs.load_signature(current_user) || + Submitters::FindRememberedSignature.call(@submitter, params, cookies) - @signature_attachment ||= - Submitters::MaybeAssignDefaultBrowserSignature.call(@submitter, params, cookies, @attachments_index.values) - - @attachments_index[@signature_attachment.uuid] = @signature_attachment if @signature_attachment + @prefill_signature = Submitters.build_prefill_attachment_data(@submitter, signature) if signature end def update diff --git a/app/controllers/submit_form_prefill_attachments_controller.rb b/app/controllers/submit_form_prefill_attachments_controller.rb new file mode 100644 index 000000000..d56dc2a45 --- /dev/null +++ b/app/controllers/submit_form_prefill_attachments_controller.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +class SubmitFormPrefillAttachmentsController < ActionController::API + include ActiveStorage::SetCurrent + + def create + submitter = Submitter.find_by!(slug: params[:submit_form_slug]) + + unless can_upload?(submitter) + return render json: { error: I18n.t('form_has_been_archived') }, status: :unprocessable_content + end + + uuid, slug = ApplicationRecord.signed_id_verifier.verify(params[:prefill_token], purpose: :prefill_attachment) + + raise ActiveRecord::RecordNotFound if slug != submitter.slug + + source_attachment = ActiveStorage::Attachment.find_by!(uuid:) + + attachment = submitter.attachments_attachments.find_or_create_by!(blob_id: source_attachment.blob_id) + + render json: attachment.as_json(only: %i[uuid created_at], methods: %i[url filename content_type]) + end + + private + + def can_upload?(submitter) + !submitter.declined_at? && + !submitter.completed_at? && + !submitter.submission.archived_at? && + !submitter.submission.expired? && + !submitter.submission.template&.archived_at? + end +end diff --git a/app/javascript/form.js b/app/javascript/form.js index 96aba8b45..050e87e03 100644 --- a/app/javascript/form.js +++ b/app/javascript/form.js @@ -32,7 +32,9 @@ safeRegisterElement('submission-form', class extends HTMLElement { optionalInviteSubmitters: JSON.parse(this.dataset.optionalInviteSubmitters), schema: JSON.parse(this.dataset.schema), canSendEmail: this.dataset.canSendEmail === 'true', - previousSignatureValue: this.dataset.previousSignatureValue, + prefillSignature: this.dataset.prefillSignature ? JSON.parse(this.dataset.prefillSignature) : null, + prefillInitials: this.dataset.prefillInitials ? JSON.parse(this.dataset.prefillInitials) : null, + currentUser: this.dataset.currentUser ? JSON.parse(this.dataset.currentUser) : null, goToLast: this.dataset.goToLast === 'true', isDemo: this.dataset.isDemo === 'true', attribution: this.dataset.attribution !== 'false', diff --git a/app/javascript/submission_form/form.vue b/app/javascript/submission_form/form.vue index 695d3385b..80d3f45aa 100644 --- a/app/javascript/submission_form/form.vue +++ b/app/javascript/submission_form/form.vue @@ -491,8 +491,8 @@ :reason="values[currentField.preferences?.reason_field_uuid]" :field="currentField" :values="values" - :previous-value="previousSignatureValueFor(currentField) || previousSignatureValue" - :touch-attachment-uuid="previousSignatureValue" + :previous-value="previousSignatureValueFor(currentField)" + :prefill-data="prefillSignature" :with-typed-signature="withTypedSignature" :remember-signature="rememberSignature" :attachments-index="attachmentsIndex" @@ -507,7 +507,6 @@ :show-field-names="showFieldNames" :native-platform="nativePlatform" @update:reason="values[currentField.preferences?.reason_field_uuid] = $event" - @touch-attachment="attachmentsIndex[previousSignatureValue] ? attachmentsIndex[previousSignatureValue].created_at = new Date() : null" @attached="attachments.push($event)" @start="scrollIntoField(currentField)" @minimize="minimizeForm" @@ -521,6 +520,7 @@ :dry-run="dryRun" :submitter="submitter" :previous-value="previousInitialsValue" + :prefill-data="prefillInitials" :attachments-index="attachmentsIndex" :show-field-names="showFieldNames" :submitter-slug="submitterSlug" @@ -981,10 +981,20 @@ export default { required: false, default: '' }, - previousSignatureValue: { - type: String, + prefillSignature: { + type: Object, required: false, - default: '' + default: null + }, + prefillInitials: { + type: Object, + required: false, + default: null + }, + currentUser: { + type: Object, + required: false, + default: null }, allowToSkip: { type: Boolean, @@ -1346,6 +1356,30 @@ export default { screen?.orientation?.addEventListener('change', this.onOrientationChange) + if (this.currentUser) { + this.fields.forEach((field) => { + if (field.readonly || field.type !== 'text') { + return + } + + const fieldName = (field.name || '').toLowerCase() + + let value + + if (fieldName === 'full name' || fieldName === 'legal name') { + value = this.currentUser.full_name + } else if (fieldName === 'first name') { + value = this.currentUser.first_name + } else if (fieldName === 'last name') { + value = this.currentUser.last_name + } + + if (value) { + this.values[field.uuid] ??= value + } + }) + } + this.fields.forEach((field) => { if (field.default_value && !field.readonly) { this.values[field.uuid] ||= field.default_value diff --git a/app/javascript/submission_form/initials_step.vue b/app/javascript/submission_form/initials_step.vue index 65cf82897..5f430476a 100644 --- a/app/javascript/submission_form/initials_step.vue +++ b/app/javascript/submission_form/initials_step.vue @@ -87,7 +87,7 @@