feat: add fast track quick send feature (v0.13.0)

* feat: add fast track quick send feature (v0.13.0)

* fix: add missing 'required' i18n key to all 7 locales

* fix: add Quick Send button to empty-state template view

---------

Co-authored-by: Bob Develop <developbob50@gmail.com>
pull/639/head
devin-ai-integration[bot] 2 weeks ago committed by GitHub
parent 8829aae73b
commit d08179854b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,38 @@
# frozen_string_literal: true
class TemplatesQuickSendController < ApplicationController
load_and_authorize_resource :template
before_action :authorize_create_submission, only: :create
def show
@fields = @template.fields
@submitters = @template.submitters
end
def create
submissions =
Submissions.create_from_emails(template: @template,
user: current_user,
source: :invite,
mark_as_sent: true,
emails: params[:email],
params: { 'send_completed_email' => true })
WebhookUrls.enqueue_events(submissions, 'submission.created')
Submissions.send_signature_requests(submissions)
SearchEntries.enqueue_reindex(submissions)
redirect_to template_path(@template), notice: I18n.t('submission_has_been_sent')
rescue Submissions::CreateFromSubmitters::BaseError => e
redirect_to template_path(@template), alert: e.message
end
private
def authorize_create_submission
authorize!(:create, Submission)
end
end

@ -18,6 +18,10 @@
<span><%= t('export') %></span>
<% end %>
<% if !@template.archived_at? && can?(:create, Submission) %>
<%= link_to template_quick_send_path(@template), id: 'quick_send_button', class: 'white-button !border', data: { turbo_frame: 'modal' } do %>
<%= svg_icon('send', class: 'w-6 h-6 stroke-2') %>
<%= t('quick_send') %>
<% end %>
<%= link_to new_template_submission_path(@template), id: 'add_recipients_button', class: 'white-button !border', data: { turbo_frame: 'modal' } do %>
<%= svg_icon('plus', class: 'w-6 h-6 stroke-2') %>
<%= t('add_recipients_html') %>
@ -89,7 +93,11 @@
<p><%= t('send_an_invitation_to_fill_and_complete_the_form') %></p>
<div class="space-y-2 flex flex-col">
<% if can?(:create, Submission) %>
<%= link_to new_template_submission_path(@template, with_link: true), id: 'send_to_recipients_button', class: 'base-button mt-6', data: { turbo_frame: 'modal' } do %>
<%= link_to template_quick_send_path(@template), id: 'quick_send_button', class: 'base-button mt-6', data: { turbo_frame: 'modal' } do %>
<%= svg_icon('send', class: 'w-6 h-6 stroke-2') %>
<span class="mr-1"><%= t('quick_send') %></span>
<% end %>
<%= link_to new_template_submission_path(@template, with_link: true), id: 'send_to_recipients_button', class: 'white-button w-full', data: { turbo_frame: 'modal' } do %>
<%= svg_icon('plus', class: 'w-6 h-6 stroke-2') %>
<span class="mr-1"><%= t('send_to_recipients') %></span>
<% end %>

