From c1183926c61888ff8e51a69bb2f165bac0ea0a4b Mon Sep 17 00:00:00 2001 From: Kainic Date: Wed, 11 Jul 2018 22:55:44 -0400 Subject: [PATCH 1/5] Add functionality to not filter out properties on inactive pages that also appear on active pages Refactor Refactor Remove duplicate properties from array Return properties --- lib/js/helpers.js | 40 ++++++++++++++++++++++++++++++++-------- lib/js/helpers.js.map | 2 +- src/js/helpers.js | 27 +++++++++++++++++++++++---- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/lib/js/helpers.js b/lib/js/helpers.js index b960754..79695d8 100644 --- a/lib/js/helpers.js +++ b/lib/js/helpers.js @@ -5,10 +5,6 @@ Object.defineProperty(exports, "__esModule", { }); exports.pureWithDeepEquals = undefined; -var _uniq2 = require('lodash/fp/uniq'); - -var _uniq3 = _interopRequireDefault(_uniq2); - var _merge3 = require('lodash/fp/merge'); var _merge4 = _interopRequireDefault(_merge3); @@ -37,6 +33,14 @@ var _assign2 = require('lodash/fp/assign'); var _assign3 = _interopRequireDefault(_assign2); +var _concat2 = require('lodash/fp/concat'); + +var _concat3 = _interopRequireDefault(_concat2); + +var _uniq2 = require('lodash/fp/uniq'); + +var _uniq3 = _interopRequireDefault(_uniq2); + var _matches2 = require('lodash/fp/matches'); var _matches3 = _interopRequireDefault(_matches2); @@ -47,6 +51,7 @@ var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = [ exports.isActivePage = isActivePage; exports.getActivePages = getActivePages; +exports.getActiveProperties = getActiveProperties; exports.getInactivePages = getInactivePages; exports.createFormPageList = createFormPageList; exports.createPageListByChapter = createPageListByChapter; @@ -92,6 +97,9 @@ function _defineProperty(obj, key, value) { if (key in obj) { Object.definePrope function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } +// An active page is one that will be shown to the user. +// Pages become inactive if they are conditionally shown based +// on answers to previous questions. function isActivePage(page, data) { if (typeof page.depends === 'function') { return page.depends(data, page.index); @@ -112,6 +120,16 @@ function getActivePages(pages, data) { }); } +function getActiveProperties(activePages) { + var allProperties = []; + activePages.map(function (page) { + allProperties = (0, _uniq3.default)((0, _concat3.default)(Object.keys(page.schema.properties), allProperties)); + return allProperties; + }); + + return allProperties; +} + function getInactivePages(pages, data) { return pages.filter(function (page) { return !isActivePage(page, data); @@ -304,10 +322,15 @@ function filterViewFields(data) { }, {}); } -function filterInactivePages(pages, form) { - return pages.reduce(function (formData, page) { +function filterInactivePages(inactivePages, activePages, form) { + var activeProperties = getActiveProperties(activePages); + + return inactivePages.reduce(function (formData, page) { return Object.keys(page.schema.properties).reduce(function (currentData, prop) { - return (0, _unset3.default)(prop, currentData); + if (!activeProperties.includes(prop)) { + (0, _unset3.default)(prop, currentData); + } + return currentData; }, formData); }, form.data); } @@ -361,8 +384,9 @@ function isInProgress(pathName) { function transformForSubmit(formConfig, form) { var replacer = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringifyFormReplacer; + var activePages = getActivePages(createFormPageList(formConfig), form.data); var inactivePages = getInactivePages(createFormPageList(formConfig), form.data); - var withoutInactivePages = filterInactivePages(inactivePages, form); + var withoutInactivePages = filterInactivePages(inactivePages, activePages, form); var withoutViewFields = filterViewFields(withoutInactivePages); return JSON.stringify(withoutViewFields, replacer) || '{}'; diff --git a/lib/js/helpers.js.map b/lib/js/helpers.js.map index 26847f4..1c87a4a 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","getInactivePages","createFormPageList","createPageListByChapter","createPageList","createRoutes","formatISOPartialDate","formatReviewDate","parseISODate","filterViewFields","filterInactivePages","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","formConfig","Object","keys","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","form","formData","schema","properties","currentData","prop","key","value","country","street","city","postalCode","zipcode","fields","every","widget","id","confirmationCode","file","newValues","v","pathName","trimmedPathname","endsWith","replacer","inactivePages","withoutInactivePages","withoutViewFields","JSON","stringify","isHiddenField","findArrays","obj","ui","type","push","definitions","uiSchema","forEach","$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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAOgBA,Y,GAAAA,Y;QAYAC,c,GAAAA,c;QAIAC,gB,GAAAA,gB;QAIAC,kB,GAAAA,kB;QAgBAC,uB,GAAAA,uB;QAcAC,c,GAAAA,c;QA6BAC,Y,GAAAA,Y;QA+DAC,oB,GAAAA,oB;QAQAC,gB,GAAAA,gB;QAWAC,Y,GAAAA,Y;QAqBAC,gB,GAAAA,gB;QAyBAC,mB,GAAAA,mB;QASAC,qB,GAAAA,qB;QAmCAC,Y,GAAAA,Y;QAaAC,kB,GAAAA,kB;QAgBAC,c,GAAAA,c;QA4BAC,uB,GAAAA,uB;QAmBAC,iB,GAAAA,iB;QAuDAC,gB,GAAAA,gB;QAkDAC,qB,GAAAA,qB;QAIAC,oB,GAAAA,oB;QAgCAC,gB,GAAAA,gB;QAqCAC,W,GAAAA,W;QAoBAC,iB,GAAAA,iB;QAeAC,Y,GAAAA,Y;QAmBAC,W,GAAAA,W;;AArjBhB;;;;AACA;;AAEA;;;;AACA;;;;;;;;;;AAEO,SAASzB,YAAT,CAAsB0B,IAAtB,EAA4BC,IAA5B,EAAkC;AACvC,MAAI,OAAOD,KAAKE,OAAZ,KAAwB,UAA5B,EAAwC;AACtC,WAAOF,KAAKE,OAAL,CAAaD,IAAb,EAAmBD,KAAKG,KAAxB,CAAP;AACD;;AAED,MAAIC,MAAMC,OAAN,CAAcL,KAAKE,OAAnB,CAAJ,EAAiC;AAC/B,WAAOF,KAAKE,OAAL,CAAaI,IAAb,CAAkB;AAAA,aAAa,uBAAUC,SAAV,EAAqBN,IAArB,CAAb;AAAA,KAAlB,CAAP;AACD;;AAED,SAAOD,KAAKE,OAAL,KAAiBM,SAAjB,IAA8B,uBAAUR,KAAKE,OAAf,EAAwBD,IAAxB,CAArC;AACD;;AAEM,SAAS1B,cAAT,CAAwBkC,KAAxB,EAA+BR,IAA/B,EAAqC;AAC1C,SAAOQ,MAAMC,MAAN,CAAa;AAAA,WAAQpC,aAAa0B,IAAb,EAAmBC,IAAnB,CAAR;AAAA,GAAb,CAAP;AACD;;AAEM,SAASzB,gBAAT,CAA0BiC,KAA1B,EAAiCR,IAAjC,EAAuC;AAC5C,SAAOQ,MAAMC,MAAN,CAAa;AAAA,WAAQ,CAACpC,aAAa0B,IAAb,EAAmBC,IAAnB,CAAT;AAAA,GAAb,CAAP;AACD;;AAEM,SAASxB,kBAAT,CAA4BkC,UAA5B,EAAwC;AAC7C,SAAOC,OAAOC,IAAP,CAAYF,WAAWG,QAAvB,EACJC,MADI,CACG,UAACC,QAAD,EAAWC,OAAX,EAAuB;AAC7B,QAAMC,eAAeP,WAAWG,QAAX,CAAoBG,OAApB,EAA6BE,KAAlD;AACA,QAAMV,QAAQG,OAAOC,IAAP,CAAYF,WAAWG,QAAX,CAAoBG,OAApB,EAA6BR,KAAzC,EACXW,GADW,CACP,gBAAQ;AACX,aAAO,sBAAST,WAAWG,QAAX,CAAoBG,OAApB,EAA6BR,KAA7B,CAAmCT,IAAnC,CAAT,EAAmD;AACxDkB,kCADwD;AAExDG,oBAAYJ,OAF4C;AAGxDK,iBAAStB;AAH+C,OAAnD,CAAP;AAKD,KAPW,CAAd;AAQA,WAAOgB,SAASO,MAAT,CAAgBd,KAAhB,CAAP;AACD,GAZI,EAYF,EAZE,CAAP;AAaD;;AAEM,SAAS/B,uBAAT,CAAiCiC,UAAjC,EAA6C;AAClD,SAAOC,OAAOC,IAAP,CAAYF,WAAWG,QAAvB,EACJC,MADI,CACG,UAACD,QAAD,EAAWG,OAAX,EAAuB;AAC7B,QAAMR,QAAQG,OAAOC,IAAP,CAAYF,WAAWG,QAAX,CAAoBG,OAApB,EAA6BR,KAAzC,EACXW,GADW,CACP,gBAAQ;AACX,aAAO,sBAAST,WAAWG,QAAX,CAAoBG,OAApB,EAA6BR,KAA7B,CAAmCT,IAAnC,CAAT,EAAmD;AACxDsB,iBAAStB,IAD+C;AAExDqB,oBAAYJ;AAF4C,OAAnD,CAAP;AAID,KANW,CAAd;AAOA,WAAO,mBAAMA,OAAN,EAAeR,KAAf,EAAsBK,QAAtB,CAAP;AACD,GAVI,EAUF,EAVE,CAAP;AAWD;;AAEM,SAASnC,cAAT,CAAwBgC,UAAxB,EAAoCa,SAApC,EAA+C;AACpD,MAAIR,WAAWQ,SAAf;AACA,MAAIb,WAAWc,YAAf,EAA6B;AAC3BT,eAAW,CACT;AACEM,eAAS,cADX;AAEEI,YAAM;AAFR,KADS,EAKTH,MALS,CAKFP,QALE,CAAX;AAMD;;AAED,SAAOA,SACJO,MADI,CACG,CACN;AACED,aAAS,mBADX;AAEEI,UAAM,mBAFR;AAGEL,gBAAY;AAHd,GADM,CADH,EAQJD,GARI,CAQA,gBAAQ;AACX,WAAO,mBAAM,MAAN,QAAiBT,WAAWgB,SAAX,IAAwB,EAAzC,IAA8C3B,KAAK0B,IAAnD,EAA2D1B,IAA3D,CAAP;AACD,GAVI,CAAP;AAWD;;AAED;;;;;AAKO,SAASpB,YAAT,CAAsB+B,UAAtB,EAAkC;AACvC,MAAMa,YAAY/C,mBAAmBkC,UAAnB,CAAlB;AACA,MAAMK,WAAWrC,eAAegC,UAAf,EAA2Ba,SAA3B,CAAjB;AACA,MAAII,SAASJ,UACVJ,GADU,CACN,gBAAQ;AACX,WAAO;AACLM,YAAM1B,KAAK0B,IADN;AAELG,iBAAW7B,KAAK6B,SAAL,IAAkBC,kBAFxB;AAGLC,kBAAY/B,IAHP;AAILgB,wBAJK;AAKLW,iBAAWhB,WAAWgB;AALjB,KAAP;AAOD,GATU,CAAb;AAUA,MAAIhB,WAAWc,YAAf,EAA6B;AAC3BG,aAAS,CACP;AACEF,YAAM,cADR;AAEEG,iBAAWlB,WAAWc,YAFxB;AAGEd,4BAHF;AAIEK;AAJF,KADO,EAOPO,MAPO,CAOAK,MAPA,CAAT;AAQD;;AAED,SAAOA,OAAOL,MAAP,CAAc,CACnB;AACEG,UAAM,mBADR;AAEEf,0BAFF;AAGEkB,eAAWG,oBAHb;AAIEhB;AAJF,GADmB,EAOnB;AACEU,UAAM,cADR;AAEEG,eAAWlB,WAAWsB;AAFxB,GAPmB,EAWnB;AACEP,UAAM,GADR;AAEEQ,aAAS,iBAACC,SAAD,EAAYC,OAAZ;AAAA,aAAwBA,QAAQzB,WAAWgB,SAAX,IAAwB,GAAhC,CAAxB;AAAA;AAFX,GAXmB,CAAd,CAAP;AAgBD;;AAED,SAASU,cAAT,CAAwBC,GAAxB,EAA6B;AAC3B,MAAIA,GAAJ,EAAS;AACP,QAAMC,aAAaD,IAAIE,QAAJ,EAAnB;AACA,QAAIC,OAAOF,UAAP,KAAsBA,WAAWG,MAAX,KAAsB,CAAhD,EAAmD;AACjD,mBAAWJ,GAAX;AACD,KAFD,MAEO,IAAIG,OAAOF,UAAP,CAAJ,EAAwB;AAC7B,aAAOA,UAAP;AACD;AACF;;AAED,SAAO,IAAP;AACD;;AAED,SAASI,UAAT,CAAoBL,GAApB,EAAyB;AACvB,MAAI,CAACA,GAAD,IAAQ,CAACA,IAAII,MAAjB,EAAyB;AACvB,WAAO,MAAP;AACD;;AAED,SAAOJ,GAAP;AACD;;AAEM,SAASzD,oBAAT,OAAoD;AAAA,MAApB+D,KAAoB,QAApBA,KAAoB;AAAA,MAAbC,GAAa,QAAbA,GAAa;AAAA,MAARC,IAAQ,QAARA,IAAQ;;AACzD,MAAIF,SAASC,GAAT,IAAgBC,IAApB,EAA0B;AACxB,WAAUH,WAAWG,IAAX,CAAV,SAA8BT,eAAeO,KAAf,CAA9B,SAAuDP,eAAeQ,GAAf,CAAvD;AACD;;AAED,SAAOrC,SAAP;AACD;;AAEM,SAAS1B,gBAAT,CAA0BiE,UAA1B,EAAyD;AAAA,MAAnBC,SAAmB,uEAAP,KAAO;;AAC9D,MAAID,UAAJ,EAAgB;AAAA,4BACaA,WAAWE,KAAX,CAAiB,GAAjB,EAAsB,CAAtB,CADb;AAAA;AAAA,QACPH,IADO;AAAA,QACDF,KADC;AAAA,QACMC,GADN;;AAGd,WAAOG,YACAX,eAAeO,KAAf,CADA,SACyBD,WAAWG,IAAX,CADzB,GAEAT,eAAeO,KAAf,CAFA,SAEyBP,eAAeQ,GAAf,CAFzB,SAEgDF,WAAWG,IAAX,CAFvD;AAGD;;AAED,SAAOtC,SAAP;AACD;AACM,SAASzB,YAAT,CAAsBgE,UAAtB,EAAkC;AACvC,MAAI,OAAOA,UAAP,KAAsB,QAA1B,EAAoC;AAAA,6BACPA,WAAWE,KAAX,CAAiB,GAAjB,EAAsB,CAAtB,CADO;AAAA;AAAA,QAC3BH,IAD2B;AAAA,QACrBF,KADqB;AAAA,QACdC,GADc;;AAGlC,WAAO;AACLD,aAAOA,UAAU,IAAV,GAAiB,EAAjB,GAAsBH,OAAOG,KAAP,EAAcJ,QAAd,EADxB;AAELK,WAAKA,QAAQ,IAAR,GAAe,EAAf,GAAoBJ,OAAOI,GAAP,EAAYL,QAAZ,EAFpB;AAGLM,YAAMA,SAAS,MAAT,GAAkB,EAAlB,GAAuBA;AAHxB,KAAP;AAKD;;AAED,SAAO;AACLF,WAAO,EADF;AAELC,SAAK,EAFA;AAGLC,UAAM;AAHD,GAAP;AAKD;;AAED;;;AAGO,SAAS9D,gBAAT,CAA0BiB,IAA1B,EAAgC;AACrC,SAAOW,OAAOC,IAAP,CAAYZ,IAAZ,EAAkBc,MAAlB,CAAyB,UAACmC,OAAD,EAAUC,QAAV,EAAuB;AACrD,QAAMC,QAAQnD,KAAKkD,QAAL,CAAd;;AAEA,QAAI/C,MAAMC,OAAN,CAAc+C,KAAd,CAAJ,EAA0B;AACxB,UAAMC,WAAWD,MAAMhC,GAAN,CAAU,UAACkC,IAAD;AAAA,eAAUtE,iBAAiBsE,IAAjB,CAAV;AAAA,OAAV,CAAjB;;AAEA,aAAO,mBAAMH,QAAN,EAAgBE,QAAhB,EAA0BH,OAA1B,CAAP;AACD;;AAED,QAAI,QAAOE,KAAP,yCAAOA,KAAP,OAAiB,QAArB,EAA+B;AAC7B,UAAID,SAASI,UAAT,CAAoB,OAApB,CAAJ,EAAkC;AAChC,eAAO,sBAASL,OAAT,EAAkBlE,iBAAiBoE,KAAjB,CAAlB,CAAP;AACD;AACD,aAAO,mBAAMD,QAAN,EAAgBnE,iBAAiBoE,KAAjB,CAAhB,EAAyCF,OAAzC,CAAP;AACD;;AAED,QAAI,CAACC,SAASI,UAAT,CAAoB,OAApB,CAAL,EAAmC;AACjC,aAAO,mBAAMJ,QAAN,EAAgBC,KAAhB,EAAuBF,OAAvB,CAAP;AACD;;AAED,WAAOA,OAAP;AACD,GArBM,EAqBJ,EArBI,CAAP;AAsBD;;AAEM,SAASjE,mBAAT,CAA6BwB,KAA7B,EAAoC+C,IAApC,EAA0C;AAC/C,SAAO/C,MAAMM,MAAN,CAAa,UAAC0C,QAAD,EAAWzD,IAAX,EAAoB;AACtC,WAAOY,OAAOC,IAAP,CAAYb,KAAK0D,MAAL,CAAYC,UAAxB,EACJ5C,MADI,CACG,UAAC6C,WAAD,EAAcC,IAAd,EAAuB;AAC7B,aAAO,qBAAQA,IAAR,EAAcD,WAAd,CAAP;AACD,KAHI,EAGFH,QAHE,CAAP;AAID,GALM,EAKJD,KAAKvD,IALD,CAAP;AAMD;;AAEM,SAASf,qBAAT,CAA+B4E,GAA/B,EAAoCC,KAApC,EAA2C;AAChD;AACA,MAAIA,SAAS,OAAOA,MAAMC,OAAb,KAAyB,WAAlC,KACD,CAACD,MAAME,MAAP,IAAiB,CAACF,MAAMG,IAAxB,IAAiC,CAACH,MAAMI,UAAP,IAAqB,CAACJ,MAAMK,OAD5D,CAAJ,EAC2E;AACzE,WAAO5D,SAAP;AACD;;AAED;AACA,MAAI,QAAOuD,KAAP,yCAAOA,KAAP,OAAiB,QAArB,EAA+B;AAC7B,QAAMM,SAASzD,OAAOC,IAAP,CAAYkD,KAAZ,CAAf;AACA,QAAIM,OAAO3B,MAAP,KAAkB,CAAlB,IAAuB2B,OAAOC,KAAP,CAAa;AAAA,aAASP,MAAMX,KAAN,MAAiB5C,SAA1B;AAAA,KAAb,CAA3B,EAA8E;AAC5E,aAAOA,SAAP;AACD;;AAED;AACA,QAAIuD,MAAMQ,MAAN,KAAiB,aAArB,EAAoC;AAClC,aAAOR,MAAMS,EAAb;AACD;;AAED;AACA,QAAIT,MAAMU,gBAAN,IAA0BV,MAAMW,IAApC,EAA0C;AACxC,aAAO,oBAAO,MAAP,EAAeX,KAAf,CAAP;AACD;AACF;;AAED;AACA,MAAI3D,MAAMC,OAAN,CAAc0D,KAAd,CAAJ,EAA0B;AACxB,QAAMY,YAAYZ,MAAMrD,MAAN,CAAa;AAAA,aAAK,CAAC,CAACxB,sBAAsB4E,GAAtB,EAA2Bc,CAA3B,CAAP;AAAA,KAAb,CAAlB;AACA;AACA,WAAOD,UAAUjC,MAAV,GAAmB,CAAnB,GAAuBiC,SAAvB,GAAmCnE,SAA1C;AACD;;AAED,SAAOuD,KAAP;AACD;;AAEM,SAAS5E,YAAT,CAAsB0F,QAAtB,EAAgC;AACrC,MAAMC,kBAAkBD,SAASzC,OAAT,CAAiB,KAAjB,EAAwB,EAAxB,CAAxB;AACA,SAAO,EACL0C,gBAAgBC,QAAhB,CAAyB,cAAzB,KACGD,gBAAgBC,QAAhB,CAAyB,cAAzB,CADH,IAEGD,gBAAgBC,QAAhB,CAAyB,YAAzB,CAFH,IAGGD,gBAAgBC,QAAhB,CAAyB,OAAzB,CAJE,CAAP;AAMD;;AAED;;;AAGO,SAAS3F,kBAAT,CAA4BuB,UAA5B,EAAwC6C,IAAxC,EAAgF;AAAA,MAAlCwB,QAAkC,uEAAvB9F,qBAAuB;;AACrF,MAAM+F,gBAAgBzG,iBAAiBC,mBAAmBkC,UAAnB,CAAjB,EAAiD6C,KAAKvD,IAAtD,CAAtB;AACA,MAAMiF,uBAAuBjG,oBAAoBgG,aAApB,EAAmCzB,IAAnC,CAA7B;AACA,MAAM2B,oBAAoBnG,iBAAiBkG,oBAAjB,CAA1B;;AAEA,SAAOE,KAAKC,SAAL,CAAeF,iBAAf,EAAkCH,QAAlC,KAA+C,IAAtD;AACD;;AAED,SAASM,aAAT,CAAuB5B,MAAvB,EAA+B;AAC7B,SAAO,CAAC,CAACA,OAAO,cAAP,CAAF,IAA4B,CAAC,CAACA,OAAO,WAAP,CAArC;AACD;;AAED;;;;AAIO,SAASrE,cAAT,CAAwBY,IAAxB,EAA8B;AACnC,MAAMoE,SAAS,EAAf;AACA,MAAMkB,aAAa,SAAbA,UAAa,CAACC,GAAD,EAAMC,EAAN,EAAwB;AAAA,QAAd/D,IAAc,uEAAP,EAAO;;AACzC,QAAI8D,IAAIE,IAAJ,KAAa,OAAb,IAAwB,CAACJ,cAAcE,GAAd,CAAzB,IAA+C,CAAC,mBAAM,+BAAN,EAAuCC,EAAvC,CAApD,EAAgG;AAC9FpB,aAAOsB,IAAP,CAAY;AACVjE,kBADU;AAEVgC,gBAAQ,mBAAM,aAAN,EAAqBzD,KAAKyD,MAAL,CAAYkC,WAAjC,EAA8CJ,GAA9C,CAFE;AAGVK,kBAAU,mBAAMnE,IAAN,EAAYzB,KAAK4F,QAAjB,KAA8B5F,KAAK4F;AAHnC,OAAZ;AAKD;;AAED,QAAIL,IAAIE,IAAJ,KAAa,QAAb,IAAyB,CAACJ,cAAcE,GAAd,CAA9B,EAAkD;AAChD5E,aAAOC,IAAP,CAAY2E,IAAI7B,UAAhB,EAA4BmC,OAA5B,CAAoC,gBAAQ;AAC1CP,mBAAWC,IAAI7B,UAAJ,CAAeE,IAAf,CAAX,EAAiC4B,GAAG5B,IAAH,CAAjC,EAA2CnC,KAAKH,MAAL,CAAYsC,IAAZ,CAA3C;AACD,OAFD;AAGD;AACF,GAdD;;AAgBA0B,aAAWtF,KAAKyD,MAAhB,EAAwBzD,KAAK4F,QAA7B;;AAEA,SAAOxB,MAAP;AACD;;AAED;;;;;AAKO,SAAS/E,uBAAT,CAAiCoE,MAAjC,EAAyC;AAC9C,MAAIA,OAAOqC,IAAP,IAAgBrC,OAAOgC,IAAP,KAAgB,QAAhB,IAA4BhC,OAAOgC,IAAP,KAAgB,OAAhE,EAA0E;AACxE,WAAO,IAAP;AACD;;AAED,MAAIhC,OAAOgC,IAAP,KAAgB,QAApB,EAA8B;AAC5B,WAAO9E,OAAOC,IAAP,CAAY6C,OAAOC,UAAnB,EAA+BrD,IAA/B,CAAoC,oBAAY;AACrD,aAAOhB,wBAAwBoE,OAAOC,UAAP,CAAkBR,QAAlB,CAAxB,CAAP;AACD,KAFM,CAAP;AAGD;;AAED,SAAO,KAAP;AACD;;AAED;;;;;AAKO,SAAS5D,iBAAT,CAA2BmE,MAA3B,EAAkD;AAAA,MAAfmC,QAAe,uEAAJ,EAAI;;AACvD,MAAInC,OAAOgC,IAAP,KAAgB,OAAhB,IAA2B,CAAC,mBAAM,+BAAN,EAAuCG,QAAvC,CAAhC,EAAkF;AAChF,WAAOrF,SAAP;AACD;;AAED,MAAIkD,OAAOgC,IAAP,KAAgB,QAApB,EAA8B;AAC5B,QAAMM,gBAAgBpF,OAAOC,IAAP,CAAY6C,OAAOC,UAAnB,EAA+B5C,MAA/B,CAAsC,UAACkF,OAAD,EAAUC,IAAV,EAAmB;AAC7E,UAAMC,YAAY5G,kBAAkBmE,OAAOC,UAAP,CAAkBuC,IAAlB,CAAlB,EAA2CL,SAASK,IAAT,CAA3C,CAAlB;;AAEA,UAAI,OAAOC,SAAP,KAAqB,WAAzB,EAAsC;AACpC,eAAO,qBAAQD,IAAR,EAAcD,OAAd,CAAP;AACD;;AAED,UAAIE,cAAczC,OAAOC,UAAP,CAAkBuC,IAAlB,CAAlB,EAA2C;AACzC,eAAO,mBAAMA,IAAN,EAAYC,SAAZ,EAAuBF,OAAvB,CAAP;AACD;;AAED,aAAOA,OAAP;AACD,KAZqB,EAYnBvC,OAAOC,UAZY,CAAtB;;AAcA,QAAI/C,OAAOC,IAAP,CAAYmF,aAAZ,EAA2BtD,MAA3B,KAAsC,CAA1C,EAA6C;AAC3C,aAAOlC,SAAP;AACD;;AAED,QAAIwF,kBAAkBtC,OAAOC,UAA7B,EAAyC;AACvC,UAAIwC,YAAY,mBAAM,YAAN,EAAoBH,aAApB,EAAmCtC,MAAnC,CAAhB;AACA,UAAIyC,UAAUC,QAAd,EAAwB;AACtB,YAAMC,cAAc,4BAAezF,OAAOC,IAAP,CAAYsF,UAAUxC,UAAtB,CAAf,EAAkDwC,UAAUC,QAA5D,CAApB;AACA,YAAIC,YAAY3D,MAAZ,KAAuByD,UAAUC,QAAV,CAAmB1D,MAA9C,EAAsD;AACpDyD,sBAAY,mBAAM,UAAN,EAAkBE,WAAlB,EAA+BF,SAA/B,CAAZ;AACD;AACF;;AAED,aAAOA,SAAP;AACD;AACF;;AAED,SAAOzC,MAAP;AACD;;AAGM,IAAM4C,kDAAqB,4BAAa,UAACC,KAAD,EAAQC,SAAR,EAAsB;AACnE,SAAO,CAAC,uBAAWD,KAAX,EAAkBC,SAAlB,CAAR;AACD,CAFiC,CAA3B;;AAIP;;;;;;;;;;AAUO,SAAShH,gBAAT,CAA0BkE,MAA1B,EAAgE;AAAA,MAA9B+C,MAA8B,uEAArB,EAAqB;AAAA,MAAjB/E,IAAiB,uEAAV,CAAC,MAAD,CAAU;;AACrE,MAAI,OAAOgC,OAAOgC,IAAd,KAAuB,QAA3B,EAAqC;AACnCe,WAAOd,IAAP,sBAA+BjE,KAAKgF,IAAL,CAAU,GAAV,CAA/B;AACD;;AAED,MAAIhD,OAAOgC,IAAP,KAAgB,QAApB,EAA8B;AAC5B,QAAI,QAAOhC,OAAOC,UAAd,MAA6B,QAAjC,EAA2C;AACzC8C,aAAOd,IAAP,mCAA4CjE,KAAKgF,IAAL,CAAU,GAAV,CAA5C;AACD,KAFD,MAEO;AACL9F,aAAOC,IAAP,CAAY6C,OAAOC,UAAnB,EAA+BmC,OAA/B,CAAuC,UAACa,QAAD,EAAc;AACnDnH,yBAAiBkE,OAAOC,UAAP,CAAkBgD,QAAlB,CAAjB,EAA8CF,MAA9C,+BAA0D/E,IAA1D,IAAgEiF,QAAhE;AACD,OAFD;AAGD;AACF;;AAED,MAAIjD,OAAOgC,IAAP,KAAgB,OAApB,EAA6B;AAC3B;AACA;AACA,QAAItF,MAAMC,OAAN,CAAcqD,OAAOkD,KAArB,CAAJ,EAAiC;AAC/B,UAAI,CAAClD,OAAOmD,eAAZ,EAA6B;AAC3BJ,eAAOd,IAAP,CAAejE,KAAKgF,IAAL,CAAU,GAAV,CAAf;AACD;AACDhD,aAAOkD,KAAP,CAAad,OAAb,CAAqB,UAACxC,IAAD,EAAOnD,KAAP,EAAiB;AACpCX,yBAAiB8D,IAAjB,EAAuBmD,MAAvB,+BAAmC/E,IAAnC,IAAyC,OAAzC,EAAkDvB,KAAlD;AACD,OAFD;AAGD,KAPD,MAOO,IAAI,QAAOuD,OAAOkD,KAAd,MAAwB,QAA5B,EAAsC;AAC3C,UAAIlD,OAAOmD,eAAX,EAA4B;AAC1BJ,eAAOd,IAAP,CAAejE,KAAKgF,IAAL,CAAU,GAAV,CAAf;AACD;AACDlH,uBAAiBkE,OAAOkD,KAAxB,EAA+BH,MAA/B,+BAA2C/E,IAA3C,IAAiD,OAAjD;AACD,KALM,MAKA;AACL+E,aAAOd,IAAP,8BAAuCjE,KAAKgF,IAAL,CAAU,GAAV,CAAvC;AACD;;AAED;AACA,QAAIhD,OAAOmD,eAAX,EAA4B;AAC1BrH,uBAAiBkE,OAAOmD,eAAxB,EAAyCJ,MAAzC,+BAAqD/E,IAArD,IAA2D,iBAA3D;AACD;AACF;;AAED;AACA;AACA,MAAIA,KAAKgB,MAAL,KAAgB,CAAhB,IAAqB+D,OAAO/D,MAAP,GAAgB,CAAzC,EAA4C;AAC1C;AACA,UAAM,IAAIoE,KAAJ,YAAkBL,OAAO/D,MAAP,GAAgB,CAAhB,GAAoB,GAApB,GAA0B,EAA5C,2BAAmE+D,OAAOC,IAAP,CAAY,GAAZ,CAAnE,CAAN;AACD,GAHD,MAGO;AACL,WAAO,IAAP;AACD;AACF;;AAEM,SAASjH,qBAAT,CAA+BsH,MAA/B,EAAuC5G,KAAvC,EAA8C;AACnD,6BAAa4G,MAAb,SAAuB5G,KAAvB,EAAiC,IAAjC;AACD;;AAEM,SAAST,oBAAT,CAA8BsH,MAA9B,EAAsC;AAC3C,SAAOA,OAAOC,GAAP,CAAWlG,MAAX,CAAkB,UAACkF,OAAD,SAA+B;AAAA,QAAnBiB,KAAmB,SAAnBA,KAAmB;AAAA,QAAZnD,KAAY,SAAZA,KAAY;;AACtD,WAAO,qBAAQkC,OAAR,sBAAoBlC,KAApB,EAA4BmD,KAA5B,EAAP;AACD,GAFM,EAEJ,EAFI,CAAP;AAGD;;AAED;;;;AAIA,SAASC,kBAAT,CAA4BC,UAA5B,EAAwCnH,IAAxC,EAA8C;AAC5C,MAAM2G,QAAQ,mBAAMQ,WAAW,CAAX,EAAcC,SAApB,EAA+BpH,IAA/B,KAAwC,EAAtD;AACA,SAAO2G,MACJ7F,MADI,CACG,UAACN,KAAD,EAAQ6C,IAAR,EAAcnD,KAAd;AAAA,WACNM,MAAMc,MAAN,CAAa6F,WAAWhG,GAAX,CAAe;AAAA,aAC1B,sBAASpB,IAAT,EAAe;AACb0B,cAAM1B,KAAK0B,IAAL,CAAUU,OAAV,CAAkB,QAAlB,EAA4BjC,KAA5B,CADO;AAEbA;AAFa,OAAf,CAD0B;AAAA,KAAf,CAAb,CADM;AAAA,GADH,EAQL,EARK;AAUL;AAVK,GAWJO,MAXI,CAWG;AAAA,WAAQ,CAACV,KAAKsH,UAAN,IAAoBtH,KAAKsH,UAAL,CAAgBV,MAAM5G,KAAKG,KAAX,CAAhB,CAA5B;AAAA,GAXH,CAAP;AAYD;;AAED;;;;;;AAMO,SAASR,gBAAT,CAA0BqB,QAA1B,EAAoCf,IAApC,EAA0C;AAC/C,MAAMsH,SAASvG,SAASD,MAAT,CAAgB,UAACyG,GAAD,EAAMC,QAAN,EAAmB;AAAA,QACxCC,aADwC,GACGF,GADH,CACxCE,aADwC;AAAA,QACzBN,UADyB,GACGI,GADH,CACzBJ,UADyB;AAAA,QACbO,WADa,GACGH,GADH,CACbG,WADa;AAEhD;AACA;;AACA,QAAIF,SAASG,eAAT,KAA6B,CAACF,aAAD,IAAkBD,SAASJ,SAAT,KAAuBK,aAAtE,CAAJ,EAA0F;AACxFN,iBAAWzB,IAAX,CAAgB8B,QAAhB;AACA,aAAOD,GAAP;AACF;AACA;AACC,KALD,MAKO,IAAIC,SAASJ,SAAT,KAAuBK,aAAvB,IAAwC,CAAC,CAACN,WAAW1E,MAAzD,EAAiE;AACtE,UAAMmF,UAAUF,YAAYpG,MAAZ,CAAmB4F,mBAAmBC,UAAnB,EAA+BnH,IAA/B,CAAnB,EAAyDwH,QAAzD,CAAhB;AACA,aAAO,sBAASD,GAAT,EAAc;AACnBE,uBAAe,IADI;AAEnBN,oBAAY,EAFO;AAGnBO,qBAAaE;AAHM,OAAd,CAAP;AAKD;;AAED,WAAO,mBAAM,aAAN,EAAqBF,YAAYpG,MAAZ,CAAmBkG,QAAnB,CAArB,EAAmDD,GAAnD,CAAP;AACD,GAnBc,EAmBZ,EAAEE,eAAe,IAAjB,EAAuBN,YAAY,EAAnC,EAAuCO,aAAa,EAApD,EAnBY,CAAf;;AAqBA,MAAIJ,OAAOH,UAAP,CAAkB1E,MAAlB,GAA2B,CAA/B,EAAkC;AAChC,WAAO6E,OAAOI,WAAP,CAAmBpG,MAAnB,CAA0B4F,mBAAmBI,OAAOH,UAA1B,EAAsCnH,IAAtC,CAA1B,CAAP;AACD;;AAED,SAAOsH,OAAOI,WAAd;AACD;;AAED;;;;;;;;AAQO,SAAS/H,WAAT,CAAqBa,KAArB,EAA4BgD,QAA5B,EAAsC;AAC3C,MAAMqE,mBAAmBvJ,eAAekC,KAAf,EAAsBgD,QAAtB,CAAzB;AACA,MAAMsE,mBAAmBpI,iBAAiBmI,gBAAjB,EAAmCrE,QAAnC,CAAzB;;AAEA,SAAOsE,iBAAiB3G,GAAjB,CAAqB,gBAAQ;AAClC,QAAIE,UAAUtB,KAAKsB,OAAnB;AACA,QAAI,OAAOtB,KAAKG,KAAZ,KAAsB,WAA1B,EAAuC;AACrCmB,iBAAWtB,KAAKG,KAAhB;AACD;AACD,WAAOmB,OAAP;AACD,GANM,CAAP;AAOD;;AAED;;;;;;;AAOO,SAASzB,iBAAT,CAA2Bc,UAA3B,EAAuC8C,QAAvC,EAAiD;AACtD,MAAMjC,YAAY/C,mBAAmBkC,UAAnB,CAAlB;AACA,MAAMK,WAAWrC,eAAegC,UAAf,EAA2Ba,SAA3B,CAAjB;AACA,MAAMsG,mBAAmBvJ,eAAeyC,QAAf,EAAyByC,QAAzB,CAAzB;AACA,MAAMsE,mBAAmBpI,iBAAiBmI,gBAAjB,EAAmCrE,QAAnC,CAAzB;;AAEA,SAAO,oBAAOsE,iBAAiB3G,GAAjB,CAAqB;AAAA,WAAK4G,EAAE3G,UAAP;AAAA,GAArB,EAAwCX,MAAxC,CAA+C;AAAA,WAAO,CAAC,CAACoD,GAAF,IAASA,QAAQ,QAAxB;AAAA,GAA/C,CAAP,CAAP;AACD;;AAED;;;;;;AAMO,SAAShE,YAAT,CAAsB4D,MAAtB,EAA8B;AACnC,MAAI,QAAOA,MAAP,yCAAOA,MAAP,OAAkB,QAAlB,IAA8BtD,MAAMC,OAAN,CAAcqD,MAAd,CAAlC,EAAyD;AACvD,WAAOA,MAAP;AACD;;AAED,MAAMyC,YAAY,oBAAO,UAAP,EAAmBzC,MAAnB,CAAlB;AACA9C,SAAOC,IAAP,CAAYsF,SAAZ,EAAuBL,OAAvB,CAA+B,eAAO;AACpCK,cAAUrC,GAAV,IAAiBhE,aAAaqG,UAAUrC,GAAV,CAAb,CAAjB;AACD,GAFD;;AAIA,SAAOqC,SAAP;AACD;;AAED;;;;;;AAMO,SAASpG,WAAT,CAAqBE,IAArB,EAA2B;AAChC,SAAOgI,OAAOC,SAAP,IAAoBD,OAAOC,SAAP,CAAiBvC,IAAjB,CAAsB1F,IAAtB,CAA3B;AACD","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\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 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 filterInactivePages(pages, form) {\n return pages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n return _.unset(prop, currentData);\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 inactivePages = getInactivePages(createFormPageList(formConfig), form.data);\n const withoutInactivePages = filterInactivePages(inactivePages, 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","filterInactivePages","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","map","Object","keys","schema","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","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","push","definitions","uiSchema","forEach","$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 let allProperties = [];\n activePages.map(page => {\n allProperties = _.uniq(_.concat(Object.keys(page.schema.properties), allProperties));\n return allProperties;\n });\n\n return 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 filterInactivePages(inactivePages, activePages, form) {\n const activeProperties = getActiveProperties(activePages);\n\n return inactivePages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n if (!activeProperties.includes(prop)) {\n _.unset(prop, currentData);\n }\n return currentData;\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 = filterInactivePages(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 diff --git a/src/js/helpers.js b/src/js/helpers.js index bcfe473..001e70a 100644 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -5,6 +5,9 @@ import { deepEquals } from '@department-of-veterans-affairs/react-jsonschema-for import FormPage from './containers/FormPage'; import ReviewPage from './review/ReviewPage'; +// An active page is one that will be shown to the user. +// Pages become inactive if they are conditionally shown based +// on answers to previous questions. export function isActivePage(page, data) { if (typeof page.depends === 'function') { return page.depends(data, page.index); @@ -21,6 +24,16 @@ export function getActivePages(pages, data) { return pages.filter(page => isActivePage(page, data)); } +export function getActiveProperties(activePages) { + let allProperties = []; + activePages.map(page => { + allProperties = _.uniq(_.concat(Object.keys(page.schema.properties), allProperties)); + return allProperties; + }); + + return allProperties; +} + export function getInactivePages(pages, data) { return pages.filter(page => !isActivePage(page, data)); } @@ -212,11 +225,16 @@ export function filterViewFields(data) { }, {}); } -export function filterInactivePages(pages, form) { - return pages.reduce((formData, page) => { +export function filterInactivePages(inactivePages, activePages, form) { + const activeProperties = getActiveProperties(activePages); + + return inactivePages.reduce((formData, page) => { return Object.keys(page.schema.properties) .reduce((currentData, prop) => { - return _.unset(prop, currentData); + if (!activeProperties.includes(prop)) { + _.unset(prop, currentData); + } + return currentData; }, formData); }, form.data); } @@ -270,8 +288,9 @@ export function isInProgress(pathName) { * Normal transform for schemaform data */ export function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) { + const activePages = getActivePages(createFormPageList(formConfig), form.data); const inactivePages = getInactivePages(createFormPageList(formConfig), form.data); - const withoutInactivePages = filterInactivePages(inactivePages, form); + const withoutInactivePages = filterInactivePages(inactivePages, activePages, form); const withoutViewFields = filterViewFields(withoutInactivePages); return JSON.stringify(withoutViewFields, replacer) || '{}'; From 0bd39d30eb220bf3991b8c02c78386e6b749f281 Mon Sep 17 00:00:00 2001 From: Kainic Date: Thu, 12 Jul 2018 10:37:12 -0400 Subject: [PATCH 2/5] Write unit tests for new functionality --- lib/js/helpers.js | 9 ++++-- lib/js/helpers.js.map | 2 +- package.json | 2 +- src/js/helpers.js | 9 ++++-- test/js/helpers.unit.spec.js | 61 +++++++++++++++++++++++++++++++++++- 5 files changed, 74 insertions(+), 9 deletions(-) diff --git a/lib/js/helpers.js b/lib/js/helpers.js index 79695d8..0a9f87c 100644 --- a/lib/js/helpers.js +++ b/lib/js/helpers.js @@ -123,7 +123,9 @@ function getActivePages(pages, data) { function getActiveProperties(activePages) { var allProperties = []; activePages.map(function (page) { - allProperties = (0, _uniq3.default)((0, _concat3.default)(Object.keys(page.schema.properties), allProperties)); + if (page.schema) { + allProperties = (0, _uniq3.default)((0, _concat3.default)(Object.keys(page.schema.properties), allProperties)); + } return allProperties; }); @@ -324,13 +326,14 @@ function filterViewFields(data) { function filterInactivePages(inactivePages, activePages, form) { var activeProperties = getActiveProperties(activePages); + var newData = void 0; return inactivePages.reduce(function (formData, page) { return Object.keys(page.schema.properties).reduce(function (currentData, prop) { if (!activeProperties.includes(prop)) { - (0, _unset3.default)(prop, currentData); + newData = (0, _unset3.default)(prop, currentData); } - return currentData; + return newData; }, formData); }, form.data); } diff --git a/lib/js/helpers.js.map b/lib/js/helpers.js.map index 1c87a4a..49b8634 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","filterInactivePages","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","map","Object","keys","schema","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","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","push","definitions","uiSchema","forEach","$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 let allProperties = [];\n activePages.map(page => {\n allProperties = _.uniq(_.concat(Object.keys(page.schema.properties), allProperties));\n return allProperties;\n });\n\n return 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 filterInactivePages(inactivePages, activePages, form) {\n const activeProperties = getActiveProperties(activePages);\n\n return inactivePages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n if (!activeProperties.includes(prop)) {\n _.unset(prop, currentData);\n }\n return currentData;\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 = filterInactivePages(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","filterInactivePages","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","map","schema","Object","keys","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","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","push","definitions","uiSchema","forEach","$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 let allProperties = [];\n activePages.map(page => {\n if (page.schema) {\n allProperties = _.uniq(_.concat(Object.keys(page.schema.properties), allProperties));\n }\n return allProperties;\n });\n\n return 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 filterInactivePages(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 if (!activeProperties.includes(prop)) {\n newData = _.unset(prop, currentData);\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 = filterInactivePages(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 diff --git a/package.json b/package.json index 933030a..7c4b9ff 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "lint": "npm run lint:js && npm run lint:sass", "lint:js": "eslint --quiet --ext .js --ext .jsx .", "lint:sass": "sass-lint -c test/config/sass-lint.yaml --verbose", - "test": "BABEL_ENV=test mocha --require test/config/unit-test-setup.js --require test/config/enzyme-setup.jsx --compilers js:babel-core/register ./test/**/*.spec.jsx", + "test": "BABEL_ENV=test mocha --require test/config/unit-test-setup.js --require test/config/enzyme-setup.jsx --compilers js:babel-core/register './test/**/*.spec.js?(x)' ", "webpack": "webpack" }, "repository": { diff --git a/src/js/helpers.js b/src/js/helpers.js index 001e70a..772e12c 100644 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -27,7 +27,9 @@ export function getActivePages(pages, data) { export function getActiveProperties(activePages) { let allProperties = []; activePages.map(page => { - allProperties = _.uniq(_.concat(Object.keys(page.schema.properties), allProperties)); + if (page.schema) { + allProperties = _.uniq(_.concat(Object.keys(page.schema.properties), allProperties)); + } return allProperties; }); @@ -227,14 +229,15 @@ export function filterViewFields(data) { export function filterInactivePages(inactivePages, activePages, form) { const activeProperties = getActiveProperties(activePages); + let newData; return inactivePages.reduce((formData, page) => { return Object.keys(page.schema.properties) .reduce((currentData, prop) => { if (!activeProperties.includes(prop)) { - _.unset(prop, currentData); + newData = _.unset(prop, currentData); } - return currentData; + return newData; }, formData); }, form.data); } diff --git a/test/js/helpers.unit.spec.js b/test/js/helpers.unit.spec.js index 948d81c..f7f9ad9 100644 --- a/test/js/helpers.unit.spec.js +++ b/test/js/helpers.unit.spec.js @@ -348,7 +348,12 @@ describe('Schemaform helpers:', () => { }, chapter2: { pages: { - page2: {} + page2: { + schema: { + type: 'object', + properties: {} + } + } } } } @@ -366,6 +371,60 @@ describe('Schemaform helpers:', () => { field: 'testing' }); }); + it('should not remove properties that are on both active and inactive pages', () => { + const formConfig = { + chapters: { + chapter1: { + pages: { + page1: { + schema: { + type: 'object', + properties: { + otherField: { + type: 'string' + }, + anotherField: { + type: 'string' + } + } + }, + depends: { + field: 'something' + } + }, + } + }, + chapter2: { + pages: { + page2: { + schema: { + type: 'object', + properties: { + anotherField: { + type: 'string' + } + } + } + } + } + } + } + }; + const formData = { + data: { + otherField: 'testing2', + anotherField: 'testing3', + field: 'testing' + } + }; + + const output = JSON.parse(transformForSubmit(formConfig, formData)); + + expect(output).to.eql({ + field: 'testing', + anotherField: 'testing3' + }); + }); it('should remove empty addresses', () => { const formConfig = { chapters: { From 3cbc36cfddf4a518c7d54d9131b7d1b668cba40a Mon Sep 17 00:00:00 2001 From: Kainic Date: Fri, 13 Jul 2018 14:12:00 -0400 Subject: [PATCH 3/5] Refactor from code review --- src/js/helpers.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/js/helpers.js b/src/js/helpers.js index 772e12c..eb6a7a5 100644 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -34,6 +34,10 @@ export function getActiveProperties(activePages) { }); return allProperties; + + // return new Set([].concat( + // ...activePages.map(page => Object.keys(page.schema.properties)) + // )); } export function getInactivePages(pages, data) { @@ -227,15 +231,16 @@ export function filterViewFields(data) { }, {}); } -export function filterInactivePages(inactivePages, activePages, form) { +export function filterInactivePageData(inactivePages, activePages, form) { const activeProperties = getActiveProperties(activePages); let newData; return inactivePages.reduce((formData, page) => { return Object.keys(page.schema.properties) .reduce((currentData, prop) => { + newData = currentData; if (!activeProperties.includes(prop)) { - newData = _.unset(prop, currentData); + delete newData[prop]; } return newData; }, formData); @@ -293,7 +298,7 @@ export function isInProgress(pathName) { export function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) { const activePages = getActivePages(createFormPageList(formConfig), form.data); const inactivePages = getInactivePages(createFormPageList(formConfig), form.data); - const withoutInactivePages = filterInactivePages(inactivePages, activePages, form); + const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form); const withoutViewFields = filterViewFields(withoutInactivePages); return JSON.stringify(withoutViewFields, replacer) || '{}'; From ae7aef1215376fdd85a7944e8fa55fa83faec56e Mon Sep 17 00:00:00 2001 From: Kainic Date: Fri, 13 Jul 2018 15:39:56 -0400 Subject: [PATCH 4/5] Change _.uniq to only be called once --- src/js/helpers.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/js/helpers.js b/src/js/helpers.js index eb6a7a5..c6382d5 100644 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -25,19 +25,13 @@ export function getActivePages(pages, data) { } export function getActiveProperties(activePages) { - let allProperties = []; - activePages.map(page => { + const allProperties = []; + activePages.forEach(page => { if (page.schema) { - allProperties = _.uniq(_.concat(Object.keys(page.schema.properties), allProperties)); + allProperties.push(...Object.keys(page.schema.properties)); } - return allProperties; }); - - return allProperties; - - // return new Set([].concat( - // ...activePages.map(page => Object.keys(page.schema.properties)) - // )); + return _.uniq(allProperties); } export function getInactivePages(pages, data) { From 28fe309a526432b2f7d1aae14277c59e5b1bdb2a Mon Sep 17 00:00:00 2001 From: Kainic Date: Wed, 1 Aug 2018 19:01:30 -0400 Subject: [PATCH 5/5] Run build on latest changes --- lib/js/helpers.js | 29 ++++++++++++----------------- lib/js/helpers.js.map | 2 +- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/lib/js/helpers.js b/lib/js/helpers.js index 0a9f87c..f8bec1d 100644 --- a/lib/js/helpers.js +++ b/lib/js/helpers.js @@ -13,6 +13,10 @@ var _intersection2 = require('lodash/fp/intersection'); var _intersection3 = _interopRequireDefault(_intersection2); +var _unset2 = require('lodash/fp/unset'); + +var _unset3 = _interopRequireDefault(_unset2); + var _get2 = require('lodash/fp/get'); var _get3 = _interopRequireDefault(_get2); @@ -21,10 +25,6 @@ var _omit2 = require('lodash/fp/omit'); var _omit3 = _interopRequireDefault(_omit2); -var _unset2 = require('lodash/fp/unset'); - -var _unset3 = _interopRequireDefault(_unset2); - var _set2 = require('lodash/fp/set'); var _set3 = _interopRequireDefault(_set2); @@ -33,10 +33,6 @@ var _assign2 = require('lodash/fp/assign'); var _assign3 = _interopRequireDefault(_assign2); -var _concat2 = require('lodash/fp/concat'); - -var _concat3 = _interopRequireDefault(_concat2); - var _uniq2 = require('lodash/fp/uniq'); var _uniq3 = _interopRequireDefault(_uniq2); @@ -61,7 +57,7 @@ exports.formatISOPartialDate = formatISOPartialDate; exports.formatReviewDate = formatReviewDate; exports.parseISODate = parseISODate; exports.filterViewFields = filterViewFields; -exports.filterInactivePages = filterInactivePages; +exports.filterInactivePageData = filterInactivePageData; exports.stringifyFormReplacer = stringifyFormReplacer; exports.isInProgress = isInProgress; exports.transformForSubmit = transformForSubmit; @@ -122,14 +118,12 @@ function getActivePages(pages, data) { function getActiveProperties(activePages) { var allProperties = []; - activePages.map(function (page) { + activePages.forEach(function (page) { if (page.schema) { - allProperties = (0, _uniq3.default)((0, _concat3.default)(Object.keys(page.schema.properties), allProperties)); + allProperties.push.apply(allProperties, _toConsumableArray(Object.keys(page.schema.properties))); } - return allProperties; }); - - return allProperties; + return (0, _uniq3.default)(allProperties); } function getInactivePages(pages, data) { @@ -324,14 +318,15 @@ function filterViewFields(data) { }, {}); } -function filterInactivePages(inactivePages, activePages, form) { +function filterInactivePageData(inactivePages, activePages, form) { var activeProperties = getActiveProperties(activePages); var newData = void 0; return inactivePages.reduce(function (formData, page) { return Object.keys(page.schema.properties).reduce(function (currentData, prop) { + newData = currentData; if (!activeProperties.includes(prop)) { - newData = (0, _unset3.default)(prop, currentData); + delete newData[prop]; } return newData; }, formData); @@ -389,7 +384,7 @@ function transformForSubmit(formConfig, form) { var activePages = getActivePages(createFormPageList(formConfig), form.data); var inactivePages = getInactivePages(createFormPageList(formConfig), form.data); - var withoutInactivePages = filterInactivePages(inactivePages, activePages, form); + var withoutInactivePages = filterInactivePageData(inactivePages, activePages, form); var withoutViewFields = filterViewFields(withoutInactivePages); return JSON.stringify(withoutViewFields, replacer) || '{}'; diff --git a/lib/js/helpers.js.map b/lib/js/helpers.js.map index 49b8634..b92fb0b 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","filterInactivePages","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","map","schema","Object","keys","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","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","push","definitions","uiSchema","forEach","$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 let allProperties = [];\n activePages.map(page => {\n if (page.schema) {\n allProperties = _.uniq(_.concat(Object.keys(page.schema.properties), allProperties));\n }\n return allProperties;\n });\n\n return 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 filterInactivePages(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 if (!activeProperties.includes(prop)) {\n newData = _.unset(prop, currentData);\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 = filterInactivePages(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","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