diff --git a/.rubocop.yml b/.rubocop.yml
index 623c3db2..bcb65cd4 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -67,6 +67,9 @@ RSpec/MultipleMemoizedHelpers:
Rails/I18nLocaleTexts:
Enabled: false
+Rails/FindEach:
+ Enabled: false
+
Rails/SkipsModelValidations:
Enabled: false
diff --git a/app/controllers/api/templates_documents_controller.rb b/app/controllers/api/templates_documents_controller.rb
index 1657e70e..04fdb12c 100644
--- a/app/controllers/api/templates_documents_controller.rb
+++ b/app/controllers/api/templates_documents_controller.rb
@@ -16,6 +16,7 @@ module Api
render json: {
schema:,
documents: documents.as_json(
+ methods: [:metadata],
include: {
preview_images: { methods: %i[url metadata filename] }
}
diff --git a/app/controllers/preview_document_page_controller.rb b/app/controllers/preview_document_page_controller.rb
new file mode 100644
index 00000000..f49a8128
--- /dev/null
+++ b/app/controllers/preview_document_page_controller.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+class PreviewDocumentPageController < ActionController::API
+ include ActiveStorage::SetCurrent
+
+ FORMAT = Templates::ProcessDocument::FORMAT
+
+ def show
+ if Docuseal.multitenant?
+ Rollbar.warning('load page')
+
+ return head :not_found
+ end
+
+ attachment = ActiveStorage::Attachment.find_by(uuid: params[:attachment_uuid])
+
+ return head :not_found unless attachment
+
+ preview_image = attachment.preview_images.joins(:blob).find_by(blob: { filename: "#{params[:id]}#{FORMAT}" })
+
+ return redirect_to preview_image.url, allow_other_host: true if preview_image
+
+ file_path =
+ if attachment.service.name == :disk
+ ActiveStorage::Blob.service.path_for(attachment.key)
+ else
+ find_or_create_document_tempfile_path(attachment)
+ end
+
+ io = Templates::ProcessDocument.generate_pdf_preview_from_file(attachment, file_path, params[:id].to_i)
+
+ render plain: io.tap(&:rewind).read
+ end
+
+ def find_or_create_document_tempfile_path(attachment)
+ file_path = "#{Dir.tmpdir}/#{attachment.uuid}"
+
+ File.open(file_path, File::RDWR | File::CREAT, 0o644) do |f|
+ f.flock(File::LOCK_EX)
+
+ # rubocop:disable Style/ZeroLengthPredicate
+ if f.size.zero?
+ f.binmode
+
+ f.write(attachment.download)
+ end
+ # rubocop:enable Style/ZeroLengthPredicate
+ end
+
+ file_path
+ end
+end
diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb
index 311efb19..a327d56e 100644
--- a/app/controllers/submissions_controller.rb
+++ b/app/controllers/submissions_controller.rb
@@ -6,12 +6,24 @@ class SubmissionsController < ApplicationController
load_and_authorize_resource :submission, only: %i[show destroy]
+ PRELOAD_ALL_PAGES_AMOUNT = 200
+
def show
ActiveRecord::Associations::Preloader.new(
records: [@submission],
- associations: [:template, { template_schema_documents: [:blob, { preview_images_attachments: :blob }] }]
+ associations: [:template, { template_schema_documents: :blob }]
).call
+ total_pages =
+ @submission.template_schema_documents.sum { |e| e.metadata.dig('pdf', 'number_of_pages').to_i }
+
+ if total_pages < PRELOAD_ALL_PAGES_AMOUNT
+ ActiveRecord::Associations::Preloader.new(
+ records: @submission.template_schema_documents,
+ associations: [:blob, { preview_images_attachments: :blob }]
+ ).call
+ end
+
render :show, layout: 'plain'
end
diff --git a/app/controllers/submit_form_controller.rb b/app/controllers/submit_form_controller.rb
index ea9e8597..01fa5adc 100644
--- a/app/controllers/submit_form_controller.rb
+++ b/app/controllers/submit_form_controller.rb
@@ -6,15 +6,28 @@ class SubmitFormController < ApplicationController
skip_before_action :authenticate_user!
skip_authorization_check
+ PRELOAD_ALL_PAGES_AMOUNT = 200
+
def show
- @submitter =
- Submitter.preload(submission: [
- :template, { template_schema_documents: [:blob, { preview_images_attachments: :blob }] }
- ])
- .find_by!(slug: params[:slug])
+ @submitter = Submitter.find_by!(slug: params[:slug])
return redirect_to submit_form_completed_path(@submitter.slug) if @submitter.completed_at?
+ ActiveRecord::Associations::Preloader.new(
+ records: [@submitter],
+ associations: [submission: [:template, { template_schema_documents: :blob }]]
+ ).call
+
+ total_pages =
+ @submitter.submission.template_schema_documents.sum { |e| e.metadata.dig('pdf', 'number_of_pages').to_i }
+
+ if total_pages < PRELOAD_ALL_PAGES_AMOUNT
+ ActiveRecord::Associations::Preloader.new(
+ records: @submitter.submission.template_schema_documents,
+ associations: [:blob, { preview_images_attachments: :blob }]
+ ).call
+ end
+
Submitters::MaybeUpdateDefaultValues.call(@submitter, current_user)
cookies[:submitter_sid] = @submitter.signed_id
diff --git a/app/controllers/templates_controller.rb b/app/controllers/templates_controller.rb
index e1be3c3b..c1e2c99e 100644
--- a/app/controllers/templates_controller.rb
+++ b/app/controllers/templates_controller.rb
@@ -30,6 +30,14 @@ class TemplatesController < ApplicationController
associations: [schema_documents: { preview_images_attachments: :blob }]
).call
+ @template_data =
+ @template.as_json.merge(
+ documents: @template.schema_documents.as_json(
+ methods: [:metadata],
+ include: { preview_images: { methods: %i[url metadata filename] } }
+ )
+ ).to_json
+
render :edit, layout: 'plain'
end
diff --git a/app/javascript/template_builder/document.vue b/app/javascript/template_builder/document.vue
index cc48defb..e7d3195b 100644
--- a/app/javascript/template_builder/document.vue
+++ b/app/javascript/template_builder/document.vue
@@ -56,8 +56,26 @@ export default {
}
},
computed: {
+ numberOfPages () {
+ return this.document.metadata?.pdf?.number_of_pages || this.document.preview_images.length
+ },
sortedPreviewImages () {
- return [...this.document.preview_images].sort((a, b) => parseInt(a.filename) - parseInt(b.filename))
+ const lazyloadMetadata = this.document.preview_images[this.document.preview_images.length - 1].metadata
+
+ return [...Array(this.numberOfPages).keys()].map((i) => {
+ return this.previewImagesIndex[i] || {
+ metadata: lazyloadMetadata,
+ id: Math.random().toString(),
+ url: `/preview/${this.document.uuid}/${i}.jpg`
+ }
+ })
+ },
+ previewImagesIndex () {
+ return this.document.preview_images.reduce((acc, e) => {
+ acc[parseInt(e.filename)] = e
+
+ return acc
+ }, {})
}
},
beforeUpdate () {
diff --git a/app/javascript/template_builder/page.vue b/app/javascript/template_builder/page.vue
index 2fea1656..97725d9d 100644
--- a/app/javascript/template_builder/page.vue
+++ b/app/javascript/template_builder/page.vue
@@ -5,11 +5,12 @@
>