diff --git a/packages/enketo-express/public/js/src/module/controller-webform.js b/packages/enketo-express/public/js/src/module/controller-webform.js index 7a8054fcb498e636e10139297e94d00bd8b42f97..9bfa32149851b90d05957bde6153eeea5c9d124e 100644 --- a/packages/enketo-express/public/js/src/module/controller-webform.js +++ b/packages/enketo-express/public/js/src/module/controller-webform.js @@ -17,6 +17,15 @@ import formCache from './form-cache'; import { getLastSavedRecord, populateLastSavedInstances } from './last-saved'; import { FormController } from './form-controller'; +const cronInterval = setInterval(async () => { + connection.getOnlineStatus() + .then(appearsOnline => { + console.log(appearsOnline) + if (!appearsOnline) { + } + }) +}, 5000); + /** * @typedef {import('../../../../app/models/survey-model').SurveyObject} Survey */ @@ -348,6 +357,9 @@ function _submitRecord(survey) { heading = t('alert.submissionsuccess.heading'); } else if (level === 'warning') { heading = t('alert.submissionwarning.heading'); + } else if (level === 'offline') { + heading = "You are offline"; + level = 'warning'; } else { heading = t('alert.submissionerror.heading'); } @@ -726,9 +738,14 @@ function _setEventHandlers(survey) { console.log(arrayOfFileURLs?.length) console.log("formFiles: " + formFiles?.length) if (arrayOfFileURLs?.length <= formFiles?.length && formFiles?.length) { - const file = formFiles[formFiles?.length - 1]; - const fileURL = await formController.uploadFile(file); - arrayOfFileURLs.push({ url: fileURL, name: file.name }); + for (let i = 0; i < formFiles.length; i++) { + const file = formFiles[i]; + if (typeof file === 'object') { + const fileURL = await formController.uploadFile(file); + if (fileURL) + arrayOfFileURLs.push({ url: fileURL, name: file.name }); + } + } } else { arrayOfFileURLs = arrayOfFileURLs.filter(file => formFiles.find(el => el.name == file.name)) } diff --git a/packages/enketo-express/public/js/src/module/form-controller.js b/packages/enketo-express/public/js/src/module/form-controller.js index 01374c1f0ebc9feafe69d2708f5aaaebd76d9c24..abebc75bc0e13ac942930a2c5a3691b115111474 100644 --- a/packages/enketo-express/public/js/src/module/form-controller.js +++ b/packages/enketo-express/public/js/src/module/form-controller.js @@ -1,6 +1,14 @@ import { xml2json } from './xml2json'; import settings from './settings'; +import imageCompression from 'browser-image-compression'; +const options = { + maxSizeMB: 0.5, + maxWidthOrHeight: 840, + useWebWorker: true, +} + + // import { config } from '../../../../app/models/config-model'; @@ -65,6 +73,7 @@ export class FormController { this._message = ''; this.formSpec = formSpec; this._parser = new DOMParser(); + this.formFiles = null; this.formSpec.isSuccessExecute = () => this.executeMethod(this.formSpec.successCheck); this.formSpec.onFormSuccessExecute = () => this.executeMethod(this.formSpec.onSuccess.sideEffect); @@ -100,19 +109,26 @@ export class FormController { } async uploadFile(data) { - const fd = new FormData(); - var newFile = new File([data], data.name, { type: data.type }); - fd.append('file', newFile, data.name); - const response = await fetch(`${settings.formManagerBaseURI}/form/uploadFile`, { - method: 'POST', - body: fd - }).then(s => { - return s.json(); - }).catch(e => { - console.log(e); - }); - - return response.fileURL; + console.log("Ab dekh data:", data) + if (data) { + const fd = new FormData(); + var newFile = new File([data], data.name, { type: data.type }); + // Compressing this file + newFile = await imageCompression(newFile, options) + fd.append('file', newFile, data.name); + const response = await fetch(`${settings.formManagerBaseURI}/form/uploadFile`, { + method: 'POST', + body: fd + }).then(s => { + return s.json(); + }).catch(e => { + console.log(e); + return null; + }); + + return response ? response.fileURL : null; + } + return null; } set(obj, path, value) { @@ -135,13 +151,29 @@ export class FormController { async processForm(formData, formFiles) { const doc = this._parser.parseFromString(formData, 'text/xml'); - this.formData = (await fetch(`${settings.formManagerBaseURI}/parse`, { + const parseRes = await fetch(`${settings.formManagerBaseURI}/parse`, { method: "POST", body: JSON.stringify({ xml: formData.toString() }), headers: { "Content-type": "application/json; charset=UTF-8" } - }).then(res => res.json())).data; + }).then(res => res.json()).catch(e => { + this._state = 'FORM_FAILURE_OFFLINE'; + this.formFiles = formFiles; + window.parent.postMessage(JSON.stringify({ + state: this._state, + formDataXml: formData, + formFilesXml: formFiles + }), '*'); + }); + + if (parseRes == undefined) + return Promise.resolve({ + status: "offline", + message: "You are oflline. Your form data has been saved. Please re-submit using the submit button once back online" + }); + this.formData = parseRes.data; + // for (let i = 0; i < formFiles.length; i++) { // const file = formFiles[i]; // const fileURL = await this.uploadFile(file);