From 118f4a231be1799f124e3e4ec24fc225d3f06f85 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Tue, 17 Feb 2026 17:45:46 +0200 Subject: [PATCH] detailed time format --- app/models/account_config.rb | 1 + app/views/submissions/_value.html.erb | 3 ++- app/views/submissions/show.html.erb | 5 ++-- app/views/submit_form/show.html.erb | 2 +- config/locales/i18n.yml | 27 +++++++++++++++++++ lib/submissions/generate_audit_trail.rb | 6 ++++- .../generate_preview_attachments.rb | 4 ++- .../generate_result_attachments.rb | 12 ++++++--- lib/submitters/form_configs.rb | 4 ++- 9 files changed, 54 insertions(+), 10 deletions(-) diff --git a/app/models/account_config.rb b/app/models/account_config.rb index 276194da..083aea07 100644 --- a/app/models/account_config.rb +++ b/app/models/account_config.rb @@ -49,6 +49,7 @@ class AccountConfig < ApplicationRecord WITH_AUDIT_VALUES_KEY = 'with_audit_values' WITH_AUDIT_SENDER_KEY = 'with_audit_sender' WITH_SUBMITTER_TIMEZONE_KEY = 'with_submitter_timezone' + WITH_TIMESTAMP_SECONDS_KEY = 'with_timestamp_seconds' REQUIRE_SIGNING_REASON_KEY = 'require_signing_reason' REUSE_SIGNATURE_KEY = 'reuse_signature' WITH_FIELD_LABELS_KEY = 'with_field_labels' diff --git a/app/views/submissions/_value.html.erb b/app/views/submissions/_value.html.erb index a0b3205d..5654080c 100644 --- a/app/views/submissions/_value.html.erb +++ b/app/views/submissions/_value.html.erb @@ -28,7 +28,8 @@ <% end %>
<% timezone = local_assigns[:with_submitter_timezone] ? (submitter.timezone || local_assigns[:timezone]) : local_assigns[:timezone] %> - <%= l(attachment.created_at.in_time_zone(timezone), format: :long, locale: local_assigns[:locale]) %> <%= TimeUtils.timezone_abbr(timezone, attachment.created_at) %> + <% time_format = local_assigns[:with_timestamp_seconds] ? :detailed : :long %> + <%= l(attachment.created_at.in_time_zone(timezone), format: time_format, locale: local_assigns[:locale]) %> <%= TimeUtils.timezone_abbr(timezone, attachment.created_at) %>
<% end %> diff --git a/app/views/submissions/show.html.erb b/app/views/submissions/show.html.erb index 5d19f351..7940f337 100644 --- a/app/views/submissions/show.html.erb +++ b/app/views/submissions/show.html.erb @@ -2,10 +2,11 @@ <%= render 'submissions/preview_tags' %> <% end %> <% font_scale = 1040.0 / PdfUtils::US_LETTER_W %> -<% configs = AccountConfig.where(account_id: @submission.account_id, key: [AccountConfig::COMBINE_PDF_RESULT_KEY, AccountConfig::WITH_SIGNATURE_ID, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY, AccountConfig::WITH_SIGNATURE_ID_REASON_KEY]) %> +<% configs = AccountConfig.where(account_id: @submission.account_id, key: [AccountConfig::COMBINE_PDF_RESULT_KEY, AccountConfig::WITH_SIGNATURE_ID, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY, AccountConfig::WITH_SIGNATURE_ID_REASON_KEY, AccountConfig::WITH_TIMESTAMP_SECONDS_KEY]) %> <% with_signature_id = configs.find { |e| e.key == AccountConfig::WITH_SIGNATURE_ID }&.value == true %> <% is_combined_enabled = configs.find { |e| e.key == AccountConfig::COMBINE_PDF_RESULT_KEY }&.value == true && !@submission.template_fields&.any? { |f| f['type'] == 'verification' } %> <% with_submitter_timezone = configs.find { |e| e.key == AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY }&.value == true %> +<% with_timestamp_seconds = configs.find { |e| e.key == AccountConfig::WITH_TIMESTAMP_SECONDS_KEY }&.value == true %> <% with_signature_id_reason = configs.find { |e| e.key == AccountConfig::WITH_SIGNATURE_ID_REASON_KEY }&.value != false %>
@@ -125,7 +126,7 @@ <% else %> - <%= render 'submissions/value', page_width: width, page_height: height, font_scale:, area:, field:, attachments_index:, value: mask.present? ? Array.wrap(value).map { |e| TextUtils.mask_value(e, mask) }.join(', ') : value, locale: @submission.account.locale, timezone: @submission.account.timezone, submitter:, with_signature_id:, with_submitter_timezone:, with_signature_id_reason: %> + <%= render 'submissions/value', page_width: width, page_height: height, font_scale:, area:, field:, attachments_index:, value: mask.present? ? Array.wrap(value).map { |e| TextUtils.mask_value(e, mask) }.join(', ') : value, locale: @submission.account.locale, timezone: @submission.account.timezone, submitter:, with_signature_id:, with_submitter_timezone:, with_timestamp_seconds:, with_signature_id_reason: %> <% end %> <% elsif field['readonly'] != true && submitter && !submitter.completed_at? %> <% submitters_order_index ||= (@submission.template_submitters || @submission.template.submitters).each_with_index.to_h { |s, i| [s['uuid'], i] } %> diff --git a/app/views/submit_form/show.html.erb b/app/views/submit_form/show.html.erb index 9e73f00d..f2bfedd3 100644 --- a/app/views/submit_form/show.html.erb +++ b/app/views/submit_form/show.html.erb @@ -80,7 +80,7 @@ <% 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 %> - <%= 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_signature_id_reason: @form_configs[:with_signature_id_reason] %> + <%= 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] %> <% end %>
diff --git a/config/locales/i18n.yml b/config/locales/i18n.yml index c95a793a..7fc42386 100644 --- a/config/locales/i18n.yml +++ b/config/locales/i18n.yml @@ -1002,6 +1002,9 @@ en: &en events: range_with_total: "%{from}-%{to} of %{count} events" range_without_total: "%{from}-%{to} events" + time: + formats: + detailed: "%B %d, %Y %H:%M:%S" es: &es knowledge_based_authentication: Autenticación basada en el conocimiento @@ -1986,6 +1989,9 @@ es: &es events: range_with_total: "%{from}-%{to} de %{count} eventos" range_without_total: "%{from}-%{to} eventos" + time: + formats: + detailed: "%-d de %B de %Y %H:%M:%S" it: &it knowledge_based_authentication: Autenticazione basata sulla conoscenza @@ -2971,6 +2977,9 @@ it: &it events: range_with_total: "%{from}-%{to} di %{count} eventi" range_without_total: "%{from}-%{to} eventi" + time: + formats: + detailed: "%d %B %Y %H:%M:%S" fr: &fr knowledge_based_authentication: Authentification basée sur la connaissance @@ -3952,6 +3961,9 @@ fr: &fr events: range_with_total: "%{from}-%{to} sur %{count} événements" range_without_total: "%{from}-%{to} événements" + time: + formats: + detailed: "%A %d %B %Y %Hh%Mm%Ss" pt: &pt knowledge_based_authentication: Autenticação baseada em conhecimento @@ -4936,6 +4948,9 @@ pt: &pt events: range_with_total: "%{from}-%{to} de %{count} eventos" range_without_total: "%{from}-%{to} eventos" + time: + formats: + detailed: "%A, %d de %B de %Y, %H:%M:%Sh" de: &de knowledge_based_authentication: Wissensbasierte Authentifizierung @@ -5920,6 +5935,9 @@ de: &de events: range_with_total: "%{from}-%{to} von %{count} Ereignissen" range_without_total: "%{from}-%{to} Ereignisse" + time: + formats: + detailed: "%A, %d. %B %Y, %H:%M:%S Uhr" pl: require_phone_2fa_to_open: Wymagaj uwierzytelniania telefonicznego 2FA do otwarcia @@ -7289,6 +7307,9 @@ nl: &nl events: range_with_total: "%{from}-%{to} van %{count} gebeurtenissen" range_without_total: "%{from}-%{to} gebeurtenissen" + time: + formats: + detailed: "%d %B %Y %H:%M:%S" ar: require_phone_2fa_to_open: "تطلب فتح عبر تحقق الهاتف ذو العاملين" @@ -7586,12 +7607,18 @@ en-US: date: formats: default: "%m/%d/%Y" + time: + formats: + detailed: "%B %d, %Y %I:%M:%S %p" en-GB: <<: *en date: formats: default: "%d/%m/%Y" + time: + formats: + detailed: "%d %B, %Y %H:%M:%S" es-ES: <<: *es diff --git a/lib/submissions/generate_audit_trail.rb b/lib/submissions/generate_audit_trail.rb index 92fa783c..ed80a86d 100644 --- a/lib/submissions/generate_audit_trail.rb +++ b/lib/submissions/generate_audit_trail.rb @@ -116,6 +116,7 @@ module Submissions configs = submission.account.account_configs.where(key: [AccountConfig::WITH_AUDIT_VALUES_KEY, AccountConfig::WITH_SIGNATURE_ID, AccountConfig::WITH_FILE_LINKS_KEY, + AccountConfig::WITH_TIMESTAMP_SECONDS_KEY, AccountConfig::WITH_AUDIT_SENDER_KEY, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY]) @@ -126,6 +127,7 @@ module Submissions with_audit_values = configs.find { |c| c.key == AccountConfig::WITH_AUDIT_VALUES_KEY }&.value != false with_audit_sender = configs.find { |c| c.key == AccountConfig::WITH_AUDIT_SENDER_KEY }&.value == true with_submitter_timezone = configs.find { |c| c.key == AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY }&.value == true + with_timestamp_seconds = configs.find { |c| c.key == AccountConfig::WITH_TIMESTAMP_SECONDS_KEY }&.value == true timezone = account.timezone timezone = last_submitter.timezone || account.timezone if with_submitter_timezone @@ -489,8 +491,10 @@ module Submissions end end + time_format = with_timestamp_seconds ? :detailed : :long + [ - "#{I18n.l(event.event_timestamp.in_time_zone(timezone), format: :long, locale: account.locale)} " \ + "#{I18n.l(event.event_timestamp.in_time_zone(timezone), format: time_format, locale: account.locale)} " \ "#{TimeUtils.timezone_abbr(timezone, event.event_timestamp)}", composer.document.layout.formatted_text_box(text_box) ] diff --git a/lib/submissions/generate_preview_attachments.rb b/lib/submissions/generate_preview_attachments.rb index ff5a85a8..a5e22632 100644 --- a/lib/submissions/generate_preview_attachments.rb +++ b/lib/submissions/generate_preview_attachments.rb @@ -15,6 +15,7 @@ module Submissions configs = submission.account.account_configs.where(key: [AccountConfig::FLATTEN_RESULT_PDF_KEY, AccountConfig::WITH_SIGNATURE_ID, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY, + AccountConfig::WITH_TIMESTAMP_SECONDS_KEY, AccountConfig::WITH_FILE_LINKS_KEY, AccountConfig::WITH_SIGNATURE_ID_REASON_KEY]) @@ -22,6 +23,7 @@ module Submissions with_file_links = configs.find { |c| c.key == AccountConfig::WITH_FILE_LINKS_KEY }&.value == true is_flatten = configs.find { |c| c.key == AccountConfig::FLATTEN_RESULT_PDF_KEY }&.value != false with_submitter_timezone = configs.find { |c| c.key == AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY }&.value == true + with_timestamp_seconds = configs.find { |c| c.key == AccountConfig::WITH_TIMESTAMP_SECONDS_KEY }&.value == true with_signature_id_reason = configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID_REASON_KEY }&.value != false @@ -37,7 +39,7 @@ module Submissions GenerateResultAttachments.fill_submitter_fields(s, submission.account, pdfs_index, with_signature_id:, is_flatten:, with_headings: index.zero?, with_submitter_timezone:, with_file_links:, - with_signature_id_reason:) + with_signature_id_reason:, with_timestamp_seconds:) end template = submission.template diff --git a/lib/submissions/generate_result_attachments.rb b/lib/submissions/generate_result_attachments.rb index 580b9be1..1f0eb4ee 100644 --- a/lib/submissions/generate_result_attachments.rb +++ b/lib/submissions/generate_result_attachments.rb @@ -140,11 +140,13 @@ module Submissions configs = submitter.account.account_configs.where(key: [AccountConfig::FLATTEN_RESULT_PDF_KEY, AccountConfig::WITH_SIGNATURE_ID, AccountConfig::WITH_FILE_LINKS_KEY, + AccountConfig::WITH_TIMESTAMP_SECONDS_KEY, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY, AccountConfig::WITH_SIGNATURE_ID_REASON_KEY]) with_signature_id = configs.find { |c| c.key == AccountConfig::WITH_SIGNATURE_ID }&.value == true is_flatten = configs.find { |c| c.key == AccountConfig::FLATTEN_RESULT_PDF_KEY }&.value != false + with_timestamp_seconds = configs.find { |c| c.key == AccountConfig::WITH_TIMESTAMP_SECONDS_KEY }&.value == true with_submitter_timezone = configs.find { |c| c.key == AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY }&.value == true with_file_links = configs.find { |c| c.key == AccountConfig::WITH_FILE_LINKS_KEY }&.value == true with_signature_id_reason = @@ -195,11 +197,13 @@ module Submissions fill_submitter_fields(submitter, submitter.account, pdfs_index, with_signature_id:, is_flatten:, with_submitter_timezone:, with_file_links:, + with_timestamp_seconds:, with_signature_id_reason:) end def fill_submitter_fields(submitter, account, pdfs_index, with_signature_id:, is_flatten:, with_headings: nil, - with_submitter_timezone: false, with_signature_id_reason: true, with_file_links: nil) + with_submitter_timezone: false, with_signature_id_reason: true, + with_timestamp_seconds: false, with_file_links: nil) cell_layouters = Hash.new do |hash, valign| hash[valign] = HexaPDF::Layout::TextLayouter.new(text_valign: valign.to_sym, text_align: :center) end @@ -320,13 +324,15 @@ module Submissions timezone = submitter.account.timezone timezone = submitter.timezone || submitter.account.timezone if with_submitter_timezone + time_format = with_timestamp_seconds ? :detailed : :long + if with_signature_id_reason || field.dig('preferences', 'reasons').present? "#{"#{I18n.t('reason')}: " if reason_value}#{reason_value || I18n.t('digitally_signed_by')} " \ "#{submitter.name}#{" <#{submitter.email}>" if submitter.email.present?}\n" \ - "#{I18n.l(attachment.created_at.in_time_zone(timezone), format: :long)} " \ + "#{I18n.l(attachment.created_at.in_time_zone(timezone), format: time_format)} " \ "#{TimeUtils.timezone_abbr(timezone, attachment.created_at)}" else - "#{I18n.l(attachment.created_at.in_time_zone(timezone), format: :long)} " \ + "#{I18n.l(attachment.created_at.in_time_zone(timezone), format: time_format)} " \ "#{TimeUtils.timezone_abbr(timezone, attachment.created_at)}" end end diff --git a/lib/submitters/form_configs.rb b/lib/submitters/form_configs.rb index 38d18993..4db19b32 100644 --- a/lib/submitters/form_configs.rb +++ b/lib/submitters/form_configs.rb @@ -15,6 +15,7 @@ module Submitters AccountConfig::ALLOW_TO_PARTIAL_DOWNLOAD_KEY, AccountConfig::ALLOW_TYPED_SIGNATURE, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY, + AccountConfig::WITH_TIMESTAMP_SECONDS_KEY, AccountConfig::WITH_SIGNATURE_ID_REASON_KEY, *(Docuseal.multitenant? ? [] : [AccountConfig::POLICY_LINKS_KEY])].freeze @@ -35,6 +36,7 @@ module Submitters require_signing_reason = find_safe_value(configs, AccountConfig::REQUIRE_SIGNING_REASON_KEY) == true enforce_signing_order = find_safe_value(configs, AccountConfig::ENFORCE_SIGNING_ORDER_KEY) == true with_submitter_timezone = find_safe_value(configs, AccountConfig::WITH_SUBMITTER_TIMEZONE_KEY) == true + with_timestamp_seconds = find_safe_value(configs, AccountConfig::WITH_TIMESTAMP_SECONDS_KEY) == true with_signature_id_reason = find_safe_value(configs, AccountConfig::WITH_SIGNATURE_ID_REASON_KEY) != false with_field_labels = find_safe_value(configs, AccountConfig::WITH_FIELD_LABELS_KEY) != false policy_links = find_safe_value(configs, AccountConfig::POLICY_LINKS_KEY) @@ -43,7 +45,7 @@ module Submitters reuse_signature:, with_decline:, with_partial_download:, policy_links:, enforce_signing_order:, completed_message:, require_signing_reason:, prefill_signature:, with_submitter_timezone:, - with_signature_id_reason:, with_signature_id:, with_field_labels: } + with_signature_id_reason:, with_signature_id:, with_field_labels:, with_timestamp_seconds: } keys.each do |key| attrs[key.to_sym] = configs.find { |e| e.key == key.to_s }&.value