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]