@ -0,0 +1,63 @@
<%= render 'shared/turbo_modal_large', title: t('quick_send') do %>
<div class="mt-2 mb-4 px-5">
<% submitter_fields = @fields.select { |f| f['submitter_uuid'] == @submitters.first['uuid'] } %>
<% auto_fillable = submitter_fields.all? { |f| f['default_value'].present? || !f['required'] || f['type'].in?(%w[signature initials stamp]) } %>
<% if auto_fillable %>
<div class="alert bg-base-200 border-base-300 mt-3 mb-4">
<%= svg_icon('circle_check', class: 'w-5 h-5 stroke-current shrink-0') %>
<span><%= t('all_fields_have_defaults') %></span>
</div>
<% else %>
<div class="alert bg-warning/10 border-warning/30 mt-3 mb-4">
<%= svg_icon('alert_circle', class: 'w-5 h-5 stroke-current shrink-0') %>
<span><%= t('some_fields_require_manual_input') %></span>
</div>
<% end %>
<% if submitter_fields.present? %>
<div class="mb-4">
<label class="text-sm font-semibold"><%= t('auto_filled_fields') %></label>
<div class="overflow-x-auto mt-2">
<table class="table table-sm table-zebra">
<thead>
<tr>
<th><%= t('name') %></th>
<th><%= t('type') %></th>
<th><%= t('value') %></th>
</tr>
</thead>
<tbody>
<% submitter_fields.each do |field| %>
<tr>
<td class="font-medium"><%= field['name'].presence || field['type'].humanize %></td>
<td><span class="badge badge-outline badge-sm"><%= field['type'] %></span></td>
<td>
<% if field['default_value'].present? %>
<span class="text-sm"><%= truncate(Array(field['default_value']).join(', '), length: 40) %></span>
<% elsif field['type'].in?(%w[signature initials stamp]) %>
<span class="text-xs text-base-content/50"><%= t('filled_by_recipient') %></span>
<% elsif !field['required'] %>
<span class="text-xs text-base-content/50"><%= t('optional') %></span>
<% else %>
<span class="text-xs text-warning"><%= t('required') %></span>
<% end %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
</div>
<% end %>
<%= form_for '', url: template_quick_send_path(@template), method: :post, html: { autocomplete: 'off' }, data: { turbo_frame: :_top } do |f| %>
<div class="form-control mb-4">
<label class="label">
<span class="label-text font-semibold"><%= t('recipient_email') %></span>
</label>
<input type="email" name="email" class="base-input w-full" placeholder="<%= t('email') %>" required autofocus autocomplete="off">
</div>
<div class="form-control">
<%= f.button button_title(title: t('send_now'), icon: svg_icon('send', class: 'w-5 h-5')), class: 'base-button' %>
</div>
<% end %>
</div>
<% end %>

