diff --git a/app/controllers/submissions_archived_controller.rb b/app/controllers/submissions_archived_controller.rb index c13745ff..3c3f49b6 100644 --- a/app/controllers/submissions_archived_controller.rb +++ b/app/controllers/submissions_archived_controller.rb @@ -8,6 +8,9 @@ class SubmissionsArchivedController < ApplicationController @submissions = @submissions.where.not(archived_at: nil) .or(@submissions.where.not(templates: { archived_at: nil })) .preload(:created_by_user, template: :author) + + @submissions = @submissions.preload(:template_accesses) unless current_user.role.in?(%w[admin superadmin]) + @submissions = Submissions.search(@submissions, params[:q], search_template: true) @submissions = Submissions::Filter.call(@submissions, current_user, params) diff --git a/app/controllers/submissions_dashboard_controller.rb b/app/controllers/submissions_dashboard_controller.rb index 164e893a..f71e10b5 100644 --- a/app/controllers/submissions_dashboard_controller.rb +++ b/app/controllers/submissions_dashboard_controller.rb @@ -10,6 +10,8 @@ class SubmissionsDashboardController < ApplicationController .where(templates: { archived_at: nil }) .preload(:created_by_user, template: :author) + @submissions = @submissions.preload(:template_accesses) unless current_user.role.in?(%w[admin superadmin]) + @submissions = Submissions.search(@submissions, params[:q], search_template: true) @submissions = Submissions::Filter.call(@submissions, current_user, params) diff --git a/app/controllers/submitters_autocomplete_controller.rb b/app/controllers/submitters_autocomplete_controller.rb index 37b00c6e..e86e129e 100644 --- a/app/controllers/submitters_autocomplete_controller.rb +++ b/app/controllers/submitters_autocomplete_controller.rb @@ -9,7 +9,8 @@ class SubmittersAutocompleteController < ApplicationController def index submitters = search_submitters(@submitters) - values = submitters.limit(LIMIT).group(SELECT_COLUMNS.join(', ')).pluck(SELECT_COLUMNS.join(', ')) + arel_columns = SELECT_COLUMNS.map { |col| Submitter.arel_table[col] } + values = submitters.limit(LIMIT).group(arel_columns).pluck(arel_columns) attrs = values.map { |row| SELECT_COLUMNS.zip(row).to_h } attrs = attrs.uniq { |e| e[params[:field]] } if params[:field].present? diff --git a/app/controllers/template_folders_controller.rb b/app/controllers/template_folders_controller.rb index 87ce435c..dd7010bb 100644 --- a/app/controllers/template_folders_controller.rb +++ b/app/controllers/template_folders_controller.rb @@ -4,7 +4,7 @@ class TemplateFoldersController < ApplicationController load_and_authorize_resource :template_folder def show - @templates = @template_folder.templates.active.preload(:author).order(id: :desc) + @templates = @template_folder.templates.active.preload(:author, :template_accesses).order(id: :desc) @templates = Templates.search(@templates, params[:q]) @pagy, @templates = pagy(@templates, limit: 12) diff --git a/app/controllers/templates_archived_controller.rb b/app/controllers/templates_archived_controller.rb index 1f0f1752..f75e83a1 100644 --- a/app/controllers/templates_archived_controller.rb +++ b/app/controllers/templates_archived_controller.rb @@ -4,7 +4,7 @@ class TemplatesArchivedController < ApplicationController load_and_authorize_resource :template, parent: false def index - @templates = @templates.where.not(archived_at: nil).preload(:author, :folder).order(id: :desc) + @templates = @templates.where.not(archived_at: nil).preload(:author, :folder, :template_accesses).order(id: :desc) @templates = Templates.search(@templates, params[:q]) @pagy, @templates = pagy(@templates, limit: 12) diff --git a/app/controllers/templates_controller.rb b/app/controllers/templates_controller.rb index 0d414755..1b52c23b 100644 --- a/app/controllers/templates_controller.rb +++ b/app/controllers/templates_controller.rb @@ -22,6 +22,8 @@ class TemplatesController < ApplicationController submissions.order(id: :desc) end + submissions = submissions.preload(:template_accesses) unless current_user.role.in?(%w[admin superadmin]) + @pagy, @submissions = pagy(submissions.preload(submitters: :start_form_submission_events)) rescue ActiveRecord::RecordNotFound redirect_to root_path diff --git a/app/controllers/templates_dashboard_controller.rb b/app/controllers/templates_dashboard_controller.rb index be9dea75..3a6a66df 100644 --- a/app/controllers/templates_dashboard_controller.rb +++ b/app/controllers/templates_dashboard_controller.rb @@ -45,7 +45,7 @@ class TemplatesDashboardController < ApplicationController end def filter_templates(templates) - rel = templates.active.preload(:author).order(id: :desc) + rel = templates.active.preload(:author, :template_accesses).order(id: :desc) if params[:q].blank? if Docuseal.multitenant? && !current_account.testing? diff --git a/app/models/submission.rb b/app/models/submission.rb index e6aa35df..8567aaa1 100644 --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -57,6 +57,8 @@ class Submission < ApplicationRecord has_many_attached :preview_documents + has_many :template_accesses, primary_key: :template_id, foreign_key: :template_id, dependent: nil, inverse_of: false + has_many :template_schema_documents, ->(e) { where(uuid: (e.template_schema.presence || e.template.schema).pluck('attachment_uuid')) }, through: :template, source: :documents_attachments diff --git a/app/models/submitter.rb b/app/models/submitter.rb index c735a095..97a93773 100644 --- a/app/models/submitter.rb +++ b/app/models/submitter.rb @@ -54,6 +54,7 @@ class Submitter < ApplicationRecord has_many_attached :documents has_many_attached :attachments has_many_attached :preview_documents + has_many :template_accesses, through: :template has_many :document_generation_events, dependent: :destroy has_many :submission_events, dependent: :destroy diff --git a/app/models/template.rb b/app/models/template.rb index ec4ecec8..28441a9a 100644 --- a/app/models/template.rb +++ b/app/models/template.rb @@ -62,6 +62,7 @@ class Template < ApplicationRecord has_many :submissions, dependent: :destroy has_many :template_sharings, dependent: :destroy + has_many :template_accesses, dependent: :destroy scope :active, -> { where(archived_at: nil) } scope :archived, -> { where.not(archived_at: nil) } diff --git a/app/models/template_access.rb b/app/models/template_access.rb new file mode 100644 index 00000000..7e459513 --- /dev/null +++ b/app/models/template_access.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +# == Schema Information +# +# Table name: template_accesses +# +# id :bigint not null, primary key +# created_at :datetime not null +# updated_at :datetime not null +# template_id :bigint not null +# user_id :bigint not null +# +# Indexes +# +# index_template_accesses_on_template_id_and_user_id (template_id,user_id) UNIQUE +# +# Foreign Keys +# +# fk_rails_... (template_id => templates.id) +# +class TemplateAccess < ApplicationRecord + ADMIN_USER_ID = -1 + + belongs_to :template + belongs_to :user, optional: true +end diff --git a/app/views/submissions/show.html.erb b/app/views/submissions/show.html.erb index 163697f9..45365d17 100644 --- a/app/views/submissions/show.html.erb +++ b/app/views/submissions/show.html.erb @@ -122,7 +122,7 @@ <%= (@submission.template_submitters || @submission.template.submitters).find { |e| e['uuid'] == submitter&.uuid }&.dig('name') || "#{(index + 1).ordinalize} Submitter" %> - <% if signed_in? && can?(:update, submitter) && !submitter.completed_at? && !submitter.declined_at? && !@submission.archived_at? && !@submission.expired? && !submitter.start_form_submission_events.any? %> + <% if signed_in? && can?(:update, @submission) && !submitter.completed_at? && !submitter.declined_at? && !@submission.archived_at? && !@submission.expired? && !submitter.start_form_submission_events.any? %> <%= link_to edit_submitter_path(submitter), class: 'shrink-0 inline md:hidden md:group-hover:inline', data: { turbo_frame: 'modal' } do %> <%= svg_icon('pencil', class: 'w-5 h-5') %> @@ -174,15 +174,15 @@ <% end %> - <% if signed_in? && submitter && submitter.email && !submitter.completed_at && !@submission.archived_at? && can?(:update, submitter) && Accounts.can_send_emails?(current_account) && !@submission.expired? && !submitter.declined_at? %> + <% if signed_in? && submitter && submitter.email && !submitter.completed_at && !@submission.archived_at? && can?(:update, @submission) && Accounts.can_send_emails?(current_account) && !@submission.expired? && !submitter.declined_at? %>