Files
docuseal/app/views/submit_form/show.html.erb
T

191 lines
14 KiB
Plaintext
Raw Normal View History

2026-06-23 08:48:49 +03:00
<% content_for(:html_title, "#{@submitter.submission.name || @submitter.submission.template&.name} | DocuSeal") %>
2025-06-26 16:33:11 +03:00
<% I18n.with_locale(@submitter.account.locale) do %>
<% content_for(:html_description, t('account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution', account_name: @submitter.account.name)) %>
<% end %>
2023-07-26 09:58:50 +03:00
<% fields_index = Templates.build_field_areas_index(@submitter.submission.template_fields || @submitter.submission.template.fields) %>
2023-10-12 00:06:33 +03:00
<% values = @submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) } %>
2024-08-06 00:19:33 +03:00
<% submitters_index = @submitter.submission.submitters.index_by(&:uuid) %>
2026-04-02 12:48:28 +03:00
<% page_blob_struct = Struct.new(:url, :metadata) %>
2026-06-19 16:33:55 +03:00
<% service_url_time = ActiveStorage::Attachment.service_url_time %>
2024-12-07 01:35:59 +02:00
<% schema = Submissions.filtered_conditions_schema(@submitter.submission, values:, include_submitter_uuid: @submitter.uuid) %>
2025-07-14 12:53:15 +03:00
<% font_scale = 1000.0 / PdfUtils::US_LETTER_W %>
2026-04-16 12:41:42 +03:00
<% decline_modal_id = nil %>
<% delegate_modal_id = nil %>
2023-07-03 00:03:29 +03:00
<div style="max-height: -webkit-fill-available;">
2026-04-16 12:41:42 +03:00
<main id="scrollbox">
2026-04-17 14:49:14 +03:00
<div id="sr_only_content"></div>
2023-07-03 00:03:29 +03:00
<div class="mx-auto block pb-72" style="max-width: 1000px">
2025-04-18 12:28:46 +03:00
<%# flex block w-full sticky top-0 z-50 space-x-2 items-center bg-yellow-100 p-2 border-y border-yellow-200 transition-transform duration-300 %>
2024-08-21 09:22:59 +03:00
<%= local_assigns[:banner_html] || capture do %>
<%= render('submit_form/banner') %>
2026-04-16 12:41:42 +03:00
<header id="signing_form_header" class="sticky min-[1230px]:static top-0 z-50 bg-base-100 py-2 px-2 flex items-center md:-mx-[8px]" style="margin-bottom: -16px">
<h1 class="text-xl md:text-2xl font-medium focus:text-clip" style="width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
2026-06-23 08:48:49 +03:00
<%= @submitter.submission.name || @submitter.submission.template&.name %>
2026-04-16 12:41:42 +03:00
</h1>
2026-05-12 21:38:15 +03:00
<div class="flex items-center gap-2 group" style="margin-left: 20px; flex-shrink: 0">
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_decline] && !@submitter.viewer? %>
2026-05-12 21:38:15 +03:00
<modal-button data-target="<%= decline_modal_id = SecureRandom.uuid %>" class="hidden group-has-[.complete-button]:flex">
<button type="button" class="btn btn-sm md:!px-5 px-2" aria-label="<%= t(:decline) %>">
<span class="hidden md:inline"><%= t(:decline) %></span>
<span class="inline md:hidden">
<%= svg_icon('x', class: 'w-5 h-5') %>
</span>
</button>
</modal-button>
<% end %>
<span id="complete_button_container" class="peer contents"></span>
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_delegate] && !@submitter.viewer? %>
2026-05-12 21:38:15 +03:00
<modal-button data-target="<%= delegate_modal_id = SecureRandom.uuid %>" class="hidden peer-empty:flex">
2026-04-16 12:41:42 +03:00
<button id="delegate_button" type="button" class="btn btn-sm !px-5"><%= t(:delegate) %></button>
</modal-button>
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_decline] && !@submitter.viewer? %>
2026-05-12 21:38:15 +03:00
<modal-button data-target="<%= decline_modal_id %>" class="hidden peer-empty:flex">
2026-04-16 12:41:42 +03:00
<button id="decline_button" type="button" class="btn btn-sm px-2" aria-label="<%= t(:decline) %>">
<%= svg_icon('x', class: 'w-5 h-5') %>
</button>
</modal-button>
2026-03-27 12:56:52 +02:00
<% end %>
<% if @form_configs[:with_partial_download] %>
2026-05-12 21:38:15 +03:00
<download-button role="button" tabindex="0" data-src="<%= submit_form_download_index_path(@submitter.slug) %>" class="btn btn-neutral text-white btn-sm px-2 hidden peer-empty:flex" title="<%= t('download') %>" aria-label="<%= t('download') %>">
2026-03-27 12:56:52 +02:00
<span data-target="download-button.defaultButton">
<%= svg_icon('download', class: 'w-5 h-5') %>
</span>
<span class="hidden" data-target="download-button.loadingButton">
<%= svg_icon('loader', class: 'w-5 h-5 animate-spin') %>
</span>
</download-button>
<% end %>
<% else %>
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_decline] && !@submitter.viewer? %>
2026-05-12 21:38:15 +03:00
<modal-button data-target="<%= decline_modal_id %>" class="hidden peer-empty:flex">
2026-04-16 12:41:42 +03:00
<button id="decline_button" type="button" class="btn btn-sm !px-5"><%= t(:decline) %></button>
</modal-button>
2026-03-27 12:56:52 +02:00
<% end %>
<% if @form_configs[:with_partial_download] %>
2026-05-12 21:38:15 +03:00
<download-button role="button" tabindex="0" data-src="<%= submit_form_download_index_path(@submitter.slug) %>" class="btn btn-neutral text-white btn-sm !px-4 hidden peer-empty:flex" aria-label="<%= t('download') %>">
2026-03-27 12:56:52 +02:00
<span class="flex items-center justify-center" data-target="download-button.defaultButton">
<%= svg_icon('download', class: 'w-6 h-6 inline md:hidden') %>
<span class="hidden md:inline"><%= t('download') %></span>
</span>
<span class="flex items-center justify-center space-x-2 hidden" data-target="download-button.loadingButton">
<%= svg_icon('loader', class: 'w-6 h-6 animate-spin') %>
<span class="hidden md:inline"><%= t('downloading') %></span>
</span>
</download-button>
<% end %>
2025-06-06 16:23:44 +03:00
<% end %>
2024-08-21 09:22:59 +03:00
</div>
2026-04-16 12:41:42 +03:00
</header>
2026-05-12 21:38:15 +03:00
<scroll-buttons inert class="fixed right-5 top-2 hidden md:flex gap-1 z-50 ease-in-out opacity-0 -translate-y-10 group">
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_decline] && !@submitter.viewer? %>
2026-05-12 21:38:15 +03:00
<modal-button data-target="<%= decline_modal_id %>" class="hidden group-has-[.complete-button]:flex">
<button type="button" class="btn btn-sm px-2" aria-label="<%= t(:decline) %>">
<%= svg_icon('x', class: 'w-5 h-5') %>
</button>
</modal-button>
<% end %>
<span id="complete_button_container_scroll" class="peer contents"></span>
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_delegate] && !@submitter.viewer? %>
2026-05-12 21:38:15 +03:00
<modal-button data-target="<%= delegate_modal_id %>" class="hidden peer-empty:flex">
2026-04-17 14:49:14 +03:00
<button id="delegate_button_mobile" type="button" class="btn btn-sm px-0" aria-label="<%= t(:delegate) %>">
2026-04-16 12:41:42 +03:00
<span class="min-[1366px]:inline hidden px-3">
<%= t(:delegate) %>
</span>
<span class="inline min-[1366px]:hidden px-2">
<%= svg_icon('user_share', class: 'w-5 h-5') %>
</span>
</button>
</modal-button>
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_decline] && !@submitter.viewer? %>
2026-05-12 21:38:15 +03:00
<modal-button data-target="<%= decline_modal_id %>" class="hidden peer-empty:flex">
2026-04-17 14:49:14 +03:00
<button id="decline_button_mobile" type="button" class="btn btn-sm px-2" aria-label="<%= t(:decline) %>">
2026-04-16 12:41:42 +03:00
<%= svg_icon('x', class: 'w-5 h-5') %>
</button>
</modal-button>
2026-03-27 12:56:52 +02:00
<% end %>
<% else %>
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_decline] && !@submitter.viewer? %>
2026-05-12 21:38:15 +03:00
<modal-button data-target="<%= decline_modal_id %>" class="hidden peer-empty:flex">
2026-04-17 14:49:14 +03:00
<button id="decline_button_mobile" type="button" class="btn btn-sm px-0" aria-label="<%= t(:decline) %>">
2026-04-16 12:41:42 +03:00
<span class="min-[1366px]:inline hidden px-3">
<%= t(:decline) %>
</span>
<span class="inline min-[1366px]:hidden px-2">
<%= svg_icon('x', class: 'w-5 h-5') %>
</span>
</button>
</modal-button>
2026-03-27 12:56:52 +02:00
<% end %>
2025-04-18 12:16:11 +03:00
<% end %>
2026-05-13 08:47:20 +03:00
<% if @form_configs[:with_partial_download] %>
<download-button role="button" tabindex="0" data-src="<%= submit_form_download_index_path(@submitter.slug) %>" class="btn btn-neutral text-white btn-sm px-2 hidden peer-empty:flex" aria-label="<%= t('download') %>">
<span data-target="download-button.defaultButton">
<%= svg_icon('download', class: 'w-5 h-5') %>
</span>
<span class="hidden" data-target="download-button.loadingButton">
<%= svg_icon('loader', class: 'w-5 h-5 animate-spin') %>
</span>
</download-button>
<% end %>
2025-04-18 12:16:11 +03:00
</scroll-buttons>
2024-08-21 09:22:59 +03:00
<% end %>
2024-12-07 01:35:59 +02:00
<% schema.each do |item| %>
2025-05-31 15:15:25 +03:00
<% document = @submitter.submission.schema_documents.find { |a| a.uuid == item['attachment_uuid'] } %>
2024-12-07 01:35:59 +02:00
<div id="document-<%= document.uuid %>">
2026-04-17 14:49:14 +03:00
<div class="sr_only_content"></div>
2024-12-07 01:35:59 +02:00
<% document_annots_index = document.metadata.dig('pdf', 'annotations')&.group_by { |e| e['page'] } || {} %>
<% preview_images_index = document.preview_images.loaded? ? document.preview_images.index_by { |e| e.filename.base.to_i } : {} %>
2025-07-14 12:53:15 +03:00
<% lazyload_metadata = document.preview_images.last&.metadata || Templates::ProcessDocument::US_LETTER_SIZE %>
2024-12-07 01:35:59 +02:00
<% (document.metadata.dig('pdf', 'number_of_pages') || (document.preview_images.loaded? ? preview_images_index.size : document.preview_images.size)).times do |index| %>
2026-04-24 21:44:57 +03:00
<% page = preview_images_index[index] || page_blob_struct.new(metadata: lazyload_metadata, url: preview_document_page_path(document.signed_key, "#{index}#{Templates::ProcessDocument::PREVIEW_FORMAT}")) %>
2025-07-14 12:53:15 +03:00
<page-container class="block relative my-4 shadow-md" style="container-type: size; aspect-ratio: <%= width = page.metadata['width'] %> / <%= height = page.metadata['height'] %>">
2026-06-19 16:33:55 +03:00
<img loading="lazy" src="<%= page.is_a?(ActiveStorage::Attachment) ? page.url(time: service_url_time) : page.url %>" width="<%= width %>" height="<%= height %>" alt="<%= "#{item['name']} - #{t('page')} #{index + 1}" %>">
2024-12-07 01:35:59 +02:00
<div id="page-<%= [document.uuid, index].join('-') %>" class="top-0 bottom-0 left-0 right-0 absolute">
2025-02-14 12:33:49 +02:00
<% if annots = document_annots_index[index] %>
<%= render 'submit_form/annotations', annots: %>
2024-12-07 01:35:59 +02:00
<% end %>
<% fields_index.dig(document.uuid, index)&.each do |(area, field)| %>
2025-08-11 16:58:14 +03:00
<% value = values[field['uuid']].presence || (field['readonly'] == true && field['default_value'].present? ? Submitters::SubmitValues.template_default_value_for_submitter(field['default_value'], @submitter.submission.submitters.find { |e| e.uuid == field['submitter_uuid'] }, with_time: false) : nil) %>
2024-12-07 01:35:59 +02:00
<% next if value.blank? %>
<% next if !field['readonly'] && field['submitter_uuid'] == @submitter.uuid %>
<% next if value == '{{date}}' && field['submitter_uuid'] != @submitter.uuid %>
<% next if field['conditions'].present? && values[field['uuid']].blank? && field['submitter_uuid'] != @submitter.uuid %>
<% next if field['conditions'].present? && field['submitter_uuid'] == @submitter.uuid %>
<% next if field.dig('preferences', 'formula').present? && field['submitter_uuid'] == @submitter.uuid %>
2026-07-14 12:47:38 +03:00
<%= render 'submissions/value', page_width: width, page_height: height, font_scale:, area:, field:, attachments_index: @attachments_index, value: field.dig('preferences', 'mask').present? ? TextUtils.mask_value(value, field.dig('preferences', 'mask')) : value, locale: @submitter.account.locale, timezone: @submitter.account.timezone, submitter: submitters_index[field['submitter_uuid']], with_signature_id: @form_configs[:with_signature_id], with_submitter_timezone: @form_configs[:with_submitter_timezone], with_timestamp_seconds: @form_configs[:with_timestamp_seconds], with_signature_id_reason: @form_configs[:with_signature_id_reason], with_signature_id_completed_at: @form_configs[:with_signature_id_completed_at] %>
2024-12-07 01:35:59 +02:00
<% end %>
</div>
2025-07-14 12:53:15 +03:00
</page-container>
2024-12-07 01:35:59 +02:00
<% end %>
</div>
2023-07-03 00:03:29 +03:00
<% end %>
2024-10-13 18:11:15 +03:00
<%= render 'shared/attribution', link_path: '/start', account: @submitter.account, with_style: false %>
2024-11-29 19:49:44 +02:00
<% if @form_configs[:policy_links].present? %>
<div class="text-center md:text-neutral-500 md:pr-3 md:pb-3 md:text-sm md:text-left mt-2 md:mt-0 md:fixed md:bottom-0 md:right-0">
<div class="md:max-w-[8rem] flex flex-wrap md:flex-col justify-center md:justify-start md:items-start space-x-2 md:space-x-0">
2026-02-21 14:50:35 +02:00
<%= MarkdownToHtml.call(@form_configs[:policy_links]) %>
</div>
</div>
<% end %>
2023-07-03 00:03:29 +03:00
</div>
2026-04-16 12:41:42 +03:00
</main>
2023-06-15 01:05:04 +03:00
</div>
2026-01-26 11:26:28 +02:00
<div class="fixed bottom-0 w-full h-0 z-50">
2023-06-15 01:05:04 +03:00
<div class="mx-auto" style="max-width: 1000px">
<div class="relative md:mx-32">
2024-12-07 01:35:59 +02:00
<%= render 'submit_form/submission_form', attachments_index: @attachments_index, submitter: @submitter, signature_attachment: @signature_attachment, configs: @form_configs, dry_run: local_assigns[:dry_run], expand: local_assigns[:expand], scroll_padding: local_assigns.fetch(:scroll_padding, '-110px'), schema: %>
2023-05-31 23:19:20 +03:00
</div>
</div>
</div>
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_decline] && !@submitter.viewer? %>
2026-04-16 12:41:42 +03:00
<%= render 'shared/html_modal', title: t(:decline), uuid: decline_modal_id do %>
2026-01-26 11:26:28 +02:00
<%= render 'submit_form/decline_form', submitter: @submitter %>
<% end %>
<% end %>
2026-07-04 15:47:40 +03:00
<% if @form_configs[:with_delegate] && !@submitter.viewer? %>
2026-04-16 12:41:42 +03:00
<%= render 'shared/html_modal', title: t(:delegate), uuid: delegate_modal_id do %>
2026-03-27 12:56:52 +02:00
<%= render 'submit_form/delegate_form', submitter: @submitter %>
<% end %>
<% end %>
2023-11-26 00:06:38 +02:00
<%= render 'scripts/autosize_field' %>