diff --git a/app/controllers/api/templates_documents_controller.rb b/app/controllers/api/templates_documents_controller.rb index dc6995ce..2956091c 100644 --- a/app/controllers/api/templates_documents_controller.rb +++ b/app/controllers/api/templates_documents_controller.rb @@ -26,11 +26,11 @@ module Api def del_image template = Template.find(params[:template_id]) - attachment_id = params[:attachment_id] - document_id = params[:documentId] - page_number = template.documents.find(document_id).preview_images.find_index { |pic| pic.id == attachment_id } + document = template.documents.find(params[:documentId]) + img_attachment_id = params[:attachment_id] + page_number = document.preview_images.find_index { |pic| pic.id == img_attachment_id } if page_number - Templates::ProcessDocument.delete_picture(template, attachment_id, page_number) + Templates::ProcessDocument.delete_picture(template, document, img_attachment_id, page_number) render json: { success: true, message: 'image deleted successfully' } else page_number = "No image found for deletion" diff --git a/app/javascript/pdf_loader.js b/app/javascript/pdf_loader.js index 3dff5b13..464ecf2d 100644 --- a/app/javascript/pdf_loader.js +++ b/app/javascript/pdf_loader.js @@ -1,15 +1,17 @@ -document.addEventListener("DOMContentLoaded", function () { - function showLoading() { - document.getElementById("loader").style.display = "block"; +document.addEventListener('DOMContentLoaded', function () { + function showLoading () { + document.getElementById('loader').style.display = 'block' } - var editTemplateLink = document.getElementById("edit-template-link"); - editTemplateLink.addEventListener("click", function (event) { - event.preventDefault(); - showLoading(); + const editTemplateLink = document.getElementById('edit-template-link') + if (editTemplateLink) { + editTemplateLink.addEventListener('click', function (event) { + event.preventDefault() + showLoading() - var template = this.getAttribute("data-template"); - setTimeout(function () { - window.location.href = template; - }, 3000); - }); -}); + const template = this.getAttribute('data-template') + setTimeout(function () { + window.location.href = template + }, 3000) + }) + } +}) diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index ff4b4d6b..f1551d78 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -452,7 +452,6 @@ export default { scrollIntoDocument (item, page) { const documentRef = this.documentRefs.find((e) => e.document.uuid === item.attachment_uuid) documentRef.scrollIntoDocument(page) - // pageRef.$el.scrollIntoView({ behavior: 'smooth', block: 'start' }) }, onKeyUp (e) { if (e.code === 'Escape') { @@ -648,7 +647,7 @@ export default { this.save() }, onDocumentRemove (item) { - if (window.confirm('Are you sure?')) { + if (window.confirm('Are you sure you want to delete the document?')) { this.template.schema.splice(this.template.schema.indexOf(item), 1) } @@ -744,58 +743,46 @@ export default { }) }, removeImage (item, imageId) { - // console.log(this.template.documents[0].preview_secured_images) - // output: 0: {id: 26, name: 'preview_images', uuid: 'db2de68e-c52f-41e0-a743-550a5ba26ec0', record_type: 'ActiveStorage::Attachment', record_id: 25, …} 1 : {id: 27, name: 'preview_images', uuid: '4f2cd882-95fb-4344-8571-78c9bb5a20aa', record_type: 'ActiveStorage::Attachment', record_id: 25, …} 2: {id: 28, name: 'preview_images', uuid: '28bb656a-0799-4a73-b665-692aab2c690b', record_type: 'ActiveStorage::Attachment', record_id: 25, …} length: 3, imageId: 27 - // const indexToRemove = this.template.documents.findIndex(item => item.id === imageId) - this.template.documents.forEach((document) => { - // Check if the document has a preview_images array - if (Array.isArray(document.preview_images)) { - // Find the index of the preview image with the matching id - const indexToRemove = document.preview_images.findIndex( - (previewImage) => previewImage.id === imageId - ) - // console.log('simple preview', document.preview_images, ': secured', document.preview_secured_images) - console.log(indexToRemove) - if (indexToRemove !== -1) { - const confirmed = window.confirm('Are you sure you want to delete this image?') - if (confirmed) { - const documentId = document.id - const apiUrl = `/api/templates/${this.template.id}/documents/${documentId}/del_image` - fetch(apiUrl, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - template: this.template.id, - attachment_id: imageId, - documentId - // page_number: document.preview_images.find(x => x.id === imageId).name - }) + const document = this.template.documents.find((e) => e.uuid === item.attachment_uuid) + if (Array.isArray(document.preview_images)) { + const indexToRemove = document.preview_images.findIndex((previewImage) => previewImage.id === imageId) + console.log(indexToRemove) + if (indexToRemove !== -1) { + const confirmed = window.confirm('Are you sure you want to delete this image?') + if (confirmed) { + const documentId = document.id + const apiUrl = `/api/templates/${this.template.id}/documents/${documentId}/del_image` + fetch(apiUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + template: this.template.id, + attachment_id: imageId, + documentId + }) + }) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error! Status: ${response.status}`) + } + return response.json() + }) + .then((data) => { + document.preview_images.splice(indexToRemove, 1) + window.location.reload() + console.log('Success:', data) + }) + .catch((error) => { + console.error('Error:', error) }) - .then((response) => { - if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`) - } - return response.json() - }) - .then((data) => { - // remove from frontend - document.preview_images.splice(indexToRemove, 1) - console.log('Success:', data) - }) - .catch((error) => { - console.error('Error:', error) - }) - } } } - }) + } }, addBlankPage (item) { - const documentRef = this.documentRefs.find( - (e) => e.document.uuid === item.attachment_uuid - ) + const documentRef = this.documentRefs.find((e) => e.document.uuid === item.attachment_uuid) const confirmed = window.confirm('Are you sure you want to create new image?') if (confirmed) { const documentId = documentRef.document.id @@ -817,6 +804,7 @@ export default { return response.json() }) .then((data) => { + window.location.reload() console.log('Success: ---', data) }) .catch((error) => { diff --git a/app/javascript/template_builder/preview.vue b/app/javascript/template_builder/preview.vue index c66f7a49..52b13e5f 100644 --- a/app/javascript/template_builder/preview.vue +++ b/app/javascript/template_builder/preview.vue @@ -19,7 +19,18 @@ v-if="editable && index==0" class="flex justify-between w-full" > -
+
+ +
'deleted_page', - 'areas' => [{ - 'x' => 0, - 'y' => 0, - 'w' => 1, - 'h' => 1, - 'attachment_uuid' => SecureRandom.uuid, - 'page' => page_number, - }] - } - template.fields << deleted_page_field - template.save! + def delete_picture(template, document, image_attachment_id, page_number) + image_attachment = ActiveStorage::Attachment.find_by(id: image_attachment_id) + return unless image_attachment + file_path = + if document.service.name == :disk + ActiveStorage::Blob.service.path_for(document.key) + end + temp_dir = "#{Rails.root}/tmp/" + FileUtils.mkdir_p(temp_dir) + temp_file_path = "#{temp_dir}#{SecureRandom.uuid}.pdf" + File.open(temp_file_path, 'wb') do |file| + document.download { |chunk| file.write(chunk) } + end + pdf = HexaPDF::Document.open(temp_file_path) + pdf.pages.delete_at(page_number) + pdf.write(temp_file_path) + document.reload + document.metadata[:pdf]['number_of_pages'] -= 1 + temp_doc = document.metadata + new_attachment = document.attachments.update!( + name: document.name, + uuid: document.uuid, + blob: ActiveStorage::Blob.create_and_upload!( + io: File.open(temp_file_path), + filename: document.blob.filename, + content_type: document.blob.content_type, + metadata: temp_doc + ) + ) + document.blob.purge + image_attachment.purge + document.reload + File.delete(temp_file_path) + + remaining_images = document.preview_images + remaining_images.each_with_index do |image, index| + new_filename = "#{index}.jpeg" + image.blob.update!(filename: new_filename) + end + rescue StandardError => e + Rails.logger.error("Error uploading new blank image: #{e.message}") + ensure + File.delete(temp_file_path) if File.exist?(temp_file_path) end def upload_new_blank_image(template, document) - - blank_image = generate_blank_image - blank_blob = create_blob_from_image(blank_image, document ) - # upload_new_attachment(template, blank_blob, ATTACHMENT_NAME) - # puts '-----New blank image uploaded successfully!-----' - if blank_blob - Rails.logger.info('New blank image uploaded successfully!') - else - Rails.logger.info('Blank image not uploaded') + file_path = + if document.service.name == :disk + ActiveStorage::Blob.service.path_for(document.key) + end + temp_dir = "#{Rails.root}/tmp/" + FileUtils.mkdir_p(temp_dir) + temp_file_path = "#{temp_dir}#{SecureRandom.uuid}.pdf" + File.open(temp_file_path, 'wb') do |file| + document.download { |chunk| file.write(chunk) } end - end - - - def generate_blank_image - height = 2000 - Vips::Image.new_from_array([[255]* MAX_WIDTH] * height, 255) - end - - - def create_blob_from_image(image, attachment) - - begin - previews_count = attachment.preview_images.count - ActiveStorage::Attachment.create!( + pdf = HexaPDF::Document.open(temp_file_path) + pdf.pages.add + pdf.write(temp_file_path) + document.reload + document.metadata[:pdf]['number_of_pages'] += 1 + temp_doc = document.metadata + new_attachment = document.attachments.update!( + name: document.name, + uuid: document.uuid, blob: ActiveStorage::Blob.create_and_upload!( - io: StringIO.new(image.write_to_buffer(FORMAT, Q: Q, interlace: true)), - filename: "#{previews_count}#{FORMAT}", - metadata: { analyzed: true, identified: true, width: image.width, height: image.height } - ), - name: ATTACHMENT_NAME, - record: attachment + io: File.open(temp_file_path), + filename: document.blob.filename, + content_type: document.blob.content_type, + metadata: temp_doc + ) ) - rescue => e - Rails.logger.error("Error creating blob from image: #{e.message}") - end + document.blob.purge + document.reload + + # to update pdf images in storage blob + self.generate_pdf_preview_images(document, document.blob.download) + + File.delete(temp_file_path) + rescue StandardError => e + Rails.logger.error("Error uploading new blank image: #{e.message}") + ensure + File.delete(temp_file_path) if File.exist?(temp_file_path) end + + # def generate_blank_image + # # here height and width should be equal to height and width from existing pdf pages + # height = 2000 + # width = MAX_WIDTH + # Vips::Image.new_from_array([[255]* width] * height, 255) + # end + + # # def create_blob_from_image(image, attachment) + # def create_image_blob(image, attachment) + # begin + # previews_count = attachment.preview_images.count + # ActiveStorage::Attachment.create!( + # blob: ActiveStorage::Blob.create_and_upload!( + # io: StringIO.new(image.write_to_buffer(FORMAT, Q: Q, interlace: true)), + # filename: "#{previews_count}#{FORMAT}", + # metadata: { analyzed: true, identified: true, width: image.width, height: image.height } + # ), + # name: ATTACHMENT_NAME, + # record: attachment + # ) + # rescue => e + # Rails.logger.error("Error creating blob from image: #{e.message}") + # end + # end end end