attestation_covid/src/js/form-util.js
2020-10-30 10:12:32 +01:00

162 lines
4.7 KiB
JavaScript

import { $, $$, downloadBlob } from './dom-utils'
import { addSlash, getFormattedDate } from './util'
import pdfBase from '../certificate.pdf'
import { generatePdf } from './pdf-util'
const conditions = {
'#field-firstname': {
length: 1,
},
'#field-lastname': {
length: 1,
},
'#field-birthday': {
pattern: /^([0][1-9]|[1-2][0-9]|30|31)\/([0][1-9]|10|11|12)\/(19[0-9][0-9]|20[0-1][0-9]|2020)/g,
},
'#field-placeofbirth': {
length: 1,
},
'#field-address': {
length: 1,
},
'#field-city': {
length: 1,
},
'#field-zipcode': {
pattern: /\d{5}/g,
},
'#field-datesortie': {
pattern: /\d{4}-\d{2}-\d{2}/g,
},
'#field-heuresortie': {
pattern: /\d{2}:\d{2}/g,
},
}
function validateAriaFields () {
return Object.keys(conditions)
.map((field) => {
const fieldData = conditions[field]
const pattern = fieldData.pattern
const length = fieldData.length
const isInvalidPattern = pattern && !$(field).value.match(pattern)
const isInvalidLength = length && !$(field).value.length
const isInvalid = !!(isInvalidPattern || isInvalidLength)
$(field).setAttribute('aria-invalid', isInvalid)
if (isInvalid) {
$(field).focus()
}
return isInvalid
})
.includes(true)
}
export function setReleaseDateTime (releaseDateInput) {
const loadedDate = new Date()
releaseDateInput.value = getFormattedDate(loadedDate)
}
export function getProfile (formInputs) {
const fields = {}
for (const field of formInputs) {
let value = field.value
if (field.id === 'field-datesortie') {
const dateSortie = field.value.split('-')
value = `${dateSortie[2]}/${dateSortie[1]}/${dateSortie[0]}`
}
fields[field.id.substring('field-'.length)] = value
}
return fields
}
export function getReasons (reasonInputs) {
const reasons = reasonInputs
.filter(input => input.checked)
.map(input => input.value).join(', ')
return reasons
}
export function prepareInputs (formInputs, reasonInputs, reasonFieldset, reasonAlert, snackbar) {
formInputs.forEach((input) => {
const exempleElt = input.parentNode.parentNode.querySelector('.exemple')
const validitySpan = input.parentNode.parentNode.querySelector('.validity')
if (input.placeholder && exempleElt) {
input.addEventListener('input', (event) => {
if (input.value) {
exempleElt.innerHTML = 'ex. : ' + input.placeholder
validitySpan.removeAttribute('hidden')
} else {
exempleElt.innerHTML = ''
}
})
}
})
$('#field-birthday').addEventListener('keyup', function (event) {
event.preventDefault()
const input = event.target
const key = event.keyCode || event.charCode
if (key !== 8 && key !== 46) {
input.value = addSlash(input.value)
}
})
reasonInputs.forEach(radioInput => {
radioInput.addEventListener('change', function (event) {
const isInError = reasonInputs.every(input => !input.checked)
reasonFieldset.classList.toggle('fieldset-error', isInError)
reasonAlert.classList.toggle('hidden', !isInError)
})
})
$('#generate-btn').addEventListener('click', async (event) => {
event.preventDefault()
const reasons = getReasons(reasonInputs)
if (!reasons) {
reasonFieldset.classList.add('fieldset-error')
reasonAlert.classList.remove('hidden')
reasonFieldset.scrollIntoView && reasonFieldset.scrollIntoView()
return
}
const invalid = validateAriaFields()
if (invalid) {
return
}
console.log(getProfile(formInputs), reasons)
const pdfBlob = await generatePdf(getProfile(formInputs), reasons, pdfBase)
const creationInstant = new Date()
const creationDate = creationInstant.toLocaleDateString('fr-CA')
const creationHour = creationInstant
.toLocaleTimeString('fr-FR', { hour: '2-digit', minute: '2-digit' })
.replace(':', '-')
downloadBlob(pdfBlob, `attestation-${creationDate}_${creationHour}.pdf`)
snackbar.classList.remove('d-none')
setTimeout(() => snackbar.classList.add('show'), 100)
setTimeout(function () {
snackbar.classList.remove('show')
setTimeout(() => snackbar.classList.add('d-none'), 500)
}, 6000)
})
}
export function prepareForm () {
const formInputs = $$('#form-profile input')
const snackbar = $('#snackbar')
const reasonInputs = [...$$('input[name="field-reason"]')]
const reasonFieldset = $('#reason-fieldset')
const reasonAlert = reasonFieldset.querySelector('.msg-alert')
const releaseDateInput = $('#field-datesortie')
setReleaseDateTime(releaseDateInput)
prepareInputs(formInputs, reasonInputs, reasonFieldset, reasonAlert, snackbar)
}