From a80e20234f9cda5d52d0292dfec68e295bb3c5ef Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Sun, 3 Sep 2023 14:05:31 +0300 Subject: [PATCH] add name and phone to submitter details --- app/controllers/api/submissions_controller.rb | 17 +-- app/controllers/email_settings_controller.rb | 4 +- app/controllers/sms_settings_controller.rb | 5 + app/controllers/submissions_controller.rb | 12 +- .../submitters_send_email_controller.rb | 16 +++ app/javascript/form.js | 3 +- app/javascript/submission_form/form.vue | 13 +- app/models/submitter.rb | 4 +- app/views/api_settings/index.html.erb | 3 +- app/views/icons/_dots_vertical.html.erb | 6 + app/views/icons/_phone.html.erb | 4 + .../_documents_copy_email_form.html.erb | 28 +++++ .../_signature_request_email_form.html.erb | 28 +++++ .../_submitter_completed_email_form.html.erb | 28 +++++ .../personalization_settings/show.html.erb | 87 +------------ app/views/shared/_button_title.html.erb | 2 +- app/views/shared/_flash.html.erb | 2 +- app/views/shared/_settings_nav.html.erb | 3 + app/views/sms_settings/_placeholder.html.erb | 11 ++ app/views/sms_settings/index.html.erb | 8 ++ app/views/submissions/_detailed_form.html.erb | 43 +++++++ app/views/submissions/_email_form.html.erb | 42 +++++++ app/views/submissions/_phone_form.html.erb | 44 +++++++ app/views/submissions/_send_email.html.erb | 37 ++++++ app/views/submissions/_send_sms.html.erb | 3 + .../submissions/_send_sms_button.html.erb | 5 + app/views/submissions/new.html.erb | 99 ++++----------- app/views/submissions/show.html.erb | 38 +++++- app/views/submit_form/completed.html.erb | 2 +- app/views/submit_form/show.html.erb | 2 +- app/views/templates/_submission.html.erb | 116 +++++++++++++++++ app/views/templates/show.html.erb | 119 +----------------- config/routes.rb | 2 + ...171216_add_phone_and_name_to_submitters.rb | 10 ++ db/schema.rb | 6 +- lib/replace_email_variables.rb | 20 +-- lib/submissions.rb | 12 +- lib/submissions/generate_export_files.rb | 10 +- lib/submitters.rb | 10 ++ lib/submitters/serialize_for_webhook.rb | 2 +- spec/system/submit_form_spec.rb | 12 +- 41 files changed, 575 insertions(+), 343 deletions(-) create mode 100644 app/controllers/sms_settings_controller.rb create mode 100644 app/controllers/submitters_send_email_controller.rb create mode 100644 app/views/icons/_dots_vertical.html.erb create mode 100644 app/views/icons/_phone.html.erb create mode 100644 app/views/personalization_settings/_documents_copy_email_form.html.erb create mode 100644 app/views/personalization_settings/_signature_request_email_form.html.erb create mode 100644 app/views/personalization_settings/_submitter_completed_email_form.html.erb create mode 100644 app/views/sms_settings/_placeholder.html.erb create mode 100644 app/views/sms_settings/index.html.erb create mode 100644 app/views/submissions/_detailed_form.html.erb create mode 100644 app/views/submissions/_email_form.html.erb create mode 100644 app/views/submissions/_phone_form.html.erb create mode 100644 app/views/submissions/_send_email.html.erb create mode 100644 app/views/submissions/_send_sms.html.erb create mode 100644 app/views/submissions/_send_sms_button.html.erb create mode 100644 app/views/templates/_submission.html.erb create mode 100644 db/migrate/20230902171216_add_phone_and_name_to_submitters.rb diff --git a/app/controllers/api/submissions_controller.rb b/app/controllers/api/submissions_controller.rb index 58296619..433f183a 100644 --- a/app/controllers/api/submissions_controller.rb +++ b/app/controllers/api/submissions_controller.rb @@ -13,7 +13,7 @@ module Api Submissions.create_from_emails(template:, user: current_user, source: :api, - send_email: params[:send_email] != 'false', + mark_as_sent: params[:send_email] != 'false', emails: params[:emails] || params[:email]) else submissions_attrs = normalize_submissions_params!(submissions_params[:submission], template) @@ -21,13 +21,13 @@ module Api Submissions.create_from_submitters(template:, user: current_user, source: :api, - send_email: params[:send_email] != 'false', + mark_as_sent: params[:send_email] != 'false', submissions_attrs:) end submitters = submissions.flat_map(&:submitters) - send_invitation_emails(submitters) if params[:send_email] != 'false' + Submitters.send_signature_requests(submitters, send_email: params[:send_email] != 'false') render json: submitters rescue UnknownFieldName, UnknownSubmitterName => e @@ -36,14 +36,8 @@ module Api private - def send_invitation_emails(submitters) - submitters.each do |submitter| - SubmitterMailer.invitation_email(submitter, message: params[:message]).deliver_later! - end - end - def submissions_params - params.permit(submission: [{ submitters: [[:uuid, :name, :email, { values: {} }]] }]) + params.permit(submission: [{ submitters: [[:uuid, :name, :email, :role, :phone, { values: {} }]] }]) end def normalize_submissions_params!(submissions_params, template) @@ -53,7 +47,8 @@ module Api submitter[:values] = normalize_submitter_values(template, - submitter[:values], submitter[:name] || template.submitters[index]['name']) + submitter[:values], + submitter[:role] || template.submitters[index]['name']) end end diff --git a/app/controllers/email_settings_controller.rb b/app/controllers/email_settings_controller.rb index df0b7f80..f5700872 100644 --- a/app/controllers/email_settings_controller.rb +++ b/app/controllers/email_settings_controller.rb @@ -6,7 +6,7 @@ class EmailSettingsController < ApplicationController def index; end def create - if @encrypted_config.update(storage_configs) + if @encrypted_config.update(email_configs) SettingsMailer.smtp_successful_setup(@encrypted_config.value['from_email']).deliver_now! redirect_to settings_email_index_path, notice: 'Changes have been saved' @@ -26,7 +26,7 @@ class EmailSettingsController < ApplicationController EncryptedConfig.find_or_initialize_by(account: current_account, key: EncryptedConfig::EMAIL_SMTP_KEY) end - def storage_configs + def email_configs params.require(:encrypted_config).permit(value: {}).tap do |e| e[:value].compact_blank! end diff --git a/app/controllers/sms_settings_controller.rb b/app/controllers/sms_settings_controller.rb new file mode 100644 index 00000000..1f48fd30 --- /dev/null +++ b/app/controllers/sms_settings_controller.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class SmsSettingsController < ApplicationController + def index; end +end diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb index 81bb8536..f4a99853 100644 --- a/app/controllers/submissions_controller.rb +++ b/app/controllers/submissions_controller.rb @@ -20,23 +20,19 @@ class SubmissionsController < ApplicationController Submissions.create_from_emails(template: @template, user: current_user, source: :invite, - send_email: params[:send_email] == '1', + mark_as_sent: params[:send_email] == '1', emails: params[:emails]) else Submissions.create_from_submitters(template: @template, user: current_user, source: :invite, - send_email: params[:send_email] == '1', + mark_as_sent: params[:send_email] == '1', submissions_attrs: submissions_params[:submission].to_h.values) end submitters = submissions.flat_map(&:submitters) - if params[:send_email] == '1' - submitters.each do |submitter| - SubmitterMailer.invitation_email(submitter, message: params[:message]).deliver_later! - end - end + Submitters.send_signature_requests(submitters, params) redirect_to template_path(@template), notice: "#{submitters.size} #{'recipient'.pluralize(submitters.size)} added" @@ -54,7 +50,7 @@ class SubmissionsController < ApplicationController private def submissions_params - params.permit(submission: { submitters: [%i[uuid email]] }) + params.permit(submission: { submitters: [%i[uuid email phone name]] }) end def load_template diff --git a/app/controllers/submitters_send_email_controller.rb b/app/controllers/submitters_send_email_controller.rb new file mode 100644 index 00000000..8a714537 --- /dev/null +++ b/app/controllers/submitters_send_email_controller.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class SubmittersSendEmailController < ApplicationController + def create + submitter = Submitter.joins(:template) + .where(template: { account_id: current_account.id }) + .find_by!(slug: params[:submitter_slug]) + + SubmitterMailer.invitation_email(submitter).deliver_later! + + submitter.sent_at ||= Time.current + submitter.save! + + redirect_back(fallback_location: submission_path(submitter.submission), notice: 'Email has been sent') + end +end diff --git a/app/javascript/form.js b/app/javascript/form.js index 943c4384..da33cdbe 100644 --- a/app/javascript/form.js +++ b/app/javascript/form.js @@ -9,8 +9,7 @@ window.customElements.define('submission-form', class extends HTMLElement { this.appElem = document.createElement('div') this.app = createApp(Form, { - submitterSlug: this.dataset.submitterSlug, - submitterUuid: this.dataset.submitterUuid, + submitter: JSON.parse(this.dataset.submitter), authenticityToken: this.dataset.authenticityToken, canSendEmail: this.dataset.canSendEmail === 'true', isDirectUpload: this.dataset.isDirectUpload === 'true', diff --git a/app/javascript/submission_form/form.vue b/app/javascript/submission_form/form.vue index 642d13c7..91d63d6f 100644 --- a/app/javascript/submission_form/form.vue +++ b/app/javascript/submission_form/form.vue @@ -294,7 +294,7 @@ v-else :is-demo="isDemo" :with-confetti="withConfetti" - :can-send-email="canSendEmail" + :can-send-email="canSendEmail && submitter.email" :submitter-slug="submitterSlug" />
@@ -343,8 +343,8 @@ export default { } }, props: { - submitterSlug: { - type: String, + submitter: { + type: Object, required: true }, canSendEmail: { @@ -352,10 +352,6 @@ export default { required: false, default: false }, - submitterUuid: { - type: String, - required: true - }, attachments: { type: Array, required: false, @@ -414,6 +410,9 @@ export default { currentStepFields () { return this.stepFields[this.currentStep] }, + submitterSlug () { + return this.submitter.slug + }, isAnonymousChecboxes () { return this.currentField.type === 'checkbox' && this.currentStepFields.every((e) => !e.name) && this.currentStepFields.length > 4 }, diff --git a/app/models/submitter.rb b/app/models/submitter.rb index d09a1288..6849c022 100644 --- a/app/models/submitter.rb +++ b/app/models/submitter.rb @@ -6,9 +6,11 @@ # # id :bigint not null, primary key # completed_at :datetime -# email :string not null +# email :string # ip :string +# name :string # opened_at :datetime +# phone :string # sent_at :datetime # slug :string not null # ua :string diff --git a/app/views/api_settings/index.html.erb b/app/views/api_settings/index.html.erb index 4320ecb6..e8530140 100644 --- a/app/views/api_settings/index.html.erb +++ b/app/views/api_settings/index.html.erb @@ -59,7 +59,8 @@ { "submitters": [ { - "name": "<%= current_account.templates.last ? current_account.templates.last.submitters.first['name'] : 'First Submitter' %>", + "name": "John Doe", + "role": "<%= current_account.templates.last ? current_account.templates.last.submitters.first['name'] : 'First Submitter' %>", "email": "<%= current_user.email.sub('@', '+test@') %>", "values": { "Form Text Field Name": "Default Value" diff --git a/app/views/icons/_dots_vertical.html.erb b/app/views/icons/_dots_vertical.html.erb new file mode 100644 index 00000000..dfbfb681 --- /dev/null +++ b/app/views/icons/_dots_vertical.html.erb @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/views/icons/_phone.html.erb b/app/views/icons/_phone.html.erb new file mode 100644 index 00000000..6e10b6df --- /dev/null +++ b/app/views/icons/_phone.html.erb @@ -0,0 +1,4 @@ + + + + diff --git a/app/views/personalization_settings/_documents_copy_email_form.html.erb b/app/views/personalization_settings/_documents_copy_email_form.html.erb new file mode 100644 index 00000000..737c35dc --- /dev/null +++ b/app/views/personalization_settings/_documents_copy_email_form.html.erb @@ -0,0 +1,28 @@ +
+ +
+
+ Documents Copy Email +
+
+
+ <%= form_for AccountConfigs.find_or_initialize_for_key(current_account, AccountConfig::SUBMITTER_DOCUMENTS_COPY_EMAIL_KEY), url: settings_personalization_path, method: :post, html: { autocomplete: 'off', class: 'space-y-4' } do |f| %> + <%= f.hidden_field :key %> + <%= f.fields_for :value, Struct.new(:subject, :body).new(*f.object.value.values_at('subject', 'body')) do |ff| %> +
+ <%= ff.label :subject, class: 'label' %> + <%= ff.text_field :subject, required: true, class: 'base-input' %> +
+
+ <%= ff.label :body, class: 'label' %> + + <%= ff.text_area :body, required: true, class: 'base-input w-full py-2' %> + +
+ <% end %> +
+ <%= f.button button_title(title: 'Save', disabled_with: 'Saving'), class: 'base-button' %> +
+ <% end %> +
+
diff --git a/app/views/personalization_settings/_signature_request_email_form.html.erb b/app/views/personalization_settings/_signature_request_email_form.html.erb new file mode 100644 index 00000000..321647d0 --- /dev/null +++ b/app/views/personalization_settings/_signature_request_email_form.html.erb @@ -0,0 +1,28 @@ +
+ +
+
+ Signature Request Email +
+
+
+ <%= form_for AccountConfigs.find_or_initialize_for_key(current_account, AccountConfig::SUBMITTER_INVITATION_EMAIL_KEY), url: settings_personalization_path, method: :post, html: { autocomplete: 'off', class: 'space-y-4' } do |f| %> + <%= f.hidden_field :key %> + <%= f.fields_for :value, Struct.new(:subject, :body).new(*f.object.value.values_at('subject', 'body')) do |ff| %> +
+ <%= ff.label :subject, class: 'label' %> + <%= ff.text_field :subject, required: true, class: 'base-input' %> +
+
+ <%= ff.label :body, class: 'label' %> + + <%= ff.text_area :body, required: true, class: 'base-input w-full py-2' %> + +
+ <% end %> +
+ <%= f.button button_title(title: 'Save', disabled_with: 'Saving'), class: 'base-button' %> +
+ <% end %> +
+
diff --git a/app/views/personalization_settings/_submitter_completed_email_form.html.erb b/app/views/personalization_settings/_submitter_completed_email_form.html.erb new file mode 100644 index 00000000..0273610f --- /dev/null +++ b/app/views/personalization_settings/_submitter_completed_email_form.html.erb @@ -0,0 +1,28 @@ +
+ +
+
+ Form Completed Email +
+
+
+ <%= form_for AccountConfigs.find_or_initialize_for_key(current_account, AccountConfig::SUBMITTER_COMPLETED_EMAIL_KEY), url: settings_personalization_path, method: :post, html: { autocomplete: 'off', class: 'space-y-4' } do |f| %> + <%= f.hidden_field :key %> + <%= f.fields_for :value, Struct.new(:subject, :body).new(*f.object.value.values_at('subject', 'body')) do |ff| %> +
+ <%= ff.label :subject, class: 'label' %> + <%= ff.text_field :subject, required: true, class: 'base-input' %> +
+
+ <%= ff.label :body, class: 'label' %> + + <%= ff.text_area :body, required: true, class: 'base-input w-full py-2' %> + +
+ <% end %> +
+ <%= f.button button_title(title: 'Save', disabled_with: 'Saving'), class: 'base-button' %> +
+ <% end %> +
+
diff --git a/app/views/personalization_settings/show.html.erb b/app/views/personalization_settings/show.html.erb index 73cb2140..6582baec 100644 --- a/app/views/personalization_settings/show.html.erb +++ b/app/views/personalization_settings/show.html.erb @@ -2,89 +2,10 @@ <%= render 'shared/settings_nav' %>

Email Templates

-
- -
-
- Signature Request Email -
-
-
- <%= form_for AccountConfigs.find_or_initialize_for_key(current_account, AccountConfig::SUBMITTER_INVITATION_EMAIL_KEY), url: settings_personalization_path, method: :post, html: { autocomplete: 'off', class: 'space-y-4' } do |f| %> - <%= f.hidden_field :key %> - <%= f.fields_for :value, Struct.new(:subject, :body).new(*f.object.value.values_at('subject', 'body')) do |ff| %> -
- <%= ff.label :subject, class: 'label' %> - <%= ff.text_field :subject, required: true, class: 'base-input' %> -
-
- <%= ff.label :body, class: 'label' %> - - <%= ff.text_area :body, required: true, class: 'base-input w-full py-2' %> - -
- <% end %> -
- <%= f.button button_title(title: 'Save', disabled_with: 'Saving'), class: 'base-button' %> -
- <% end %> -
-
-
- -
-
- Form Completed Email -
-
-
- <%= form_for AccountConfigs.find_or_initialize_for_key(current_account, AccountConfig::SUBMITTER_COMPLETED_EMAIL_KEY), url: settings_personalization_path, method: :post, html: { autocomplete: 'off', class: 'space-y-4' } do |f| %> - <%= f.hidden_field :key %> - <%= f.fields_for :value, Struct.new(:subject, :body).new(*f.object.value.values_at('subject', 'body')) do |ff| %> -
- <%= ff.label :subject, class: 'label' %> - <%= ff.text_field :subject, required: true, class: 'base-input' %> -
-
- <%= ff.label :body, class: 'label' %> - - <%= ff.text_area :body, required: true, class: 'base-input w-full py-2' %> - -
- <% end %> -
- <%= f.button button_title(title: 'Save', disabled_with: 'Saving'), class: 'base-button' %> -
- <% end %> -
-
-
- -
-
- Documents Copy Email -
-
-
- <%= form_for AccountConfigs.find_or_initialize_for_key(current_account, AccountConfig::SUBMITTER_DOCUMENTS_COPY_EMAIL_KEY), url: settings_personalization_path, method: :post, html: { autocomplete: 'off', class: 'space-y-4' } do |f| %> - <%= f.hidden_field :key %> - <%= f.fields_for :value, Struct.new(:subject, :body).new(*f.object.value.values_at('subject', 'body')) do |ff| %> -
- <%= ff.label :subject, class: 'label' %> - <%= ff.text_field :subject, required: true, class: 'base-input' %> -
-
- <%= ff.label :body, class: 'label' %> - - <%= ff.text_area :body, required: true, class: 'base-input w-full py-2' %> - -
- <% end %> -
- <%= f.button button_title(title: 'Save', disabled_with: 'Saving'), class: 'base-button' %> -
- <% end %> -
+
+ <%= render 'signature_request_email_form' %> + <%= render 'submitter_completed_email_form' %> + <%= render 'documents_copy_email_form' %>

Company Logo

<%= render 'logo_form' %> diff --git a/app/views/shared/_button_title.html.erb b/app/views/shared/_button_title.html.erb index 5f33090a..fea5841b 100644 --- a/app/views/shared/_button_title.html.erb +++ b/app/views/shared/_button_title.html.erb @@ -8,7 +8,7 @@ - <%= local_assigns[:icon_disabled] || svg_icon('loader', class: 'w-6 h-6 animate-spin') %> + <%= local_assigns[:icon_disabled] || svg_icon('loader', class: 'w-5 h-5 animate-spin') %> <%= disabled_with %>... diff --git a/app/views/shared/_flash.html.erb b/app/views/shared/_flash.html.erb index be4ecba0..5eee11bd 100644 --- a/app/views/shared/_flash.html.erb +++ b/app/views/shared/_flash.html.erb @@ -1,4 +1,4 @@ -