@ -493,6 +493,15 @@ en: &en
there_are_no_submissions: There are no Submissions
send_an_invitation_to_fill_and_complete_the_form: Send an invitation to fill and complete the form
send_to_recipients: Send to Recipients
quick_send: Quick Send
send_now: Send Now
recipient_email: Recipient Email
all_fields_have_defaults: All fields have defaults or are auto-fillable.
some_fields_require_manual_input: Some required fields do not have default values.
auto_filled_fields: Auto-filled Fields
filled_by_recipient: Filled by recipient
submission_has_been_sent: Submission has been sent.
required: Required
sign_it_yourself: Sign it Yourself
api_and_embedding: API and Embedding
template_id: Template ID
@ -1539,6 +1548,15 @@ es: &es
there_are_no_submissions: No hay envíos
send_an_invitation_to_fill_and_complete_the_form: Enviar una invitación para completar el formulario
send_to_recipients: Enviar a los destinatarios
quick_send: Envío rápido
send_now: Enviar ahora
recipient_email: Correo del destinatario
all_fields_have_defaults: Todos los campos tienen valores predeterminados o se completan automáticamente.
some_fields_require_manual_input: Algunos campos obligatorios no tienen valores predeterminados.
auto_filled_fields: Campos autocompletados
filled_by_recipient: Completado por el destinatario
submission_has_been_sent: El envío ha sido realizado.
required: Obligatorio
sign_it_yourself: Fírmalo tú mismo
api_and_embedding: API e Integración
template_id: ID de plantilla
@ -2582,6 +2600,15 @@ it: &it
there_are_no_submissions: Non ci sono invii
send_an_invitation_to_fill_and_complete_the_form: Invia un invito per compilare e completare il modulo
send_to_recipients: Invia ai destinatari
quick_send: Invio rapido
send_now: Invia ora
recipient_email: Email del destinatario
all_fields_have_defaults: Tutti i campi hanno valori predefiniti o sono compilabili automaticamente.
some_fields_require_manual_input: Alcuni campi obbligatori non hanno valori predefiniti.
auto_filled_fields: Campi compilati automaticamente
filled_by_recipient: Compilato dal destinatario
submission_has_been_sent: L'invio è stato effettuato.
required: Obbligatorio
sign_it_yourself: Firmalo tu stesso
api_and_embedding: API e Incorporazione
template_id: ID modello
@ -3629,6 +3656,15 @@ fr: &fr
there_are_no_submissions: Il ny a aucune soumission
send_an_invitation_to_fill_and_complete_the_form: Envoyer une invitation pour remplir et terminer le formulaire
send_to_recipients: Envoyer aux destinataires
quick_send: Envoi rapide
send_now: Envoyer maintenant
recipient_email: Email du destinataire
all_fields_have_defaults: Tous les champs ont des valeurs par défaut ou sont remplis automatiquement.
some_fields_require_manual_input: Certains champs obligatoires n'ont pas de valeurs par défaut.
auto_filled_fields: Champs remplis automatiquement
filled_by_recipient: Rempli par le destinataire
submission_has_been_sent: L'envoi a été effectué.
required: Obligatoire
sign_it_yourself: Signer vousmême
api_and_embedding: API et Embedding
template_id: ID du modèle
@ -4669,6 +4705,15 @@ pt: &pt
there_are_no_submissions: Não há submissões
send_an_invitation_to_fill_and_complete_the_form: Enviar um convite para preencher e concluir o formulário
send_to_recipients: Enviar para destinatários
quick_send: Envio rápido
send_now: Enviar agora
recipient_email: Email do destinatário
all_fields_have_defaults: Todos os campos têm valores padrão ou são preenchidos automaticamente.
some_fields_require_manual_input: Alguns campos obrigatórios não têm valores padrão.
auto_filled_fields: Campos preenchidos automaticamente
filled_by_recipient: Preenchido pelo destinatário
submission_has_been_sent: O envio foi realizado.
required: Obrigatório
sign_it_yourself: Assine você mesmo
api_and_embedding: API e Incorporação
template_id: ID do modelo
@ -5712,6 +5757,15 @@ de: &de
there_are_no_submissions: Es gibt keine Einreichungen
send_an_invitation_to_fill_and_complete_the_form: Einladung zum Ausfüllen und Abschließen des Formulars senden
send_to_recipients: An Empfänger senden
quick_send: Schnellversand
send_now: Jetzt senden
recipient_email: Empfänger-E-Mail
all_fields_have_defaults: Alle Felder haben Standardwerte oder werden automatisch ausgefüllt.
some_fields_require_manual_input: Einige Pflichtfelder haben keine Standardwerte.
auto_filled_fields: Automatisch ausgefüllte Felder
filled_by_recipient: Vom Empfänger ausgefüllt
submission_has_been_sent: Die Übermittlung wurde gesendet.
required: Erforderlich
sign_it_yourself: Selbst unterschreiben
api_and_embedding: API und Einbettung
template_id: Vorlagen-ID
@ -7160,6 +7214,15 @@ nl: &nl
there_are_no_submissions: Er zijn geen inzendingen
send_an_invitation_to_fill_and_complete_the_form: Stuur een uitnodiging om het formulier in te vullen en te voltooien
send_to_recipients: Verzenden naar ontvangers
quick_send: Snel verzenden
send_now: Nu verzenden
recipient_email: E-mail van ontvanger
all_fields_have_defaults: Alle velden hebben standaardwaarden of worden automatisch ingevuld.
some_fields_require_manual_input: Sommige verplichte velden hebben geen standaardwaarden.
auto_filled_fields: Automatisch ingevulde velden
filled_by_recipient: Ingevuld door ontvanger
submission_has_been_sent: De inzending is verzonden.
required: Vereist
sign_it_yourself: Zelf ondertekenen
api_and_embedding: API en insluiten
template_id: Sjabloon-ID

@ -112,6 +112,7 @@ Rails.application.routes.draw do
resources :recipients, only: %i[create], controller: 'templates_recipients'
resources :prefillable_fields, only: %i[create], controller: 'templates_prefillable_fields'
resources :submissions_export, only: %i[index new]
resource :quick_send, only: %i[show create], controller: 'templates_quick_send'
end
resources :preview_document_page, only: %i[show], path: '/preview/:signed_key'
resource :blobs_proxy, only: %i[show], path: '/file/:signed_uuid/*filename',

Loading…
Cancel
Save