From 7ba3a604bdda3fc0bef71f6c8a05b36443c27605 Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Sat, 23 Sep 2023 18:22:48 +0300 Subject: [PATCH] add textarea emails autocomplete --- .../elements/submitter_autocomplete.js | 19 +++++++++++++++---- app/views/submissions/_email_form.html.erb | 12 +++++++----- lib/submissions.rb | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/app/javascript/elements/submitter_autocomplete.js b/app/javascript/elements/submitter_autocomplete.js index d6fcf707..0e5f8a8f 100644 --- a/app/javascript/elements/submitter_autocomplete.js +++ b/app/javascript/elements/submitter_autocomplete.js @@ -19,21 +19,32 @@ export default class extends HTMLElement { fields.forEach((field) => { const input = submitterItemEl.querySelector(`submitters-autocomplete[data-field="${field}"] input`) + const textarea = submitterItemEl.querySelector(`submitters-autocomplete[data-field="${field}"] textarea`) if (input && item[field]) { input.value = item[field] } + + if (textarea && item[field]) { + textarea.value = textarea.value.replace(/[^;,\s]+$/, item[field] + ' ') + } }) } fetch = (text, resolve) => { - if (text) { - const queryParams = new URLSearchParams({ q: text, field: this.dataset.field }) + const q = text.split(/[;,\s]+/).pop().trim() + + if (q) { + const queryParams = new URLSearchParams({ q, field: this.dataset.field }) fetch('/api/submitters_autocomplete?' + queryParams).then(async (resp) => { const items = await resp.json() - resolve(items) + if (q.length < 3) { + resolve(items.filter((e) => e[this.dataset.field].startsWith(q))) + } else { + resolve(items) + } }).catch(() => { resolve([]) }) @@ -51,6 +62,6 @@ export default class extends HTMLElement { } get input () { - return this.querySelector('input') + return this.querySelector('input') || this.querySelector('textarea') } } diff --git a/app/views/submissions/_email_form.html.erb b/app/views/submissions/_email_form.html.erb index 422e7544..5b972676 100644 --- a/app/views/submissions/_email_form.html.erb +++ b/app/views/submissions/_email_form.html.erb @@ -1,10 +1,12 @@ <%= 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/lib/submissions.rb b/lib/submissions.rb index 1e713c0c..677466e8 100644 --- a/lib/submissions.rb +++ b/lib/submissions.rb @@ -30,7 +30,7 @@ module Submissions def create_from_emails(template:, user:, emails:, source:, mark_as_sent: false) emails = emails.to_s.scan(User::EMAIL_REGEXP) unless emails.is_a?(Array) - emails.map do |email| + emails.uniq.map do |email| submission = template.submissions.new(created_by_user: user, source:, template_submitters: template.submitters) submission.submitters.new(email: normalize_email(email), uuid: template.submitters.first['uuid'],