diff --git a/app/controllers/start_form_controller.rb b/app/controllers/start_form_controller.rb index 35e0fbcc..080b9807 100644 --- a/app/controllers/start_form_controller.rb +++ b/app/controllers/start_form_controller.rb @@ -97,6 +97,7 @@ class StartFormController < ApplicationController submitter.submission ||= Submission.new(template:, account_id: template.account_id, template_submitters: template.submitters, + expire_at: Templates.build_default_expire_at(template), submitters: [submitter], source: :link) diff --git a/app/controllers/templates_preferences_controller.rb b/app/controllers/templates_preferences_controller.rb index 2c9194b7..8f820e3f 100644 --- a/app/controllers/templates_preferences_controller.rb +++ b/app/controllers/templates_preferences_controller.rb @@ -34,6 +34,12 @@ class TemplatesPreferencesController < ApplicationController submitters: [%i[uuid request_email_subject request_email_body]]] ).tap do |attrs| attrs[:preferences].delete(:submitters) if params[:request_email_per_submitter] != '1' + + if (default_expire_at = attrs.dig(:preferences, :default_expire_at).presence) + attrs[:preferences][:default_expire_at] = + (ActiveSupport::TimeZone[current_account.timezone] || Time.zone).parse(default_expire_at).utc + end + attrs[:preferences] = attrs[:preferences].transform_values do |value| if %w[true false].include?(value) value == 'true' diff --git a/app/javascript/elements/dashboard_dropzone.js b/app/javascript/elements/dashboard_dropzone.js index 19372c4c..d04a17d1 100644 --- a/app/javascript/elements/dashboard_dropzone.js +++ b/app/javascript/elements/dashboard_dropzone.js @@ -108,7 +108,6 @@ export default targetable(class extends HTMLElement { redirect: 'manual', body: formData, headers: { - Accept: 'application/json', 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content } }).finally(() => { diff --git a/app/javascript/template_builder/dropzone.vue b/app/javascript/template_builder/dropzone.vue index 72705b99..ce97bcc1 100644 --- a/app/javascript/template_builder/dropzone.vue +++ b/app/javascript/template_builder/dropzone.vue @@ -23,13 +23,14 @@
{{ message }}
diff --git a/app/models/template.rb b/app/models/template.rb index 366217fb..28441a9a 100644 --- a/app/models/template.rb +++ b/app/models/template.rb @@ -36,24 +36,6 @@ # class Template < ApplicationRecord DEFAULT_SUBMITTER_NAME = 'First Party' - EXPIRATION_DURATIONS = { - one_day: 1.day, - two_days: 2.days, - three_days: 3.days, - four_days: 4.days, - five_days: 5.days, - six_days: 6.days, - seven_days: 7.days, - eight_days: 8.days, - nine_days: 9.days, - ten_days: 10.days, - two_weeks: 14.days, - three_weeks: 21.days, - four_weeks: 28.days, - one_month: 1.month, - two_months: 2.months, - three_months: 3.months - }.with_indifferent_access.freeze belongs_to :author, class_name: 'User' belongs_to :account diff --git a/app/views/icons/_clock_exclamation.html.erb b/app/views/icons/_clock_exclamation.html.erb new file mode 100644 index 00000000..f6dc08ee --- /dev/null +++ b/app/views/icons/_clock_exclamation.html.erb @@ -0,0 +1,3 @@ + + + diff --git a/app/views/submissions/show.html.erb b/app/views/submissions/show.html.erb index b027c0c8..75fe1ea7 100644 --- a/app/views/submissions/show.html.erb +++ b/app/views/submissions/show.html.erb @@ -172,12 +172,26 @@ <% end %>
- <%= svg_icon('writing', class: 'w-5 h-5') %> + <% if @submission.expire_at? && submitter && !submitter.completed_at? %> + <%= svg_icon('clock_exclamation', class: 'w-5 h-5') %> + <% else %> + <%= svg_icon('writing', class: 'w-5 h-5') %> + <% end %> <% if submitter&.declined_at? %> <%= t('declined_on_time', time: l(submitter.declined_at.in_time_zone(@submission.account.timezone), format: :short, locale: @submission.account.locale)) %> <% elsif submitter %> - <%= submitter.completed_at? ? l(submitter.completed_at.in_time_zone(@submission.account.timezone), format: :long, locale: @submission.account.locale) : t('not_completed_yet') %> + <% if submitter.completed_at? %> + <%= l(submitter.completed_at.in_time_zone(@submission.account.timezone), format: :long, locale: @submission.account.locale) %> + <% elsif @submission.expire_at? %> + <% if @submission.expired? %> + <%= t(:expired) %> + <% else %> + <%= t('expire_on_time', time: l(@submission.expire_at.in_time_zone(@submission.account.timezone), format: :short, locale: @submission.account.locale)) %> + <% end %> + <% else %> + <%= t('not_completed_yet') %> + <% end %> <% else %> <%= t('not_invited_yet') %> <% end %> diff --git a/app/views/templates_preferences/show.html.erb b/app/views/templates_preferences/show.html.erb index 0fe4b5ee..b59fac43 100644 --- a/app/views/templates_preferences/show.html.erb +++ b/app/views/templates_preferences/show.html.erb @@ -41,25 +41,18 @@
<% end %> - <%= form_for @template, url: template_preferences_path(@template), method: :post, html: { autocomplete: 'off', class: 'mb-2' }, data: { close_on_submit: false } do |f| %> - - <%= f.fields_for :preferences, Struct.new(:default_expire_at_duration, :default_expire_at).new(*@template.preferences.values_at('default_expire_at_duration', 'default_expire_at').compact_blank) do |ff| %> + <%= form_for @template, url: template_preferences_path(@template), method: :post, html: { autocomplete: 'off', class: 'mb-5' }, data: { close_on_submit: false } do |f| %> + <%= f.fields_for :preferences, Struct.new(:default_expire_at_duration, :default_expire_at).new(@template.preferences['default_expire_at_duration'], @template.preferences['default_expire_at'] ? Time.zone.parse(@template.preferences['default_expire_at']).in_time_zone(current_account.timezone) : nil) do |ff| %>
- <% duration_options = ::Template::EXPIRATION_DURATIONS.keys.map { |duration| [t(duration), duration] } + [[t('specified_date'), 'specified_date']] %> - <%= ff.label :default_expire_at_duration, t('default_expiration'), class: 'label' %> + <% duration_options = Templates::EXPIRATION_DURATIONS.keys.map { |duration| [t(duration), duration] } + [[t('specified_date'), 'specified_date']] %> + <%= ff.label :default_expire_at_duration, t('default_expiration'), class: 'label pt-0' %>
<%= ff.select :default_expire_at_duration, duration_options, { include_blank: t('none') }, required: false, class: 'base-select flex-1', dir: 'auto', autocomplete: 'off', onchange: "this.value == 'specified_date' ? window.template_preferences_default_expire_at.classList.remove('hidden') : [window.template_preferences_default_expire_at.classList.add('hidden'), window.template_preferences_default_expire_at.value = '', this.form.requestSubmit()]" %> <%= ff.datetime_field :default_expire_at, required: false, class: ['base-input flex-1', ff.object.default_expire_at.blank? && 'hidden'].compact_blank.join(' '), dir: 'auto', autocomplete: 'off', onchange: 'this.value && this.form.requestSubmit()' %>
-
-
- -
-
<% end %> <% end %> - <%= render 'templates_code_modal/preferences' %>
@@ -291,6 +284,7 @@
+ <%= render 'templates_code_modal/preferences', class: 'pt-2' %> <% if show_recipients %>