diff --git a/app/javascript/template_builder/builder.vue b/app/javascript/template_builder/builder.vue index 43cac48b..569d77c0 100644 --- a/app/javascript/template_builder/builder.vue +++ b/app/javascript/template_builder/builder.vue @@ -187,6 +187,7 @@ @remove="onDocumentRemove" @replace="onDocumentReplace" @up="moveDocument(item, -1)" + @reorder="reorderFields" @down="moveDocument(item, 1)" @change="save" /> @@ -818,6 +819,89 @@ export default { this.documentRefs = [] }, methods: { + reorderFields (item) { + const itemFields = [] + const fields = [] + const fieldAreasIndex = {} + + const attachmentUuids = this.template.schema.map((e) => e.attachment_uuid) + + this.template.fields.forEach((f) => { + if (f.areas?.length) { + const firstArea = f.areas.reduce((min, a) => { + return attachmentUuids.indexOf(a.attachment_uuid) < attachmentUuids.indexOf(min.attachment_uuid) ? a : min + }, f.areas[0]) + + if (firstArea.attachment_uuid === item.attachment_uuid) { + itemFields.push(f) + } else { + fields.push(f) + } + } else { + fields.push(f) + } + }) + + const sortArea = (aArea, bArea) => { + if (aArea.attachment_uuid === bArea.attachment_uuid) { + if (aArea.page === bArea.page) { + if (Math.abs(aArea.y - bArea.y) < 0.01) { + if (aArea.x === bArea.x) { + return 0 + } else { + return aArea.x - bArea.x + } + } else { + return aArea.y - bArea.y + } + } else { + return aArea.page - bArea.page + } + } else { + return attachmentUuids.indexOf(aArea.attachment_uuid) - attachmentUuids.indexOf(bArea.attachment_uuid) + } + } + + itemFields.sort((aField, bField) => { + const aArea = (fieldAreasIndex[aField.uuid] ||= [...(aField.areas || [])].sort(sortArea)[0]) + const bArea = (fieldAreasIndex[bField.uuid] ||= [...(bField.areas || [])].sort(sortArea)[0]) + + return sortArea(aArea, bArea) + }) + + const insertBeforeAttachmentUuids = attachmentUuids.slice(this.template.schema.indexOf(item) + 1) + + let sortedFields = [] + + if (insertBeforeAttachmentUuids.length) { + const insertAfterField = fields.find((f) => { + if (f.areas?.length) { + return f.areas.find((a) => insertBeforeAttachmentUuids.includes(a.attachment_uuid)) + } else { + return false + } + }) + + if (insertAfterField) { + fields.splice(fields.indexOf(insertAfterField), 0, ...itemFields) + + sortedFields = fields + } else { + sortedFields = fields.concat(itemFields) + } + } else { + if (fields.length && itemFields.length && this.template.fields.indexOf(fields[0]) > this.template.fields.indexOf(itemFields[0])) { + sortedFields = itemFields.concat(fields) + } else { + sortedFields = fields.concat(itemFields) + } + } + + if (this.template.fields.length === sortedFields.length) { + this.template.fields = sortedFields + this.save() + } + }, closeDropdown () { document.activeElement.blur() }, diff --git a/app/javascript/template_builder/i18n.js b/app/javascript/template_builder/i18n.js index 34a9604a..72997e68 100644 --- a/app/javascript/template_builder/i18n.js +++ b/app/javascript/template_builder/i18n.js @@ -1,4 +1,5 @@ const en = { + reorder_fields: 'Reorder fields', verify_id: 'Verify ID', obtain_qualified_electronic_signature_with_the_trusted_provider_click_to_learn_more: 'Obtain qualified electronic signature (QeS) with the trusted provider. Click to learn more.', editable: 'Editable', @@ -158,6 +159,7 @@ const en = { } const es = { + reorder_fields: 'Reordenar campos', verify_id: 'Verificar ID', obtain_qualified_electronic_signature_with_the_trusted_provider_click_to_learn_more: 'Obtenga una firma electrónica cualificada (QeS) con el proveedor de confianza. Haga clic para obtener más información.', recurrent: 'Recurrente', @@ -317,6 +319,7 @@ const es = { } const it = { + reorder_fields: 'Riordina i campi', verify_id: 'Verifica ID', obtain_qualified_electronic_signature_with_the_trusted_provider_click_to_learn_more: 'Ottieni una firma elettronica qualificata (QeS) con il fornitore di fiducia. Clicca per saperne di più.', ricorrente: 'Ricorrente', @@ -476,6 +479,7 @@ const it = { } const pt = { + reorder_fields: 'Reorganizar campos', verify_id: 'Verificar ID', obtain_qualified_electronic_signature_with_the_trusted_provider_click_to_learn_more: 'Obtenha a assinatura eletrônica qualificada (QeS) com o provedor confiável. Clique para saber mais.', recurrent: 'Recurrente', @@ -635,6 +639,7 @@ const pt = { } const fr = { + reorder_fields: 'Réorganiser les champs', verify_id: "Vérifier l'ID", obtain_qualified_electronic_signature_with_the_trusted_provider_click_to_learn_more: 'Obtenez une signature électronique qualifiée (QeS) avec le fournisseur de confiance. Cliquez pour en savoir plus.', recurrent: 'Récurrent', @@ -794,6 +799,7 @@ const fr = { } const de = { + reorder_fields: 'Felder neu anordnen', verify_id: 'ID überprüfen', obtain_qualified_electronic_signature_with_the_trusted_provider_click_to_learn_more: 'Erhalten Sie eine qualifizierte elektronische Signatur (QeS) beim vertrauenswürdigen Anbieter. Klicken Sie hier, um mehr zu erfahren.', wiederkehrend: 'Wiederkehrend', diff --git a/app/javascript/template_builder/preview.vue b/app/javascript/template_builder/preview.vue index ae8c3fdb..29505141 100644 --- a/app/javascript/template_builder/preview.vue +++ b/app/javascript/template_builder/preview.vue @@ -56,23 +56,39 @@