diff --git a/app/controllers/console_redirect_controller.rb b/app/controllers/console_redirect_controller.rb
index f6042225..84fc0c89 100644
--- a/app/controllers/console_redirect_controller.rb
+++ b/app/controllers/console_redirect_controller.rb
@@ -5,6 +5,10 @@ class ConsoleRedirectController < ApplicationController
skip_authorization_check
def index
+ if request.path == '/upgrade'
+ params[:redir] = Docuseal.multitenant? ? "#{Docuseal::CONSOLE_URL}/plans" : "#{Docuseal::CONSOLE_URL}/on_premise"
+ end
+
return redirect_to(new_user_session_path({ redir: params[:redir] }.compact)) if true_user.blank?
auth = JsonWebToken.encode(uuid: true_user.uuid,
diff --git a/app/javascript/application.js b/app/javascript/application.js
index 85c7fa2a..0a9629fa 100644
--- a/app/javascript/application.js
+++ b/app/javascript/application.js
@@ -20,6 +20,7 @@ import FolderAutocomplete from './elements/folder_autocomplete'
import SignatureForm from './elements/signature_form'
import SubmitForm from './elements/submit_form'
import PromptPassword from './elements/prompt_password'
+import EmailsTextarea from './elements/emails_textarea'
import * as TurboInstantClick from './lib/turbo_instant_click'
@@ -53,6 +54,7 @@ window.customElements.define('folder-autocomplete', FolderAutocomplete)
window.customElements.define('signature-form', SignatureForm)
window.customElements.define('submit-form', SubmitForm)
window.customElements.define('prompt-password', PromptPassword)
+window.customElements.define('emails-textarea', EmailsTextarea)
document.addEventListener('turbo:before-fetch-request', encodeMethodIntoRequestBody)
document.addEventListener('turbo:submit-end', async (event) => {
diff --git a/app/javascript/elements/emails_textarea.js b/app/javascript/elements/emails_textarea.js
new file mode 100644
index 00000000..dde8109f
--- /dev/null
+++ b/app/javascript/elements/emails_textarea.js
@@ -0,0 +1,56 @@
+const emailRegexp = /([^@;,<>\s]+@[^@;,<>\s]+)/g
+
+export default class extends HTMLElement {
+ connectedCallback () {
+ if (this.dataset.limit) {
+ this.textarea.addEventListener('input', () => {
+ const emails = this.textarea.value.match(emailRegexp) || []
+
+ this.updateCounter(emails.length)
+ })
+ }
+ }
+
+ updateCounter (count) {
+ let counter = document.getElementById('emails_counter')
+ let bulkMessage = document.getElementById('bulk_message')
+
+ if (count < 2) {
+ counter?.remove()
+
+ return
+ }
+
+ if ((count + 10) > this.dataset.limit) {
+ if (!counter) {
+ counter = document.createElement('span')
+
+ counter.id = 'emails_counter'
+ counter.classList.add('text-xs', 'right-0', 'absolute')
+ counter.style.bottom = '-15px'
+
+ this.textarea.parentNode.append(counter)
+ }
+
+ counter.innerText = `${count} / ${this.dataset.limit}`
+ }
+
+ if (this.dataset.bulkEnabled !== 'true') {
+ if (!bulkMessage) {
+ bulkMessage = document.createElement('span')
+
+ bulkMessage.id = 'bulk_message'
+ bulkMessage.classList.add('text-xs', 'left-0', 'absolute')
+ bulkMessage.style.bottom = '-15px'
+
+ this.textarea.parentNode.append(bulkMessage)
+ }
+
+ bulkMessage.innerHTML = 'Upgrade to bulk send multiple recipients'
+ }
+ }
+
+ get textarea () {
+ return this.querySelector('textarea')
+ }
+}
diff --git a/app/javascript/elements/submitter_autocomplete.js b/app/javascript/elements/submitter_autocomplete.js
index 197a2beb..d13f3014 100644
--- a/app/javascript/elements/submitter_autocomplete.js
+++ b/app/javascript/elements/submitter_autocomplete.js
@@ -28,6 +28,8 @@ export default class extends HTMLElement {
if (textarea && item[field]) {
textarea.value = textarea.value.replace(/[^;,\s]+$/, item[field] + ' ')
+
+ textarea.dispatchEvent(new Event('input', { bubbles: true }))
}
})
}
diff --git a/app/views/submissions/_email_form.html.erb b/app/views/submissions/_email_form.html.erb
index c5790bcf..941594f3 100644
--- a/app/views/submissions/_email_form.html.erb
+++ b/app/views/submissions/_email_form.html.erb
@@ -1,11 +1,13 @@
<%= form_for '', url: template_submissions_path(template), html: { class: 'space-y-4', autocomplete: 'off' }, data: { turbo_frame: :_top } do |f| %>
<% if template.submitters.size == 1 %>
-
-
- <%= f.text_area :emails, required: true, class: 'base-textarea w-full', placeholder: 'Type emails here...' %>
-
-
+
+
+
+ <%= f.text_area :emails, required: true, class: 'base-textarea w-full', placeholder: 'Type emails here...' %>
+
+
+
<% else %>
diff --git a/config/routes.rb b/config/routes.rb
index 076704f0..673bb83d 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -55,6 +55,7 @@ Rails.application.routes.draw do
resource :user_signature, only: %i[edit update destroy]
resources :submissions, only: %i[show destroy]
resources :console_redirect, only: %i[index]
+ resources :upgrade, only: %i[index], controller: 'console_redirect'
resource :testing_account, only: %i[show destroy]
resources :testing_api_settings, only: %i[index]
resource :templates_upload, only: %i[create]