From 6be597d5ad2fb84e1948d19b5e60a046f3a6a9fe Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 4 Sep 2018 14:41:31 -0400 Subject: [PATCH 1/9] Rebase on latest master --- lib/js/actions.js | 46 +++++++++----------------- lib/js/actions.js.map | 2 +- lib/js/helpers.js | 11 ------- lib/js/helpers.js.map | 2 +- lib/js/review/SubmitController.js | 23 +++---------- lib/js/review/SubmitController.js.map | 2 +- lib/js/state/helpers.js | 3 +- lib/js/state/helpers.js.map | 2 +- package-lock.json | 5 --- package.json | 1 - src/js/actions.js | 47 ++++++++++----------------- src/js/helpers.js | 10 ------ src/js/review/SubmitController.jsx | 25 +++++--------- src/js/state/helpers.js | 3 +- 14 files changed, 52 insertions(+), 130 deletions(-) diff --git a/lib/js/actions.js b/lib/js/actions.js index 0e6ef56..8bc1241 100644 --- a/lib/js/actions.js +++ b/lib/js/actions.js @@ -15,10 +15,6 @@ exports.setViewedPages = setViewedPages; exports.submitForm = submitForm; exports.uploadFile = uploadFile; -var _ravenJs = require('raven-js'); - -var _ravenJs2 = _interopRequireDefault(_ravenJs); - var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); @@ -112,15 +108,14 @@ function setViewedPages(pageKeys) { }; } -function submitToUrl(body, submitUrl, trackingPrefix) { +function submitToUrl(body, submitUrl, recordEvent) { return new Promise(function (resolve, reject) { var req = new XMLHttpRequest(); req.open('POST', submitUrl); req.addEventListener('load', function () { if (req.status >= 200 && req.status < 300) { - (0, _helpers.recordEvent)({ - event: trackingPrefix + '-submission-successful' - }); + recordEvent({ event: 'form-submit-successful' }); + // got this from the fetch polyfill, keeping it to be safe var responseBody = 'response' in req ? req.response : req.responseText; var results = JSON.parse(responseBody); @@ -169,24 +164,11 @@ function submitToUrl(body, submitUrl, trackingPrefix) { } function submitForm(formConfig, form) { - var captureError = function captureError(error, errorType) { - _ravenJs2.default.captureException(error, { - fingerprint: [formConfig.trackingPrefix, error.message], - extra: { - errorType: errorType, - statusText: error.statusText - } - }); - (0, _helpers.recordEvent)({ - event: formConfig.trackingPrefix + '-submission-failed' + (errorType.startsWith('client') ? '-client' : '') - }); - }; + var recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : console.error.bind(console); // eslint-disable-line no-console return function (dispatch) { dispatch(setSubmission('status', 'submitPending')); - (0, _helpers.recordEvent)({ - event: formConfig.trackingPrefix + '-submission' - }); + recordEvent({ event: 'form-submit-pending' }); var promise = void 0; if (formConfig.submit) { @@ -194,7 +176,7 @@ function submitForm(formConfig, form) { } else { var body = formConfig.transformForSubmit ? formConfig.transformForSubmit(formConfig, form) : (0, _helpers.transformForSubmit)(formConfig, form); - promise = submitToUrl(body, formConfig.submitUrl, formConfig.trackingPrefix); + promise = submitToUrl(body, formConfig.submitUrl, recordEvent); } return promise.then(function (resp) { @@ -209,7 +191,7 @@ function submitForm(formConfig, form) { } else if (errorMessage.startsWith('vets_server_error')) { errorType = 'serverError'; } - captureError(error, errorType); + recordEvent({ event: 'form-submit-error', error: error, errorType: errorType }); dispatch(setSubmission('status', errorType, error.extra)); }); }; @@ -276,7 +258,8 @@ function uploadFile(file, uiOptions, onProgress, onChange, onError) { name: file.name, errorMessage: errorMessage }); - _ravenJs2.default.captureMessage('vets_upload_error: ' + req.statusText); + // Commenting until this is removed by a PR for #211 + // Raven.captureMessage(`vets_upload_error: ${req.statusText}`); onError(); } }); @@ -287,11 +270,12 @@ function uploadFile(file, uiOptions, onProgress, onChange, onError) { name: file.name, errorMessage: errorMessage }); - _ravenJs2.default.captureMessage('vets_upload_error: ' + errorMessage, { - extra: { - statusText: req.statusText - } - }); + // Commenting until this is removed by a PR for #211 + // Raven.captureMessage(`vets_upload_error: ${errorMessage}`, { + // extra: { + // statusText: req.statusText + // } + // }); onError(); }); diff --git a/lib/js/actions.js.map b/lib/js/actions.js.map index a672268..a2095bf 100644 --- a/lib/js/actions.js.map +++ b/lib/js/actions.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/js/actions.js"],"names":["closeReviewChapter","openReviewChapter","setData","setEditMode","setSubmission","setPreSubmit","setSubmitted","setViewedPages","submitForm","uploadFile","SET_EDIT_MODE","SET_DATA","SET_VIEWED_PAGES","SET_PRE_SUBMIT","SET_SUBMISSION","SET_SUBMITTED","OPEN_REVIEW_CHAPTER","CLOSE_REVIEW_CHAPTER","closedChapter","pageKeys","type","openedChapter","data","page","edit","index","field","value","extra","preSubmitField","preSubmitAccepted","response","submitToUrl","body","submitUrl","trackingPrefix","Promise","resolve","reject","req","XMLHttpRequest","open","addEventListener","status","event","responseBody","responseText","results","JSON","parse","error","Error","statusText","parseInt","getResponseHeader","setRequestHeader","userToken","_","get","window","send","formConfig","form","captureError","errorType","Raven","captureException","fingerprint","message","startsWith","dispatch","promise","submit","transformForSubmit","then","resp","catch","errorReceived","errorMessage","String","file","uiOptions","onProgress","onChange","onError","getState","size","maxSize","name","minSize","fileTypes","some","toLowerCase","endsWith","fileType","uploading","payload","createPayload","formId","fileUploadUrl","fileData","parseResponse","moment","unix","captureMessage","upload","evt","lengthComputable","loaded","total"],"mappings":"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","file":"actions.js","sourcesContent":["import Raven from 'raven-js';\nimport moment from 'moment';\nimport _ from './utilities/data';\nimport { transformForSubmit, recordEvent } from './helpers';\nimport { timeFromNow } from './utilities/date';\n\nexport const SET_EDIT_MODE = 'SET_EDIT_MODE';\nexport const SET_DATA = 'SET_DATA';\nexport const SET_VIEWED_PAGES = 'SET_VIEWED_PAGES';\nexport const SET_PRE_SUBMIT = 'SET_PRE_SUBMIT';\nexport const SET_SUBMISSION = 'SET_SUBMISSION';\nexport const SET_SUBMITTED = 'SET_SUBMITTED';\nexport const OPEN_REVIEW_CHAPTER = 'OPEN_REVIEW_CHAPTER';\nexport const CLOSE_REVIEW_CHAPTER = 'CLOSE_REVIEW_CHAPTER';\n\nexport function closeReviewChapter(closedChapter, pageKeys = []) {\n return {\n type: CLOSE_REVIEW_CHAPTER,\n closedChapter,\n pageKeys\n };\n}\n\nexport function openReviewChapter(openedChapter) {\n return {\n type: OPEN_REVIEW_CHAPTER,\n openedChapter\n };\n}\n\nexport function setData(data) {\n return {\n type: SET_DATA,\n data\n };\n}\n\nexport function setEditMode(page, edit, index = null) {\n return {\n type: SET_EDIT_MODE,\n edit,\n page,\n index\n };\n}\n\n// extra is used to pass other information (from a submission error or anything else)\n// into the submission state object\nexport function setSubmission(field, value, extra = null) {\n return {\n type: SET_SUBMISSION,\n field,\n value,\n extra\n };\n}\n\nexport function setPreSubmit(preSubmitField, preSubmitAccepted) {\n return {\n type: SET_PRE_SUBMIT,\n preSubmitField,\n preSubmitAccepted\n };\n}\n\nexport function setSubmitted(response) {\n return {\n type: SET_SUBMITTED,\n response: typeof response.data !== 'undefined' ? response.data : response\n };\n}\n\n\nexport function setViewedPages(pageKeys) {\n return {\n type: SET_VIEWED_PAGES,\n pageKeys\n };\n}\n\nfunction submitToUrl(body, submitUrl, trackingPrefix) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.open('POST', submitUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n recordEvent({\n event: `${trackingPrefix}-submission-successful`,\n });\n // got this from the fetch polyfill, keeping it to be safe\n const responseBody = 'response' in req ? req.response : req.responseText;\n const results = JSON.parse(responseBody);\n resolve(results);\n } else {\n let error;\n if (req.status === 429) {\n error = new Error(`vets_throttled_error: ${req.statusText}`);\n error.extra = parseInt(req.getResponseHeader('x-ratelimit-reset'), 10);\n } else {\n error = new Error(`vets_server_error: ${req.statusText}`);\n }\n error.statusText = req.statusText;\n reject(error);\n }\n });\n\n req.addEventListener('error', () => {\n const error = new Error('vets_client_error: Network request failed');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('abort', () => {\n const error = new Error('vets_client_error: Request aborted');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('timeout', () => {\n const error = new Error('vets_client_error: Request timed out');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.setRequestHeader('Content-Type', 'application/json');\n\n const userToken = _.get('sessionStorage.userToken', window);\n if (userToken) {\n req.setRequestHeader('Authorization', `Token token=${userToken}`);\n }\n\n req.send(body);\n });\n}\n\nexport function submitForm(formConfig, form) {\n const captureError = (error, errorType) => {\n Raven.captureException(error, {\n fingerprint: [formConfig.trackingPrefix, error.message],\n extra: {\n errorType,\n statusText: error.statusText\n }\n });\n recordEvent({\n event: `${formConfig.trackingPrefix}-submission-failed${errorType.startsWith('client') ? '-client' : ''}`,\n });\n };\n\n return dispatch => {\n dispatch(setSubmission('status', 'submitPending'));\n recordEvent({\n event: `${formConfig.trackingPrefix}-submission`,\n });\n\n let promise;\n if (formConfig.submit) {\n promise = formConfig.submit(form, formConfig);\n } else {\n const body = formConfig.transformForSubmit\n ? formConfig.transformForSubmit(formConfig, form)\n : transformForSubmit(formConfig, form);\n\n promise = submitToUrl(body, formConfig.submitUrl, formConfig.trackingPrefix);\n }\n\n return promise\n .then(resp => dispatch(setSubmitted(resp)))\n .catch(errorReceived => {\n // overly cautious\n const error = errorReceived instanceof Error ? errorReceived : new Error(errorReceived);\n const errorMessage = String(error.message);\n let errorType = 'clientError';\n if (errorMessage.startsWith('vets_throttled_error')) {\n errorType = 'throttledError';\n } else if (errorMessage.startsWith('vets_server_error')) {\n errorType = 'serverError';\n }\n captureError(error, errorType);\n dispatch(setSubmission('status', errorType, error.extra));\n });\n };\n}\n\nexport function uploadFile(file, uiOptions, onProgress, onChange, onError) {\n return (dispatch, getState) => {\n if (file.size > uiOptions.maxSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too large to be uploaded'\n });\n\n onError();\n return null;\n }\n\n if (file.size < uiOptions.minSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too small to be uploaded'\n });\n\n onError();\n return null;\n }\n\n // we limit file types, but it’s not respected on mobile and desktop\n // users can bypass it without much effort\n if (!uiOptions.fileTypes.some(fileType => file.name.toLowerCase().endsWith(fileType.toLowerCase()))) {\n onChange({\n name: file.name,\n errorMessage: 'File is not one of the allowed types'\n });\n\n onError();\n return null;\n }\n\n onChange({\n name: file.name,\n uploading: true\n });\n\n const payload = uiOptions.createPayload(file, getState().form.formId);\n\n const req = new XMLHttpRequest();\n\n req.open('POST', uiOptions.fileUploadUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n const body = 'response' in req ? req.response : req.responseText;\n const fileData = uiOptions.parseResponse(JSON.parse(body), file);\n onChange(fileData);\n } else {\n let errorMessage = req.statusText;\n if (req.status === 429) {\n errorMessage = `You’ve reached the limit for the number of submissions we can accept at this time. Please try again in ${timeFromNow(moment.unix(parseInt(req.getResponseHeader('x-ratelimit-reset'), 10)))}.`;\n }\n\n onChange({\n name: file.name,\n errorMessage\n });\n Raven.captureMessage(`vets_upload_error: ${req.statusText}`);\n onError();\n }\n });\n\n req.addEventListener('error', () => {\n const errorMessage = 'Network request failed';\n onChange({\n name: file.name,\n errorMessage\n });\n Raven.captureMessage(`vets_upload_error: ${errorMessage}`, {\n extra: {\n statusText: req.statusText\n }\n });\n onError();\n });\n\n req.upload.addEventListener('progress', (evt) => {\n if (evt.lengthComputable && onProgress) {\n // setting this at 80, because there's some time after we get to 100%\n // where the backend is uploading to s3\n onProgress((evt.loaded / evt.total) * 80);\n }\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.send(payload);\n\n return req;\n };\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/js/actions.js"],"names":["closeReviewChapter","openReviewChapter","setData","setEditMode","setSubmission","setPreSubmit","setSubmitted","setViewedPages","submitForm","uploadFile","SET_EDIT_MODE","SET_DATA","SET_VIEWED_PAGES","SET_PRE_SUBMIT","SET_SUBMISSION","SET_SUBMITTED","OPEN_REVIEW_CHAPTER","CLOSE_REVIEW_CHAPTER","closedChapter","pageKeys","type","openedChapter","data","page","edit","index","field","value","extra","preSubmitField","preSubmitAccepted","response","submitToUrl","body","submitUrl","recordEvent","Promise","resolve","reject","req","XMLHttpRequest","open","addEventListener","status","event","responseBody","responseText","results","JSON","parse","error","Error","statusText","parseInt","getResponseHeader","setRequestHeader","userToken","_","get","window","send","formConfig","form","bind","console","dispatch","promise","submit","transformForSubmit","then","resp","catch","errorReceived","errorMessage","String","message","errorType","startsWith","file","uiOptions","onProgress","onChange","onError","getState","size","maxSize","name","minSize","fileTypes","some","toLowerCase","endsWith","fileType","uploading","payload","createPayload","formId","fileUploadUrl","fileData","parseResponse","moment","unix","upload","evt","lengthComputable","loaded","total"],"mappings":";;;;;;QAcgBA,kB,GAAAA,kB;QAQAC,iB,GAAAA,iB;QAOAC,O,GAAAA,O;QAOAC,W,GAAAA,W;QAWAC,a,GAAAA,a;QASAC,Y,GAAAA,Y;QAQAC,Y,GAAAA,Y;QAQAC,c,GAAAA,c;QA8DAC,U,GAAAA,U;QAsCAC,U,GAAAA,U;;AA5KhB;;;;AACA;;;;AACA;;AACA;;;;AAEO,IAAMC,wCAAgB,eAAtB;AACA,IAAMC,8BAAW,UAAjB;AACA,IAAMC,8CAAmB,kBAAzB;AACA,IAAMC,0CAAiB,gBAAvB;AACA,IAAMC,0CAAiB,gBAAvB;AACA,IAAMC,wCAAgB,eAAtB;AACA,IAAMC,oDAAsB,qBAA5B;AACA,IAAMC,sDAAuB,sBAA7B;;AAEA,SAASjB,kBAAT,CAA4BkB,aAA5B,EAA0D;AAAA,MAAfC,QAAe,uEAAJ,EAAI;;AAC/D,SAAO;AACLC,UAAMH,oBADD;AAELC,gCAFK;AAGLC;AAHK,GAAP;AAKD;;AAEM,SAASlB,iBAAT,CAA2BoB,aAA3B,EAA0C;AAC/C,SAAO;AACLD,UAAMJ,mBADD;AAELK;AAFK,GAAP;AAID;;AAEM,SAASnB,OAAT,CAAiBoB,IAAjB,EAAuB;AAC5B,SAAO;AACLF,UAAMT,QADD;AAELW;AAFK,GAAP;AAID;;AAEM,SAASnB,WAAT,CAAqBoB,IAArB,EAA2BC,IAA3B,EAA+C;AAAA,MAAdC,KAAc,uEAAN,IAAM;;AACpD,SAAO;AACLL,UAAMV,aADD;AAELc,cAFK;AAGLD,cAHK;AAILE;AAJK,GAAP;AAMD;;AAED;AACA;AACO,SAASrB,aAAT,CAAuBsB,KAAvB,EAA8BC,KAA9B,EAAmD;AAAA,MAAdC,KAAc,uEAAN,IAAM;;AACxD,SAAO;AACLR,UAAMN,cADD;AAELY,gBAFK;AAGLC,gBAHK;AAILC;AAJK,GAAP;AAMD;;AAEM,SAASvB,YAAT,CAAsBwB,cAAtB,EAAsCC,iBAAtC,EAAyD;AAC9D,SAAO;AACLV,UAAMP,cADD;AAELgB,kCAFK;AAGLC;AAHK,GAAP;AAKD;;AAEM,SAASxB,YAAT,CAAsByB,QAAtB,EAAgC;AACrC,SAAO;AACLX,UAAML,aADD;AAELgB,cAAU,OAAOA,SAAST,IAAhB,KAAyB,WAAzB,GAAuCS,SAAST,IAAhD,GAAuDS;AAF5D,GAAP;AAID;;AAGM,SAASxB,cAAT,CAAwBY,QAAxB,EAAkC;AACvC,SAAO;AACLC,UAAMR,gBADD;AAELO;AAFK,GAAP;AAID;;AAED,SAASa,WAAT,CAAqBC,IAArB,EAA2BC,SAA3B,EAAsCC,WAAtC,EAAmD;AACjD,SAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;AACtC,QAAMC,MAAM,IAAIC,cAAJ,EAAZ;AACAD,QAAIE,IAAJ,CAAS,MAAT,EAAiBP,SAAjB;AACAK,QAAIG,gBAAJ,CAAqB,MAArB,EAA6B,YAAM;AACjC,UAAIH,IAAII,MAAJ,IAAc,GAAd,IAAqBJ,IAAII,MAAJ,GAAa,GAAtC,EAA2C;AACzCR,oBAAY,EAAES,OAAO,wBAAT,EAAZ;;AAEA;AACA,YAAMC,eAAe,cAAcN,GAAd,GAAoBA,IAAIR,QAAxB,GAAmCQ,IAAIO,YAA5D;AACA,YAAMC,UAAUC,KAAKC,KAAL,CAAWJ,YAAX,CAAhB;AACAR,gBAAQU,OAAR;AACD,OAPD,MAOO;AACL,YAAIG,cAAJ;AACA,YAAIX,IAAII,MAAJ,KAAe,GAAnB,EAAwB;AACtBO,kBAAQ,IAAIC,KAAJ,4BAAmCZ,IAAIa,UAAvC,CAAR;AACAF,gBAAMtB,KAAN,GAAcyB,SAASd,IAAIe,iBAAJ,CAAsB,mBAAtB,CAAT,EAAqD,EAArD,CAAd;AACD,SAHD,MAGO;AACLJ,kBAAQ,IAAIC,KAAJ,yBAAgCZ,IAAIa,UAApC,CAAR;AACD;AACDF,cAAME,UAAN,GAAmBb,IAAIa,UAAvB;AACAd,eAAOY,KAAP;AACD;AACF,KAnBD;;AAqBAX,QAAIG,gBAAJ,CAAqB,OAArB,EAA8B,YAAM;AAClC,UAAMQ,QAAQ,IAAIC,KAAJ,CAAU,2CAAV,CAAd;AACAD,YAAME,UAAN,GAAmBb,IAAIa,UAAvB;AACAd,aAAOY,KAAP;AACD,KAJD;;AAMAX,QAAIG,gBAAJ,CAAqB,OAArB,EAA8B,YAAM;AAClC,UAAMQ,QAAQ,IAAIC,KAAJ,CAAU,oCAAV,CAAd;AACAD,YAAME,UAAN,GAAmBb,IAAIa,UAAvB;AACAd,aAAOY,KAAP;AACD,KAJD;;AAMAX,QAAIG,gBAAJ,CAAqB,SAArB,EAAgC,YAAM;AACpC,UAAMQ,QAAQ,IAAIC,KAAJ,CAAU,sCAAV,CAAd;AACAD,YAAME,UAAN,GAAmBb,IAAIa,UAAvB;AACAd,aAAOY,KAAP;AACD,KAJD;;AAMAX,QAAIgB,gBAAJ,CAAqB,kBAArB,EAAyC,OAAzC;AACAhB,QAAIgB,gBAAJ,CAAqB,cAArB,EAAqC,kBAArC;;AAEA,QAAMC,YAAYC,eAAEC,GAAF,CAAM,0BAAN,EAAkCC,MAAlC,CAAlB;AACA,QAAIH,SAAJ,EAAe;AACbjB,UAAIgB,gBAAJ,CAAqB,eAArB,mBAAqDC,SAArD;AACD;;AAEDjB,QAAIqB,IAAJ,CAAS3B,IAAT;AACD,GAnDM,CAAP;AAoDD;;AAEM,SAASzB,UAAT,CAAoBqD,UAApB,EAAgCC,IAAhC,EAAsC;AAC3C,MAAM3B,cAAc0B,WAAW1B,WAAX,GAClB0B,WAAW1B,WAAX,CAAuB4B,IAAvB,CAA4BF,UAA5B,CADkB,GAElBG,QAAQd,KAAR,CAAca,IAAd,CAAmBC,OAAnB,CAFF,CAD2C,CAGP;;AAEpC,SAAO,oBAAY;AACjBC,aAAS7D,cAAc,QAAd,EAAwB,eAAxB,CAAT;AACA+B,gBAAY,EAAES,OAAO,qBAAT,EAAZ;;AAEA,QAAIsB,gBAAJ;AACA,QAAIL,WAAWM,MAAf,EAAuB;AACrBD,gBAAUL,WAAWM,MAAX,CAAkBL,IAAlB,EAAwBD,UAAxB,CAAV;AACD,KAFD,MAEO;AACL,UAAM5B,OAAO4B,WAAWO,kBAAX,GACTP,WAAWO,kBAAX,CAA8BP,UAA9B,EAA0CC,IAA1C,CADS,GAET,iCAAmBD,UAAnB,EAA+BC,IAA/B,CAFJ;;AAIAI,gBAAUlC,YAAYC,IAAZ,EAAkB4B,WAAW3B,SAA7B,EAAwCC,WAAxC,CAAV;AACD;;AAED,WAAO+B,QACJG,IADI,CACC;AAAA,aAAQJ,SAAS3D,aAAagE,IAAb,CAAT,CAAR;AAAA,KADD,EAEJC,KAFI,CAEE,yBAAiB;AACtB;AACA,UAAMrB,QAAQsB,yBAAyBrB,KAAzB,GAAiCqB,aAAjC,GAAiD,IAAIrB,KAAJ,CAAUqB,aAAV,CAA/D;AACA,UAAMC,eAAeC,OAAOxB,MAAMyB,OAAb,CAArB;AACA,UAAIC,YAAY,aAAhB;AACA,UAAIH,aAAaI,UAAb,CAAwB,sBAAxB,CAAJ,EAAqD;AACnDD,oBAAY,gBAAZ;AACD,OAFD,MAEO,IAAIH,aAAaI,UAAb,CAAwB,mBAAxB,CAAJ,EAAkD;AACvDD,oBAAY,aAAZ;AACD;AACDzC,kBAAY,EAAES,OAAO,mBAAT,EAA8BM,YAA9B,EAAqC0B,oBAArC,EAAZ;AACAX,eAAS7D,cAAc,QAAd,EAAwBwE,SAAxB,EAAmC1B,MAAMtB,KAAzC,CAAT;AACD,KAdI,CAAP;AAeD,GA9BD;AA+BD;;AAEM,SAASnB,UAAT,CAAoBqE,IAApB,EAA0BC,SAA1B,EAAqCC,UAArC,EAAiDC,QAAjD,EAA2DC,OAA3D,EAAoE;AACzE,SAAO,UAACjB,QAAD,EAAWkB,QAAX,EAAwB;AAC7B,QAAIL,KAAKM,IAAL,GAAYL,UAAUM,OAA1B,EAAmC;AACjCJ,eAAS;AACPK,cAAMR,KAAKQ,IADJ;AAEPb,sBAAc;AAFP,OAAT;;AAKAS;AACA,aAAO,IAAP;AACD;;AAED,QAAIJ,KAAKM,IAAL,GAAYL,UAAUQ,OAA1B,EAAmC;AACjCN,eAAS;AACPK,cAAMR,KAAKQ,IADJ;AAEPb,sBAAc;AAFP,OAAT;;AAKAS;AACA,aAAO,IAAP;AACD;;AAED;AACA;AACA,QAAI,CAACH,UAAUS,SAAV,CAAoBC,IAApB,CAAyB;AAAA,aAAYX,KAAKQ,IAAL,CAAUI,WAAV,GAAwBC,QAAxB,CAAiCC,SAASF,WAAT,EAAjC,CAAZ;AAAA,KAAzB,CAAL,EAAqG;AACnGT,eAAS;AACPK,cAAMR,KAAKQ,IADJ;AAEPb,sBAAc;AAFP,OAAT;;AAKAS;AACA,aAAO,IAAP;AACD;;AAEDD,aAAS;AACPK,YAAMR,KAAKQ,IADJ;AAEPO,iBAAW;AAFJ,KAAT;;AAKA,QAAMC,UAAUf,UAAUgB,aAAV,CAAwBjB,IAAxB,EAA8BK,WAAWrB,IAAX,CAAgBkC,MAA9C,CAAhB;;AAEA,QAAMzD,MAAM,IAAIC,cAAJ,EAAZ;;AAEAD,QAAIE,IAAJ,CAAS,MAAT,EAAiBsC,UAAUkB,aAA3B;AACA1D,QAAIG,gBAAJ,CAAqB,MAArB,EAA6B,YAAM;AACjC,UAAIH,IAAII,MAAJ,IAAc,GAAd,IAAqBJ,IAAII,MAAJ,GAAa,GAAtC,EAA2C;AACzC,YAAMV,OAAO,cAAcM,GAAd,GAAoBA,IAAIR,QAAxB,GAAmCQ,IAAIO,YAApD;AACA,YAAMoD,WAAWnB,UAAUoB,aAAV,CAAwBnD,KAAKC,KAAL,CAAWhB,IAAX,CAAxB,EAA0C6C,IAA1C,CAAjB;AACAG,iBAASiB,QAAT;AACD,OAJD,MAIO;AACL,YAAIzB,eAAelC,IAAIa,UAAvB;AACA,YAAIb,IAAII,MAAJ,KAAe,GAAnB,EAAwB;AACtB8B,0IAAyH,uBAAY2B,iBAAOC,IAAP,CAAYhD,SAASd,IAAIe,iBAAJ,CAAsB,mBAAtB,CAAT,EAAqD,EAArD,CAAZ,CAAZ,CAAzH;AACD;;AAED2B,iBAAS;AACPK,gBAAMR,KAAKQ,IADJ;AAEPb;AAFO,SAAT;AAIA;AACA;AACAS;AACD;AACF,KAnBD;;AAqBA3C,QAAIG,gBAAJ,CAAqB,OAArB,EAA8B,YAAM;AAClC,UAAM+B,eAAe,wBAArB;AACAQ,eAAS;AACPK,cAAMR,KAAKQ,IADJ;AAEPb;AAFO,OAAT;AAIA;AACA;AACA;AACA;AACA;AACA;AACAS;AACD,KAbD;;AAeA3C,QAAI+D,MAAJ,CAAW5D,gBAAX,CAA4B,UAA5B,EAAwC,UAAC6D,GAAD,EAAS;AAC/C,UAAIA,IAAIC,gBAAJ,IAAwBxB,UAA5B,EAAwC;AACtC;AACA;AACAA,mBAAYuB,IAAIE,MAAJ,GAAaF,IAAIG,KAAlB,GAA2B,EAAtC;AACD;AACF,KAND;;AAQAnE,QAAIgB,gBAAJ,CAAqB,kBAArB,EAAyC,OAAzC;AACAhB,QAAIqB,IAAJ,CAASkC,OAAT;;AAEA,WAAOvD,GAAP;AACD,GA3FD;AA4FD","file":"actions.js","sourcesContent":["import moment from 'moment';\nimport _ from './utilities/data';\nimport { transformForSubmit } from './helpers';\nimport { timeFromNow } from './utilities/date';\n\nexport const SET_EDIT_MODE = 'SET_EDIT_MODE';\nexport const SET_DATA = 'SET_DATA';\nexport const SET_VIEWED_PAGES = 'SET_VIEWED_PAGES';\nexport const SET_PRE_SUBMIT = 'SET_PRE_SUBMIT';\nexport const SET_SUBMISSION = 'SET_SUBMISSION';\nexport const SET_SUBMITTED = 'SET_SUBMITTED';\nexport const OPEN_REVIEW_CHAPTER = 'OPEN_REVIEW_CHAPTER';\nexport const CLOSE_REVIEW_CHAPTER = 'CLOSE_REVIEW_CHAPTER';\n\nexport function closeReviewChapter(closedChapter, pageKeys = []) {\n return {\n type: CLOSE_REVIEW_CHAPTER,\n closedChapter,\n pageKeys\n };\n}\n\nexport function openReviewChapter(openedChapter) {\n return {\n type: OPEN_REVIEW_CHAPTER,\n openedChapter\n };\n}\n\nexport function setData(data) {\n return {\n type: SET_DATA,\n data\n };\n}\n\nexport function setEditMode(page, edit, index = null) {\n return {\n type: SET_EDIT_MODE,\n edit,\n page,\n index\n };\n}\n\n// extra is used to pass other information (from a submission error or anything else)\n// into the submission state object\nexport function setSubmission(field, value, extra = null) {\n return {\n type: SET_SUBMISSION,\n field,\n value,\n extra\n };\n}\n\nexport function setPreSubmit(preSubmitField, preSubmitAccepted) {\n return {\n type: SET_PRE_SUBMIT,\n preSubmitField,\n preSubmitAccepted\n };\n}\n\nexport function setSubmitted(response) {\n return {\n type: SET_SUBMITTED,\n response: typeof response.data !== 'undefined' ? response.data : response\n };\n}\n\n\nexport function setViewedPages(pageKeys) {\n return {\n type: SET_VIEWED_PAGES,\n pageKeys\n };\n}\n\nfunction submitToUrl(body, submitUrl, recordEvent) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.open('POST', submitUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n recordEvent({ event: 'form-submit-successful' });\n\n // got this from the fetch polyfill, keeping it to be safe\n const responseBody = 'response' in req ? req.response : req.responseText;\n const results = JSON.parse(responseBody);\n resolve(results);\n } else {\n let error;\n if (req.status === 429) {\n error = new Error(`vets_throttled_error: ${req.statusText}`);\n error.extra = parseInt(req.getResponseHeader('x-ratelimit-reset'), 10);\n } else {\n error = new Error(`vets_server_error: ${req.statusText}`);\n }\n error.statusText = req.statusText;\n reject(error);\n }\n });\n\n req.addEventListener('error', () => {\n const error = new Error('vets_client_error: Network request failed');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('abort', () => {\n const error = new Error('vets_client_error: Request aborted');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('timeout', () => {\n const error = new Error('vets_client_error: Request timed out');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.setRequestHeader('Content-Type', 'application/json');\n\n const userToken = _.get('sessionStorage.userToken', window);\n if (userToken) {\n req.setRequestHeader('Authorization', `Token token=${userToken}`);\n }\n\n req.send(body);\n });\n}\n\nexport function submitForm(formConfig, form) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent.bind(formConfig) :\n console.error.bind(console); // eslint-disable-line no-console\n\n return dispatch => {\n dispatch(setSubmission('status', 'submitPending'));\n recordEvent({ event: 'form-submit-pending' });\n\n let promise;\n if (formConfig.submit) {\n promise = formConfig.submit(form, formConfig);\n } else {\n const body = formConfig.transformForSubmit\n ? formConfig.transformForSubmit(formConfig, form)\n : transformForSubmit(formConfig, form);\n\n promise = submitToUrl(body, formConfig.submitUrl, recordEvent);\n }\n\n return promise\n .then(resp => dispatch(setSubmitted(resp)))\n .catch(errorReceived => {\n // overly cautious\n const error = errorReceived instanceof Error ? errorReceived : new Error(errorReceived);\n const errorMessage = String(error.message);\n let errorType = 'clientError';\n if (errorMessage.startsWith('vets_throttled_error')) {\n errorType = 'throttledError';\n } else if (errorMessage.startsWith('vets_server_error')) {\n errorType = 'serverError';\n }\n recordEvent({ event: 'form-submit-error', error, errorType });\n dispatch(setSubmission('status', errorType, error.extra));\n });\n };\n}\n\nexport function uploadFile(file, uiOptions, onProgress, onChange, onError) {\n return (dispatch, getState) => {\n if (file.size > uiOptions.maxSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too large to be uploaded'\n });\n\n onError();\n return null;\n }\n\n if (file.size < uiOptions.minSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too small to be uploaded'\n });\n\n onError();\n return null;\n }\n\n // we limit file types, but it’s not respected on mobile and desktop\n // users can bypass it without much effort\n if (!uiOptions.fileTypes.some(fileType => file.name.toLowerCase().endsWith(fileType.toLowerCase()))) {\n onChange({\n name: file.name,\n errorMessage: 'File is not one of the allowed types'\n });\n\n onError();\n return null;\n }\n\n onChange({\n name: file.name,\n uploading: true\n });\n\n const payload = uiOptions.createPayload(file, getState().form.formId);\n\n const req = new XMLHttpRequest();\n\n req.open('POST', uiOptions.fileUploadUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n const body = 'response' in req ? req.response : req.responseText;\n const fileData = uiOptions.parseResponse(JSON.parse(body), file);\n onChange(fileData);\n } else {\n let errorMessage = req.statusText;\n if (req.status === 429) {\n errorMessage = `You’ve reached the limit for the number of submissions we can accept at this time. Please try again in ${timeFromNow(moment.unix(parseInt(req.getResponseHeader('x-ratelimit-reset'), 10)))}.`;\n }\n\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${req.statusText}`);\n onError();\n }\n });\n\n req.addEventListener('error', () => {\n const errorMessage = 'Network request failed';\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${errorMessage}`, {\n // extra: {\n // statusText: req.statusText\n // }\n // });\n onError();\n });\n\n req.upload.addEventListener('progress', (evt) => {\n if (evt.lengthComputable && onProgress) {\n // setting this at 80, because there's some time after we get to 100%\n // where the backend is uploading to s3\n onProgress((evt.loaded / evt.total) * 80);\n }\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.send(payload);\n\n return req;\n };\n}\n"]} \ No newline at end of file diff --git a/lib/js/helpers.js b/lib/js/helpers.js index f8bec1d..12b6016 100644 --- a/lib/js/helpers.js +++ b/lib/js/helpers.js @@ -71,7 +71,6 @@ exports.expandArrayPages = expandArrayPages; exports.getPageKeys = getPageKeys; exports.getActiveChapters = getActiveChapters; exports.omitRequired = omitRequired; -exports.recordEvent = recordEvent; var _shouldUpdate = require('recompose/shouldUpdate'); @@ -686,14 +685,4 @@ function omitRequired(schema) { return newSchema; } - -/** - * Helper function for reporting events to Google Analytics. An alias for window.dataLayer.push. - * @module platform/monitoring/record-event - * @see https://developers.google.com/tag-manager/devguide - * @param {object} data - The event data that will be sent to GA. - */ -function recordEvent(data) { - return window.dataLayer && window.dataLayer.push(data); -} //# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/lib/js/helpers.js.map b/lib/js/helpers.js.map index b92fb0b..e083297 100644 --- a/lib/js/helpers.js.map +++ b/lib/js/helpers.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/js/helpers.js"],"names":["isActivePage","getActivePages","getActiveProperties","getInactivePages","createFormPageList","createPageListByChapter","createPageList","createRoutes","formatISOPartialDate","formatReviewDate","parseISODate","filterViewFields","filterInactivePageData","stringifyFormReplacer","isInProgress","transformForSubmit","getArrayFields","hasFieldsOtherThanArray","getNonArraySchema","checkValidSchema","setArrayRecordTouched","createUSAStateLabels","expandArrayPages","getPageKeys","getActiveChapters","omitRequired","recordEvent","page","data","depends","index","Array","isArray","some","condition","undefined","pages","filter","activePages","allProperties","forEach","schema","push","Object","keys","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","map","chapterKey","pageKey","concat","formPages","introduction","path","urlPrefix","routes","component","FormPage","pageConfig","ReviewPage","confirmation","onEnter","nextState","replace","formatDayMonth","val","dayOrMonth","toString","Number","length","formatYear","month","day","year","dateString","monthYear","split","newData","nextProp","field","newArray","item","startsWith","inactivePages","form","activeProperties","formData","currentData","prop","includes","key","value","country","street","city","postalCode","zipcode","fields","every","widget","id","confirmationCode","file","newValues","v","pathName","trimmedPathname","endsWith","replacer","withoutInactivePages","withoutViewFields","JSON","stringify","isHiddenField","findArrays","obj","ui","type","definitions","uiSchema","$ref","newProperties","current","next","newSchema","required","newRequired","pureWithDeepEquals","props","nextProps","errors","join","propName","items","additionalItems","Error","prefix","states","USA","label","generateArrayPages","arrayPages","arrayPath","itemFilter","result","acc","nextPage","lastArrayPath","currentList","showPagePerItem","newList","eligiblePageList","expandedPageList","p","window","dataLayer"],"mappings":"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","file":"helpers.js","sourcesContent":["import _ from 'lodash/fp';\nimport shouldUpdate from 'recompose/shouldUpdate';\nimport { deepEquals } from '@department-of-veterans-affairs/react-jsonschema-form/lib/utils';\n\nimport FormPage from './containers/FormPage';\nimport ReviewPage from './review/ReviewPage';\n\n// An active page is one that will be shown to the user.\n// Pages become inactive if they are conditionally shown based\n// on answers to previous questions.\nexport function isActivePage(page, data) {\n if (typeof page.depends === 'function') {\n return page.depends(data, page.index);\n }\n\n if (Array.isArray(page.depends)) {\n return page.depends.some(condition => _.matches(condition)(data));\n }\n\n return page.depends === undefined || _.matches(page.depends)(data);\n}\n\nexport function getActivePages(pages, data) {\n return pages.filter(page => isActivePage(page, data));\n}\n\nexport function getActiveProperties(activePages) {\n const allProperties = [];\n activePages.forEach(page => {\n if (page.schema) {\n allProperties.push(...Object.keys(page.schema.properties));\n }\n });\n return _.uniq(allProperties);\n}\n\nexport function getInactivePages(pages, data) {\n return pages.filter(page => !isActivePage(page, data));\n}\n\nexport function createFormPageList(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((pageList, chapter) => {\n const chapterTitle = formConfig.chapters[chapter].title;\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n chapterTitle,\n chapterKey: chapter,\n pageKey: page\n });\n });\n return pageList.concat(pages);\n }, []);\n}\n\nexport function createPageListByChapter(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((chapters, chapter) => {\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n pageKey: page,\n chapterKey: chapter\n });\n });\n return _.set(chapter, pages, chapters);\n }, {});\n}\n\nexport function createPageList(formConfig, formPages) {\n let pageList = formPages;\n if (formConfig.introduction) {\n pageList = [\n {\n pageKey: 'introduction',\n path: 'introduction'\n }\n ].concat(pageList);\n }\n\n return pageList\n .concat([\n {\n pageKey: 'review-and-submit',\n path: 'review-and-submit',\n chapterKey: 'review'\n }\n ])\n .map(page => {\n return _.set('path', `${formConfig.urlPrefix || ''}${page.path}`, page);\n });\n}\n\n/*\n * Create the routes based on a form config. This goes through each chapter in a form\n * config, pulls out the config for each page, then generates a list of Route components with the\n * config as props\n */\nexport function createRoutes(formConfig) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n let routes = formPages\n .map(page => {\n return {\n path: page.path,\n component: page.component || FormPage,\n pageConfig: page,\n pageList,\n urlPrefix: formConfig.urlPrefix\n };\n });\n if (formConfig.introduction) {\n routes = [\n {\n path: 'introduction',\n component: formConfig.introduction,\n formConfig,\n pageList\n }\n ].concat(routes);\n }\n\n return routes.concat([\n {\n path: 'review-and-submit',\n formConfig,\n component: ReviewPage,\n pageList\n },\n {\n path: 'confirmation',\n component: formConfig.confirmation\n },\n {\n path: '*',\n onEnter: (nextState, replace) => replace(formConfig.urlPrefix || '/')\n }\n ]);\n}\n\nfunction formatDayMonth(val) {\n if (val) {\n const dayOrMonth = val.toString();\n if (Number(dayOrMonth) && dayOrMonth.length === 1) {\n return `0${val}`;\n } else if (Number(dayOrMonth)) {\n return dayOrMonth;\n }\n }\n\n return 'XX';\n}\n\nfunction formatYear(val) {\n if (!val || !val.length) {\n return 'XXXX';\n }\n\n return val;\n}\n\nexport function formatISOPartialDate({ month, day, year }) {\n if (month || day || year) {\n return `${formatYear(year)}-${formatDayMonth(month)}-${formatDayMonth(day)}`;\n }\n\n return undefined;\n}\n\nexport function formatReviewDate(dateString, monthYear = false) {\n if (dateString) {\n const [year, month, day] = dateString.split('-', 3);\n\n return monthYear\n ? `${formatDayMonth(month)}/${formatYear(year)}`\n : `${formatDayMonth(month)}/${formatDayMonth(day)}/${formatYear(year)}`;\n }\n\n return undefined;\n}\nexport function parseISODate(dateString) {\n if (typeof dateString === 'string') {\n const [year, month, day] = dateString.split('-', 3);\n\n return {\n month: month === 'XX' ? '' : Number(month).toString(),\n day: day === 'XX' ? '' : Number(day).toString(),\n year: year === 'XXXX' ? '' : year\n };\n }\n\n return {\n month: '',\n day: '',\n year: ''\n };\n}\n\n/*\n * Removes 'view:' fields from data object\n */\nexport function filterViewFields(data) {\n return Object.keys(data).reduce((newData, nextProp) => {\n const field = data[nextProp];\n\n if (Array.isArray(field)) {\n const newArray = field.map((item) => filterViewFields(item));\n\n return _.set(nextProp, newArray, newData);\n }\n\n if (typeof field === 'object') {\n if (nextProp.startsWith('view:')) {\n return _.assign(newData, filterViewFields(field));\n }\n return _.set(nextProp, filterViewFields(field), newData);\n }\n\n if (!nextProp.startsWith('view:')) {\n return _.set(nextProp, field, newData);\n }\n\n return newData;\n }, {});\n}\n\nexport function filterInactivePageData(inactivePages, activePages, form) {\n const activeProperties = getActiveProperties(activePages);\n let newData;\n\n return inactivePages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n newData = currentData;\n if (!activeProperties.includes(prop)) {\n delete newData[prop];\n }\n return newData;\n }, formData);\n }, form.data);\n}\n\nexport function stringifyFormReplacer(key, value) {\n // an object with country is an address\n if (value && typeof value.country !== 'undefined' &&\n (!value.street || !value.city || (!value.postalCode && !value.zipcode))) {\n return undefined;\n }\n\n // clean up empty objects, which we have no reason to send\n if (typeof value === 'object') {\n const fields = Object.keys(value);\n if (fields.length === 0 || fields.every(field => value[field] === undefined)) {\n return undefined;\n }\n\n // autosuggest widgets save value and label info, but we should just return the value\n if (value.widget === 'autosuggest') {\n return value.id;\n }\n\n // Exclude file data\n if (value.confirmationCode && value.file) {\n return _.omit('file', value);\n }\n }\n\n // Clean up empty objects in arrays\n if (Array.isArray(value)) {\n const newValues = value.filter(v => !!stringifyFormReplacer(key, v));\n // If every item in the array is cleared, remove the whole array\n return newValues.length > 0 ? newValues : undefined;\n }\n\n return value;\n}\n\nexport function isInProgress(pathName) {\n const trimmedPathname = pathName.replace(/\\/$/, '');\n return !(\n trimmedPathname.endsWith('introduction')\n || trimmedPathname.endsWith('confirmation')\n || trimmedPathname.endsWith('form-saved')\n || trimmedPathname.endsWith('error')\n );\n}\n\n/*\n * Normal transform for schemaform data\n */\nexport function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) {\n const activePages = getActivePages(createFormPageList(formConfig), form.data);\n const inactivePages = getInactivePages(createFormPageList(formConfig), form.data);\n const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form);\n const withoutViewFields = filterViewFields(withoutInactivePages);\n\n return JSON.stringify(withoutViewFields, replacer) || '{}';\n}\n\nfunction isHiddenField(schema) {\n return !!schema['ui:collapsed'] || !!schema['ui:hidden'];\n}\n\n/*\n * Pull the array fields from a schema. Used to separate out array fields\n * from the rest of page to be displayed on the review page\n */\nexport function getArrayFields(data) {\n const fields = [];\n const findArrays = (obj, ui, path = []) => {\n if (obj.type === 'array' && !isHiddenField(obj) && !_.get('ui:options.keepInPageOnReview', ui)) {\n fields.push({\n path,\n schema: _.set('definitions', data.schema.definitions, obj),\n uiSchema: _.get(path, data.uiSchema) || data.uiSchema\n });\n }\n\n if (obj.type === 'object' && !isHiddenField(obj)) {\n Object.keys(obj.properties).forEach(prop => {\n findArrays(obj.properties[prop], ui[prop], path.concat(prop));\n });\n }\n };\n\n findArrays(data.schema, data.uiSchema);\n\n return fields;\n}\n\n/*\n * Checks to see if there are non array fields in a page schema, so that\n * we don’t show a blank page header on the review page if a page is just\n * a growable table\n */\nexport function hasFieldsOtherThanArray(schema) {\n if (schema.$ref || (schema.type !== 'object' && schema.type !== 'array')) {\n return true;\n }\n\n if (schema.type === 'object') {\n return Object.keys(schema.properties).some(nextProp => {\n return hasFieldsOtherThanArray(schema.properties[nextProp]);\n });\n }\n\n return false;\n}\n\n/*\n * Return a schema without array fields. If the schema has only array fields,\n * then return undefined (because there’s no reason to use an object schema with\n * no properties)\n */\nexport function getNonArraySchema(schema, uiSchema = {}) {\n if (schema.type === 'array' && !_.get('ui:options.keepInPageOnReview', uiSchema)) {\n return undefined;\n }\n\n if (schema.type === 'object') {\n const newProperties = Object.keys(schema.properties).reduce((current, next) => {\n const newSchema = getNonArraySchema(schema.properties[next], uiSchema[next]);\n\n if (typeof newSchema === 'undefined') {\n return _.unset(next, current);\n }\n\n if (newSchema !== schema.properties[next]) {\n return _.set(next, newSchema, current);\n }\n\n return current;\n }, schema.properties);\n\n if (Object.keys(newProperties).length === 0) {\n return undefined;\n }\n\n if (newProperties !== schema.properties) {\n let newSchema = _.set('properties', newProperties, schema);\n if (newSchema.required) {\n const newRequired = _.intersection(Object.keys(newSchema.properties), newSchema.required);\n if (newRequired.length !== newSchema.required.length) {\n newSchema = _.set('required', newRequired, newSchema);\n }\n }\n\n return newSchema;\n }\n }\n\n return schema;\n}\n\n\nexport const pureWithDeepEquals = shouldUpdate((props, nextProps) => {\n return !deepEquals(props, nextProps);\n});\n\n/**\n * Recursively checks to see if the schema is valid.\n *\n * Note: This only returns true. If the schema is invalid, an error is thrown to\n * stop everything.\n *\n * @param {Object} schema - The schema in question\n * @return {bool} - true if we succeed\n * @throws {Error} - If the schema is invalid\n */\nexport function checkValidSchema(schema, errors = [], path = ['root']) {\n if (typeof schema.type !== 'string') {\n errors.push(`Missing type in ${path.join('.')} schema.`);\n }\n\n if (schema.type === 'object') {\n if (typeof schema.properties !== 'object') {\n errors.push(`Missing object properties in ${path.join('.')} schema.`);\n } else {\n Object.keys(schema.properties).forEach((propName) => {\n checkValidSchema(schema.properties[propName], errors, [...path, propName]);\n });\n }\n }\n\n if (schema.type === 'array') {\n // We check this both before items is turned into additionalItems and after,\n // so we need to account for it being both an object and an array.\n if (Array.isArray(schema.items)) {\n if (!schema.additionalItems) {\n errors.push(`${path.join('.')} should contain additionalItems when items is an array.`);\n }\n schema.items.forEach((item, index) => {\n checkValidSchema(item, errors, [...path, 'items', index]);\n });\n } else if (typeof schema.items === 'object') {\n if (schema.additionalItems) {\n errors.push(`${path.join('.')} should not contain additionalItems when items is an object.`);\n }\n checkValidSchema(schema.items, errors, [...path, 'items']);\n } else {\n errors.push(`Missing items schema in ${path.join('.')}.`);\n }\n\n // Check additionalItems\n if (schema.additionalItems) {\n checkValidSchema(schema.additionalItems, errors, [...path, 'additionalItems']);\n }\n }\n\n // We’ve recursed all the way back down to ['root']; throw an error containing\n // all the error messages.\n if (path.length === 1 && errors.length > 0) {\n // console.log(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')} -- ${path.join('.')}`);\n throw new Error(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')}`);\n } else {\n return true;\n }\n}\n\nexport function setArrayRecordTouched(prefix, index) {\n return { [`${prefix}_${index}`]: true };\n}\n\nexport function createUSAStateLabels(states) {\n return states.USA.reduce((current, { label, value }) => {\n return _.merge(current, { [value]: label });\n }, {});\n}\n\n/*\n * Take a list of pages and create versions of them\n * for each item in an array\n */\nfunction generateArrayPages(arrayPages, data) {\n const items = _.get(arrayPages[0].arrayPath, data) || [];\n return items\n .reduce((pages, item, index) =>\n pages.concat(arrayPages.map(page =>\n _.assign(page, {\n path: page.path.replace(':index', index),\n index\n })\n )),\n []\n )\n // doing this after the map so that we don’t change indexes\n .filter(page => !page.itemFilter || page.itemFilter(items[page.index]));\n}\n\n/*\n * We want to generate the pages we need for each item in the array\n * being used by an array page. We also want to group those pages by item.\n * So, this grabs contiguous sections of array pages and at the end generates\n * the right number of pages based on the items in the array\n */\nexport function expandArrayPages(pageList, data) {\n const result = pageList.reduce((acc, nextPage) => {\n const { lastArrayPath, arrayPages, currentList } = acc;\n // If we see an array page and we’re starting a section or in the middle of one, just add it\n // to the temporary array\n if (nextPage.showPagePerItem && (!lastArrayPath || nextPage.arrayPath === lastArrayPath)) {\n arrayPages.push(nextPage);\n return acc;\n // Now we’ve hit the end of a section of array pages using the same array, so\n // actually generate the pages now\n } else if (nextPage.arrayPath !== lastArrayPath && !!arrayPages.length) {\n const newList = currentList.concat(generateArrayPages(arrayPages, data), nextPage);\n return _.assign(acc, {\n lastArrayPath: null,\n arrayPages: [],\n currentList: newList\n });\n }\n\n return _.set('currentList', currentList.concat(nextPage), acc);\n }, { lastArrayPath: null, arrayPages: [], currentList: [] });\n\n if (result.arrayPages.length > 0) {\n return result.currentList.concat(generateArrayPages(result.arrayPages, data));\n }\n\n return result.currentList;\n}\n\n/**\n * getPageKeys returns a list of keys for the currently active pages\n *\n * @param pages {Array} List of page configs\n * @param formData {Object} Current form data\n * @returns {Array} A list of page keys from the page config\n * and the index if it’s a pagePerItem page\n */\nexport function getPageKeys(pages, formData) {\n const eligiblePageList = getActivePages(pages, formData);\n const expandedPageList = expandArrayPages(eligiblePageList, formData);\n\n return expandedPageList.map(page => {\n let pageKey = page.pageKey;\n if (typeof page.index !== 'undefined') {\n pageKey += page.index;\n }\n return pageKey;\n });\n}\n\n/**\n * getActiveChapters returns the list of chapter keys with active pages\n *\n * @param formConfig {Object} The form config object\n * @param formData {Object} The current form data\n * @returns {Array} The list of chapter key strings for active chapters\n */\nexport function getActiveChapters(formConfig, formData) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n const eligiblePageList = getActivePages(pageList, formData);\n const expandedPageList = expandArrayPages(eligiblePageList, formData);\n\n return _.uniq(expandedPageList.map(p => p.chapterKey).filter(key => !!key && key !== 'review'));\n}\n\n/**\n * Returns the schema, omitting all `required` arrays.\n *\n * @param schema {Object}\n * @returns {Object} The schema without any `required` arrays\n */\nexport function omitRequired(schema) {\n if (typeof schema !== 'object' || Array.isArray(schema)) {\n return schema;\n }\n\n const newSchema = _.omit('required', schema);\n Object.keys(newSchema).forEach(key => {\n newSchema[key] = omitRequired(newSchema[key]);\n });\n\n return newSchema;\n}\n\n/**\n * Helper function for reporting events to Google Analytics. An alias for window.dataLayer.push.\n * @module platform/monitoring/record-event\n * @see https://developers.google.com/tag-manager/devguide\n * @param {object} data - The event data that will be sent to GA.\n */\nexport function recordEvent(data) {\n return window.dataLayer && window.dataLayer.push(data);\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/js/helpers.js"],"names":["isActivePage","getActivePages","getActiveProperties","getInactivePages","createFormPageList","createPageListByChapter","createPageList","createRoutes","formatISOPartialDate","formatReviewDate","parseISODate","filterViewFields","filterInactivePageData","stringifyFormReplacer","isInProgress","transformForSubmit","getArrayFields","hasFieldsOtherThanArray","getNonArraySchema","checkValidSchema","setArrayRecordTouched","createUSAStateLabels","expandArrayPages","getPageKeys","getActiveChapters","omitRequired","page","data","depends","index","Array","isArray","some","condition","undefined","pages","filter","activePages","allProperties","forEach","schema","push","Object","keys","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","map","chapterKey","pageKey","concat","formPages","introduction","path","urlPrefix","routes","component","FormPage","pageConfig","ReviewPage","confirmation","onEnter","nextState","replace","formatDayMonth","val","dayOrMonth","toString","Number","length","formatYear","month","day","year","dateString","monthYear","split","newData","nextProp","field","newArray","item","startsWith","inactivePages","form","activeProperties","formData","currentData","prop","includes","key","value","country","street","city","postalCode","zipcode","fields","every","widget","id","confirmationCode","file","newValues","v","pathName","trimmedPathname","endsWith","replacer","withoutInactivePages","withoutViewFields","JSON","stringify","isHiddenField","findArrays","obj","ui","type","definitions","uiSchema","$ref","newProperties","current","next","newSchema","required","newRequired","pureWithDeepEquals","props","nextProps","errors","join","propName","items","additionalItems","Error","prefix","states","USA","label","generateArrayPages","arrayPages","arrayPath","itemFilter","result","acc","nextPage","lastArrayPath","currentList","showPagePerItem","newList","eligiblePageList","expandedPageList","p"],"mappings":"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","file":"helpers.js","sourcesContent":["import _ from 'lodash/fp';\nimport shouldUpdate from 'recompose/shouldUpdate';\nimport { deepEquals } from '@department-of-veterans-affairs/react-jsonschema-form/lib/utils';\n\nimport FormPage from './containers/FormPage';\nimport ReviewPage from './review/ReviewPage';\n\n// An active page is one that will be shown to the user.\n// Pages become inactive if they are conditionally shown based\n// on answers to previous questions.\nexport function isActivePage(page, data) {\n if (typeof page.depends === 'function') {\n return page.depends(data, page.index);\n }\n\n if (Array.isArray(page.depends)) {\n return page.depends.some(condition => _.matches(condition)(data));\n }\n\n return page.depends === undefined || _.matches(page.depends)(data);\n}\n\nexport function getActivePages(pages, data) {\n return pages.filter(page => isActivePage(page, data));\n}\n\nexport function getActiveProperties(activePages) {\n const allProperties = [];\n activePages.forEach(page => {\n if (page.schema) {\n allProperties.push(...Object.keys(page.schema.properties));\n }\n });\n return _.uniq(allProperties);\n}\n\nexport function getInactivePages(pages, data) {\n return pages.filter(page => !isActivePage(page, data));\n}\n\nexport function createFormPageList(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((pageList, chapter) => {\n const chapterTitle = formConfig.chapters[chapter].title;\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n chapterTitle,\n chapterKey: chapter,\n pageKey: page\n });\n });\n return pageList.concat(pages);\n }, []);\n}\n\nexport function createPageListByChapter(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((chapters, chapter) => {\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n pageKey: page,\n chapterKey: chapter\n });\n });\n return _.set(chapter, pages, chapters);\n }, {});\n}\n\nexport function createPageList(formConfig, formPages) {\n let pageList = formPages;\n if (formConfig.introduction) {\n pageList = [\n {\n pageKey: 'introduction',\n path: 'introduction'\n }\n ].concat(pageList);\n }\n\n return pageList\n .concat([\n {\n pageKey: 'review-and-submit',\n path: 'review-and-submit',\n chapterKey: 'review'\n }\n ])\n .map(page => {\n return _.set('path', `${formConfig.urlPrefix || ''}${page.path}`, page);\n });\n}\n\n/*\n * Create the routes based on a form config. This goes through each chapter in a form\n * config, pulls out the config for each page, then generates a list of Route components with the\n * config as props\n */\nexport function createRoutes(formConfig) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n let routes = formPages\n .map(page => {\n return {\n path: page.path,\n component: page.component || FormPage,\n pageConfig: page,\n pageList,\n urlPrefix: formConfig.urlPrefix\n };\n });\n if (formConfig.introduction) {\n routes = [\n {\n path: 'introduction',\n component: formConfig.introduction,\n formConfig,\n pageList\n }\n ].concat(routes);\n }\n\n return routes.concat([\n {\n path: 'review-and-submit',\n formConfig,\n component: ReviewPage,\n pageList\n },\n {\n path: 'confirmation',\n component: formConfig.confirmation\n },\n {\n path: '*',\n onEnter: (nextState, replace) => replace(formConfig.urlPrefix || '/')\n }\n ]);\n}\n\nfunction formatDayMonth(val) {\n if (val) {\n const dayOrMonth = val.toString();\n if (Number(dayOrMonth) && dayOrMonth.length === 1) {\n return `0${val}`;\n } else if (Number(dayOrMonth)) {\n return dayOrMonth;\n }\n }\n\n return 'XX';\n}\n\nfunction formatYear(val) {\n if (!val || !val.length) {\n return 'XXXX';\n }\n\n return val;\n}\n\nexport function formatISOPartialDate({ month, day, year }) {\n if (month || day || year) {\n return `${formatYear(year)}-${formatDayMonth(month)}-${formatDayMonth(day)}`;\n }\n\n return undefined;\n}\n\nexport function formatReviewDate(dateString, monthYear = false) {\n if (dateString) {\n const [year, month, day] = dateString.split('-', 3);\n\n return monthYear\n ? `${formatDayMonth(month)}/${formatYear(year)}`\n : `${formatDayMonth(month)}/${formatDayMonth(day)}/${formatYear(year)}`;\n }\n\n return undefined;\n}\nexport function parseISODate(dateString) {\n if (typeof dateString === 'string') {\n const [year, month, day] = dateString.split('-', 3);\n\n return {\n month: month === 'XX' ? '' : Number(month).toString(),\n day: day === 'XX' ? '' : Number(day).toString(),\n year: year === 'XXXX' ? '' : year\n };\n }\n\n return {\n month: '',\n day: '',\n year: ''\n };\n}\n\n/*\n * Removes 'view:' fields from data object\n */\nexport function filterViewFields(data) {\n return Object.keys(data).reduce((newData, nextProp) => {\n const field = data[nextProp];\n\n if (Array.isArray(field)) {\n const newArray = field.map((item) => filterViewFields(item));\n\n return _.set(nextProp, newArray, newData);\n }\n\n if (typeof field === 'object') {\n if (nextProp.startsWith('view:')) {\n return _.assign(newData, filterViewFields(field));\n }\n return _.set(nextProp, filterViewFields(field), newData);\n }\n\n if (!nextProp.startsWith('view:')) {\n return _.set(nextProp, field, newData);\n }\n\n return newData;\n }, {});\n}\n\nexport function filterInactivePageData(inactivePages, activePages, form) {\n const activeProperties = getActiveProperties(activePages);\n let newData;\n\n return inactivePages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n newData = currentData;\n if (!activeProperties.includes(prop)) {\n delete newData[prop];\n }\n return newData;\n }, formData);\n }, form.data);\n}\n\nexport function stringifyFormReplacer(key, value) {\n // an object with country is an address\n if (value && typeof value.country !== 'undefined' &&\n (!value.street || !value.city || (!value.postalCode && !value.zipcode))) {\n return undefined;\n }\n\n // clean up empty objects, which we have no reason to send\n if (typeof value === 'object') {\n const fields = Object.keys(value);\n if (fields.length === 0 || fields.every(field => value[field] === undefined)) {\n return undefined;\n }\n\n // autosuggest widgets save value and label info, but we should just return the value\n if (value.widget === 'autosuggest') {\n return value.id;\n }\n\n // Exclude file data\n if (value.confirmationCode && value.file) {\n return _.omit('file', value);\n }\n }\n\n // Clean up empty objects in arrays\n if (Array.isArray(value)) {\n const newValues = value.filter(v => !!stringifyFormReplacer(key, v));\n // If every item in the array is cleared, remove the whole array\n return newValues.length > 0 ? newValues : undefined;\n }\n\n return value;\n}\n\nexport function isInProgress(pathName) {\n const trimmedPathname = pathName.replace(/\\/$/, '');\n return !(\n trimmedPathname.endsWith('introduction')\n || trimmedPathname.endsWith('confirmation')\n || trimmedPathname.endsWith('form-saved')\n || trimmedPathname.endsWith('error')\n );\n}\n\n/*\n * Normal transform for schemaform data\n */\nexport function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) {\n const activePages = getActivePages(createFormPageList(formConfig), form.data);\n const inactivePages = getInactivePages(createFormPageList(formConfig), form.data);\n const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form);\n const withoutViewFields = filterViewFields(withoutInactivePages);\n\n return JSON.stringify(withoutViewFields, replacer) || '{}';\n}\n\nfunction isHiddenField(schema) {\n return !!schema['ui:collapsed'] || !!schema['ui:hidden'];\n}\n\n/*\n * Pull the array fields from a schema. Used to separate out array fields\n * from the rest of page to be displayed on the review page\n */\nexport function getArrayFields(data) {\n const fields = [];\n const findArrays = (obj, ui, path = []) => {\n if (obj.type === 'array' && !isHiddenField(obj) && !_.get('ui:options.keepInPageOnReview', ui)) {\n fields.push({\n path,\n schema: _.set('definitions', data.schema.definitions, obj),\n uiSchema: _.get(path, data.uiSchema) || data.uiSchema\n });\n }\n\n if (obj.type === 'object' && !isHiddenField(obj)) {\n Object.keys(obj.properties).forEach(prop => {\n findArrays(obj.properties[prop], ui[prop], path.concat(prop));\n });\n }\n };\n\n findArrays(data.schema, data.uiSchema);\n\n return fields;\n}\n\n/*\n * Checks to see if there are non array fields in a page schema, so that\n * we don’t show a blank page header on the review page if a page is just\n * a growable table\n */\nexport function hasFieldsOtherThanArray(schema) {\n if (schema.$ref || (schema.type !== 'object' && schema.type !== 'array')) {\n return true;\n }\n\n if (schema.type === 'object') {\n return Object.keys(schema.properties).some(nextProp => {\n return hasFieldsOtherThanArray(schema.properties[nextProp]);\n });\n }\n\n return false;\n}\n\n/*\n * Return a schema without array fields. If the schema has only array fields,\n * then return undefined (because there’s no reason to use an object schema with\n * no properties)\n */\nexport function getNonArraySchema(schema, uiSchema = {}) {\n if (schema.type === 'array' && !_.get('ui:options.keepInPageOnReview', uiSchema)) {\n return undefined;\n }\n\n if (schema.type === 'object') {\n const newProperties = Object.keys(schema.properties).reduce((current, next) => {\n const newSchema = getNonArraySchema(schema.properties[next], uiSchema[next]);\n\n if (typeof newSchema === 'undefined') {\n return _.unset(next, current);\n }\n\n if (newSchema !== schema.properties[next]) {\n return _.set(next, newSchema, current);\n }\n\n return current;\n }, schema.properties);\n\n if (Object.keys(newProperties).length === 0) {\n return undefined;\n }\n\n if (newProperties !== schema.properties) {\n let newSchema = _.set('properties', newProperties, schema);\n if (newSchema.required) {\n const newRequired = _.intersection(Object.keys(newSchema.properties), newSchema.required);\n if (newRequired.length !== newSchema.required.length) {\n newSchema = _.set('required', newRequired, newSchema);\n }\n }\n\n return newSchema;\n }\n }\n\n return schema;\n}\n\n\nexport const pureWithDeepEquals = shouldUpdate((props, nextProps) => {\n return !deepEquals(props, nextProps);\n});\n\n/**\n * Recursively checks to see if the schema is valid.\n *\n * Note: This only returns true. If the schema is invalid, an error is thrown to\n * stop everything.\n *\n * @param {Object} schema - The schema in question\n * @return {bool} - true if we succeed\n * @throws {Error} - If the schema is invalid\n */\nexport function checkValidSchema(schema, errors = [], path = ['root']) {\n if (typeof schema.type !== 'string') {\n errors.push(`Missing type in ${path.join('.')} schema.`);\n }\n\n if (schema.type === 'object') {\n if (typeof schema.properties !== 'object') {\n errors.push(`Missing object properties in ${path.join('.')} schema.`);\n } else {\n Object.keys(schema.properties).forEach((propName) => {\n checkValidSchema(schema.properties[propName], errors, [...path, propName]);\n });\n }\n }\n\n if (schema.type === 'array') {\n // We check this both before items is turned into additionalItems and after,\n // so we need to account for it being both an object and an array.\n if (Array.isArray(schema.items)) {\n if (!schema.additionalItems) {\n errors.push(`${path.join('.')} should contain additionalItems when items is an array.`);\n }\n schema.items.forEach((item, index) => {\n checkValidSchema(item, errors, [...path, 'items', index]);\n });\n } else if (typeof schema.items === 'object') {\n if (schema.additionalItems) {\n errors.push(`${path.join('.')} should not contain additionalItems when items is an object.`);\n }\n checkValidSchema(schema.items, errors, [...path, 'items']);\n } else {\n errors.push(`Missing items schema in ${path.join('.')}.`);\n }\n\n // Check additionalItems\n if (schema.additionalItems) {\n checkValidSchema(schema.additionalItems, errors, [...path, 'additionalItems']);\n }\n }\n\n // We’ve recursed all the way back down to ['root']; throw an error containing\n // all the error messages.\n if (path.length === 1 && errors.length > 0) {\n // console.log(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')} -- ${path.join('.')}`);\n throw new Error(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')}`);\n } else {\n return true;\n }\n}\n\nexport function setArrayRecordTouched(prefix, index) {\n return { [`${prefix}_${index}`]: true };\n}\n\nexport function createUSAStateLabels(states) {\n return states.USA.reduce((current, { label, value }) => {\n return _.merge(current, { [value]: label });\n }, {});\n}\n\n/*\n * Take a list of pages and create versions of them\n * for each item in an array\n */\nfunction generateArrayPages(arrayPages, data) {\n const items = _.get(arrayPages[0].arrayPath, data) || [];\n return items\n .reduce((pages, item, index) =>\n pages.concat(arrayPages.map(page =>\n _.assign(page, {\n path: page.path.replace(':index', index),\n index\n })\n )),\n []\n )\n // doing this after the map so that we don’t change indexes\n .filter(page => !page.itemFilter || page.itemFilter(items[page.index]));\n}\n\n/*\n * We want to generate the pages we need for each item in the array\n * being used by an array page. We also want to group those pages by item.\n * So, this grabs contiguous sections of array pages and at the end generates\n * the right number of pages based on the items in the array\n */\nexport function expandArrayPages(pageList, data) {\n const result = pageList.reduce((acc, nextPage) => {\n const { lastArrayPath, arrayPages, currentList } = acc;\n // If we see an array page and we’re starting a section or in the middle of one, just add it\n // to the temporary array\n if (nextPage.showPagePerItem && (!lastArrayPath || nextPage.arrayPath === lastArrayPath)) {\n arrayPages.push(nextPage);\n return acc;\n // Now we’ve hit the end of a section of array pages using the same array, so\n // actually generate the pages now\n } else if (nextPage.arrayPath !== lastArrayPath && !!arrayPages.length) {\n const newList = currentList.concat(generateArrayPages(arrayPages, data), nextPage);\n return _.assign(acc, {\n lastArrayPath: null,\n arrayPages: [],\n currentList: newList\n });\n }\n\n return _.set('currentList', currentList.concat(nextPage), acc);\n }, { lastArrayPath: null, arrayPages: [], currentList: [] });\n\n if (result.arrayPages.length > 0) {\n return result.currentList.concat(generateArrayPages(result.arrayPages, data));\n }\n\n return result.currentList;\n}\n\n/**\n * getPageKeys returns a list of keys for the currently active pages\n *\n * @param pages {Array} List of page configs\n * @param formData {Object} Current form data\n * @returns {Array} A list of page keys from the page config\n * and the index if it’s a pagePerItem page\n */\nexport function getPageKeys(pages, formData) {\n const eligiblePageList = getActivePages(pages, formData);\n const expandedPageList = expandArrayPages(eligiblePageList, formData);\n\n return expandedPageList.map(page => {\n let pageKey = page.pageKey;\n if (typeof page.index !== 'undefined') {\n pageKey += page.index;\n }\n return pageKey;\n });\n}\n\n/**\n * getActiveChapters returns the list of chapter keys with active pages\n *\n * @param formConfig {Object} The form config object\n * @param formData {Object} The current form data\n * @returns {Array} The list of chapter key strings for active chapters\n */\nexport function getActiveChapters(formConfig, formData) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n const eligiblePageList = getActivePages(pageList, formData);\n const expandedPageList = expandArrayPages(eligiblePageList, formData);\n\n return _.uniq(expandedPageList.map(p => p.chapterKey).filter(key => !!key && key !== 'review'));\n}\n\n/**\n * Returns the schema, omitting all `required` arrays.\n *\n * @param schema {Object}\n * @returns {Object} The schema without any `required` arrays\n */\nexport function omitRequired(schema) {\n if (typeof schema !== 'object' || Array.isArray(schema)) {\n return schema;\n }\n\n const newSchema = _.omit('required', schema);\n Object.keys(newSchema).forEach(key => {\n newSchema[key] = omitRequired(newSchema[key]);\n });\n\n return newSchema;\n}\n"]} \ No newline at end of file diff --git a/lib/js/review/SubmitController.js b/lib/js/review/SubmitController.js index d7aefbc..689efbd 100644 --- a/lib/js/review/SubmitController.js +++ b/lib/js/review/SubmitController.js @@ -13,10 +13,6 @@ var _react = require('react'); var _react2 = _interopRequireDefault(_react); -var _ravenJs = require('raven-js'); - -var _ravenJs2 = _interopRequireDefault(_ravenJs); - var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); @@ -84,8 +80,7 @@ var SubmitController = function (_React$Component) { var _this$props2 = _this.props, form = _this$props2.form, formConfig = _this$props2.formConfig, - pagesByChapter = _this$props2.pagesByChapter, - trackingPrefix = _this$props2.trackingPrefix; + pagesByChapter = _this$props2.pagesByChapter; // If a pre-submit agreement is required, make sure it was accepted @@ -104,15 +99,9 @@ var SubmitController = function (_React$Component) { errors = _isValidForm.errors; if (!isValid) { - (0, _helpers.recordEvent)({ - event: trackingPrefix + '-validation-failed' - }); - _ravenJs2.default.captureMessage('Validation issue not displayed', { - extra: { - errors: errors, - prefix: trackingPrefix - } - }); + var recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : console.error.bind(console); // eslint-disable-line no-console + + recordEvent({ event: 'validation-failed-on-submit', errors: errors }); _this.props.setSubmission('status', 'validationError'); _this.props.setSubmission('hasAttemptedSubmit', true); return; @@ -177,7 +166,6 @@ function mapStateToProps(state, ownProps) { var form = state.form; var pagesByChapter = (0, _helpers.createPageListByChapter)(formConfig); - var trackingPrefix = formConfig.trackingPrefix; var submission = form.submission; var showPreSubmitError = submission.hasAttemptedSubmit; @@ -189,8 +177,7 @@ function mapStateToProps(state, ownProps) { renderErrorMessage: renderErrorMessage, router: router, submission: submission, - showPreSubmitError: showPreSubmitError, - trackingPrefix: trackingPrefix + showPreSubmitError: showPreSubmitError }; } diff --git a/lib/js/review/SubmitController.js.map b/lib/js/review/SubmitController.js.map index 08b346d..bf0fb2f 100644 --- a/lib/js/review/SubmitController.js.map +++ b/lib/js/review/SubmitController.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","eligiblePageList","data","expandedPageList","push","length","path","handleSubmit","pagesByChapter","trackingPrefix","preSubmit","setSubmission","isValid","errors","event","Raven","captureMessage","extra","prefix","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func","string"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport Raven from 'raven-js';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActivePages,\n recordEvent\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const eligiblePageList = getActivePages(pageList, form.data);\n const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter,\n trackingPrefix\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n recordEvent({\n event: `${trackingPrefix}-validation-failed`,\n });\n Raven.captureMessage('Validation issue not displayed', {\n extra: {\n errors,\n prefix: trackingPrefix\n }\n });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const trackingPrefix = formConfig.trackingPrefix;\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError,\n trackingPrefix\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired,\n trackingPrefix: PropTypes.string.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","eligiblePageList","data","expandedPageList","push","length","path","handleSubmit","pagesByChapter","preSubmit","setSubmission","isValid","errors","recordEvent","bind","console","event","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func","trackingPrefix","string"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActivePages\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const eligiblePageList = getActivePages(pageList, form.data);\n const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent.bind(formConfig) :\n console.error.bind(console); // eslint-disable-line no-console\n\n recordEvent({ event: 'validation-failed-on-submit', errors });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired,\n trackingPrefix: PropTypes.string.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file diff --git a/lib/js/state/helpers.js b/lib/js/state/helpers.js index c6319dc..8cb6ad9 100644 --- a/lib/js/state/helpers.js +++ b/lib/js/state/helpers.js @@ -531,8 +531,7 @@ function createInitialState(formConfig) { reviewPageView: { openChapters: [], viewedPages: new Set() - }, - trackingPrefix: formConfig.trackingPrefix + } }; var pageAndDataState = (0, _helpers.createFormPageList)(formConfig).reduce(function (state, page) { diff --git a/lib/js/state/helpers.js.map b/lib/js/state/helpers.js.map index b45bf4a..bd30a2e 100644 --- a/lib/js/state/helpers.js.map +++ b/lib/js/state/helpers.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/state/helpers.js"],"names":["updateRequiredFields","isContentExpanded","setHiddenFields","removeHiddenData","updateSchemaFromUiSchema","replaceRefSchemas","updateItemsSchema","updateSchemaAndData","recalculateSchemaAndData","createInitialState","isHiddenField","schema","get","path","data","reduce","current","next","uiSchema","formData","index","type","newRequired","Object","keys","properties","requiredArray","nextProp","field","isRequired","arrayHasField","some","prop","filter","concat","required","newSchema","currentSchema","nextSchema","length","newItemSchemas","items","map","item","idx","newItem","matcher","containingObject","slice","updatedSchema","hideIf","expandUnder","expandUnderCondition","newProperties","undefined","nextData","newItems","updateSchema","newSchemaProps","definitions","Error","$ref","refPath","replace","split","definition","fieldData","Array","isArray","additionalItems","fillIn","fill","updatedItems","newData","initialState","pages","state","pageKey","page","newState","showPagePerItem","arrayData","arrayPath","editMode","formConfig","submission","status","errorMessage","id","timestamp","hasAttemptedSubmit","formId","loadedData","metadata","reviewPageView","openChapters","viewedPages","Set","trackingPrefix","pageAndDataState","defaultDefinitions","isArrayPage","initialData","itemFilter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAyBgBA,oB,GAAAA,oB;QAsDAC,iB,GAAAA,iB;QAkBAC,e,GAAAA,e;QAqEAC,gB,GAAAA,gB;QAgDAC,wB,GAAAA,wB;QAwDAC,iB,GAAAA,iB;QAsDAC,iB,GAAAA,iB;QAkEAC,mB,GAAAA,mB;QAwBAC,wB,GAAAA,wB;QAkCAC,kB,GAAAA,kB;;AA/bhB;;AAEA;;;;AAKA,SAASC,aAAT,CAAuBC,MAAvB,EAA+B;AAC7B,SAAO,CAAC,CAACA,OAAO,cAAP,CAAF,IAA4B,CAAC,CAACA,OAAO,WAAP,CAArC;AACD;;AAED,SAASC,GAAT,CAAaC,IAAb,EAAmBC,IAAnB,EAAyB;AACvB,SAAOD,KAAKE,MAAL,CAAY,UAACC,OAAD,EAAUC,IAAV,EAAmB;AACpC,WAAO,OAAOD,OAAP,KAAmB,WAAnB,GAAiCA,OAAjC,GAA2CA,QAAQC,IAAR,CAAlD;AACD,GAFM,EAEJH,IAFI,CAAP;AAGD;;AAED;;;;;;;AAOO,SAASd,oBAAT,CAA8BW,MAA9B,EAAsCO,QAAtC,EAAgDC,QAAhD,EAAwE;AAAA,MAAdC,KAAc,uEAAN,IAAM;;AAC7E,MAAI,CAACF,QAAL,EAAe;AACb,WAAOP,MAAP;AACD;;AAED,MAAIA,OAAOU,IAAP,KAAgB,QAApB,EAA8B;AAC5B,QAAMC,cAAcC,OAAOC,IAAP,CAAYb,OAAOc,UAAnB,EAA+BV,MAA/B,CAAsC,UAACW,aAAD,EAAgBC,QAAhB,EAA6B;AACrF,UAAMC,QAAQV,SAASS,QAAT,CAAd;AACA,UAAIC,SAASA,MAAM,aAAN,CAAb,EAAmC;AACjC,YAAMC,aAAaD,MAAM,aAAN,EAAqBT,QAArB,EAA+BC,KAA/B,CAAnB;AACA,YAAMU,gBAAgBJ,cAAcK,IAAd,CAAmB;AAAA,iBAAQC,SAASL,QAAjB;AAAA,SAAnB,CAAtB;;AAEA,YAAIG,iBAAiB,CAACD,UAAtB,EAAkC;AAChC,iBAAOH,cAAcO,MAAd,CAAqB;AAAA,mBAAQD,SAASL,QAAjB;AAAA,WAArB,CAAP;AACD,SAFD,MAEO,IAAI,CAACG,aAAD,IAAkBD,UAAtB,EAAkC;AACvC,iBAAOH,cAAcQ,MAAd,CAAqBP,QAArB,CAAP;AACD;;AAED,eAAOD,aAAP;AACD;;AAED,aAAOA,aAAP;AACD,KAhBmB,EAgBjBf,OAAOwB,QAAP,IAAmB,EAhBF,CAApB;;AAkBA,QAAMC,YAAYb,OAAOC,IAAP,CAAYb,OAAOc,UAAnB,EAA+BV,MAA/B,CAAsC,UAACsB,aAAD,EAAgBV,QAAhB,EAA6B;AACnF,UAAIT,QAAJ,EAAc;AACZ,YAAMoB,aAAatC,qBAAqBqC,cAAcZ,UAAd,CAAyBE,QAAzB,CAArB,EAAyDT,SAASS,QAAT,CAAzD,EAA6ER,QAA7E,EAAuFC,KAAvF,CAAnB;AACA,YAAIkB,eAAeD,cAAcZ,UAAd,CAAyBE,QAAzB,CAAnB,EAAuD;AACrD,iBAAO,mBAAM,CAAC,YAAD,EAAeA,QAAf,CAAN,EAAgCW,UAAhC,EAA4CD,aAA5C,CAAP;AACD;AACF;;AAED,aAAOA,aAAP;AACD,KATiB,EASf1B,MATe,CAAlB;;AAWA,QAAIyB,UAAUD,QAAV,KAAuBb,WAAvB,KAAuCc,UAAUD,QAAV,IAAsBb,YAAYiB,MAAZ,GAAqB,CAAlF,CAAJ,EAA0F;AACxF,aAAO,mBAAM,UAAN,EAAkBjB,WAAlB,EAA+Bc,SAA/B,CAAP;AACD;;AAED,WAAOA,SAAP;AACD;;AAED,MAAIzB,OAAOU,IAAP,KAAgB,OAApB,EAA6B;AAC3B;AACA;AACA,QAAMmB,iBAAiB7B,OAAO8B,KAAP,CAAaC,GAAb,CAAiB,UAACC,IAAD,EAAOC,GAAP;AAAA,aAAe5C,qBAAqB2C,IAArB,EAA2BzB,SAASuB,KAApC,EAA2CtB,QAA3C,EAAqDyB,GAArD,CAAf;AAAA,KAAjB,CAAvB;AACA,QAAIJ,eAAeT,IAAf,CAAoB,UAACc,OAAD,EAAUD,GAAV;AAAA,aAAkBC,YAAYlC,OAAO8B,KAAP,CAAaG,GAAb,CAA9B;AAAA,KAApB,CAAJ,EAA0E;AACxE,aAAO,mBAAM,OAAN,EAAeJ,cAAf,EAA+B7B,MAA/B,CAAP;AACD;AACF;;AAED,SAAOA,MAAP;AACD;;AAEM,SAASV,iBAAT,CAA2Ba,IAA3B,EAAiCgC,OAAjC,EAA0C;AAC/C,MAAI,OAAOA,OAAP,KAAmB,WAAvB,EAAoC;AAClC,WAAO,CAAC,CAAChC,IAAT;AACD,GAFD,MAEO,IAAI,OAAOgC,OAAP,KAAmB,UAAvB,EAAmC;AACxC,WAAOA,QAAQhC,IAAR,CAAP;AACD;;AAED,SAAOA,SAASgC,OAAhB;AACD;;AAED;;;;;;;;AAQO,SAAS5C,eAAT,CAAyBS,MAAzB,EAAiCO,QAAjC,EAA2CC,QAA3C,EAAgE;AAAA,MAAXN,IAAW,uEAAJ,EAAI;;AACrE,MAAI,CAACK,QAAL,EAAe;AACb,WAAOP,MAAP;AACD;;AAED;AACA;AACA,MAAMoC,mBAAmBnC,IAAIC,KAAKmC,KAAL,CAAW,CAAX,EAAc,CAAC,CAAf,CAAJ,EAAuB7B,QAAvB,KAAoCA,QAA7D;;AAEA,MAAI8B,gBAAgBtC,MAApB;AACA,MAAMuC,SAAStC,IAAI,CAAC,YAAD,EAAe,QAAf,CAAJ,EAA8BM,QAA9B,CAAf;AACA,MAAME,QAAQP,KAAKE,MAAL,CAAY,UAACC,OAAD,EAAUC,IAAV,EAAmB;AAC3C,WAAO,OAAOA,IAAP,KAAgB,QAAhB,GAA2BA,IAA3B,GAAkCD,OAAzC;AACD,GAFa,EAEX,IAFW,CAAd;;AAIA,MAAIkC,UAAUA,OAAO/B,QAAP,EAAiBC,KAAjB,CAAd,EAAuC;AACrC,QAAI,CAAC6B,cAAc,WAAd,CAAL,EAAiC;AAC/BA,sBAAgB,mBAAM,WAAN,EAAmB,IAAnB,EAAyBA,aAAzB,CAAhB;AACD;AACF,GAJD,MAIO,IAAIA,cAAc,WAAd,CAAJ,EAAgC;AACrCA,oBAAgB,qBAAQ,WAAR,EAAqBA,aAArB,CAAhB;AACD;;AAED,MAAME,cAAcvC,IAAI,CAAC,YAAD,EAAe,aAAf,CAAJ,EAAmCM,QAAnC,CAApB;AACA,MAAMkC,uBAAuBxC,IAAI,CAAC,YAAD,EAAe,sBAAf,CAAJ,EAA4CM,QAA5C,CAA7B;AACA,MAAIiC,eAAe,CAAClD,kBAAkB8C,iBAAiBI,WAAjB,CAAlB,EAAiDC,oBAAjD,CAApB,EAA4F;AAC1F,QAAI,CAACH,cAAc,cAAd,CAAL,EAAoC;AAClCA,sBAAgB,mBAAM,cAAN,EAAsB,IAAtB,EAA4BA,aAA5B,CAAhB;AACD;AACF,GAJD,MAIO,IAAIA,cAAc,cAAd,CAAJ,EAAmC;AACxCA,oBAAgB,qBAAQ,cAAR,EAAwBA,aAAxB,CAAhB;AACD;;AAED,MAAIA,cAAc5B,IAAd,KAAuB,QAA3B,EAAqC;AACnC,QAAMgC,gBAAgB9B,OAAOC,IAAP,CAAYyB,cAAcxB,UAA1B,EAAsCV,MAAtC,CAA6C,UAACC,OAAD,EAAUC,IAAV,EAAmB;AACpF,UAAMmB,YAAYlC,gBAAgB+C,cAAcxB,UAAd,CAAyBR,IAAzB,CAAhB,EAAgDC,SAASD,IAAT,CAAhD,EAAgEE,QAAhE,EAA0EN,KAAKqB,MAAL,CAAYjB,IAAZ,CAA1E,CAAlB;;AAEA,UAAImB,cAAca,cAAcxB,UAAd,CAAyBR,IAAzB,CAAlB,EAAkD;AAChD,eAAO,mBAAMA,IAAN,EAAYmB,SAAZ,EAAuBpB,OAAvB,CAAP;AACD;;AAED,aAAOA,OAAP;AACD,KARqB,EAQnBiC,cAAcxB,UARK,CAAtB;;AAUA,QAAI4B,kBAAkBJ,cAAcxB,UAApC,EAAgD;AAC9C,aAAO,mBAAM,YAAN,EAAoB4B,aAApB,EAAmCJ,aAAnC,CAAP;AACD;AACF;;AAED,MAAIA,cAAc5B,IAAd,KAAuB,OAA3B,EAAoC;AAClC;AACA;AACA,QAAMmB,iBAAiBS,cAAcR,KAAd,CAAoBC,GAApB,CAAwB,UAACC,IAAD,EAAOC,GAAP;AAAA,aAC7C1C,gBAAgByC,IAAhB,EAAsBzB,SAASuB,KAA/B,EAAsCtB,QAAtC,EAAgDN,KAAKqB,MAAL,CAAYU,GAAZ,CAAhD,CAD6C;AAAA,KAAxB,CAAvB;;AAIA,QAAIJ,eAAeT,IAAf,CAAoB,UAACc,OAAD,EAAUD,GAAV;AAAA,aAAkBC,YAAYI,cAAcR,KAAd,CAAoBG,GAApB,CAA9B;AAAA,KAApB,CAAJ,EAAiF;AAC/E,aAAO,mBAAM,OAAN,EAAeJ,cAAf,EAA+BS,aAA/B,CAAP;AACD;AACF;;AAED,SAAOA,aAAP;AACD;;AAED;;;;;AAKO,SAAS9C,gBAAT,CAA0BQ,MAA1B,EAAkCG,IAAlC,EAAwC;AAC7C;AACA;AACA,MAAIJ,cAAcC,MAAd,KAAyB,OAAOG,IAAP,KAAgB,WAAzC,IAAwDA,SAAS,IAArE,EAA2E;AACzE,WAAOwC,SAAP;AACD;;AAED,MAAI3C,OAAOU,IAAP,KAAgB,QAApB,EAA8B;AAC5B,WAAOE,OAAOC,IAAP,CAAYV,IAAZ,EAAkBC,MAAlB,CAAyB,UAACC,OAAD,EAAUC,IAAV,EAAmB;AACjD,UAAI,OAAOH,KAAKG,IAAL,CAAP,KAAsB,WAAtB,IAAqCN,OAAOc,UAAP,CAAkBR,IAAlB,CAAzC,EAAkE;AAChE,YAAMsC,WAAWpD,iBAAiBQ,OAAOc,UAAP,CAAkBR,IAAlB,CAAjB,EAA0CH,KAAKG,IAAL,CAA1C,CAAjB;;AAEA;AACA,YAAI,OAAOsC,QAAP,KAAoB,WAAxB,EAAqC;AACnC,iBAAO,qBAAQtC,IAAR,EAAcD,OAAd,CAAP;AACD;;AAED;AACA,YAAIuC,aAAazC,KAAKG,IAAL,CAAjB,EAA6B;AAC3B,iBAAO,mBAAMA,IAAN,EAAYsC,QAAZ,EAAsBvC,OAAtB,CAAP;AACD;AACF;;AAED,aAAOA,OAAP;AACD,KAhBM,EAgBJF,IAhBI,CAAP;AAiBD;;AAED,MAAIH,OAAOU,IAAP,KAAgB,OAApB,EAA6B;AAC3B,QAAMmC,WAAW1C,KAAK4B,GAAL,CAAS,UAACC,IAAD,EAAOvB,KAAP,EAAiB;AACzC,aAAOjB,iBAAiBQ,OAAO8B,KAAP,CAAarB,KAAb,CAAjB,EAAsCuB,IAAtC,CAAP;AACD,KAFgB,CAAjB;;AAIA,QAAIa,SAASzB,IAAT,CAAc,UAACc,OAAD,EAAUD,GAAV;AAAA,aAAkBC,YAAY/B,KAAK8B,GAAL,CAA9B;AAAA,KAAd,CAAJ,EAA4D;AAC1D,aAAOY,QAAP;AACD;;AAED,WAAO1C,IAAP;AACD;;AAED,SAAOA,IAAP;AACD;;AAED;;;;;;AAMO,SAASV,wBAAT,CAAkCO,MAAlC,EAA0CO,QAA1C,EAAoDC,QAApD,EAAuF;AAAA,MAAzBC,KAAyB,uEAAjB,IAAiB;AAAA,MAAXP,IAAW,uEAAJ,EAAI;;AAC5F,MAAI,CAACK,QAAL,EAAe;AACb,WAAOP,MAAP;AACD;;AAED,MAAI0B,gBAAgB1B,MAApB;;AAEA,MAAI0B,cAAchB,IAAd,KAAuB,QAA3B,EAAqC;AACnC,QAAMe,YAAYb,OAAOC,IAAP,CAAYa,cAAcZ,UAA1B,EAAsCV,MAAtC,CAA6C,UAACC,OAAD,EAAUC,IAAV,EAAmB;AAChF,UAAMU,WAAWvB,yBAAyBY,QAAQS,UAAR,CAAmBR,IAAnB,CAAzB,EAAmDC,SAASD,IAAT,CAAnD,EAAmEE,QAAnE,EAA6EC,KAA7E,EAAoFP,KAAKqB,MAAL,CAAYjB,IAAZ,CAApF,CAAjB;;AAEA,UAAID,QAAQS,UAAR,CAAmBR,IAAnB,MAA6BU,QAAjC,EAA2C;AACzC,eAAO,mBAAM,CAAC,YAAD,EAAeV,IAAf,CAAN,EAA4BU,QAA5B,EAAsCX,OAAtC,CAAP;AACD;;AAED,aAAOA,OAAP;AACD,KARiB,EAQfqB,aARe,CAAlB;;AAUA,QAAID,cAAczB,MAAlB,EAA0B;AACxB0B,sBAAgBD,SAAhB;AACD;AACF;;AAED,MAAIC,cAAchB,IAAd,KAAuB,OAA3B,EAAoC;AAClC;AACA;AACA,QAAMmB,iBAAiBH,cAAcI,KAAd,CAAoBC,GAApB,CAAwB,UAACC,IAAD,EAAOC,GAAP;AAAA,aAC7CxC,yBAAyBuC,IAAzB,EAA+BzB,SAASuB,KAAxC,EAA+CtB,QAA/C,EAAyDyB,GAAzD,EAA8D/B,KAAKqB,MAAL,CAAYU,GAAZ,CAA9D,CAD6C;AAAA,KAAxB,CAAvB;;AAIA,QAAIJ,eAAeT,IAAf,CAAoB,UAACc,OAAD,EAAUD,GAAV;AAAA,aAAkBC,YAAYR,cAAcI,KAAd,CAAoBG,GAApB,CAA9B;AAAA,KAApB,CAAJ,EAAiF;AAC/EP,sBAAgB,mBAAM,OAAN,EAAeG,cAAf,EAA+BH,aAA/B,CAAhB;AACD;AACF;;AAED,MAAMoB,eAAe7C,IAAI,CAAC,YAAD,EAAe,cAAf,CAAJ,EAAoCM,QAApC,CAArB;;AAEA,MAAIuC,YAAJ,EAAkB;AAChB,QAAMC,iBAAiBD,aAAatC,QAAb,EAAuBkB,aAAvB,EAAsCnB,QAAtC,EAAgDE,KAAhD,EAAuDP,IAAvD,CAAvB;;AAEA,QAAMuB,aAAYb,OAAOC,IAAP,CAAYkC,cAAZ,EAA4B3C,MAA5B,CAAmC,UAACC,OAAD,EAAUC,IAAV,EAAmB;AACtE,UAAIyC,eAAezC,IAAf,MAAyBN,OAAOM,IAAP,CAA7B,EAA2C;AACzC,eAAO,mBAAMA,IAAN,EAAYyC,eAAezC,IAAf,CAAZ,EAAkCD,OAAlC,CAAP;AACD;;AAED,aAAOA,OAAP;AACD,KANiB,EAMfqB,aANe,CAAlB;;AAQA,QAAID,eAAcC,aAAlB,EAAiC;AAC/B,aAAOD,UAAP;AACD;AACF;;AAED,SAAOC,aAAP;AACD;;AAEM,SAAShC,iBAAT,CAA2BM,MAA3B,EAAmCgD,WAAnC,EAA2D;AAAA,MAAX9C,IAAW,uEAAJ,EAAI;;AAChE;AACA,MAAI,CAACF,MAAL,EAAa;AACX,UAAM,IAAIiD,KAAJ,6BAAoC/C,IAApC,CAAN;AACD;AACD,MAAIF,OAAOkD,IAAX,EAAiB;AACf;AACA;AACA,QAAMC,UAAUnD,OAAOkD,IAAP,CAAYE,OAAZ,CAAoB,gBAApB,EAAsC,EAAtC,EAA0CC,KAA1C,CAAgD,GAAhD,CAAhB;AACA,QAAMC,aAAarD,IAAIkD,OAAJ,EAAaH,WAAb,CAAnB;AACA,QAAI,CAACM,UAAL,EAAiB;AACf,YAAM,IAAIL,KAAJ,6BAAoCjD,OAAOkD,IAA3C,YAAsDhD,IAAtD,yDAAN;AACD;;AAED,WAAOR,kBAAkB4D,UAAlB,EAA8BN,WAA9B,EAA2C9C,IAA3C,CAAP;AACD;;AAED,MAAIF,OAAOU,IAAP,KAAgB,QAApB,EAA8B;AAC5B,QAAMe,YAAYb,OAAOC,IAAP,CAAYb,OAAOc,UAAnB,EAA+BV,MAA/B,CAAsC,UAACC,OAAD,EAAUC,IAAV,EAAmB;AACzE,UAAMU,WAAWtB,kBAAkBM,OAAOc,UAAP,CAAkBR,IAAlB,CAAlB,EAA2C0C,WAA3C,EAA2D9C,IAA3D,SAAmEI,IAAnE,CAAjB;;AAEA,UAAID,QAAQS,UAAR,CAAmBR,IAAnB,MAA6BU,QAAjC,EAA2C;AACzC,eAAO,mBAAM,CAAC,YAAD,EAAeV,IAAf,CAAN,EAA4BU,QAA5B,EAAsCX,OAAtC,CAAP;AACD;;AAED,aAAOA,OAAP;AACD,KARiB,EAQfL,MARe,CAAlB;;AAUA,WAAOyB,SAAP;AACD;;AAED,MAAIzB,OAAOU,IAAP,KAAgB,OAApB,EAA6B;AAC3B,QAAMmC,WAAWnD,kBAAkBM,OAAO8B,KAAzB,EAAgCkB,WAAhC,EAAgD9C,IAAhD,YAAjB;;AAEA,QAAI2C,aAAa7C,OAAO8B,KAAxB,EAA+B;AAC7B,aAAO,mBAAM,OAAN,EAAee,QAAf,EAAyB7C,MAAzB,CAAP;AACD;AACF;;AAED,SAAOA,MAAP;AACD;;AAED;;;;;;;;;;;;AAYO,SAASL,iBAAT,CAA2BK,MAA3B,EAAqD;AAAA,MAAlBuD,SAAkB,uEAAN,IAAM;;AAC1D,MAAIvD,OAAOU,IAAP,KAAgB,OAApB,EAA6B;AAC3B,QAAIe,YAAYzB,MAAhB;;AAEA;AACA;AACA,QAAI,CAACwD,MAAMC,OAAN,CAAczD,OAAO8B,KAArB,CAAL,EAAkC;AAChCL,kBAAY,sBAASzB,MAAT,EAAiB;AAC3B8B,eAAO,EADoB;AAE3B4B,yBAAiB1D,OAAO8B;AAFG,OAAjB,CAAZ;AAID;;AAED,QAAI,CAACyB,SAAL,EAAgB;AACd;AACA9B,kBAAY,mBAAM,OAAN,EAAe,EAAf,EAAmBA,SAAnB,CAAZ;AACD,KAHD,MAGO,IAAI8B,UAAU3B,MAAV,GAAmBH,UAAUK,KAAV,CAAgBF,MAAvC,EAA+C;AACpD;AACA;AACA;AACA,UAAM+B,SAASH,MAAMD,UAAU3B,MAAV,GAAmBH,UAAUK,KAAV,CAAgBF,MAAzC,EACZgC,IADY,CACPnC,UAAUiC,eADH,CAAf;AAEAjC,kBAAY,mBAAM,OAAN,EAAeA,UAAUK,KAAV,CAAgBP,MAAhB,CAAuBoC,MAAvB,CAAf,EAA+ClC,SAA/C,CAAZ;AACD,KAPM,MAOA,IAAI8B,UAAU3B,MAAV,GAAmBH,UAAUK,KAAV,CAAgBF,MAAvC,EAA+C;AACpD;AACA;AACA;AACAH,kBAAY,mBAAM,OAAN,EAAe,yBAAY,CAAZ,EAAeA,UAAUK,KAAzB,CAAf,EAAgDL,SAAhD,CAAZ;AACD;;AAED,QAAMoC,eAAepC,UAAUK,KAAV,CAAgBC,GAAhB,CACnB,UAACC,IAAD,EAAOvB,KAAP;AAAA,aAAiBd,kBAAkBqC,IAAlB,EAAwBuB,UAAU9C,KAAV,CAAxB,CAAjB;AAAA,KADmB,CAArB;AAGA,QAAIgB,UAAUK,KAAV,CAAgBV,IAAhB,CAAqB,UAACY,IAAD,EAAOvB,KAAP;AAAA,aAAiBuB,SAAS6B,aAAapD,KAAb,CAA1B;AAAA,KAArB,CAAJ,EAAyE;AACvE,aAAO,mBAAM,OAAN,EAAeoD,YAAf,EAA6BpC,SAA7B,CAAP;AACD;;AAED,WAAOA,SAAP;AACD;;AAED,MAAIzB,OAAOU,IAAP,KAAgB,QAApB,EAA8B;AAC5B,QAAMe,cAAYb,OAAOC,IAAP,CAAYb,OAAOc,UAAnB,EAA+BV,MAA/B,CAAsC,UAACC,OAAD,EAAUC,IAAV,EAAmB;AACzE,UAAMU,WAAWrB,kBAAkBK,OAAOc,UAAP,CAAkBR,IAAlB,CAAlB,EAA2CiD,YAAYA,UAAUjD,IAAV,CAAZ,GAA8B,IAAzE,CAAjB;;AAEA,UAAID,QAAQS,UAAR,CAAmBR,IAAnB,MAA6BU,QAAjC,EAA2C;AACzC,eAAO,mBAAM,CAAC,YAAD,EAAeV,IAAf,CAAN,EAA4BU,QAA5B,EAAsCX,OAAtC,CAAP;AACD;;AAED,aAAOA,OAAP;AACD,KARiB,EAQfL,MARe,CAAlB;;AAUA,WAAOyB,WAAP;AACD;;AAED,SAAOzB,MAAP;AACD;;AAED;;;;;;;;;AASO,SAASJ,mBAAT,CAA6BI,MAA7B,EAAqCO,QAArC,EAA+CC,QAA/C,EAAyD;AAC9D,MAAIiB,YAAY9B,kBAAkBK,MAAlB,EAA0BQ,QAA1B,CAAhB;AACAiB,cAAYpC,qBAAqBoC,SAArB,EAAgClB,QAAhC,EAA0CC,QAA1C,CAAZ;;AAEA;AACAiB,cAAYlC,gBAAgBkC,SAAhB,EAA2BlB,QAA3B,EAAqCC,QAArC,CAAZ;;AAEA;AACAiB,cAAYhC,yBAAyBgC,SAAzB,EAAoClB,QAApC,EAA8CC,QAA9C,CAAZ;;AAEA;AACA,MAAMsD,UAAUtE,iBAAiBiC,SAAjB,EAA4BjB,QAA5B,CAAhB;;AAEA;AACAiB,cAAY9B,kBAAkB8B,SAAlB,EAA6BqC,OAA7B,CAAZ;;AAEA,iCAAiBrC,SAAjB;;AAEA,SAAO;AACLtB,UAAM2D,OADD;AAEL9D,YAAQyB;AAFH,GAAP;AAID;;AAEM,SAAS5B,wBAAT,CAAkCkE,YAAlC,EAAgD;AACrD,SAAOnD,OAAOC,IAAP,CAAYkD,aAAaC,KAAzB,EACJ5D,MADI,CACG,UAAC6D,KAAD,EAAQC,OAAR,EAAoB;AAC1B;AACA;AACA,QAAMC,OAAOF,MAAMD,KAAN,CAAYE,OAAZ,CAAb;AACA,QAAM1D,WAAWuD,aAAa5D,IAA9B;;AAJ0B,+BAMDP,oBAAoBuE,KAAKnE,MAAzB,EAAiCmE,KAAK5D,QAAtC,EAAgDC,QAAhD,CANC;AAAA,QAMlBL,IANkB,wBAMlBA,IANkB;AAAA,QAMZH,MANY,wBAMZA,MANY;;AAQ1B,QAAIoE,WAAWH,KAAf;;AAEA,QAAIzD,aAAaL,IAAjB,EAAuB;AACrBiE,iBAAW,mBAAM,MAAN,EAAcjE,IAAd,EAAoB8D,KAApB,CAAX;AACD;;AAED,QAAIE,KAAKnE,MAAL,KAAgBA,MAApB,EAA4B;AAC1BoE,iBAAW,mBAAM,CAAC,OAAD,EAAUF,OAAV,EAAmB,QAAnB,CAAN,EAAoClE,MAApC,EAA4CoE,QAA5C,CAAX;AACD;;AAED,QAAID,KAAKE,eAAT,EAA0B;AACxB,UAAMC,YAAY,mBAAMH,KAAKI,SAAX,EAAsBH,SAASjE,IAA/B,KAAwC,EAA1D;AACA;AACA;AACA;AACA,UAAIgE,KAAKK,QAAL,CAAc5C,MAAd,KAAyB0C,UAAU1C,MAAvC,EAA+C;AAC7CwC,mBAAW,mBAAM,CAAC,OAAD,EAAUF,OAAV,EAAmB,UAAnB,CAAN,EAAsCI,UAAUvC,GAAV,CAAc;AAAA,iBAAM,KAAN;AAAA,SAAd,CAAtC,EAAkEqC,QAAlE,CAAX;AACD;AACF;;AAED,WAAOA,QAAP;AACD,GA9BI,EA8BFL,YA9BE,CAAP;AA+BD;;AAEM,SAASjE,kBAAT,CAA4B2E,UAA5B,EAAwC;AAC7C,MAAIV,eAAe;AACjBW,gBAAY;AACVC,cAAQ,KADE;AAEVC,oBAAc,KAFJ;AAGVC,UAAI,KAHM;AAIVC,iBAAW,KAJD;AAKVC,0BAAoB;AALV,KADK;AAQjBC,YAAQP,WAAWO,MARF;AASjBC,gBAAY;AACVzE,gBAAU,EADA;AAEV0E,gBAAU;AAFA,KATK;AAajBC,oBAAgB;AACdC,oBAAc,EADA;AAEdC,mBAAa,IAAIC,GAAJ;AAFC,KAbC;AAiBjBC,oBAAgBd,WAAWc;AAjBV,GAAnB;;AAoBA,MAAMC,mBAAmB,iCAAmBf,UAAnB,EACtBrE,MADsB,CACf,UAAC6D,KAAD,EAAQE,IAAR,EAAiB;AACvB,QAAMnB,cAAc,sBAASyB,WAAWgB,kBAAX,IAAiC,EAA1C,EAA8CtB,KAAKnE,MAAL,CAAYgD,WAA1D,CAApB;AACA,QAAIhD,SAASN,kBAAkByE,KAAKnE,MAAvB,EAA+BgD,WAA/B,EAA4CmB,KAAKD,OAAjD,CAAb;AACA;AACA,mCAAiBlE,MAAjB;AACAA,aAASL,kBAAkBK,MAAlB,CAAT;AACA,QAAM0F,cAAcvB,KAAKE,eAAzB;AACA,QAAMlE,OAAO,gCAAoBH,MAApB,EAA4BmE,KAAKwB,WAAjC,EAA8C3F,OAAOgD,WAArD,CAAb;;AAEA;AACAiB,UAAMD,KAAN,CAAYG,KAAKD,OAAjB,IAA4B;AAC1B3D,gBAAU4D,KAAK5D,QADW;AAE1BP,oBAF0B;AAG1BwE,gBAAUkB,cAAc,EAAd,GAAmB,KAHH;AAI1BrB,uBAAiBF,KAAKE,eAJI;AAK1BE,iBAAWJ,KAAKI,SALU;AAM1BqB,kBAAYzB,KAAKyB;AANS,KAA5B;;AASA3B,UAAM9D,IAAN,GAAa,qBAAQ8D,MAAM9D,IAAd,EAAoBA,IAApB,CAAb;AACA;;AAEA,WAAO8D,KAAP;AACD,GAxBsB,EAwBpB;AACD9D,UAAM,EADL;AAED6D,WAAO;AAFN,GAxBoB,CAAzB;;AA6BAD,iBAAe,sBAASA,YAAT,EAAuByB,gBAAvB,CAAf;AACA;AACA;AACAzB,iBAAelE,yBAAyBkE,YAAzB,CAAf;;AAEA,SAAOA,YAAP;AACD","file":"helpers.js","sourcesContent":["import _ from 'lodash/fp';\nimport { getDefaultFormState } from '@department-of-veterans-affairs/react-jsonschema-form/lib/utils';\n\nimport {\n checkValidSchema,\n createFormPageList\n} from '../helpers';\n\nfunction isHiddenField(schema) {\n return !!schema['ui:collapsed'] || !!schema['ui:hidden'];\n}\n\nfunction get(path, data) {\n return path.reduce((current, next) => {\n return typeof current === 'undefined' ? current : current[next];\n }, data);\n}\n\n/*\n * This function goes through a schema/uiSchema and updates the required array\n * based on any ui:required field properties in the uiSchema.\n *\n * If no required fields are changing, it makes sure to not mutate the existing schema,\n * so we can still take advantage of any shouldComponentUpdate optimizations\n */\nexport function updateRequiredFields(schema, uiSchema, formData, index = null) {\n if (!uiSchema) {\n return schema;\n }\n\n if (schema.type === 'object') {\n const newRequired = Object.keys(schema.properties).reduce((requiredArray, nextProp) => {\n const field = uiSchema[nextProp];\n if (field && field['ui:required']) {\n const isRequired = field['ui:required'](formData, index);\n const arrayHasField = requiredArray.some(prop => prop === nextProp);\n\n if (arrayHasField && !isRequired) {\n return requiredArray.filter(prop => prop !== nextProp);\n } else if (!arrayHasField && isRequired) {\n return requiredArray.concat(nextProp);\n }\n\n return requiredArray;\n }\n\n return requiredArray;\n }, schema.required || []);\n\n const newSchema = Object.keys(schema.properties).reduce((currentSchema, nextProp) => {\n if (uiSchema) {\n const nextSchema = updateRequiredFields(currentSchema.properties[nextProp], uiSchema[nextProp], formData, index);\n if (nextSchema !== currentSchema.properties[nextProp]) {\n return _.set(['properties', nextProp], nextSchema, currentSchema);\n }\n }\n\n return currentSchema;\n }, schema);\n\n if (newSchema.required !== newRequired && (newSchema.required || newRequired.length > 0)) {\n return _.set('required', newRequired, newSchema);\n }\n\n return newSchema;\n }\n\n if (schema.type === 'array') {\n // each item has its own schema, so we need to update the required fields on those schemas\n // and then check for differences\n const newItemSchemas = schema.items.map((item, idx) => updateRequiredFields(item, uiSchema.items, formData, idx));\n if (newItemSchemas.some((newItem, idx) => newItem !== schema.items[idx])) {\n return _.set('items', newItemSchemas, schema);\n }\n }\n\n return schema;\n}\n\nexport function isContentExpanded(data, matcher) {\n if (typeof matcher === 'undefined') {\n return !!data;\n } else if (typeof matcher === 'function') {\n return matcher(data);\n }\n\n return data === matcher;\n}\n\n/*\n * This steps through a schema and sets any fields to hidden, based on a\n * hideIf function from uiSchema and the current page data. Sets 'ui:hidden'\n * which is a non-standard JSON Schema property\n *\n * The path parameter will contain the path, relative to formData, to the\n * form data corresponding to the current schema object\n */\nexport function setHiddenFields(schema, uiSchema, formData, path = []) {\n if (!uiSchema) {\n return schema;\n }\n\n // expandUnder fields are relative to the parent object of the current\n // field, so get that object using path here\n const containingObject = get(path.slice(0, -1), formData) || formData;\n\n let updatedSchema = schema;\n const hideIf = get(['ui:options', 'hideIf'], uiSchema);\n const index = path.reduce((current, next) => {\n return typeof next === 'number' ? next : current;\n }, null);\n\n if (hideIf && hideIf(formData, index)) {\n if (!updatedSchema['ui:hidden']) {\n updatedSchema = _.set('ui:hidden', true, updatedSchema);\n }\n } else if (updatedSchema['ui:hidden']) {\n updatedSchema = _.unset('ui:hidden', updatedSchema);\n }\n\n const expandUnder = get(['ui:options', 'expandUnder'], uiSchema);\n const expandUnderCondition = get(['ui:options', 'expandUnderCondition'], uiSchema);\n if (expandUnder && !isContentExpanded(containingObject[expandUnder], expandUnderCondition)) {\n if (!updatedSchema['ui:collapsed']) {\n updatedSchema = _.set('ui:collapsed', true, updatedSchema);\n }\n } else if (updatedSchema['ui:collapsed']) {\n updatedSchema = _.unset('ui:collapsed', updatedSchema);\n }\n\n if (updatedSchema.type === 'object') {\n const newProperties = Object.keys(updatedSchema.properties).reduce((current, next) => {\n const newSchema = setHiddenFields(updatedSchema.properties[next], uiSchema[next], formData, path.concat(next));\n\n if (newSchema !== updatedSchema.properties[next]) {\n return _.set(next, newSchema, current);\n }\n\n return current;\n }, updatedSchema.properties);\n\n if (newProperties !== updatedSchema.properties) {\n return _.set('properties', newProperties, updatedSchema);\n }\n }\n\n if (updatedSchema.type === 'array') {\n // each item has its own schema, so we need to update the required fields on those schemas\n // and then check for differences\n const newItemSchemas = updatedSchema.items.map((item, idx) =>\n setHiddenFields(item, uiSchema.items, formData, path.concat(idx))\n );\n\n if (newItemSchemas.some((newItem, idx) => newItem !== updatedSchema.items[idx])) {\n return _.set('items', newItemSchemas, updatedSchema);\n }\n }\n\n return updatedSchema;\n}\n\n/*\n * Steps through data and removes any fields that are marked as hidden\n * This is done so that hidden fields don’t cause validation errors that\n * a user can’t see.\n */\nexport function removeHiddenData(schema, data) {\n // null is necessary here because Rails 4 will convert empty arrays to null\n // In the forms, there's no difference between an empty array and null or undefined\n if (isHiddenField(schema) || typeof data === 'undefined' || data === null) {\n return undefined;\n }\n\n if (schema.type === 'object') {\n return Object.keys(data).reduce((current, next) => {\n if (typeof data[next] !== 'undefined' && schema.properties[next]) {\n const nextData = removeHiddenData(schema.properties[next], data[next]);\n\n // if the data was removed, then just unset it\n if (typeof nextData === 'undefined') {\n return _.unset(next, current);\n }\n\n // if data was updated (like a nested prop was removed), update it\n if (nextData !== data[next]) {\n return _.set(next, nextData, current);\n }\n }\n\n return current;\n }, data);\n }\n\n if (schema.type === 'array') {\n const newItems = data.map((item, index) => {\n return removeHiddenData(schema.items[index], item);\n });\n\n if (newItems.some((newItem, idx) => newItem !== data[idx])) {\n return newItems;\n }\n\n return data;\n }\n\n return data;\n}\n\n/*\n * This is similar to the hidden fields schema function above, except more general.\n * It will step through a schema and replace parts of it based on an updateSchema\n * function in uiSchema. This means the schema can be re-calculated based on data\n * a user has entered.\n */\nexport function updateSchemaFromUiSchema(schema, uiSchema, formData, index = null, path = []) {\n if (!uiSchema) {\n return schema;\n }\n\n let currentSchema = schema;\n\n if (currentSchema.type === 'object') {\n const newSchema = Object.keys(currentSchema.properties).reduce((current, next) => {\n const nextProp = updateSchemaFromUiSchema(current.properties[next], uiSchema[next], formData, index, path.concat(next));\n\n if (current.properties[next] !== nextProp) {\n return _.set(['properties', next], nextProp, current);\n }\n\n return current;\n }, currentSchema);\n\n if (newSchema !== schema) {\n currentSchema = newSchema;\n }\n }\n\n if (currentSchema.type === 'array') {\n // each item has its own schema, so we need to update the required fields on those schemas\n // and then check for differences\n const newItemSchemas = currentSchema.items.map((item, idx) =>\n updateSchemaFromUiSchema(item, uiSchema.items, formData, idx, path.concat(idx))\n );\n\n if (newItemSchemas.some((newItem, idx) => newItem !== currentSchema.items[idx])) {\n currentSchema = _.set('items', newItemSchemas, currentSchema);\n }\n }\n\n const updateSchema = get(['ui:options', 'updateSchema'], uiSchema);\n\n if (updateSchema) {\n const newSchemaProps = updateSchema(formData, currentSchema, uiSchema, index, path);\n\n const newSchema = Object.keys(newSchemaProps).reduce((current, next) => {\n if (newSchemaProps[next] !== schema[next]) {\n return _.set(next, newSchemaProps[next], current);\n }\n\n return current;\n }, currentSchema);\n\n if (newSchema !== currentSchema) {\n return newSchema;\n }\n }\n\n return currentSchema;\n}\n\nexport function replaceRefSchemas(schema, definitions, path = '') {\n // this can happen if you import a field that doesn’t exist from a schema\n if (!schema) {\n throw new Error(`Schema is undefined at ${path}`);\n }\n if (schema.$ref) {\n // There’s a whole spec for JSON pointers, but we don’t use anything more complicated\n // than this so far\n const refPath = schema.$ref.replace('#/definitions/', '').split('/');\n const definition = get(refPath, definitions);\n if (!definition) {\n throw new Error(`Missing definition for ${schema.$ref} at ${path}. You probably need to add it to defaultDefinitions`);\n }\n\n return replaceRefSchemas(definition, definitions, path);\n }\n\n if (schema.type === 'object') {\n const newSchema = Object.keys(schema.properties).reduce((current, next) => {\n const nextProp = replaceRefSchemas(schema.properties[next], definitions, `${path}.${next}`);\n\n if (current.properties[next] !== nextProp) {\n return _.set(['properties', next], nextProp, current);\n }\n\n return current;\n }, schema);\n\n return newSchema;\n }\n\n if (schema.type === 'array') {\n const newItems = replaceRefSchemas(schema.items, definitions, `${path}.items`);\n\n if (newItems !== schema.items) {\n return _.set('items', newItems, schema);\n }\n }\n\n return schema;\n}\n\n/**\n * This function updates an array schema to use the array of\n * item schema format and keeps that array in sync with the\n * data in that array in the form data.\n *\n * This allows us to have conditional fields for each array item,\n * because our conditional field implementation depends on modifying\n * schemas\n *\n * @param {Object} schema The current JSON Schema object\n * @param {any} fieldData The data associated with the current schema\n */\nexport function updateItemsSchema(schema, fieldData = null) {\n if (schema.type === 'array') {\n let newSchema = schema;\n\n // This happens the first time this function is called when\n // generating the form\n if (!Array.isArray(schema.items)) {\n newSchema = _.assign(schema, {\n items: [],\n additionalItems: schema.items\n });\n }\n\n if (!fieldData) {\n // If there’s no data, the list of schemas should be empty\n newSchema = _.set('items', [], newSchema);\n } else if (fieldData.length > newSchema.items.length) {\n // Here we’re filling in the items array to make it the same\n // length as the array of form data. This happens when you add\n // another record on the form, mainly.\n const fillIn = Array(fieldData.length - newSchema.items.length)\n .fill(newSchema.additionalItems);\n newSchema = _.set('items', newSchema.items.concat(fillIn), newSchema);\n } else if (fieldData.length < newSchema.items.length) {\n // If someone removed a record we’re removing the last schema item\n // This may not be the actual removed schema, but the schemas will\n // always be updated in the next step\n newSchema = _.set('items', _.dropRight(1, newSchema.items), newSchema);\n }\n\n const updatedItems = newSchema.items.map(\n (item, index) => updateItemsSchema(item, fieldData[index])\n );\n if (newSchema.items.some((item, index) => item !== updatedItems[index])) {\n return _.set('items', updatedItems, newSchema);\n }\n\n return newSchema;\n }\n\n if (schema.type === 'object') {\n const newSchema = Object.keys(schema.properties).reduce((current, next) => {\n const nextProp = updateItemsSchema(schema.properties[next], fieldData ? fieldData[next] : null);\n\n if (current.properties[next] !== nextProp) {\n return _.set(['properties', next], nextProp, current);\n }\n\n return current;\n }, schema);\n\n return newSchema;\n }\n\n return schema;\n}\n\n/**\n * This is the main sequence of updates that happens when data is changed\n * on a form. Most updates are applied to the schema, except that the data\n * is updated to remove newly hidden data\n *\n * @param {Object} schema The current JSON Schema\n * @param {Object} uiSchema The current UI Schema (does not change)\n * @param {Object} formData Flattened data for the entire form\n */\nexport function updateSchemaAndData(schema, uiSchema, formData) {\n let newSchema = updateItemsSchema(schema, formData);\n newSchema = updateRequiredFields(newSchema, uiSchema, formData);\n\n // Update the schema with any fields that are now hidden because of the data change\n newSchema = setHiddenFields(newSchema, uiSchema, formData);\n\n // Update the schema with any general updates based on the new data\n newSchema = updateSchemaFromUiSchema(newSchema, uiSchema, formData);\n\n // Remove any data that’s now hidden in the schema\n const newData = removeHiddenData(newSchema, formData);\n\n // We need to do this again because array data might have been removed\n newSchema = updateItemsSchema(newSchema, newData);\n\n checkValidSchema(newSchema);\n\n return {\n data: newData,\n schema: newSchema\n };\n}\n\nexport function recalculateSchemaAndData(initialState) {\n return Object.keys(initialState.pages)\n .reduce((state, pageKey) => {\n // on each data change, we need to do the following steps\n // Recalculate any required fields, based on the new data\n const page = state.pages[pageKey];\n const formData = initialState.data;\n\n const { data, schema } = updateSchemaAndData(page.schema, page.uiSchema, formData);\n\n let newState = state;\n\n if (formData !== data) {\n newState = _.set('data', data, state);\n }\n\n if (page.schema !== schema) {\n newState = _.set(['pages', pageKey, 'schema'], schema, newState);\n }\n\n if (page.showPagePerItem) {\n const arrayData = _.get(page.arrayPath, newState.data) || [];\n // If an item was added or removed for the data used by a showPagePerItem page,\n // we have to reset everything because we can’t match the edit states to rows directly\n // This will rarely ever be noticeable\n if (page.editMode.length !== arrayData.length) {\n newState = _.set(['pages', pageKey, 'editMode'], arrayData.map(() => false), newState);\n }\n }\n\n return newState;\n }, initialState);\n}\n\nexport function createInitialState(formConfig) {\n let initialState = {\n submission: {\n status: false,\n errorMessage: false,\n id: false,\n timestamp: false,\n hasAttemptedSubmit: false\n },\n formId: formConfig.formId,\n loadedData: {\n formData: {},\n metadata: {}\n },\n reviewPageView: {\n openChapters: [],\n viewedPages: new Set()\n },\n trackingPrefix: formConfig.trackingPrefix\n };\n\n const pageAndDataState = createFormPageList(formConfig)\n .reduce((state, page) => {\n const definitions = _.assign(formConfig.defaultDefinitions || {}, page.schema.definitions);\n let schema = replaceRefSchemas(page.schema, definitions, page.pageKey);\n // Throw an error if the new schema is invalid\n checkValidSchema(schema);\n schema = updateItemsSchema(schema);\n const isArrayPage = page.showPagePerItem;\n const data = getDefaultFormState(schema, page.initialData, schema.definitions);\n\n /* eslint-disable no-param-reassign */\n state.pages[page.pageKey] = {\n uiSchema: page.uiSchema,\n schema,\n editMode: isArrayPage ? [] : false,\n showPagePerItem: page.showPagePerItem,\n arrayPath: page.arrayPath,\n itemFilter: page.itemFilter\n };\n\n state.data = _.merge(state.data, data);\n /* eslint-enable no-param-reassign */\n\n return state;\n }, {\n data: {},\n pages: {},\n });\n\n initialState = _.assign(initialState, pageAndDataState);\n // Take another pass and recalculate the schema and data based on the default data\n // We do this to avoid passing undefined for the whole form state when the form first renders\n initialState = recalculateSchemaAndData(initialState);\n\n return initialState;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/state/helpers.js"],"names":["updateRequiredFields","isContentExpanded","setHiddenFields","removeHiddenData","updateSchemaFromUiSchema","replaceRefSchemas","updateItemsSchema","updateSchemaAndData","recalculateSchemaAndData","createInitialState","isHiddenField","schema","get","path","data","reduce","current","next","uiSchema","formData","index","type","newRequired","Object","keys","properties","requiredArray","nextProp","field","isRequired","arrayHasField","some","prop","filter","concat","required","newSchema","currentSchema","nextSchema","length","newItemSchemas","items","map","item","idx","newItem","matcher","containingObject","slice","updatedSchema","hideIf","expandUnder","expandUnderCondition","newProperties","undefined","nextData","newItems","updateSchema","newSchemaProps","definitions","Error","$ref","refPath","replace","split","definition","fieldData","Array","isArray","additionalItems","fillIn","fill","updatedItems","newData","initialState","pages","state","pageKey","page","newState","showPagePerItem","arrayData","arrayPath","editMode","formConfig","submission","status","errorMessage","id","timestamp","hasAttemptedSubmit","formId","loadedData","metadata","reviewPageView","openChapters","viewedPages","Set","pageAndDataState","defaultDefinitions","isArrayPage","initialData","itemFilter"],"mappings":"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","file":"helpers.js","sourcesContent":["import _ from 'lodash/fp';\nimport { getDefaultFormState } from '@department-of-veterans-affairs/react-jsonschema-form/lib/utils';\n\nimport {\n checkValidSchema,\n createFormPageList\n} from '../helpers';\n\nfunction isHiddenField(schema) {\n return !!schema['ui:collapsed'] || !!schema['ui:hidden'];\n}\n\nfunction get(path, data) {\n return path.reduce((current, next) => {\n return typeof current === 'undefined' ? current : current[next];\n }, data);\n}\n\n/*\n * This function goes through a schema/uiSchema and updates the required array\n * based on any ui:required field properties in the uiSchema.\n *\n * If no required fields are changing, it makes sure to not mutate the existing schema,\n * so we can still take advantage of any shouldComponentUpdate optimizations\n */\nexport function updateRequiredFields(schema, uiSchema, formData, index = null) {\n if (!uiSchema) {\n return schema;\n }\n\n if (schema.type === 'object') {\n const newRequired = Object.keys(schema.properties).reduce((requiredArray, nextProp) => {\n const field = uiSchema[nextProp];\n if (field && field['ui:required']) {\n const isRequired = field['ui:required'](formData, index);\n const arrayHasField = requiredArray.some(prop => prop === nextProp);\n\n if (arrayHasField && !isRequired) {\n return requiredArray.filter(prop => prop !== nextProp);\n } else if (!arrayHasField && isRequired) {\n return requiredArray.concat(nextProp);\n }\n\n return requiredArray;\n }\n\n return requiredArray;\n }, schema.required || []);\n\n const newSchema = Object.keys(schema.properties).reduce((currentSchema, nextProp) => {\n if (uiSchema) {\n const nextSchema = updateRequiredFields(currentSchema.properties[nextProp], uiSchema[nextProp], formData, index);\n if (nextSchema !== currentSchema.properties[nextProp]) {\n return _.set(['properties', nextProp], nextSchema, currentSchema);\n }\n }\n\n return currentSchema;\n }, schema);\n\n if (newSchema.required !== newRequired && (newSchema.required || newRequired.length > 0)) {\n return _.set('required', newRequired, newSchema);\n }\n\n return newSchema;\n }\n\n if (schema.type === 'array') {\n // each item has its own schema, so we need to update the required fields on those schemas\n // and then check for differences\n const newItemSchemas = schema.items.map((item, idx) => updateRequiredFields(item, uiSchema.items, formData, idx));\n if (newItemSchemas.some((newItem, idx) => newItem !== schema.items[idx])) {\n return _.set('items', newItemSchemas, schema);\n }\n }\n\n return schema;\n}\n\nexport function isContentExpanded(data, matcher) {\n if (typeof matcher === 'undefined') {\n return !!data;\n } else if (typeof matcher === 'function') {\n return matcher(data);\n }\n\n return data === matcher;\n}\n\n/*\n * This steps through a schema and sets any fields to hidden, based on a\n * hideIf function from uiSchema and the current page data. Sets 'ui:hidden'\n * which is a non-standard JSON Schema property\n *\n * The path parameter will contain the path, relative to formData, to the\n * form data corresponding to the current schema object\n */\nexport function setHiddenFields(schema, uiSchema, formData, path = []) {\n if (!uiSchema) {\n return schema;\n }\n\n // expandUnder fields are relative to the parent object of the current\n // field, so get that object using path here\n const containingObject = get(path.slice(0, -1), formData) || formData;\n\n let updatedSchema = schema;\n const hideIf = get(['ui:options', 'hideIf'], uiSchema);\n const index = path.reduce((current, next) => {\n return typeof next === 'number' ? next : current;\n }, null);\n\n if (hideIf && hideIf(formData, index)) {\n if (!updatedSchema['ui:hidden']) {\n updatedSchema = _.set('ui:hidden', true, updatedSchema);\n }\n } else if (updatedSchema['ui:hidden']) {\n updatedSchema = _.unset('ui:hidden', updatedSchema);\n }\n\n const expandUnder = get(['ui:options', 'expandUnder'], uiSchema);\n const expandUnderCondition = get(['ui:options', 'expandUnderCondition'], uiSchema);\n if (expandUnder && !isContentExpanded(containingObject[expandUnder], expandUnderCondition)) {\n if (!updatedSchema['ui:collapsed']) {\n updatedSchema = _.set('ui:collapsed', true, updatedSchema);\n }\n } else if (updatedSchema['ui:collapsed']) {\n updatedSchema = _.unset('ui:collapsed', updatedSchema);\n }\n\n if (updatedSchema.type === 'object') {\n const newProperties = Object.keys(updatedSchema.properties).reduce((current, next) => {\n const newSchema = setHiddenFields(updatedSchema.properties[next], uiSchema[next], formData, path.concat(next));\n\n if (newSchema !== updatedSchema.properties[next]) {\n return _.set(next, newSchema, current);\n }\n\n return current;\n }, updatedSchema.properties);\n\n if (newProperties !== updatedSchema.properties) {\n return _.set('properties', newProperties, updatedSchema);\n }\n }\n\n if (updatedSchema.type === 'array') {\n // each item has its own schema, so we need to update the required fields on those schemas\n // and then check for differences\n const newItemSchemas = updatedSchema.items.map((item, idx) =>\n setHiddenFields(item, uiSchema.items, formData, path.concat(idx))\n );\n\n if (newItemSchemas.some((newItem, idx) => newItem !== updatedSchema.items[idx])) {\n return _.set('items', newItemSchemas, updatedSchema);\n }\n }\n\n return updatedSchema;\n}\n\n/*\n * Steps through data and removes any fields that are marked as hidden\n * This is done so that hidden fields don’t cause validation errors that\n * a user can’t see.\n */\nexport function removeHiddenData(schema, data) {\n // null is necessary here because Rails 4 will convert empty arrays to null\n // In the forms, there's no difference between an empty array and null or undefined\n if (isHiddenField(schema) || typeof data === 'undefined' || data === null) {\n return undefined;\n }\n\n if (schema.type === 'object') {\n return Object.keys(data).reduce((current, next) => {\n if (typeof data[next] !== 'undefined' && schema.properties[next]) {\n const nextData = removeHiddenData(schema.properties[next], data[next]);\n\n // if the data was removed, then just unset it\n if (typeof nextData === 'undefined') {\n return _.unset(next, current);\n }\n\n // if data was updated (like a nested prop was removed), update it\n if (nextData !== data[next]) {\n return _.set(next, nextData, current);\n }\n }\n\n return current;\n }, data);\n }\n\n if (schema.type === 'array') {\n const newItems = data.map((item, index) => {\n return removeHiddenData(schema.items[index], item);\n });\n\n if (newItems.some((newItem, idx) => newItem !== data[idx])) {\n return newItems;\n }\n\n return data;\n }\n\n return data;\n}\n\n/*\n * This is similar to the hidden fields schema function above, except more general.\n * It will step through a schema and replace parts of it based on an updateSchema\n * function in uiSchema. This means the schema can be re-calculated based on data\n * a user has entered.\n */\nexport function updateSchemaFromUiSchema(schema, uiSchema, formData, index = null, path = []) {\n if (!uiSchema) {\n return schema;\n }\n\n let currentSchema = schema;\n\n if (currentSchema.type === 'object') {\n const newSchema = Object.keys(currentSchema.properties).reduce((current, next) => {\n const nextProp = updateSchemaFromUiSchema(current.properties[next], uiSchema[next], formData, index, path.concat(next));\n\n if (current.properties[next] !== nextProp) {\n return _.set(['properties', next], nextProp, current);\n }\n\n return current;\n }, currentSchema);\n\n if (newSchema !== schema) {\n currentSchema = newSchema;\n }\n }\n\n if (currentSchema.type === 'array') {\n // each item has its own schema, so we need to update the required fields on those schemas\n // and then check for differences\n const newItemSchemas = currentSchema.items.map((item, idx) =>\n updateSchemaFromUiSchema(item, uiSchema.items, formData, idx, path.concat(idx))\n );\n\n if (newItemSchemas.some((newItem, idx) => newItem !== currentSchema.items[idx])) {\n currentSchema = _.set('items', newItemSchemas, currentSchema);\n }\n }\n\n const updateSchema = get(['ui:options', 'updateSchema'], uiSchema);\n\n if (updateSchema) {\n const newSchemaProps = updateSchema(formData, currentSchema, uiSchema, index, path);\n\n const newSchema = Object.keys(newSchemaProps).reduce((current, next) => {\n if (newSchemaProps[next] !== schema[next]) {\n return _.set(next, newSchemaProps[next], current);\n }\n\n return current;\n }, currentSchema);\n\n if (newSchema !== currentSchema) {\n return newSchema;\n }\n }\n\n return currentSchema;\n}\n\nexport function replaceRefSchemas(schema, definitions, path = '') {\n // this can happen if you import a field that doesn’t exist from a schema\n if (!schema) {\n throw new Error(`Schema is undefined at ${path}`);\n }\n if (schema.$ref) {\n // There’s a whole spec for JSON pointers, but we don’t use anything more complicated\n // than this so far\n const refPath = schema.$ref.replace('#/definitions/', '').split('/');\n const definition = get(refPath, definitions);\n if (!definition) {\n throw new Error(`Missing definition for ${schema.$ref} at ${path}. You probably need to add it to defaultDefinitions`);\n }\n\n return replaceRefSchemas(definition, definitions, path);\n }\n\n if (schema.type === 'object') {\n const newSchema = Object.keys(schema.properties).reduce((current, next) => {\n const nextProp = replaceRefSchemas(schema.properties[next], definitions, `${path}.${next}`);\n\n if (current.properties[next] !== nextProp) {\n return _.set(['properties', next], nextProp, current);\n }\n\n return current;\n }, schema);\n\n return newSchema;\n }\n\n if (schema.type === 'array') {\n const newItems = replaceRefSchemas(schema.items, definitions, `${path}.items`);\n\n if (newItems !== schema.items) {\n return _.set('items', newItems, schema);\n }\n }\n\n return schema;\n}\n\n/**\n * This function updates an array schema to use the array of\n * item schema format and keeps that array in sync with the\n * data in that array in the form data.\n *\n * This allows us to have conditional fields for each array item,\n * because our conditional field implementation depends on modifying\n * schemas\n *\n * @param {Object} schema The current JSON Schema object\n * @param {any} fieldData The data associated with the current schema\n */\nexport function updateItemsSchema(schema, fieldData = null) {\n if (schema.type === 'array') {\n let newSchema = schema;\n\n // This happens the first time this function is called when\n // generating the form\n if (!Array.isArray(schema.items)) {\n newSchema = _.assign(schema, {\n items: [],\n additionalItems: schema.items\n });\n }\n\n if (!fieldData) {\n // If there’s no data, the list of schemas should be empty\n newSchema = _.set('items', [], newSchema);\n } else if (fieldData.length > newSchema.items.length) {\n // Here we’re filling in the items array to make it the same\n // length as the array of form data. This happens when you add\n // another record on the form, mainly.\n const fillIn = Array(fieldData.length - newSchema.items.length)\n .fill(newSchema.additionalItems);\n newSchema = _.set('items', newSchema.items.concat(fillIn), newSchema);\n } else if (fieldData.length < newSchema.items.length) {\n // If someone removed a record we’re removing the last schema item\n // This may not be the actual removed schema, but the schemas will\n // always be updated in the next step\n newSchema = _.set('items', _.dropRight(1, newSchema.items), newSchema);\n }\n\n const updatedItems = newSchema.items.map(\n (item, index) => updateItemsSchema(item, fieldData[index])\n );\n if (newSchema.items.some((item, index) => item !== updatedItems[index])) {\n return _.set('items', updatedItems, newSchema);\n }\n\n return newSchema;\n }\n\n if (schema.type === 'object') {\n const newSchema = Object.keys(schema.properties).reduce((current, next) => {\n const nextProp = updateItemsSchema(schema.properties[next], fieldData ? fieldData[next] : null);\n\n if (current.properties[next] !== nextProp) {\n return _.set(['properties', next], nextProp, current);\n }\n\n return current;\n }, schema);\n\n return newSchema;\n }\n\n return schema;\n}\n\n/**\n * This is the main sequence of updates that happens when data is changed\n * on a form. Most updates are applied to the schema, except that the data\n * is updated to remove newly hidden data\n *\n * @param {Object} schema The current JSON Schema\n * @param {Object} uiSchema The current UI Schema (does not change)\n * @param {Object} formData Flattened data for the entire form\n */\nexport function updateSchemaAndData(schema, uiSchema, formData) {\n let newSchema = updateItemsSchema(schema, formData);\n newSchema = updateRequiredFields(newSchema, uiSchema, formData);\n\n // Update the schema with any fields that are now hidden because of the data change\n newSchema = setHiddenFields(newSchema, uiSchema, formData);\n\n // Update the schema with any general updates based on the new data\n newSchema = updateSchemaFromUiSchema(newSchema, uiSchema, formData);\n\n // Remove any data that’s now hidden in the schema\n const newData = removeHiddenData(newSchema, formData);\n\n // We need to do this again because array data might have been removed\n newSchema = updateItemsSchema(newSchema, newData);\n\n checkValidSchema(newSchema);\n\n return {\n data: newData,\n schema: newSchema\n };\n}\n\nexport function recalculateSchemaAndData(initialState) {\n return Object.keys(initialState.pages)\n .reduce((state, pageKey) => {\n // on each data change, we need to do the following steps\n // Recalculate any required fields, based on the new data\n const page = state.pages[pageKey];\n const formData = initialState.data;\n\n const { data, schema } = updateSchemaAndData(page.schema, page.uiSchema, formData);\n\n let newState = state;\n\n if (formData !== data) {\n newState = _.set('data', data, state);\n }\n\n if (page.schema !== schema) {\n newState = _.set(['pages', pageKey, 'schema'], schema, newState);\n }\n\n if (page.showPagePerItem) {\n const arrayData = _.get(page.arrayPath, newState.data) || [];\n // If an item was added or removed for the data used by a showPagePerItem page,\n // we have to reset everything because we can’t match the edit states to rows directly\n // This will rarely ever be noticeable\n if (page.editMode.length !== arrayData.length) {\n newState = _.set(['pages', pageKey, 'editMode'], arrayData.map(() => false), newState);\n }\n }\n\n return newState;\n }, initialState);\n}\n\nexport function createInitialState(formConfig) {\n let initialState = {\n submission: {\n status: false,\n errorMessage: false,\n id: false,\n timestamp: false,\n hasAttemptedSubmit: false\n },\n formId: formConfig.formId,\n loadedData: {\n formData: {},\n metadata: {}\n },\n reviewPageView: {\n openChapters: [],\n viewedPages: new Set()\n }\n };\n\n const pageAndDataState = createFormPageList(formConfig)\n .reduce((state, page) => {\n const definitions = _.assign(formConfig.defaultDefinitions || {}, page.schema.definitions);\n let schema = replaceRefSchemas(page.schema, definitions, page.pageKey);\n // Throw an error if the new schema is invalid\n checkValidSchema(schema);\n schema = updateItemsSchema(schema);\n const isArrayPage = page.showPagePerItem;\n const data = getDefaultFormState(schema, page.initialData, schema.definitions);\n\n /* eslint-disable no-param-reassign */\n state.pages[page.pageKey] = {\n uiSchema: page.uiSchema,\n schema,\n editMode: isArrayPage ? [] : false,\n showPagePerItem: page.showPagePerItem,\n arrayPath: page.arrayPath,\n itemFilter: page.itemFilter\n };\n\n state.data = _.merge(state.data, data);\n /* eslint-enable no-param-reassign */\n\n return state;\n }, {\n data: {},\n pages: {},\n });\n\n initialState = _.assign(initialState, pageAndDataState);\n // Take another pass and recalculate the schema and data based on the default data\n // We do this to avoid passing undefined for the whole form state when the form first renders\n initialState = recalculateSchemaAndData(initialState);\n\n return initialState;\n}\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 75f578e..cd61664 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7936,11 +7936,6 @@ "safe-buffer": "^5.1.0" } }, - "raven-js": { - "version": "3.24.2", - "resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.24.2.tgz", - "integrity": "sha512-Dy/FHDxuo5pXywVf8Nrs5utB2juMATpkxWGqHjVbpFD3m8CaWYLvkB5SEXjWFUZ5GvUsrBVVQ+Dfcp0x6Z7SOg==" - }, "react": { "version": "15.6.2", "resolved": "https://registry.npmjs.org/react/-/react-15.6.2.tgz", diff --git a/package.json b/package.json index 9f4dab4..2dd59b3 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,6 @@ "fast-levenshtein": "^2.0.6", "history": "3", "moment": "^2.15.1", - "raven-js": "^3.12.1", "react-redux": "4.4.8", "react-router": "3", "react-scroll": "^1.7.9", diff --git a/src/js/actions.js b/src/js/actions.js index 4471e8a..31fc0a6 100644 --- a/src/js/actions.js +++ b/src/js/actions.js @@ -1,7 +1,6 @@ -import Raven from 'raven-js'; import moment from 'moment'; import _ from './utilities/data'; -import { transformForSubmit, recordEvent } from './helpers'; +import { transformForSubmit } from './helpers'; import { timeFromNow } from './utilities/date'; export const SET_EDIT_MODE = 'SET_EDIT_MODE'; @@ -78,15 +77,14 @@ export function setViewedPages(pageKeys) { }; } -function submitToUrl(body, submitUrl, trackingPrefix) { +function submitToUrl(body, submitUrl, recordEvent) { return new Promise((resolve, reject) => { const req = new XMLHttpRequest(); req.open('POST', submitUrl); req.addEventListener('load', () => { if (req.status >= 200 && req.status < 300) { - recordEvent({ - event: `${trackingPrefix}-submission-successful`, - }); + recordEvent({ event: 'form-submit-successful' }); + // got this from the fetch polyfill, keeping it to be safe const responseBody = 'response' in req ? req.response : req.responseText; const results = JSON.parse(responseBody); @@ -135,24 +133,13 @@ function submitToUrl(body, submitUrl, trackingPrefix) { } export function submitForm(formConfig, form) { - const captureError = (error, errorType) => { - Raven.captureException(error, { - fingerprint: [formConfig.trackingPrefix, error.message], - extra: { - errorType, - statusText: error.statusText - } - }); - recordEvent({ - event: `${formConfig.trackingPrefix}-submission-failed${errorType.startsWith('client') ? '-client' : ''}`, - }); - }; + const recordEvent = formConfig.recordEvent ? + formConfig.recordEvent.bind(formConfig) : + console.error.bind(console); // eslint-disable-line no-console return dispatch => { dispatch(setSubmission('status', 'submitPending')); - recordEvent({ - event: `${formConfig.trackingPrefix}-submission`, - }); + recordEvent({ event: 'form-submit-pending' }); let promise; if (formConfig.submit) { @@ -162,7 +149,7 @@ export function submitForm(formConfig, form) { ? formConfig.transformForSubmit(formConfig, form) : transformForSubmit(formConfig, form); - promise = submitToUrl(body, formConfig.submitUrl, formConfig.trackingPrefix); + promise = submitToUrl(body, formConfig.submitUrl, recordEvent); } return promise @@ -177,7 +164,7 @@ export function submitForm(formConfig, form) { } else if (errorMessage.startsWith('vets_server_error')) { errorType = 'serverError'; } - captureError(error, errorType); + recordEvent({ event: 'form-submit-error', error, errorType }); dispatch(setSubmission('status', errorType, error.extra)); }); }; @@ -242,7 +229,8 @@ export function uploadFile(file, uiOptions, onProgress, onChange, onError) { name: file.name, errorMessage }); - Raven.captureMessage(`vets_upload_error: ${req.statusText}`); + // Commenting until this is removed by a PR for #211 + // Raven.captureMessage(`vets_upload_error: ${req.statusText}`); onError(); } }); @@ -253,11 +241,12 @@ export function uploadFile(file, uiOptions, onProgress, onChange, onError) { name: file.name, errorMessage }); - Raven.captureMessage(`vets_upload_error: ${errorMessage}`, { - extra: { - statusText: req.statusText - } - }); + // Commenting until this is removed by a PR for #211 + // Raven.captureMessage(`vets_upload_error: ${errorMessage}`, { + // extra: { + // statusText: req.statusText + // } + // }); onError(); }); diff --git a/src/js/helpers.js b/src/js/helpers.js index c6382d5..b207c6b 100644 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -578,13 +578,3 @@ export function omitRequired(schema) { return newSchema; } - -/** - * Helper function for reporting events to Google Analytics. An alias for window.dataLayer.push. - * @module platform/monitoring/record-event - * @see https://developers.google.com/tag-manager/devguide - * @param {object} data - The event data that will be sent to GA. - */ -export function recordEvent(data) { - return window.dataLayer && window.dataLayer.push(data); -} diff --git a/src/js/review/SubmitController.jsx b/src/js/review/SubmitController.jsx index 87b2a37..c97030d 100644 --- a/src/js/review/SubmitController.jsx +++ b/src/js/review/SubmitController.jsx @@ -1,5 +1,4 @@ import React from 'react'; -import Raven from 'raven-js'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { withRouter } from 'react-router'; @@ -10,8 +9,7 @@ import { isValidForm } from '../validation'; import { createPageListByChapter, expandArrayPages, - getActivePages, - recordEvent + getActivePages } from '../helpers'; import { setPreSubmit, @@ -60,8 +58,7 @@ class SubmitController extends React.Component { const { form, formConfig, - pagesByChapter, - trackingPrefix + pagesByChapter } = this.props; // If a pre-submit agreement is required, make sure it was accepted @@ -76,15 +73,11 @@ class SubmitController extends React.Component { // like to know if they’re common const { isValid, errors } = isValidForm(form, pagesByChapter); if (!isValid) { - recordEvent({ - event: `${trackingPrefix}-validation-failed`, - }); - Raven.captureMessage('Validation issue not displayed', { - extra: { - errors, - prefix: trackingPrefix - } - }); + const recordEvent = formConfig.recordEvent ? + formConfig.recordEvent.bind(formConfig) : + console.error.bind(console); // eslint-disable-line no-console + + recordEvent({ event: 'validation-failed-on-submit', errors }); this.props.setSubmission('status', 'validationError'); this.props.setSubmission('hasAttemptedSubmit', true); return; @@ -130,7 +123,6 @@ function mapStateToProps(state, ownProps) { const form = state.form; const pagesByChapter = createPageListByChapter(formConfig); - const trackingPrefix = formConfig.trackingPrefix; const submission = form.submission; const showPreSubmitError = submission.hasAttemptedSubmit; @@ -142,8 +134,7 @@ function mapStateToProps(state, ownProps) { renderErrorMessage, router, submission, - showPreSubmitError, - trackingPrefix + showPreSubmitError }; } diff --git a/src/js/state/helpers.js b/src/js/state/helpers.js index 3ee2747..9b908c7 100644 --- a/src/js/state/helpers.js +++ b/src/js/state/helpers.js @@ -463,8 +463,7 @@ export function createInitialState(formConfig) { reviewPageView: { openChapters: [], viewedPages: new Set() - }, - trackingPrefix: formConfig.trackingPrefix + } }; const pageAndDataState = createFormPageList(formConfig) From 60141caedf19b9940914af4bc1f0bdbd28f1405d Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 4 Sep 2018 15:13:50 -0400 Subject: [PATCH 2/9] Documentation is sweeping the nation --- ...vailable-form-features-and-usage-guidelines.md | 15 +++++++++++++++ src/js/actions.js | 2 +- src/js/review/SubmitController.jsx | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/building-a-form/available-form-features-and-usage-guidelines.md b/docs/building-a-form/available-form-features-and-usage-guidelines.md index edb0a61..f4363af 100644 --- a/docs/building-a-form/available-form-features-and-usage-guidelines.md +++ b/docs/building-a-form/available-form-features-and-usage-guidelines.md @@ -21,6 +21,7 @@ These form features are available in the US Forms System library. We've provided - [Sequential duplicate form groups](#sequential-duplicate-form-groups) - [Review page](#review-page) - [Required checkbox before form submission](#required-checkbox-before-form-submission) +- [Remote error and event monitoring](#remote-error-and-event-monitoring) ### Form instructions @@ -448,4 +449,18 @@ If you don't specify a `preSubmitInfo` section, no notice or checkbox appears ab For the code implementation, see [`PreSubmitSection`](../../src/js/components/PreSubmitSection.jsx) and [`SubmitController`](../../src/js/review/SubmitController.jsx). +### Remote error and event monitoring + +If you provide a function for `formConfig.recordEvent`, the library calls that function when notable events occur. If you do not provide a function, the library logs these events onto the browser console. + +The `recordEvent` function receives a single object that can contain different information depending on the kind of event being reported. Events reported by the library always have a `event` property that is a string describing the event. The events currently supported by the library are: +* **validation-failed-on-submit**: The user completed the form and tried to submit it, but there were still validation errors. This is most likely an error in the form definition or one of the React components, since the form should already be fully validated by the time this point is reached. +* **form-submit-pending**: The user has pressed the submit button, the form validated, and the form has been sent to the server. This is informational only and does not represent an error. +* **form-submit-successful**: The server returned a status indicating it has accepted the form. +* **form-submit-error**: The form was submitted but some problem occurred that prevented it from being accepted by the server. The object contains an `error` and `errorType` with more information about the nature of the error. + +### Usage guidelines + +Web applications can fail for many reasons, including bad Internet connections, outdated browsers, and misbehaved browser extensions. Even if you test thoroughly, users may experience frustrating errors that they do not report. We highly recommend that you use an error and event reporting service to track the use of your forms. Examples of services that could be used are Google Analytics, Errorception, Sentry, Airbrake, and Raygun. + [Back to *Building a Form*](./README.md) diff --git a/src/js/actions.js b/src/js/actions.js index 31fc0a6..de2251b 100644 --- a/src/js/actions.js +++ b/src/js/actions.js @@ -135,7 +135,7 @@ function submitToUrl(body, submitUrl, recordEvent) { export function submitForm(formConfig, form) { const recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : - console.error.bind(console); // eslint-disable-line no-console + console.log.bind(console); // eslint-disable-line no-console return dispatch => { dispatch(setSubmission('status', 'submitPending')); diff --git a/src/js/review/SubmitController.jsx b/src/js/review/SubmitController.jsx index c97030d..a51aca4 100644 --- a/src/js/review/SubmitController.jsx +++ b/src/js/review/SubmitController.jsx @@ -75,7 +75,7 @@ class SubmitController extends React.Component { if (!isValid) { const recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : - console.error.bind(console); // eslint-disable-line no-console + console.log.bind(console); // eslint-disable-line no-console recordEvent({ event: 'validation-failed-on-submit', errors }); this.props.setSubmission('status', 'validationError'); From 217ea09eb912f65cd7c0f5c44e428c7184225c89 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Wed, 5 Sep 2018 10:53:37 -0400 Subject: [PATCH 3/9] PR feedback on docs --- .../available-form-features-and-usage-guidelines.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/building-a-form/available-form-features-and-usage-guidelines.md b/docs/building-a-form/available-form-features-and-usage-guidelines.md index f4363af..a27cc51 100644 --- a/docs/building-a-form/available-form-features-and-usage-guidelines.md +++ b/docs/building-a-form/available-form-features-and-usage-guidelines.md @@ -454,10 +454,10 @@ For the code implementation, see [`PreSubmitSection`](../../src/js/components/Pr If you provide a function for `formConfig.recordEvent`, the library calls that function when notable events occur. If you do not provide a function, the library logs these events onto the browser console. The `recordEvent` function receives a single object that can contain different information depending on the kind of event being reported. Events reported by the library always have a `event` property that is a string describing the event. The events currently supported by the library are: -* **validation-failed-on-submit**: The user completed the form and tried to submit it, but there were still validation errors. This is most likely an error in the form definition or one of the React components, since the form should already be fully validated by the time this point is reached. -* **form-submit-pending**: The user has pressed the submit button, the form validated, and the form has been sent to the server. This is informational only and does not represent an error. +* **validation-failed-on-submit**: This is likely an error in the form definition or a React component, since the form should be completely validated at this point. +* **form-submit-pending**: An informational message showing that the user has pressed the submit button, and that the form has validated and been sent to the server. * **form-submit-successful**: The server returned a status indicating it has accepted the form. -* **form-submit-error**: The form was submitted but some problem occurred that prevented it from being accepted by the server. The object contains an `error` and `errorType` with more information about the nature of the error. +* **form-submit-error**: The form was submitted, but the server didn't accept the submission. The object contains an `error` and `errorType` with more information about the nature of the error. ### Usage guidelines From 6af66f1840a58ea9d841d22105e90abe5a8792c2 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 11 Sep 2018 11:41:21 -0400 Subject: [PATCH 4/9] Add example to docs --- ...able-form-features-and-usage-guidelines.md | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/building-a-form/available-form-features-and-usage-guidelines.md b/docs/building-a-form/available-form-features-and-usage-guidelines.md index a27cc51..98c37e7 100644 --- a/docs/building-a-form/available-form-features-and-usage-guidelines.md +++ b/docs/building-a-form/available-form-features-and-usage-guidelines.md @@ -459,8 +459,26 @@ The `recordEvent` function receives a single object that can contain different i * **form-submit-successful**: The server returned a status indicating it has accepted the form. * **form-submit-error**: The form was submitted, but the server didn't accept the submission. The object contains an `error` and `errorType` with more information about the nature of the error. +Other events may be added in the future. This `recordEvent` logs events to Google Analytics, except for pending/successful form submits which are filtered out: + +```js +formConfig = { + ... + // The Google Analytics code snippet loads in the main document + // https://developers.google.com/analytics/devguides/collection/analyticsjs/ + recordEvent: data => { + // Don't log if GA is not (yet) loaded or if this is a form success/pending + if (!window.dataLayer || /^form-submit-(successful|pending)$/).test(data.event)) { + return; + } + return window.dataLayer.push(event); + }, + ... +}; +``` + ### Usage guidelines -Web applications can fail for many reasons, including bad Internet connections, outdated browsers, and misbehaved browser extensions. Even if you test thoroughly, users may experience frustrating errors that they do not report. We highly recommend that you use an error and event reporting service to track the use of your forms. Examples of services that could be used are Google Analytics, Errorception, Sentry, Airbrake, and Raygun. +Web applications can fail for many reasons, including bad Internet connections, outdated browsers, and misbehaved browser extensions. Even if you test thoroughly, users may experience frustrating errors that they do not or cannot report. We highly recommend that you use an error-reporting and/or event-reporting service to track the use of your forms. Examples of services that could be used are Google Analytics, Errorception, Sentry, Airbrake, and Raygun. [Back to *Building a Form*](./README.md) From b49a710ae18f9510b84fe4dcfa95c2978dccfeba Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 11 Sep 2018 11:43:26 -0400 Subject: [PATCH 5/9] Update built files --- lib/js/actions.js | 2 +- lib/js/actions.js.map | 2 +- lib/js/review/SubmitController.js | 2 +- lib/js/review/SubmitController.js.map | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/js/actions.js b/lib/js/actions.js index 8bc1241..94ea28b 100644 --- a/lib/js/actions.js +++ b/lib/js/actions.js @@ -164,7 +164,7 @@ function submitToUrl(body, submitUrl, recordEvent) { } function submitForm(formConfig, form) { - var recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : console.error.bind(console); // eslint-disable-line no-console + var recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : console.log.bind(console); // eslint-disable-line no-console return function (dispatch) { dispatch(setSubmission('status', 'submitPending')); diff --git a/lib/js/actions.js.map b/lib/js/actions.js.map index a2095bf..4957004 100644 --- a/lib/js/actions.js.map +++ b/lib/js/actions.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/js/actions.js"],"names":["closeReviewChapter","openReviewChapter","setData","setEditMode","setSubmission","setPreSubmit","setSubmitted","setViewedPages","submitForm","uploadFile","SET_EDIT_MODE","SET_DATA","SET_VIEWED_PAGES","SET_PRE_SUBMIT","SET_SUBMISSION","SET_SUBMITTED","OPEN_REVIEW_CHAPTER","CLOSE_REVIEW_CHAPTER","closedChapter","pageKeys","type","openedChapter","data","page","edit","index","field","value","extra","preSubmitField","preSubmitAccepted","response","submitToUrl","body","submitUrl","recordEvent","Promise","resolve","reject","req","XMLHttpRequest","open","addEventListener","status","event","responseBody","responseText","results","JSON","parse","error","Error","statusText","parseInt","getResponseHeader","setRequestHeader","userToken","_","get","window","send","formConfig","form","bind","console","dispatch","promise","submit","transformForSubmit","then","resp","catch","errorReceived","errorMessage","String","message","errorType","startsWith","file","uiOptions","onProgress","onChange","onError","getState","size","maxSize","name","minSize","fileTypes","some","toLowerCase","endsWith","fileType","uploading","payload","createPayload","formId","fileUploadUrl","fileData","parseResponse","moment","unix","upload","evt","lengthComputable","loaded","total"],"mappings":"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","file":"actions.js","sourcesContent":["import moment from 'moment';\nimport _ from './utilities/data';\nimport { transformForSubmit } from './helpers';\nimport { timeFromNow } from './utilities/date';\n\nexport const SET_EDIT_MODE = 'SET_EDIT_MODE';\nexport const SET_DATA = 'SET_DATA';\nexport const SET_VIEWED_PAGES = 'SET_VIEWED_PAGES';\nexport const SET_PRE_SUBMIT = 'SET_PRE_SUBMIT';\nexport const SET_SUBMISSION = 'SET_SUBMISSION';\nexport const SET_SUBMITTED = 'SET_SUBMITTED';\nexport const OPEN_REVIEW_CHAPTER = 'OPEN_REVIEW_CHAPTER';\nexport const CLOSE_REVIEW_CHAPTER = 'CLOSE_REVIEW_CHAPTER';\n\nexport function closeReviewChapter(closedChapter, pageKeys = []) {\n return {\n type: CLOSE_REVIEW_CHAPTER,\n closedChapter,\n pageKeys\n };\n}\n\nexport function openReviewChapter(openedChapter) {\n return {\n type: OPEN_REVIEW_CHAPTER,\n openedChapter\n };\n}\n\nexport function setData(data) {\n return {\n type: SET_DATA,\n data\n };\n}\n\nexport function setEditMode(page, edit, index = null) {\n return {\n type: SET_EDIT_MODE,\n edit,\n page,\n index\n };\n}\n\n// extra is used to pass other information (from a submission error or anything else)\n// into the submission state object\nexport function setSubmission(field, value, extra = null) {\n return {\n type: SET_SUBMISSION,\n field,\n value,\n extra\n };\n}\n\nexport function setPreSubmit(preSubmitField, preSubmitAccepted) {\n return {\n type: SET_PRE_SUBMIT,\n preSubmitField,\n preSubmitAccepted\n };\n}\n\nexport function setSubmitted(response) {\n return {\n type: SET_SUBMITTED,\n response: typeof response.data !== 'undefined' ? response.data : response\n };\n}\n\n\nexport function setViewedPages(pageKeys) {\n return {\n type: SET_VIEWED_PAGES,\n pageKeys\n };\n}\n\nfunction submitToUrl(body, submitUrl, recordEvent) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.open('POST', submitUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n recordEvent({ event: 'form-submit-successful' });\n\n // got this from the fetch polyfill, keeping it to be safe\n const responseBody = 'response' in req ? req.response : req.responseText;\n const results = JSON.parse(responseBody);\n resolve(results);\n } else {\n let error;\n if (req.status === 429) {\n error = new Error(`vets_throttled_error: ${req.statusText}`);\n error.extra = parseInt(req.getResponseHeader('x-ratelimit-reset'), 10);\n } else {\n error = new Error(`vets_server_error: ${req.statusText}`);\n }\n error.statusText = req.statusText;\n reject(error);\n }\n });\n\n req.addEventListener('error', () => {\n const error = new Error('vets_client_error: Network request failed');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('abort', () => {\n const error = new Error('vets_client_error: Request aborted');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('timeout', () => {\n const error = new Error('vets_client_error: Request timed out');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.setRequestHeader('Content-Type', 'application/json');\n\n const userToken = _.get('sessionStorage.userToken', window);\n if (userToken) {\n req.setRequestHeader('Authorization', `Token token=${userToken}`);\n }\n\n req.send(body);\n });\n}\n\nexport function submitForm(formConfig, form) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent.bind(formConfig) :\n console.error.bind(console); // eslint-disable-line no-console\n\n return dispatch => {\n dispatch(setSubmission('status', 'submitPending'));\n recordEvent({ event: 'form-submit-pending' });\n\n let promise;\n if (formConfig.submit) {\n promise = formConfig.submit(form, formConfig);\n } else {\n const body = formConfig.transformForSubmit\n ? formConfig.transformForSubmit(formConfig, form)\n : transformForSubmit(formConfig, form);\n\n promise = submitToUrl(body, formConfig.submitUrl, recordEvent);\n }\n\n return promise\n .then(resp => dispatch(setSubmitted(resp)))\n .catch(errorReceived => {\n // overly cautious\n const error = errorReceived instanceof Error ? errorReceived : new Error(errorReceived);\n const errorMessage = String(error.message);\n let errorType = 'clientError';\n if (errorMessage.startsWith('vets_throttled_error')) {\n errorType = 'throttledError';\n } else if (errorMessage.startsWith('vets_server_error')) {\n errorType = 'serverError';\n }\n recordEvent({ event: 'form-submit-error', error, errorType });\n dispatch(setSubmission('status', errorType, error.extra));\n });\n };\n}\n\nexport function uploadFile(file, uiOptions, onProgress, onChange, onError) {\n return (dispatch, getState) => {\n if (file.size > uiOptions.maxSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too large to be uploaded'\n });\n\n onError();\n return null;\n }\n\n if (file.size < uiOptions.minSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too small to be uploaded'\n });\n\n onError();\n return null;\n }\n\n // we limit file types, but it’s not respected on mobile and desktop\n // users can bypass it without much effort\n if (!uiOptions.fileTypes.some(fileType => file.name.toLowerCase().endsWith(fileType.toLowerCase()))) {\n onChange({\n name: file.name,\n errorMessage: 'File is not one of the allowed types'\n });\n\n onError();\n return null;\n }\n\n onChange({\n name: file.name,\n uploading: true\n });\n\n const payload = uiOptions.createPayload(file, getState().form.formId);\n\n const req = new XMLHttpRequest();\n\n req.open('POST', uiOptions.fileUploadUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n const body = 'response' in req ? req.response : req.responseText;\n const fileData = uiOptions.parseResponse(JSON.parse(body), file);\n onChange(fileData);\n } else {\n let errorMessage = req.statusText;\n if (req.status === 429) {\n errorMessage = `You’ve reached the limit for the number of submissions we can accept at this time. Please try again in ${timeFromNow(moment.unix(parseInt(req.getResponseHeader('x-ratelimit-reset'), 10)))}.`;\n }\n\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${req.statusText}`);\n onError();\n }\n });\n\n req.addEventListener('error', () => {\n const errorMessage = 'Network request failed';\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${errorMessage}`, {\n // extra: {\n // statusText: req.statusText\n // }\n // });\n onError();\n });\n\n req.upload.addEventListener('progress', (evt) => {\n if (evt.lengthComputable && onProgress) {\n // setting this at 80, because there's some time after we get to 100%\n // where the backend is uploading to s3\n onProgress((evt.loaded / evt.total) * 80);\n }\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.send(payload);\n\n return req;\n };\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/js/actions.js"],"names":["closeReviewChapter","openReviewChapter","setData","setEditMode","setSubmission","setPreSubmit","setSubmitted","setViewedPages","submitForm","uploadFile","SET_EDIT_MODE","SET_DATA","SET_VIEWED_PAGES","SET_PRE_SUBMIT","SET_SUBMISSION","SET_SUBMITTED","OPEN_REVIEW_CHAPTER","CLOSE_REVIEW_CHAPTER","closedChapter","pageKeys","type","openedChapter","data","page","edit","index","field","value","extra","preSubmitField","preSubmitAccepted","response","submitToUrl","body","submitUrl","recordEvent","Promise","resolve","reject","req","XMLHttpRequest","open","addEventListener","status","event","responseBody","responseText","results","JSON","parse","error","Error","statusText","parseInt","getResponseHeader","setRequestHeader","userToken","_","get","window","send","formConfig","form","bind","console","log","dispatch","promise","submit","transformForSubmit","then","resp","catch","errorReceived","errorMessage","String","message","errorType","startsWith","file","uiOptions","onProgress","onChange","onError","getState","size","maxSize","name","minSize","fileTypes","some","toLowerCase","endsWith","fileType","uploading","payload","createPayload","formId","fileUploadUrl","fileData","parseResponse","moment","unix","upload","evt","lengthComputable","loaded","total"],"mappings":"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","file":"actions.js","sourcesContent":["import moment from 'moment';\nimport _ from './utilities/data';\nimport { transformForSubmit } from './helpers';\nimport { timeFromNow } from './utilities/date';\n\nexport const SET_EDIT_MODE = 'SET_EDIT_MODE';\nexport const SET_DATA = 'SET_DATA';\nexport const SET_VIEWED_PAGES = 'SET_VIEWED_PAGES';\nexport const SET_PRE_SUBMIT = 'SET_PRE_SUBMIT';\nexport const SET_SUBMISSION = 'SET_SUBMISSION';\nexport const SET_SUBMITTED = 'SET_SUBMITTED';\nexport const OPEN_REVIEW_CHAPTER = 'OPEN_REVIEW_CHAPTER';\nexport const CLOSE_REVIEW_CHAPTER = 'CLOSE_REVIEW_CHAPTER';\n\nexport function closeReviewChapter(closedChapter, pageKeys = []) {\n return {\n type: CLOSE_REVIEW_CHAPTER,\n closedChapter,\n pageKeys\n };\n}\n\nexport function openReviewChapter(openedChapter) {\n return {\n type: OPEN_REVIEW_CHAPTER,\n openedChapter\n };\n}\n\nexport function setData(data) {\n return {\n type: SET_DATA,\n data\n };\n}\n\nexport function setEditMode(page, edit, index = null) {\n return {\n type: SET_EDIT_MODE,\n edit,\n page,\n index\n };\n}\n\n// extra is used to pass other information (from a submission error or anything else)\n// into the submission state object\nexport function setSubmission(field, value, extra = null) {\n return {\n type: SET_SUBMISSION,\n field,\n value,\n extra\n };\n}\n\nexport function setPreSubmit(preSubmitField, preSubmitAccepted) {\n return {\n type: SET_PRE_SUBMIT,\n preSubmitField,\n preSubmitAccepted\n };\n}\n\nexport function setSubmitted(response) {\n return {\n type: SET_SUBMITTED,\n response: typeof response.data !== 'undefined' ? response.data : response\n };\n}\n\n\nexport function setViewedPages(pageKeys) {\n return {\n type: SET_VIEWED_PAGES,\n pageKeys\n };\n}\n\nfunction submitToUrl(body, submitUrl, recordEvent) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.open('POST', submitUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n recordEvent({ event: 'form-submit-successful' });\n\n // got this from the fetch polyfill, keeping it to be safe\n const responseBody = 'response' in req ? req.response : req.responseText;\n const results = JSON.parse(responseBody);\n resolve(results);\n } else {\n let error;\n if (req.status === 429) {\n error = new Error(`vets_throttled_error: ${req.statusText}`);\n error.extra = parseInt(req.getResponseHeader('x-ratelimit-reset'), 10);\n } else {\n error = new Error(`vets_server_error: ${req.statusText}`);\n }\n error.statusText = req.statusText;\n reject(error);\n }\n });\n\n req.addEventListener('error', () => {\n const error = new Error('vets_client_error: Network request failed');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('abort', () => {\n const error = new Error('vets_client_error: Request aborted');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('timeout', () => {\n const error = new Error('vets_client_error: Request timed out');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.setRequestHeader('Content-Type', 'application/json');\n\n const userToken = _.get('sessionStorage.userToken', window);\n if (userToken) {\n req.setRequestHeader('Authorization', `Token token=${userToken}`);\n }\n\n req.send(body);\n });\n}\n\nexport function submitForm(formConfig, form) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent.bind(formConfig) :\n console.log.bind(console); // eslint-disable-line no-console\n\n return dispatch => {\n dispatch(setSubmission('status', 'submitPending'));\n recordEvent({ event: 'form-submit-pending' });\n\n let promise;\n if (formConfig.submit) {\n promise = formConfig.submit(form, formConfig);\n } else {\n const body = formConfig.transformForSubmit\n ? formConfig.transformForSubmit(formConfig, form)\n : transformForSubmit(formConfig, form);\n\n promise = submitToUrl(body, formConfig.submitUrl, recordEvent);\n }\n\n return promise\n .then(resp => dispatch(setSubmitted(resp)))\n .catch(errorReceived => {\n // overly cautious\n const error = errorReceived instanceof Error ? errorReceived : new Error(errorReceived);\n const errorMessage = String(error.message);\n let errorType = 'clientError';\n if (errorMessage.startsWith('vets_throttled_error')) {\n errorType = 'throttledError';\n } else if (errorMessage.startsWith('vets_server_error')) {\n errorType = 'serverError';\n }\n recordEvent({ event: 'form-submit-error', error, errorType });\n dispatch(setSubmission('status', errorType, error.extra));\n });\n };\n}\n\nexport function uploadFile(file, uiOptions, onProgress, onChange, onError) {\n return (dispatch, getState) => {\n if (file.size > uiOptions.maxSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too large to be uploaded'\n });\n\n onError();\n return null;\n }\n\n if (file.size < uiOptions.minSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too small to be uploaded'\n });\n\n onError();\n return null;\n }\n\n // we limit file types, but it’s not respected on mobile and desktop\n // users can bypass it without much effort\n if (!uiOptions.fileTypes.some(fileType => file.name.toLowerCase().endsWith(fileType.toLowerCase()))) {\n onChange({\n name: file.name,\n errorMessage: 'File is not one of the allowed types'\n });\n\n onError();\n return null;\n }\n\n onChange({\n name: file.name,\n uploading: true\n });\n\n const payload = uiOptions.createPayload(file, getState().form.formId);\n\n const req = new XMLHttpRequest();\n\n req.open('POST', uiOptions.fileUploadUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n const body = 'response' in req ? req.response : req.responseText;\n const fileData = uiOptions.parseResponse(JSON.parse(body), file);\n onChange(fileData);\n } else {\n let errorMessage = req.statusText;\n if (req.status === 429) {\n errorMessage = `You’ve reached the limit for the number of submissions we can accept at this time. Please try again in ${timeFromNow(moment.unix(parseInt(req.getResponseHeader('x-ratelimit-reset'), 10)))}.`;\n }\n\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${req.statusText}`);\n onError();\n }\n });\n\n req.addEventListener('error', () => {\n const errorMessage = 'Network request failed';\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${errorMessage}`, {\n // extra: {\n // statusText: req.statusText\n // }\n // });\n onError();\n });\n\n req.upload.addEventListener('progress', (evt) => {\n if (evt.lengthComputable && onProgress) {\n // setting this at 80, because there's some time after we get to 100%\n // where the backend is uploading to s3\n onProgress((evt.loaded / evt.total) * 80);\n }\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.send(payload);\n\n return req;\n };\n}\n"]} \ No newline at end of file diff --git a/lib/js/review/SubmitController.js b/lib/js/review/SubmitController.js index 689efbd..20228d1 100644 --- a/lib/js/review/SubmitController.js +++ b/lib/js/review/SubmitController.js @@ -99,7 +99,7 @@ var SubmitController = function (_React$Component) { errors = _isValidForm.errors; if (!isValid) { - var recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : console.error.bind(console); // eslint-disable-line no-console + var recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : console.log.bind(console); // eslint-disable-line no-console recordEvent({ event: 'validation-failed-on-submit', errors: errors }); _this.props.setSubmission('status', 'validationError'); diff --git a/lib/js/review/SubmitController.js.map b/lib/js/review/SubmitController.js.map index bf0fb2f..695d3ff 100644 --- a/lib/js/review/SubmitController.js.map +++ b/lib/js/review/SubmitController.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","eligiblePageList","data","expandedPageList","push","length","path","handleSubmit","pagesByChapter","preSubmit","setSubmission","isValid","errors","recordEvent","bind","console","event","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func","trackingPrefix","string"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActivePages\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const eligiblePageList = getActivePages(pageList, form.data);\n const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent.bind(formConfig) :\n console.error.bind(console); // eslint-disable-line no-console\n\n recordEvent({ event: 'validation-failed-on-submit', errors });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired,\n trackingPrefix: PropTypes.string.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","eligiblePageList","data","expandedPageList","push","length","path","handleSubmit","pagesByChapter","preSubmit","setSubmission","isValid","errors","recordEvent","bind","console","log","event","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func","trackingPrefix","string"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActivePages\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const eligiblePageList = getActivePages(pageList, form.data);\n const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent.bind(formConfig) :\n console.log.bind(console); // eslint-disable-line no-console\n\n recordEvent({ event: 'validation-failed-on-submit', errors });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired,\n trackingPrefix: PropTypes.string.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file From 8802dd7de478c1995701465121d0ae4b7459c7fa Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 11 Sep 2018 12:01:37 -0400 Subject: [PATCH 6/9] Remove trackingPrefix prop --- lib/js/actions.js | 2 +- lib/js/actions.js.map | 2 +- lib/js/review/SubmitController.js | 5 ++--- lib/js/review/SubmitController.js.map | 2 +- src/js/actions.js | 2 +- src/js/review/SubmitController.jsx | 5 ++--- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/js/actions.js b/lib/js/actions.js index 94ea28b..e41da75 100644 --- a/lib/js/actions.js +++ b/lib/js/actions.js @@ -164,7 +164,7 @@ function submitToUrl(body, submitUrl, recordEvent) { } function submitForm(formConfig, form) { - var recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : console.log.bind(console); // eslint-disable-line no-console + var recordEvent = formConfig.recordEvent ? formConfig.recordEvent(formConfig) : console.log.bind(console); // eslint-disable-line no-console return function (dispatch) { dispatch(setSubmission('status', 'submitPending')); diff --git a/lib/js/actions.js.map b/lib/js/actions.js.map index 4957004..a3b56bf 100644 --- a/lib/js/actions.js.map +++ b/lib/js/actions.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/js/actions.js"],"names":["closeReviewChapter","openReviewChapter","setData","setEditMode","setSubmission","setPreSubmit","setSubmitted","setViewedPages","submitForm","uploadFile","SET_EDIT_MODE","SET_DATA","SET_VIEWED_PAGES","SET_PRE_SUBMIT","SET_SUBMISSION","SET_SUBMITTED","OPEN_REVIEW_CHAPTER","CLOSE_REVIEW_CHAPTER","closedChapter","pageKeys","type","openedChapter","data","page","edit","index","field","value","extra","preSubmitField","preSubmitAccepted","response","submitToUrl","body","submitUrl","recordEvent","Promise","resolve","reject","req","XMLHttpRequest","open","addEventListener","status","event","responseBody","responseText","results","JSON","parse","error","Error","statusText","parseInt","getResponseHeader","setRequestHeader","userToken","_","get","window","send","formConfig","form","bind","console","log","dispatch","promise","submit","transformForSubmit","then","resp","catch","errorReceived","errorMessage","String","message","errorType","startsWith","file","uiOptions","onProgress","onChange","onError","getState","size","maxSize","name","minSize","fileTypes","some","toLowerCase","endsWith","fileType","uploading","payload","createPayload","formId","fileUploadUrl","fileData","parseResponse","moment","unix","upload","evt","lengthComputable","loaded","total"],"mappings":"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","file":"actions.js","sourcesContent":["import moment from 'moment';\nimport _ from './utilities/data';\nimport { transformForSubmit } from './helpers';\nimport { timeFromNow } from './utilities/date';\n\nexport const SET_EDIT_MODE = 'SET_EDIT_MODE';\nexport const SET_DATA = 'SET_DATA';\nexport const SET_VIEWED_PAGES = 'SET_VIEWED_PAGES';\nexport const SET_PRE_SUBMIT = 'SET_PRE_SUBMIT';\nexport const SET_SUBMISSION = 'SET_SUBMISSION';\nexport const SET_SUBMITTED = 'SET_SUBMITTED';\nexport const OPEN_REVIEW_CHAPTER = 'OPEN_REVIEW_CHAPTER';\nexport const CLOSE_REVIEW_CHAPTER = 'CLOSE_REVIEW_CHAPTER';\n\nexport function closeReviewChapter(closedChapter, pageKeys = []) {\n return {\n type: CLOSE_REVIEW_CHAPTER,\n closedChapter,\n pageKeys\n };\n}\n\nexport function openReviewChapter(openedChapter) {\n return {\n type: OPEN_REVIEW_CHAPTER,\n openedChapter\n };\n}\n\nexport function setData(data) {\n return {\n type: SET_DATA,\n data\n };\n}\n\nexport function setEditMode(page, edit, index = null) {\n return {\n type: SET_EDIT_MODE,\n edit,\n page,\n index\n };\n}\n\n// extra is used to pass other information (from a submission error or anything else)\n// into the submission state object\nexport function setSubmission(field, value, extra = null) {\n return {\n type: SET_SUBMISSION,\n field,\n value,\n extra\n };\n}\n\nexport function setPreSubmit(preSubmitField, preSubmitAccepted) {\n return {\n type: SET_PRE_SUBMIT,\n preSubmitField,\n preSubmitAccepted\n };\n}\n\nexport function setSubmitted(response) {\n return {\n type: SET_SUBMITTED,\n response: typeof response.data !== 'undefined' ? response.data : response\n };\n}\n\n\nexport function setViewedPages(pageKeys) {\n return {\n type: SET_VIEWED_PAGES,\n pageKeys\n };\n}\n\nfunction submitToUrl(body, submitUrl, recordEvent) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.open('POST', submitUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n recordEvent({ event: 'form-submit-successful' });\n\n // got this from the fetch polyfill, keeping it to be safe\n const responseBody = 'response' in req ? req.response : req.responseText;\n const results = JSON.parse(responseBody);\n resolve(results);\n } else {\n let error;\n if (req.status === 429) {\n error = new Error(`vets_throttled_error: ${req.statusText}`);\n error.extra = parseInt(req.getResponseHeader('x-ratelimit-reset'), 10);\n } else {\n error = new Error(`vets_server_error: ${req.statusText}`);\n }\n error.statusText = req.statusText;\n reject(error);\n }\n });\n\n req.addEventListener('error', () => {\n const error = new Error('vets_client_error: Network request failed');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('abort', () => {\n const error = new Error('vets_client_error: Request aborted');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('timeout', () => {\n const error = new Error('vets_client_error: Request timed out');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.setRequestHeader('Content-Type', 'application/json');\n\n const userToken = _.get('sessionStorage.userToken', window);\n if (userToken) {\n req.setRequestHeader('Authorization', `Token token=${userToken}`);\n }\n\n req.send(body);\n });\n}\n\nexport function submitForm(formConfig, form) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent.bind(formConfig) :\n console.log.bind(console); // eslint-disable-line no-console\n\n return dispatch => {\n dispatch(setSubmission('status', 'submitPending'));\n recordEvent({ event: 'form-submit-pending' });\n\n let promise;\n if (formConfig.submit) {\n promise = formConfig.submit(form, formConfig);\n } else {\n const body = formConfig.transformForSubmit\n ? formConfig.transformForSubmit(formConfig, form)\n : transformForSubmit(formConfig, form);\n\n promise = submitToUrl(body, formConfig.submitUrl, recordEvent);\n }\n\n return promise\n .then(resp => dispatch(setSubmitted(resp)))\n .catch(errorReceived => {\n // overly cautious\n const error = errorReceived instanceof Error ? errorReceived : new Error(errorReceived);\n const errorMessage = String(error.message);\n let errorType = 'clientError';\n if (errorMessage.startsWith('vets_throttled_error')) {\n errorType = 'throttledError';\n } else if (errorMessage.startsWith('vets_server_error')) {\n errorType = 'serverError';\n }\n recordEvent({ event: 'form-submit-error', error, errorType });\n dispatch(setSubmission('status', errorType, error.extra));\n });\n };\n}\n\nexport function uploadFile(file, uiOptions, onProgress, onChange, onError) {\n return (dispatch, getState) => {\n if (file.size > uiOptions.maxSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too large to be uploaded'\n });\n\n onError();\n return null;\n }\n\n if (file.size < uiOptions.minSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too small to be uploaded'\n });\n\n onError();\n return null;\n }\n\n // we limit file types, but it’s not respected on mobile and desktop\n // users can bypass it without much effort\n if (!uiOptions.fileTypes.some(fileType => file.name.toLowerCase().endsWith(fileType.toLowerCase()))) {\n onChange({\n name: file.name,\n errorMessage: 'File is not one of the allowed types'\n });\n\n onError();\n return null;\n }\n\n onChange({\n name: file.name,\n uploading: true\n });\n\n const payload = uiOptions.createPayload(file, getState().form.formId);\n\n const req = new XMLHttpRequest();\n\n req.open('POST', uiOptions.fileUploadUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n const body = 'response' in req ? req.response : req.responseText;\n const fileData = uiOptions.parseResponse(JSON.parse(body), file);\n onChange(fileData);\n } else {\n let errorMessage = req.statusText;\n if (req.status === 429) {\n errorMessage = `You’ve reached the limit for the number of submissions we can accept at this time. Please try again in ${timeFromNow(moment.unix(parseInt(req.getResponseHeader('x-ratelimit-reset'), 10)))}.`;\n }\n\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${req.statusText}`);\n onError();\n }\n });\n\n req.addEventListener('error', () => {\n const errorMessage = 'Network request failed';\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${errorMessage}`, {\n // extra: {\n // statusText: req.statusText\n // }\n // });\n onError();\n });\n\n req.upload.addEventListener('progress', (evt) => {\n if (evt.lengthComputable && onProgress) {\n // setting this at 80, because there's some time after we get to 100%\n // where the backend is uploading to s3\n onProgress((evt.loaded / evt.total) * 80);\n }\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.send(payload);\n\n return req;\n };\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/js/actions.js"],"names":["closeReviewChapter","openReviewChapter","setData","setEditMode","setSubmission","setPreSubmit","setSubmitted","setViewedPages","submitForm","uploadFile","SET_EDIT_MODE","SET_DATA","SET_VIEWED_PAGES","SET_PRE_SUBMIT","SET_SUBMISSION","SET_SUBMITTED","OPEN_REVIEW_CHAPTER","CLOSE_REVIEW_CHAPTER","closedChapter","pageKeys","type","openedChapter","data","page","edit","index","field","value","extra","preSubmitField","preSubmitAccepted","response","submitToUrl","body","submitUrl","recordEvent","Promise","resolve","reject","req","XMLHttpRequest","open","addEventListener","status","event","responseBody","responseText","results","JSON","parse","error","Error","statusText","parseInt","getResponseHeader","setRequestHeader","userToken","_","get","window","send","formConfig","form","console","log","bind","dispatch","promise","submit","transformForSubmit","then","resp","catch","errorReceived","errorMessage","String","message","errorType","startsWith","file","uiOptions","onProgress","onChange","onError","getState","size","maxSize","name","minSize","fileTypes","some","toLowerCase","endsWith","fileType","uploading","payload","createPayload","formId","fileUploadUrl","fileData","parseResponse","moment","unix","upload","evt","lengthComputable","loaded","total"],"mappings":"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","file":"actions.js","sourcesContent":["import moment from 'moment';\nimport _ from './utilities/data';\nimport { transformForSubmit } from './helpers';\nimport { timeFromNow } from './utilities/date';\n\nexport const SET_EDIT_MODE = 'SET_EDIT_MODE';\nexport const SET_DATA = 'SET_DATA';\nexport const SET_VIEWED_PAGES = 'SET_VIEWED_PAGES';\nexport const SET_PRE_SUBMIT = 'SET_PRE_SUBMIT';\nexport const SET_SUBMISSION = 'SET_SUBMISSION';\nexport const SET_SUBMITTED = 'SET_SUBMITTED';\nexport const OPEN_REVIEW_CHAPTER = 'OPEN_REVIEW_CHAPTER';\nexport const CLOSE_REVIEW_CHAPTER = 'CLOSE_REVIEW_CHAPTER';\n\nexport function closeReviewChapter(closedChapter, pageKeys = []) {\n return {\n type: CLOSE_REVIEW_CHAPTER,\n closedChapter,\n pageKeys\n };\n}\n\nexport function openReviewChapter(openedChapter) {\n return {\n type: OPEN_REVIEW_CHAPTER,\n openedChapter\n };\n}\n\nexport function setData(data) {\n return {\n type: SET_DATA,\n data\n };\n}\n\nexport function setEditMode(page, edit, index = null) {\n return {\n type: SET_EDIT_MODE,\n edit,\n page,\n index\n };\n}\n\n// extra is used to pass other information (from a submission error or anything else)\n// into the submission state object\nexport function setSubmission(field, value, extra = null) {\n return {\n type: SET_SUBMISSION,\n field,\n value,\n extra\n };\n}\n\nexport function setPreSubmit(preSubmitField, preSubmitAccepted) {\n return {\n type: SET_PRE_SUBMIT,\n preSubmitField,\n preSubmitAccepted\n };\n}\n\nexport function setSubmitted(response) {\n return {\n type: SET_SUBMITTED,\n response: typeof response.data !== 'undefined' ? response.data : response\n };\n}\n\n\nexport function setViewedPages(pageKeys) {\n return {\n type: SET_VIEWED_PAGES,\n pageKeys\n };\n}\n\nfunction submitToUrl(body, submitUrl, recordEvent) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.open('POST', submitUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n recordEvent({ event: 'form-submit-successful' });\n\n // got this from the fetch polyfill, keeping it to be safe\n const responseBody = 'response' in req ? req.response : req.responseText;\n const results = JSON.parse(responseBody);\n resolve(results);\n } else {\n let error;\n if (req.status === 429) {\n error = new Error(`vets_throttled_error: ${req.statusText}`);\n error.extra = parseInt(req.getResponseHeader('x-ratelimit-reset'), 10);\n } else {\n error = new Error(`vets_server_error: ${req.statusText}`);\n }\n error.statusText = req.statusText;\n reject(error);\n }\n });\n\n req.addEventListener('error', () => {\n const error = new Error('vets_client_error: Network request failed');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('abort', () => {\n const error = new Error('vets_client_error: Request aborted');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('timeout', () => {\n const error = new Error('vets_client_error: Request timed out');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.setRequestHeader('Content-Type', 'application/json');\n\n const userToken = _.get('sessionStorage.userToken', window);\n if (userToken) {\n req.setRequestHeader('Authorization', `Token token=${userToken}`);\n }\n\n req.send(body);\n });\n}\n\nexport function submitForm(formConfig, form) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent(formConfig) :\n console.log.bind(console); // eslint-disable-line no-console\n\n return dispatch => {\n dispatch(setSubmission('status', 'submitPending'));\n recordEvent({ event: 'form-submit-pending' });\n\n let promise;\n if (formConfig.submit) {\n promise = formConfig.submit(form, formConfig);\n } else {\n const body = formConfig.transformForSubmit\n ? formConfig.transformForSubmit(formConfig, form)\n : transformForSubmit(formConfig, form);\n\n promise = submitToUrl(body, formConfig.submitUrl, recordEvent);\n }\n\n return promise\n .then(resp => dispatch(setSubmitted(resp)))\n .catch(errorReceived => {\n // overly cautious\n const error = errorReceived instanceof Error ? errorReceived : new Error(errorReceived);\n const errorMessage = String(error.message);\n let errorType = 'clientError';\n if (errorMessage.startsWith('vets_throttled_error')) {\n errorType = 'throttledError';\n } else if (errorMessage.startsWith('vets_server_error')) {\n errorType = 'serverError';\n }\n recordEvent({ event: 'form-submit-error', error, errorType });\n dispatch(setSubmission('status', errorType, error.extra));\n });\n };\n}\n\nexport function uploadFile(file, uiOptions, onProgress, onChange, onError) {\n return (dispatch, getState) => {\n if (file.size > uiOptions.maxSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too large to be uploaded'\n });\n\n onError();\n return null;\n }\n\n if (file.size < uiOptions.minSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too small to be uploaded'\n });\n\n onError();\n return null;\n }\n\n // we limit file types, but it’s not respected on mobile and desktop\n // users can bypass it without much effort\n if (!uiOptions.fileTypes.some(fileType => file.name.toLowerCase().endsWith(fileType.toLowerCase()))) {\n onChange({\n name: file.name,\n errorMessage: 'File is not one of the allowed types'\n });\n\n onError();\n return null;\n }\n\n onChange({\n name: file.name,\n uploading: true\n });\n\n const payload = uiOptions.createPayload(file, getState().form.formId);\n\n const req = new XMLHttpRequest();\n\n req.open('POST', uiOptions.fileUploadUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n const body = 'response' in req ? req.response : req.responseText;\n const fileData = uiOptions.parseResponse(JSON.parse(body), file);\n onChange(fileData);\n } else {\n let errorMessage = req.statusText;\n if (req.status === 429) {\n errorMessage = `You’ve reached the limit for the number of submissions we can accept at this time. Please try again in ${timeFromNow(moment.unix(parseInt(req.getResponseHeader('x-ratelimit-reset'), 10)))}.`;\n }\n\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${req.statusText}`);\n onError();\n }\n });\n\n req.addEventListener('error', () => {\n const errorMessage = 'Network request failed';\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${errorMessage}`, {\n // extra: {\n // statusText: req.statusText\n // }\n // });\n onError();\n });\n\n req.upload.addEventListener('progress', (evt) => {\n if (evt.lengthComputable && onProgress) {\n // setting this at 80, because there's some time after we get to 100%\n // where the backend is uploading to s3\n onProgress((evt.loaded / evt.total) * 80);\n }\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.send(payload);\n\n return req;\n };\n}\n"]} \ No newline at end of file diff --git a/lib/js/review/SubmitController.js b/lib/js/review/SubmitController.js index 20228d1..31a7867 100644 --- a/lib/js/review/SubmitController.js +++ b/lib/js/review/SubmitController.js @@ -99,7 +99,7 @@ var SubmitController = function (_React$Component) { errors = _isValidForm.errors; if (!isValid) { - var recordEvent = formConfig.recordEvent ? formConfig.recordEvent.bind(formConfig) : console.log.bind(console); // eslint-disable-line no-console + var recordEvent = formConfig.recordEvent ? formConfig.recordEvent(formConfig) : console.log.bind(console); // eslint-disable-line no-console recordEvent({ event: 'validation-failed-on-submit', errors: errors }); _this.props.setSubmission('status', 'validationError'); @@ -197,8 +197,7 @@ SubmitController.propTypes = { setPreSubmit: _propTypes2.default.func.isRequired, setSubmission: _propTypes2.default.func.isRequired, submitForm: _propTypes2.default.func.isRequired, - submission: _propTypes2.default.object.isRequired, - trackingPrefix: _propTypes2.default.string.isRequired + submission: _propTypes2.default.object.isRequired }; exports.default = (0, _reactRouter.withRouter)((0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(SubmitController)); diff --git a/lib/js/review/SubmitController.js.map b/lib/js/review/SubmitController.js.map index 695d3ff..f56b470 100644 --- a/lib/js/review/SubmitController.js.map +++ b/lib/js/review/SubmitController.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","eligiblePageList","data","expandedPageList","push","length","path","handleSubmit","pagesByChapter","preSubmit","setSubmission","isValid","errors","recordEvent","bind","console","log","event","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func","trackingPrefix","string"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActivePages\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const eligiblePageList = getActivePages(pageList, form.data);\n const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent.bind(formConfig) :\n console.log.bind(console); // eslint-disable-line no-console\n\n recordEvent({ event: 'validation-failed-on-submit', errors });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired,\n trackingPrefix: PropTypes.string.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","eligiblePageList","data","expandedPageList","push","length","path","handleSubmit","pagesByChapter","preSubmit","setSubmission","isValid","errors","recordEvent","console","log","bind","event","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActivePages\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const eligiblePageList = getActivePages(pageList, form.data);\n const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent(formConfig) :\n console.log.bind(console); // eslint-disable-line no-console\n\n recordEvent({ event: 'validation-failed-on-submit', errors });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file diff --git a/src/js/actions.js b/src/js/actions.js index de2251b..4264daa 100644 --- a/src/js/actions.js +++ b/src/js/actions.js @@ -134,7 +134,7 @@ function submitToUrl(body, submitUrl, recordEvent) { export function submitForm(formConfig, form) { const recordEvent = formConfig.recordEvent ? - formConfig.recordEvent.bind(formConfig) : + formConfig.recordEvent(formConfig) : console.log.bind(console); // eslint-disable-line no-console return dispatch => { diff --git a/src/js/review/SubmitController.jsx b/src/js/review/SubmitController.jsx index a51aca4..622b5a3 100644 --- a/src/js/review/SubmitController.jsx +++ b/src/js/review/SubmitController.jsx @@ -74,7 +74,7 @@ class SubmitController extends React.Component { const { isValid, errors } = isValidForm(form, pagesByChapter); if (!isValid) { const recordEvent = formConfig.recordEvent ? - formConfig.recordEvent.bind(formConfig) : + formConfig.recordEvent(formConfig) : console.log.bind(console); // eslint-disable-line no-console recordEvent({ event: 'validation-failed-on-submit', errors }); @@ -154,8 +154,7 @@ SubmitController.propTypes = { setPreSubmit: PropTypes.func.isRequired, setSubmission: PropTypes.func.isRequired, submitForm: PropTypes.func.isRequired, - submission: PropTypes.object.isRequired, - trackingPrefix: PropTypes.string.isRequired + submission: PropTypes.object.isRequired }; export default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController)); From 0570b1659d40e9b09c982511b8a7720a89a58f6f Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 11 Sep 2018 12:18:10 -0400 Subject: [PATCH 7/9] Fix typo --- .../available-form-features-and-usage-guidelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/building-a-form/available-form-features-and-usage-guidelines.md b/docs/building-a-form/available-form-features-and-usage-guidelines.md index 98c37e7..9dcaf31 100644 --- a/docs/building-a-form/available-form-features-and-usage-guidelines.md +++ b/docs/building-a-form/available-form-features-and-usage-guidelines.md @@ -471,7 +471,7 @@ formConfig = { if (!window.dataLayer || /^form-submit-(successful|pending)$/).test(data.event)) { return; } - return window.dataLayer.push(event); + return window.dataLayer.push(data); }, ... }; From 1335f13b342a789db9d0538881fb54c377395ac6 Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 11 Sep 2018 12:24:57 -0400 Subject: [PATCH 8/9] Fix another typo --- .../available-form-features-and-usage-guidelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/building-a-form/available-form-features-and-usage-guidelines.md b/docs/building-a-form/available-form-features-and-usage-guidelines.md index 9dcaf31..7806eb3 100644 --- a/docs/building-a-form/available-form-features-and-usage-guidelines.md +++ b/docs/building-a-form/available-form-features-and-usage-guidelines.md @@ -468,7 +468,7 @@ formConfig = { // https://developers.google.com/analytics/devguides/collection/analyticsjs/ recordEvent: data => { // Don't log if GA is not (yet) loaded or if this is a form success/pending - if (!window.dataLayer || /^form-submit-(successful|pending)$/).test(data.event)) { + if (!window.dataLayer || /^form-submit-(successful|pending)$/.test(data.event)) { return; } return window.dataLayer.push(data); From 04e43f2aad228784a4f369e818733a1d9808225a Mon Sep 17 00:00:00 2001 From: Dave Methvin Date: Tue, 11 Sep 2018 12:49:45 -0400 Subject: [PATCH 9/9] Last set of typos --- lib/js/actions.js | 2 +- lib/js/actions.js.map | 2 +- lib/js/review/SubmitController.js | 2 +- lib/js/review/SubmitController.js.map | 2 +- src/js/actions.js | 2 +- src/js/review/SubmitController.jsx | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/js/actions.js b/lib/js/actions.js index e41da75..a3dc902 100644 --- a/lib/js/actions.js +++ b/lib/js/actions.js @@ -164,7 +164,7 @@ function submitToUrl(body, submitUrl, recordEvent) { } function submitForm(formConfig, form) { - var recordEvent = formConfig.recordEvent ? formConfig.recordEvent(formConfig) : console.log.bind(console); // eslint-disable-line no-console + var recordEvent = formConfig.recordEvent ? formConfig.recordEvent : console.log.bind(console); // eslint-disable-line no-console return function (dispatch) { dispatch(setSubmission('status', 'submitPending')); diff --git a/lib/js/actions.js.map b/lib/js/actions.js.map index a3b56bf..d269517 100644 --- a/lib/js/actions.js.map +++ b/lib/js/actions.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/js/actions.js"],"names":["closeReviewChapter","openReviewChapter","setData","setEditMode","setSubmission","setPreSubmit","setSubmitted","setViewedPages","submitForm","uploadFile","SET_EDIT_MODE","SET_DATA","SET_VIEWED_PAGES","SET_PRE_SUBMIT","SET_SUBMISSION","SET_SUBMITTED","OPEN_REVIEW_CHAPTER","CLOSE_REVIEW_CHAPTER","closedChapter","pageKeys","type","openedChapter","data","page","edit","index","field","value","extra","preSubmitField","preSubmitAccepted","response","submitToUrl","body","submitUrl","recordEvent","Promise","resolve","reject","req","XMLHttpRequest","open","addEventListener","status","event","responseBody","responseText","results","JSON","parse","error","Error","statusText","parseInt","getResponseHeader","setRequestHeader","userToken","_","get","window","send","formConfig","form","console","log","bind","dispatch","promise","submit","transformForSubmit","then","resp","catch","errorReceived","errorMessage","String","message","errorType","startsWith","file","uiOptions","onProgress","onChange","onError","getState","size","maxSize","name","minSize","fileTypes","some","toLowerCase","endsWith","fileType","uploading","payload","createPayload","formId","fileUploadUrl","fileData","parseResponse","moment","unix","upload","evt","lengthComputable","loaded","total"],"mappings":"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","file":"actions.js","sourcesContent":["import moment from 'moment';\nimport _ from './utilities/data';\nimport { transformForSubmit } from './helpers';\nimport { timeFromNow } from './utilities/date';\n\nexport const SET_EDIT_MODE = 'SET_EDIT_MODE';\nexport const SET_DATA = 'SET_DATA';\nexport const SET_VIEWED_PAGES = 'SET_VIEWED_PAGES';\nexport const SET_PRE_SUBMIT = 'SET_PRE_SUBMIT';\nexport const SET_SUBMISSION = 'SET_SUBMISSION';\nexport const SET_SUBMITTED = 'SET_SUBMITTED';\nexport const OPEN_REVIEW_CHAPTER = 'OPEN_REVIEW_CHAPTER';\nexport const CLOSE_REVIEW_CHAPTER = 'CLOSE_REVIEW_CHAPTER';\n\nexport function closeReviewChapter(closedChapter, pageKeys = []) {\n return {\n type: CLOSE_REVIEW_CHAPTER,\n closedChapter,\n pageKeys\n };\n}\n\nexport function openReviewChapter(openedChapter) {\n return {\n type: OPEN_REVIEW_CHAPTER,\n openedChapter\n };\n}\n\nexport function setData(data) {\n return {\n type: SET_DATA,\n data\n };\n}\n\nexport function setEditMode(page, edit, index = null) {\n return {\n type: SET_EDIT_MODE,\n edit,\n page,\n index\n };\n}\n\n// extra is used to pass other information (from a submission error or anything else)\n// into the submission state object\nexport function setSubmission(field, value, extra = null) {\n return {\n type: SET_SUBMISSION,\n field,\n value,\n extra\n };\n}\n\nexport function setPreSubmit(preSubmitField, preSubmitAccepted) {\n return {\n type: SET_PRE_SUBMIT,\n preSubmitField,\n preSubmitAccepted\n };\n}\n\nexport function setSubmitted(response) {\n return {\n type: SET_SUBMITTED,\n response: typeof response.data !== 'undefined' ? response.data : response\n };\n}\n\n\nexport function setViewedPages(pageKeys) {\n return {\n type: SET_VIEWED_PAGES,\n pageKeys\n };\n}\n\nfunction submitToUrl(body, submitUrl, recordEvent) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.open('POST', submitUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n recordEvent({ event: 'form-submit-successful' });\n\n // got this from the fetch polyfill, keeping it to be safe\n const responseBody = 'response' in req ? req.response : req.responseText;\n const results = JSON.parse(responseBody);\n resolve(results);\n } else {\n let error;\n if (req.status === 429) {\n error = new Error(`vets_throttled_error: ${req.statusText}`);\n error.extra = parseInt(req.getResponseHeader('x-ratelimit-reset'), 10);\n } else {\n error = new Error(`vets_server_error: ${req.statusText}`);\n }\n error.statusText = req.statusText;\n reject(error);\n }\n });\n\n req.addEventListener('error', () => {\n const error = new Error('vets_client_error: Network request failed');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('abort', () => {\n const error = new Error('vets_client_error: Request aborted');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('timeout', () => {\n const error = new Error('vets_client_error: Request timed out');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.setRequestHeader('Content-Type', 'application/json');\n\n const userToken = _.get('sessionStorage.userToken', window);\n if (userToken) {\n req.setRequestHeader('Authorization', `Token token=${userToken}`);\n }\n\n req.send(body);\n });\n}\n\nexport function submitForm(formConfig, form) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent(formConfig) :\n console.log.bind(console); // eslint-disable-line no-console\n\n return dispatch => {\n dispatch(setSubmission('status', 'submitPending'));\n recordEvent({ event: 'form-submit-pending' });\n\n let promise;\n if (formConfig.submit) {\n promise = formConfig.submit(form, formConfig);\n } else {\n const body = formConfig.transformForSubmit\n ? formConfig.transformForSubmit(formConfig, form)\n : transformForSubmit(formConfig, form);\n\n promise = submitToUrl(body, formConfig.submitUrl, recordEvent);\n }\n\n return promise\n .then(resp => dispatch(setSubmitted(resp)))\n .catch(errorReceived => {\n // overly cautious\n const error = errorReceived instanceof Error ? errorReceived : new Error(errorReceived);\n const errorMessage = String(error.message);\n let errorType = 'clientError';\n if (errorMessage.startsWith('vets_throttled_error')) {\n errorType = 'throttledError';\n } else if (errorMessage.startsWith('vets_server_error')) {\n errorType = 'serverError';\n }\n recordEvent({ event: 'form-submit-error', error, errorType });\n dispatch(setSubmission('status', errorType, error.extra));\n });\n };\n}\n\nexport function uploadFile(file, uiOptions, onProgress, onChange, onError) {\n return (dispatch, getState) => {\n if (file.size > uiOptions.maxSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too large to be uploaded'\n });\n\n onError();\n return null;\n }\n\n if (file.size < uiOptions.minSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too small to be uploaded'\n });\n\n onError();\n return null;\n }\n\n // we limit file types, but it’s not respected on mobile and desktop\n // users can bypass it without much effort\n if (!uiOptions.fileTypes.some(fileType => file.name.toLowerCase().endsWith(fileType.toLowerCase()))) {\n onChange({\n name: file.name,\n errorMessage: 'File is not one of the allowed types'\n });\n\n onError();\n return null;\n }\n\n onChange({\n name: file.name,\n uploading: true\n });\n\n const payload = uiOptions.createPayload(file, getState().form.formId);\n\n const req = new XMLHttpRequest();\n\n req.open('POST', uiOptions.fileUploadUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n const body = 'response' in req ? req.response : req.responseText;\n const fileData = uiOptions.parseResponse(JSON.parse(body), file);\n onChange(fileData);\n } else {\n let errorMessage = req.statusText;\n if (req.status === 429) {\n errorMessage = `You’ve reached the limit for the number of submissions we can accept at this time. Please try again in ${timeFromNow(moment.unix(parseInt(req.getResponseHeader('x-ratelimit-reset'), 10)))}.`;\n }\n\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${req.statusText}`);\n onError();\n }\n });\n\n req.addEventListener('error', () => {\n const errorMessage = 'Network request failed';\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${errorMessage}`, {\n // extra: {\n // statusText: req.statusText\n // }\n // });\n onError();\n });\n\n req.upload.addEventListener('progress', (evt) => {\n if (evt.lengthComputable && onProgress) {\n // setting this at 80, because there's some time after we get to 100%\n // where the backend is uploading to s3\n onProgress((evt.loaded / evt.total) * 80);\n }\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.send(payload);\n\n return req;\n };\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/js/actions.js"],"names":["closeReviewChapter","openReviewChapter","setData","setEditMode","setSubmission","setPreSubmit","setSubmitted","setViewedPages","submitForm","uploadFile","SET_EDIT_MODE","SET_DATA","SET_VIEWED_PAGES","SET_PRE_SUBMIT","SET_SUBMISSION","SET_SUBMITTED","OPEN_REVIEW_CHAPTER","CLOSE_REVIEW_CHAPTER","closedChapter","pageKeys","type","openedChapter","data","page","edit","index","field","value","extra","preSubmitField","preSubmitAccepted","response","submitToUrl","body","submitUrl","recordEvent","Promise","resolve","reject","req","XMLHttpRequest","open","addEventListener","status","event","responseBody","responseText","results","JSON","parse","error","Error","statusText","parseInt","getResponseHeader","setRequestHeader","userToken","_","get","window","send","formConfig","form","console","log","bind","dispatch","promise","submit","transformForSubmit","then","resp","catch","errorReceived","errorMessage","String","message","errorType","startsWith","file","uiOptions","onProgress","onChange","onError","getState","size","maxSize","name","minSize","fileTypes","some","toLowerCase","endsWith","fileType","uploading","payload","createPayload","formId","fileUploadUrl","fileData","parseResponse","moment","unix","upload","evt","lengthComputable","loaded","total"],"mappings":"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","file":"actions.js","sourcesContent":["import moment from 'moment';\nimport _ from './utilities/data';\nimport { transformForSubmit } from './helpers';\nimport { timeFromNow } from './utilities/date';\n\nexport const SET_EDIT_MODE = 'SET_EDIT_MODE';\nexport const SET_DATA = 'SET_DATA';\nexport const SET_VIEWED_PAGES = 'SET_VIEWED_PAGES';\nexport const SET_PRE_SUBMIT = 'SET_PRE_SUBMIT';\nexport const SET_SUBMISSION = 'SET_SUBMISSION';\nexport const SET_SUBMITTED = 'SET_SUBMITTED';\nexport const OPEN_REVIEW_CHAPTER = 'OPEN_REVIEW_CHAPTER';\nexport const CLOSE_REVIEW_CHAPTER = 'CLOSE_REVIEW_CHAPTER';\n\nexport function closeReviewChapter(closedChapter, pageKeys = []) {\n return {\n type: CLOSE_REVIEW_CHAPTER,\n closedChapter,\n pageKeys\n };\n}\n\nexport function openReviewChapter(openedChapter) {\n return {\n type: OPEN_REVIEW_CHAPTER,\n openedChapter\n };\n}\n\nexport function setData(data) {\n return {\n type: SET_DATA,\n data\n };\n}\n\nexport function setEditMode(page, edit, index = null) {\n return {\n type: SET_EDIT_MODE,\n edit,\n page,\n index\n };\n}\n\n// extra is used to pass other information (from a submission error or anything else)\n// into the submission state object\nexport function setSubmission(field, value, extra = null) {\n return {\n type: SET_SUBMISSION,\n field,\n value,\n extra\n };\n}\n\nexport function setPreSubmit(preSubmitField, preSubmitAccepted) {\n return {\n type: SET_PRE_SUBMIT,\n preSubmitField,\n preSubmitAccepted\n };\n}\n\nexport function setSubmitted(response) {\n return {\n type: SET_SUBMITTED,\n response: typeof response.data !== 'undefined' ? response.data : response\n };\n}\n\n\nexport function setViewedPages(pageKeys) {\n return {\n type: SET_VIEWED_PAGES,\n pageKeys\n };\n}\n\nfunction submitToUrl(body, submitUrl, recordEvent) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest();\n req.open('POST', submitUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n recordEvent({ event: 'form-submit-successful' });\n\n // got this from the fetch polyfill, keeping it to be safe\n const responseBody = 'response' in req ? req.response : req.responseText;\n const results = JSON.parse(responseBody);\n resolve(results);\n } else {\n let error;\n if (req.status === 429) {\n error = new Error(`vets_throttled_error: ${req.statusText}`);\n error.extra = parseInt(req.getResponseHeader('x-ratelimit-reset'), 10);\n } else {\n error = new Error(`vets_server_error: ${req.statusText}`);\n }\n error.statusText = req.statusText;\n reject(error);\n }\n });\n\n req.addEventListener('error', () => {\n const error = new Error('vets_client_error: Network request failed');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('abort', () => {\n const error = new Error('vets_client_error: Request aborted');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.addEventListener('timeout', () => {\n const error = new Error('vets_client_error: Request timed out');\n error.statusText = req.statusText;\n reject(error);\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.setRequestHeader('Content-Type', 'application/json');\n\n const userToken = _.get('sessionStorage.userToken', window);\n if (userToken) {\n req.setRequestHeader('Authorization', `Token token=${userToken}`);\n }\n\n req.send(body);\n });\n}\n\nexport function submitForm(formConfig, form) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent :\n console.log.bind(console); // eslint-disable-line no-console\n\n return dispatch => {\n dispatch(setSubmission('status', 'submitPending'));\n recordEvent({ event: 'form-submit-pending' });\n\n let promise;\n if (formConfig.submit) {\n promise = formConfig.submit(form, formConfig);\n } else {\n const body = formConfig.transformForSubmit\n ? formConfig.transformForSubmit(formConfig, form)\n : transformForSubmit(formConfig, form);\n\n promise = submitToUrl(body, formConfig.submitUrl, recordEvent);\n }\n\n return promise\n .then(resp => dispatch(setSubmitted(resp)))\n .catch(errorReceived => {\n // overly cautious\n const error = errorReceived instanceof Error ? errorReceived : new Error(errorReceived);\n const errorMessage = String(error.message);\n let errorType = 'clientError';\n if (errorMessage.startsWith('vets_throttled_error')) {\n errorType = 'throttledError';\n } else if (errorMessage.startsWith('vets_server_error')) {\n errorType = 'serverError';\n }\n recordEvent({ event: 'form-submit-error', error, errorType });\n dispatch(setSubmission('status', errorType, error.extra));\n });\n };\n}\n\nexport function uploadFile(file, uiOptions, onProgress, onChange, onError) {\n return (dispatch, getState) => {\n if (file.size > uiOptions.maxSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too large to be uploaded'\n });\n\n onError();\n return null;\n }\n\n if (file.size < uiOptions.minSize) {\n onChange({\n name: file.name,\n errorMessage: 'File is too small to be uploaded'\n });\n\n onError();\n return null;\n }\n\n // we limit file types, but it’s not respected on mobile and desktop\n // users can bypass it without much effort\n if (!uiOptions.fileTypes.some(fileType => file.name.toLowerCase().endsWith(fileType.toLowerCase()))) {\n onChange({\n name: file.name,\n errorMessage: 'File is not one of the allowed types'\n });\n\n onError();\n return null;\n }\n\n onChange({\n name: file.name,\n uploading: true\n });\n\n const payload = uiOptions.createPayload(file, getState().form.formId);\n\n const req = new XMLHttpRequest();\n\n req.open('POST', uiOptions.fileUploadUrl);\n req.addEventListener('load', () => {\n if (req.status >= 200 && req.status < 300) {\n const body = 'response' in req ? req.response : req.responseText;\n const fileData = uiOptions.parseResponse(JSON.parse(body), file);\n onChange(fileData);\n } else {\n let errorMessage = req.statusText;\n if (req.status === 429) {\n errorMessage = `You’ve reached the limit for the number of submissions we can accept at this time. Please try again in ${timeFromNow(moment.unix(parseInt(req.getResponseHeader('x-ratelimit-reset'), 10)))}.`;\n }\n\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${req.statusText}`);\n onError();\n }\n });\n\n req.addEventListener('error', () => {\n const errorMessage = 'Network request failed';\n onChange({\n name: file.name,\n errorMessage\n });\n // Commenting until this is removed by a PR for #211\n // Raven.captureMessage(`vets_upload_error: ${errorMessage}`, {\n // extra: {\n // statusText: req.statusText\n // }\n // });\n onError();\n });\n\n req.upload.addEventListener('progress', (evt) => {\n if (evt.lengthComputable && onProgress) {\n // setting this at 80, because there's some time after we get to 100%\n // where the backend is uploading to s3\n onProgress((evt.loaded / evt.total) * 80);\n }\n });\n\n req.setRequestHeader('X-Key-Inflection', 'camel');\n req.send(payload);\n\n return req;\n };\n}\n"]} \ No newline at end of file diff --git a/lib/js/review/SubmitController.js b/lib/js/review/SubmitController.js index 31a7867..6995a75 100644 --- a/lib/js/review/SubmitController.js +++ b/lib/js/review/SubmitController.js @@ -99,7 +99,7 @@ var SubmitController = function (_React$Component) { errors = _isValidForm.errors; if (!isValid) { - var recordEvent = formConfig.recordEvent ? formConfig.recordEvent(formConfig) : console.log.bind(console); // eslint-disable-line no-console + var recordEvent = formConfig.recordEvent ? formConfig.recordEvent : console.log.bind(console); // eslint-disable-line no-console recordEvent({ event: 'validation-failed-on-submit', errors: errors }); _this.props.setSubmission('status', 'validationError'); diff --git a/lib/js/review/SubmitController.js.map b/lib/js/review/SubmitController.js.map index f56b470..e076402 100644 --- a/lib/js/review/SubmitController.js.map +++ b/lib/js/review/SubmitController.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","eligiblePageList","data","expandedPageList","push","length","path","handleSubmit","pagesByChapter","preSubmit","setSubmission","isValid","errors","recordEvent","console","log","bind","event","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActivePages\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const eligiblePageList = getActivePages(pageList, form.data);\n const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent(formConfig) :\n console.log.bind(console); // eslint-disable-line no-console\n\n recordEvent({ event: 'validation-failed-on-submit', errors });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","eligiblePageList","data","expandedPageList","push","length","path","handleSubmit","pagesByChapter","preSubmit","setSubmission","isValid","errors","recordEvent","console","log","bind","event","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActivePages\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const eligiblePageList = getActivePages(pageList, form.data);\n const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent :\n console.log.bind(console); // eslint-disable-line no-console\n\n recordEvent({ event: 'validation-failed-on-submit', errors });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file diff --git a/src/js/actions.js b/src/js/actions.js index 4264daa..bb8b99a 100644 --- a/src/js/actions.js +++ b/src/js/actions.js @@ -134,7 +134,7 @@ function submitToUrl(body, submitUrl, recordEvent) { export function submitForm(formConfig, form) { const recordEvent = formConfig.recordEvent ? - formConfig.recordEvent(formConfig) : + formConfig.recordEvent : console.log.bind(console); // eslint-disable-line no-console return dispatch => { diff --git a/src/js/review/SubmitController.jsx b/src/js/review/SubmitController.jsx index 622b5a3..9d2c77c 100644 --- a/src/js/review/SubmitController.jsx +++ b/src/js/review/SubmitController.jsx @@ -74,7 +74,7 @@ class SubmitController extends React.Component { const { isValid, errors } = isValidForm(form, pagesByChapter); if (!isValid) { const recordEvent = formConfig.recordEvent ? - formConfig.recordEvent(formConfig) : + formConfig.recordEvent : console.log.bind(console); // eslint-disable-line no-console recordEvent({ event: 'validation-failed-on-submit', errors });