From b6672410ed69cf9f4c3904a3b98bbd5d541bdb83 Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Fri, 14 Sep 2018 12:26:52 -0400 Subject: [PATCH 1/9] Fix expand active order --- src/js/review/ReviewChapters.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/js/review/ReviewChapters.jsx b/src/js/review/ReviewChapters.jsx index 538d5d3..51c3679 100644 --- a/src/js/review/ReviewChapters.jsx +++ b/src/js/review/ReviewChapters.jsx @@ -125,8 +125,8 @@ function mapStateToProps(state, ownProps) { const chapters = chapterNames.map(chapterName => { const pages = pagesByChapter[chapterName]; - const activePages = getActivePages(pages, formData); - const expandedPages = expandArrayPages(activePages, formData); + let expandedPages = expandArrayPages(pages, formData); + expandedPages = getActivePages(expandedPages, formData); const chapterFormConfig = formConfig.chapters[chapterName]; const open = openChapters.includes(chapterName); const pageKeys = getPageKeys(pages, formData); From 7b8b325e41ad8a8ff84ea1ebdcb223d8e28c0f58 Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Fri, 14 Sep 2018 12:43:36 -0400 Subject: [PATCH 2/9] Add build files --- lib/js/review/ReviewChapters.js | 4 ++-- lib/js/review/ReviewChapters.js.map | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/js/review/ReviewChapters.js b/lib/js/review/ReviewChapters.js index 09b8344..9a95fad 100644 --- a/lib/js/review/ReviewChapters.js +++ b/lib/js/review/ReviewChapters.js @@ -182,8 +182,8 @@ function mapStateToProps(state, ownProps) { var chapters = chapterNames.map(function (chapterName) { var pages = pagesByChapter[chapterName]; - var activePages = (0, _helpers.getActivePages)(pages, formData); - var expandedPages = (0, _helpers.expandArrayPages)(activePages, formData); + var expandedPages = (0, _helpers.expandArrayPages)(pages, formData); + expandedPages = (0, _helpers.getActivePages)(expandedPages, formData); var chapterFormConfig = formConfig.chapters[chapterName]; var open = openChapters.includes(chapterName); var pageKeys = (0, _helpers.getPageKeys)(pages, formData); diff --git a/lib/js/review/ReviewChapters.js.map b/lib/js/review/ReviewChapters.js.map index 4159644..e468567 100644 --- a/lib/js/review/ReviewChapters.js.map +++ b/lib/js/review/ReviewChapters.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/review/ReviewChapters.jsx"],"names":["scroller","Scroll","ReviewChapters","props","formData","pageList","viewedPages","Set","setViewedPages","name","open","pageKeys","closeReviewChapter","openReviewChapter","scrollToChapter","chapters","form","formContext","setValid","map","chapter","expandedPages","formConfig","handleEdit","handleSetData","showUnviewedPageWarning","handleToggleChapter","uploadFile","React","Component","chapterKey","scrollTo","window","Forms","scroll","duration","delay","smooth","pageKey","editing","index","fullPageKey","setEditMode","setData","onSetData","mapStateToProps","state","ownProps","data","openChapters","chapterNames","pagesByChapter","pages","chapterName","activePages","chapterFormConfig","includes","some","has","key","mapDispatchToProps","propTypes","PropTypes","array","isRequired","func","object"],"mappings":";;;;;;;;;AAAA;;;;AACA;;;;AACA;;AACA;;AACA;;;;AAEA;;;;AACA;;AAOA;;AAIA;;;;;;;;;;AAUA,IAAMA,WAAWC,sBAAOD,QAAxB;;IACME,c;;;;;;;;;;;;;;;;;;;wCAEgB;AAAA,mBAId,KAAKC,KAJS;AAAA,UAEhBC,QAFgB,UAEhBA,QAFgB;AAAA,UAGhBC,QAHgB,UAGhBA,QAHgB;;AAKlB,UAAMC,cAAc,IAAIC,GAAJ,CAAQ,0BAAYF,QAAZ,EAAsBD,QAAtB,CAAR,CAApB;AACA,WAAKD,KAAL,CAAWK,cAAX,CAA0BF,WAA1B;AACD;;;+CAE6C;AAAA,UAAxBG,IAAwB,SAAxBA,IAAwB;AAAA,UAAlBC,IAAkB,SAAlBA,IAAkB;AAAA,UAAZC,QAAY,SAAZA,QAAY;;AAC5C,UAAID,IAAJ,EAAU;AACR,aAAKP,KAAL,CAAWS,kBAAX,CAA8BH,IAA9B,EAAoCE,QAApC;AACD,OAFD,MAEO;AACL,aAAKR,KAAL,CAAWU,iBAAX,CAA6BJ,IAA7B;AACA,aAAKK,eAAL,CAAqBL,IAArB;AACD;AACF;;;6BAyBQ;AAAA;;AAAA,oBAOH,KAAKN,KAPF;AAAA,UAELY,QAFK,WAELA,QAFK;AAAA,UAGLC,IAHK,WAGLA,IAHK;AAAA,UAILC,WAJK,WAILA,WAJK;AAAA,UAKLC,QALK,WAKLA,QALK;AAAA,UAMLZ,WANK,WAMLA,WANK;;;AASP,aACE;AAAA;AAAA,UAAK,WAAU,eAAf;AACE;AAAA;AAAA;AACGS,mBAASI,GAAT,CAAa;AAAA,mBACZ,8BAAC,kCAAD;AACE,6BAAeC,QAAQC,aADzB;AAEE,iCAAmBD,QAAQE,UAF7B;AAGE,0BAAYF,QAAQX,IAHtB;AAIE,oBAAMO,IAJR;AAKE,2BAAaC,WALf;AAME,mBAAKG,QAAQX,IANf;AAOE,sBAAQ,OAAKc,UAPf;AAQE,oBAAMH,QAAQV,IARhB;AASE,wBAAUU,QAAQT,QATpB;AAUE,uBAAS;AAAA,uBAAa,OAAKa,aAAL,yBAAb;AAAA,eAVX;AAWE,wBAAUN,QAXZ;AAYE,uCAAyBE,QAAQK,uBAZnC;AAaE,mCAAqB;AAAA,uBAAM,OAAKC,mBAAL,CAAyBN,OAAzB,CAAN;AAAA,eAbvB;AAcE,0BAAY,OAAKjB,KAAL,CAAWwB,UAdzB;AAeE,2BAAarB,WAff,GADY;AAAA,WAAb;AADH;AADF,OADF;AAwBD;;;;EA5E0BsB,gBAAMC,S;;;;;OAoBjCf,e,GAAkB,UAACgB,UAAD,EAAgB;AAChC9B,aAAS+B,QAAT,aAA4BD,UAA5B,oBAAuDE,OAAOC,KAAP,CAAaC,MAAb,IAAuB;AAC5EC,gBAAU,GADkE;AAE5EC,aAAO,CAFqE;AAG5EC,cAAQ;AAHoE,KAA9E;AAKD,G;;OAEDd,U,GAAa,UAACe,OAAD,EAAUC,OAAV,EAAoC;AAAA,QAAjBC,KAAiB,uEAAT,IAAS;;AAC/C,QAAMC,mBAAiBH,OAAjB,IAA2BE,UAAU,IAAV,GAAiB,EAAjB,GAAsBA,KAAjD,CAAN;AACA,QAAID,OAAJ,EAAa;AACX,aAAKpC,KAAL,CAAWK,cAAX,CAA0B,CAACiC,WAAD,CAA1B;AACD;AACD,WAAKtC,KAAL,CAAWuC,WAAX,CAAuBJ,OAAvB,EAAgCC,OAAhC,EAAyCC,KAAzC;AACD,G;;OAEDhB,a,GAAgB,YAAa;AAAA;;AAC3B,sBAAKrB,KAAL,EAAWwC,OAAX;AACA,QAAI,OAAKxC,KAAL,CAAWyC,SAAf,EAA0B;AACxB,aAAKzC,KAAL,CAAWyC,SAAX;AACD;AACF,G;;;AAsCH,SAASC,eAAT,CAAyBC,KAAzB,EAAgCC,QAAhC,EAA0C;AACxC;AADwC,MAGtCzB,UAHsC,GAMpCyB,QANoC,CAGtCzB,UAHsC;AAAA,MAItCL,WAJsC,GAMpC8B,QANoC,CAItC9B,WAJsC;AAAA,MAKtCZ,QALsC,GAMpC0C,QANoC,CAKtC1C,QALsC;;AAQxC;;AACA,MAAMW,OAAO8B,MAAM9B,IAAnB;AACA,MAAMZ,WAAW0C,MAAM9B,IAAN,CAAWgC,IAA5B;AACA,MAAMC,eAAe,0CAA0BH,KAA1B,CAArB;AACA,MAAMxC,cAAc,+BAAewC,KAAf,CAApB;;AAEA,MAAMI,eAAe,gCAAkB5B,UAAlB,EAA8BlB,QAA9B,CAArB;AACA,MAAM+C,iBAAiB,sCAAwB7B,UAAxB,CAAvB;AACA,MAAMP,WAAWmC,aAAa/B,GAAb,CAAiB,uBAAe;AAC/C,QAAMiC,QAAQD,eAAeE,WAAf,CAAd;;AAEA,QAAMC,cAAc,6BAAeF,KAAf,EAAsBhD,QAAtB,CAApB;AACA,QAAMiB,gBAAgB,+BAAiBiC,WAAjB,EAA8BlD,QAA9B,CAAtB;AACA,QAAMmD,oBAAoBjC,WAAWP,QAAX,CAAoBsC,WAApB,CAA1B;AACA,QAAM3C,OAAOuC,aAAaO,QAAb,CAAsBH,WAAtB,CAAb;AACA,QAAM1C,WAAW,0BAAYyC,KAAZ,EAAmBhD,QAAnB,CAAjB;AACA,QAAMqB,0BAA0Bd,SAAS8C,IAAT,CAAc;AAAA,aAAO,CAACnD,YAAYoD,GAAZ,CAAgBC,GAAhB,CAAR;AAAA,KAAd,CAAhC;;AAEA,WAAO;AACLtC,kCADK;AAELC,kBAAYiC,iBAFP;AAGL9C,YAAM4C,WAHD;AAIL3C,gBAJK;AAKLC,wBALK;AAMLc;AANK,KAAP;AAQD,GAlBgB,CAAjB;;AAoBA,SAAO;AACLV,sBADK;AAELC,cAFK;AAGLZ,sBAHK;AAILkB,0BAJK;AAKLL,4BALK;AAMLZ,sBANK;AAOLC;AAPK,GAAP;AASD;;AAED,IAAMsD,qBAAqB;AACzBhD,iDADyB;AAEzBC,+CAFyB;AAGzB8B,2BAHyB;AAIzBD,mCAJyB;AAKzBlC,yCALyB;AAMzBmB;AANyB,CAA3B;;AASAzB,eAAe2D,SAAf,GAA2B;AACzB9C,YAAU+C,oBAAUC,KAAV,CAAgBC,UADD;AAEzBpD,sBAAoBkD,oBAAUG,IAAV,CAAeD,UAFV;AAGzBhD,QAAM8C,oBAAUI,MAAV,CAAiBF,UAHE;AAIzB5D,YAAU0D,oBAAUI,MAAV,CAAiBF,UAJF;AAKzB1C,cAAYwC,oBAAUI,MAAV,CAAiBF,UALJ;AAMzB/C,eAAa6C,oBAAUI,MANE;AAOzBtB,aAAWkB,oBAAUG,IAPI;AAQzBpD,qBAAmBiD,oBAAUG,IAAV,CAAeD,UART;AASzB3D,YAAUyD,oBAAUC,KAAV,CAAgBC,UATD;AAUzBrB,WAASmB,oBAAUG,IAAV,CAAeD,UAVC;AAWzBtB,eAAaoB,oBAAUG,IAAV,CAAeD,UAXH;AAYzBxD,kBAAgBsD,oBAAUG,IAAV,CAAeD,UAZN;AAazBrC,cAAYmC,oBAAUG,IAAV,CAAeD,UAbF;AAczB1D,eAAawD,oBAAUI,MAAV,CAAiBF;AAdL,CAA3B;;kBAiBe,6BAAW,yBAAQnB,eAAR,EAAyBe,kBAAzB,EAA6C1D,cAA7C,CAAX,C;;AAEf;;QACSA,c,GAAAA,c","file":"ReviewChapters.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport Scroll from 'react-scroll';\n\nimport ReviewCollapsibleChapter from './ReviewCollapsibleChapter';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActiveChapters,\n getActivePages,\n getPageKeys\n} from '../helpers';\nimport {\n getReviewPageOpenChapters,\n getViewedPages\n} from '../state/selectors';\nimport {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n} from '../actions';\n\n\nconst scroller = Scroll.scroller;\nclass ReviewChapters extends React.Component {\n\n componentDidMount() {\n const {\n formData,\n pageList\n } = this.props;\n const viewedPages = new Set(getPageKeys(pageList, formData));\n this.props.setViewedPages(viewedPages);\n }\n\n handleToggleChapter({ name, open, pageKeys }) {\n if (open) {\n this.props.closeReviewChapter(name, pageKeys);\n } else {\n this.props.openReviewChapter(name);\n this.scrollToChapter(name);\n }\n }\n\n scrollToChapter = (chapterKey) => {\n scroller.scrollTo(`chapter${chapterKey}ScrollElement`, window.Forms.scroll || {\n duration: 500,\n delay: 2,\n smooth: true,\n });\n }\n\n handleEdit = (pageKey, editing, index = null) => {\n const fullPageKey = `${pageKey}${index === null ? '' : index}`;\n if (editing) {\n this.props.setViewedPages([fullPageKey]);\n }\n this.props.setEditMode(pageKey, editing, index);\n }\n\n handleSetData = (...args) => {\n this.props.setData(...args);\n if (this.props.onSetData) {\n this.props.onSetData();\n }\n }\n\n render() {\n const {\n chapters,\n form,\n formContext,\n setValid,\n viewedPages\n } = this.props;\n\n return (\n
\n
\n {chapters.map(chapter => (\n this.handleSetData(...args)}\n setValid={setValid}\n showUnviewedPageWarning={chapter.showUnviewedPageWarning}\n toggleButtonClicked={() => this.handleToggleChapter(chapter)}\n uploadFile={this.props.uploadFile}\n viewedPages={viewedPages}/>\n ))}\n
\n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n // from ownprops\n const {\n formConfig,\n formContext,\n pageList\n } = ownProps;\n\n // from redux state\n const form = state.form;\n const formData = state.form.data;\n const openChapters = getReviewPageOpenChapters(state);\n const viewedPages = getViewedPages(state);\n\n const chapterNames = getActiveChapters(formConfig, formData);\n const pagesByChapter = createPageListByChapter(formConfig);\n const chapters = chapterNames.map(chapterName => {\n const pages = pagesByChapter[chapterName];\n\n const activePages = getActivePages(pages, formData);\n const expandedPages = expandArrayPages(activePages, formData);\n const chapterFormConfig = formConfig.chapters[chapterName];\n const open = openChapters.includes(chapterName);\n const pageKeys = getPageKeys(pages, formData);\n const showUnviewedPageWarning = pageKeys.some(key => !viewedPages.has(key));\n\n return {\n expandedPages,\n formConfig: chapterFormConfig,\n name: chapterName,\n open,\n pageKeys,\n showUnviewedPageWarning\n };\n });\n\n return {\n chapters,\n form,\n formData,\n formConfig,\n formContext,\n pageList,\n viewedPages\n };\n}\n\nconst mapDispatchToProps = {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n};\n\nReviewChapters.propTypes = {\n chapters: PropTypes.array.isRequired,\n closeReviewChapter: PropTypes.func.isRequired,\n form: PropTypes.object.isRequired,\n formData: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n formContext: PropTypes.object,\n onSetData: PropTypes.func,\n openReviewChapter: PropTypes.func.isRequired,\n pageList: PropTypes.array.isRequired,\n setData: PropTypes.func.isRequired,\n setEditMode: PropTypes.func.isRequired,\n setViewedPages: PropTypes.func.isRequired,\n uploadFile: PropTypes.func.isRequired,\n viewedPages: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ReviewChapters));\n\n// for tests\nexport { ReviewChapters };\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/review/ReviewChapters.jsx"],"names":["scroller","Scroll","ReviewChapters","props","formData","pageList","viewedPages","Set","setViewedPages","name","open","pageKeys","closeReviewChapter","openReviewChapter","scrollToChapter","chapters","form","formContext","setValid","map","chapter","expandedPages","formConfig","handleEdit","handleSetData","showUnviewedPageWarning","handleToggleChapter","uploadFile","React","Component","chapterKey","scrollTo","window","Forms","scroll","duration","delay","smooth","pageKey","editing","index","fullPageKey","setEditMode","setData","onSetData","mapStateToProps","state","ownProps","data","openChapters","chapterNames","pagesByChapter","pages","chapterName","chapterFormConfig","includes","some","has","key","mapDispatchToProps","propTypes","PropTypes","array","isRequired","func","object"],"mappings":"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","file":"ReviewChapters.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport Scroll from 'react-scroll';\n\nimport ReviewCollapsibleChapter from './ReviewCollapsibleChapter';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActiveChapters,\n getActivePages,\n getPageKeys\n} from '../helpers';\nimport {\n getReviewPageOpenChapters,\n getViewedPages\n} from '../state/selectors';\nimport {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n} from '../actions';\n\n\nconst scroller = Scroll.scroller;\nclass ReviewChapters extends React.Component {\n\n componentDidMount() {\n const {\n formData,\n pageList\n } = this.props;\n const viewedPages = new Set(getPageKeys(pageList, formData));\n this.props.setViewedPages(viewedPages);\n }\n\n handleToggleChapter({ name, open, pageKeys }) {\n if (open) {\n this.props.closeReviewChapter(name, pageKeys);\n } else {\n this.props.openReviewChapter(name);\n this.scrollToChapter(name);\n }\n }\n\n scrollToChapter = (chapterKey) => {\n scroller.scrollTo(`chapter${chapterKey}ScrollElement`, window.Forms.scroll || {\n duration: 500,\n delay: 2,\n smooth: true,\n });\n }\n\n handleEdit = (pageKey, editing, index = null) => {\n const fullPageKey = `${pageKey}${index === null ? '' : index}`;\n if (editing) {\n this.props.setViewedPages([fullPageKey]);\n }\n this.props.setEditMode(pageKey, editing, index);\n }\n\n handleSetData = (...args) => {\n this.props.setData(...args);\n if (this.props.onSetData) {\n this.props.onSetData();\n }\n }\n\n render() {\n const {\n chapters,\n form,\n formContext,\n setValid,\n viewedPages\n } = this.props;\n\n return (\n
\n
\n {chapters.map(chapter => (\n this.handleSetData(...args)}\n setValid={setValid}\n showUnviewedPageWarning={chapter.showUnviewedPageWarning}\n toggleButtonClicked={() => this.handleToggleChapter(chapter)}\n uploadFile={this.props.uploadFile}\n viewedPages={viewedPages}/>\n ))}\n
\n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n // from ownprops\n const {\n formConfig,\n formContext,\n pageList\n } = ownProps;\n\n // from redux state\n const form = state.form;\n const formData = state.form.data;\n const openChapters = getReviewPageOpenChapters(state);\n const viewedPages = getViewedPages(state);\n\n const chapterNames = getActiveChapters(formConfig, formData);\n const pagesByChapter = createPageListByChapter(formConfig);\n const chapters = chapterNames.map(chapterName => {\n const pages = pagesByChapter[chapterName];\n\n let expandedPages = expandArrayPages(pages, formData);\n expandedPages = getActivePages(expandedPages, formData);\n const chapterFormConfig = formConfig.chapters[chapterName];\n const open = openChapters.includes(chapterName);\n const pageKeys = getPageKeys(pages, formData);\n const showUnviewedPageWarning = pageKeys.some(key => !viewedPages.has(key));\n\n return {\n expandedPages,\n formConfig: chapterFormConfig,\n name: chapterName,\n open,\n pageKeys,\n showUnviewedPageWarning\n };\n });\n\n return {\n chapters,\n form,\n formData,\n formConfig,\n formContext,\n pageList,\n viewedPages\n };\n}\n\nconst mapDispatchToProps = {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n};\n\nReviewChapters.propTypes = {\n chapters: PropTypes.array.isRequired,\n closeReviewChapter: PropTypes.func.isRequired,\n form: PropTypes.object.isRequired,\n formData: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n formContext: PropTypes.object,\n onSetData: PropTypes.func,\n openReviewChapter: PropTypes.func.isRequired,\n pageList: PropTypes.array.isRequired,\n setData: PropTypes.func.isRequired,\n setEditMode: PropTypes.func.isRequired,\n setViewedPages: PropTypes.func.isRequired,\n uploadFile: PropTypes.func.isRequired,\n viewedPages: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ReviewChapters));\n\n// for tests\nexport { ReviewChapters };\n"]} \ No newline at end of file From 56c8743fa157535f8fbaa2c54b4c4cf678696705 Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Fri, 14 Sep 2018 14:13:17 -0400 Subject: [PATCH 3/9] Add tests and export --- lib/js/review/ReviewChapters.js | 2 + lib/js/review/ReviewChapters.js.map | 2 +- src/js/review/ReviewChapters.jsx | 5 +-- test/js/review/ReviewChapters.unit.spec.jsx | 41 ++++++++++++++++++++- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/lib/js/review/ReviewChapters.js b/lib/js/review/ReviewChapters.js index 9a95fad..0481054 100644 --- a/lib/js/review/ReviewChapters.js +++ b/lib/js/review/ReviewChapters.js @@ -7,6 +7,8 @@ exports.ReviewChapters = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); +exports.mapStateToProps = mapStateToProps; + var _react = require('react'); var _react2 = _interopRequireDefault(_react); diff --git a/lib/js/review/ReviewChapters.js.map b/lib/js/review/ReviewChapters.js.map index e468567..e86fac0 100644 --- a/lib/js/review/ReviewChapters.js.map +++ b/lib/js/review/ReviewChapters.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/review/ReviewChapters.jsx"],"names":["scroller","Scroll","ReviewChapters","props","formData","pageList","viewedPages","Set","setViewedPages","name","open","pageKeys","closeReviewChapter","openReviewChapter","scrollToChapter","chapters","form","formContext","setValid","map","chapter","expandedPages","formConfig","handleEdit","handleSetData","showUnviewedPageWarning","handleToggleChapter","uploadFile","React","Component","chapterKey","scrollTo","window","Forms","scroll","duration","delay","smooth","pageKey","editing","index","fullPageKey","setEditMode","setData","onSetData","mapStateToProps","state","ownProps","data","openChapters","chapterNames","pagesByChapter","pages","chapterName","chapterFormConfig","includes","some","has","key","mapDispatchToProps","propTypes","PropTypes","array","isRequired","func","object"],"mappings":"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","file":"ReviewChapters.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport Scroll from 'react-scroll';\n\nimport ReviewCollapsibleChapter from './ReviewCollapsibleChapter';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActiveChapters,\n getActivePages,\n getPageKeys\n} from '../helpers';\nimport {\n getReviewPageOpenChapters,\n getViewedPages\n} from '../state/selectors';\nimport {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n} from '../actions';\n\n\nconst scroller = Scroll.scroller;\nclass ReviewChapters extends React.Component {\n\n componentDidMount() {\n const {\n formData,\n pageList\n } = this.props;\n const viewedPages = new Set(getPageKeys(pageList, formData));\n this.props.setViewedPages(viewedPages);\n }\n\n handleToggleChapter({ name, open, pageKeys }) {\n if (open) {\n this.props.closeReviewChapter(name, pageKeys);\n } else {\n this.props.openReviewChapter(name);\n this.scrollToChapter(name);\n }\n }\n\n scrollToChapter = (chapterKey) => {\n scroller.scrollTo(`chapter${chapterKey}ScrollElement`, window.Forms.scroll || {\n duration: 500,\n delay: 2,\n smooth: true,\n });\n }\n\n handleEdit = (pageKey, editing, index = null) => {\n const fullPageKey = `${pageKey}${index === null ? '' : index}`;\n if (editing) {\n this.props.setViewedPages([fullPageKey]);\n }\n this.props.setEditMode(pageKey, editing, index);\n }\n\n handleSetData = (...args) => {\n this.props.setData(...args);\n if (this.props.onSetData) {\n this.props.onSetData();\n }\n }\n\n render() {\n const {\n chapters,\n form,\n formContext,\n setValid,\n viewedPages\n } = this.props;\n\n return (\n
\n
\n {chapters.map(chapter => (\n this.handleSetData(...args)}\n setValid={setValid}\n showUnviewedPageWarning={chapter.showUnviewedPageWarning}\n toggleButtonClicked={() => this.handleToggleChapter(chapter)}\n uploadFile={this.props.uploadFile}\n viewedPages={viewedPages}/>\n ))}\n
\n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n // from ownprops\n const {\n formConfig,\n formContext,\n pageList\n } = ownProps;\n\n // from redux state\n const form = state.form;\n const formData = state.form.data;\n const openChapters = getReviewPageOpenChapters(state);\n const viewedPages = getViewedPages(state);\n\n const chapterNames = getActiveChapters(formConfig, formData);\n const pagesByChapter = createPageListByChapter(formConfig);\n const chapters = chapterNames.map(chapterName => {\n const pages = pagesByChapter[chapterName];\n\n let expandedPages = expandArrayPages(pages, formData);\n expandedPages = getActivePages(expandedPages, formData);\n const chapterFormConfig = formConfig.chapters[chapterName];\n const open = openChapters.includes(chapterName);\n const pageKeys = getPageKeys(pages, formData);\n const showUnviewedPageWarning = pageKeys.some(key => !viewedPages.has(key));\n\n return {\n expandedPages,\n formConfig: chapterFormConfig,\n name: chapterName,\n open,\n pageKeys,\n showUnviewedPageWarning\n };\n });\n\n return {\n chapters,\n form,\n formData,\n formConfig,\n formContext,\n pageList,\n viewedPages\n };\n}\n\nconst mapDispatchToProps = {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n};\n\nReviewChapters.propTypes = {\n chapters: PropTypes.array.isRequired,\n closeReviewChapter: PropTypes.func.isRequired,\n form: PropTypes.object.isRequired,\n formData: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n formContext: PropTypes.object,\n onSetData: PropTypes.func,\n openReviewChapter: PropTypes.func.isRequired,\n pageList: PropTypes.array.isRequired,\n setData: PropTypes.func.isRequired,\n setEditMode: PropTypes.func.isRequired,\n setViewedPages: PropTypes.func.isRequired,\n uploadFile: PropTypes.func.isRequired,\n viewedPages: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ReviewChapters));\n\n// for tests\nexport { ReviewChapters };\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/review/ReviewChapters.jsx"],"names":["mapStateToProps","scroller","Scroll","ReviewChapters","props","formData","pageList","viewedPages","Set","setViewedPages","name","open","pageKeys","closeReviewChapter","openReviewChapter","scrollToChapter","chapters","form","formContext","setValid","map","chapter","expandedPages","formConfig","handleEdit","handleSetData","showUnviewedPageWarning","handleToggleChapter","uploadFile","React","Component","chapterKey","scrollTo","window","Forms","scroll","duration","delay","smooth","pageKey","editing","index","fullPageKey","setEditMode","setData","onSetData","state","ownProps","data","openChapters","chapterNames","pagesByChapter","pages","chapterName","chapterFormConfig","includes","some","has","key","mapDispatchToProps","propTypes","PropTypes","array","isRequired","func","object"],"mappings":";;;;;;;;;QA2GgBA,e,GAAAA,e;;AA3GhB;;;;AACA;;;;AACA;;AACA;;AACA;;;;AAEA;;;;AACA;;AAOA;;AAIA;;;;;;;;;;AAUA,IAAMC,WAAWC,sBAAOD,QAAxB;;IACME,c;;;;;;;;;;;;;;;;;;;wCAEgB;AAAA,mBAId,KAAKC,KAJS;AAAA,UAEhBC,QAFgB,UAEhBA,QAFgB;AAAA,UAGhBC,QAHgB,UAGhBA,QAHgB;;AAKlB,UAAMC,cAAc,IAAIC,GAAJ,CAAQ,0BAAYF,QAAZ,EAAsBD,QAAtB,CAAR,CAApB;AACA,WAAKD,KAAL,CAAWK,cAAX,CAA0BF,WAA1B;AACD;;;+CAE6C;AAAA,UAAxBG,IAAwB,SAAxBA,IAAwB;AAAA,UAAlBC,IAAkB,SAAlBA,IAAkB;AAAA,UAAZC,QAAY,SAAZA,QAAY;;AAC5C,UAAID,IAAJ,EAAU;AACR,aAAKP,KAAL,CAAWS,kBAAX,CAA8BH,IAA9B,EAAoCE,QAApC;AACD,OAFD,MAEO;AACL,aAAKR,KAAL,CAAWU,iBAAX,CAA6BJ,IAA7B;AACA,aAAKK,eAAL,CAAqBL,IAArB;AACD;AACF;;;6BAyBQ;AAAA;;AAAA,oBAMH,KAAKN,KANF;AAAA,UAELY,QAFK,WAELA,QAFK;AAAA,UAGLC,IAHK,WAGLA,IAHK;AAAA,UAILC,WAJK,WAILA,WAJK;AAAA,UAKLC,QALK,WAKLA,QALK;AAAA,UAKKZ,WALL,WAKKA,WALL;;;AAQP,aACE;AAAA;AAAA,UAAK,WAAU,eAAf;AACE;AAAA;AAAA;AACGS,mBAASI,GAAT,CAAa;AAAA,mBACZ,8BAAC,kCAAD;AACE,6BAAeC,QAAQC,aADzB;AAEE,iCAAmBD,QAAQE,UAF7B;AAGE,0BAAYF,QAAQX,IAHtB;AAIE,oBAAMO,IAJR;AAKE,2BAAaC,WALf;AAME,mBAAKG,QAAQX,IANf;AAOE,sBAAQ,OAAKc,UAPf;AAQE,oBAAMH,QAAQV,IARhB;AASE,wBAAUU,QAAQT,QATpB;AAUE,uBAAS;AAAA,uBAAa,OAAKa,aAAL,yBAAb;AAAA,eAVX;AAWE,wBAAUN,QAXZ;AAYE,uCAAyBE,QAAQK,uBAZnC;AAaE,mCAAqB;AAAA,uBAAM,OAAKC,mBAAL,CAAyBN,OAAzB,CAAN;AAAA,eAbvB;AAcE,0BAAY,OAAKjB,KAAL,CAAWwB,UAdzB;AAeE,2BAAarB,WAff,GADY;AAAA,WAAb;AADH;AADF,OADF;AAwBD;;;;EA3E0BsB,gBAAMC,S;;;;;OAoBjCf,e,GAAkB,UAACgB,UAAD,EAAgB;AAChC9B,aAAS+B,QAAT,aAA4BD,UAA5B,oBAAuDE,OAAOC,KAAP,CAAaC,MAAb,IAAuB;AAC5EC,gBAAU,GADkE;AAE5EC,aAAO,CAFqE;AAG5EC,cAAQ;AAHoE,KAA9E;AAKD,G;;OAEDd,U,GAAa,UAACe,OAAD,EAAUC,OAAV,EAAoC;AAAA,QAAjBC,KAAiB,uEAAT,IAAS;;AAC/C,QAAMC,mBAAiBH,OAAjB,IAA2BE,UAAU,IAAV,GAAiB,EAAjB,GAAsBA,KAAjD,CAAN;AACA,QAAID,OAAJ,EAAa;AACX,aAAKpC,KAAL,CAAWK,cAAX,CAA0B,CAACiC,WAAD,CAA1B;AACD;AACD,WAAKtC,KAAL,CAAWuC,WAAX,CAAuBJ,OAAvB,EAAgCC,OAAhC,EAAyCC,KAAzC;AACD,G;;OAEDhB,a,GAAgB,YAAa;AAAA;;AAC3B,sBAAKrB,KAAL,EAAWwC,OAAX;AACA,QAAI,OAAKxC,KAAL,CAAWyC,SAAf,EAA0B;AACxB,aAAKzC,KAAL,CAAWyC,SAAX;AACD;AACF,G;;;AAqCI,SAAS7C,eAAT,CAAyB8C,KAAzB,EAAgCC,QAAhC,EAA0C;AAC/C;AAD+C,MAG7CxB,UAH6C,GAM3CwB,QAN2C,CAG7CxB,UAH6C;AAAA,MAI7CL,WAJ6C,GAM3C6B,QAN2C,CAI7C7B,WAJ6C;AAAA,MAK7CZ,QAL6C,GAM3CyC,QAN2C,CAK7CzC,QAL6C;;AAQ/C;;AACA,MAAMW,OAAO6B,MAAM7B,IAAnB;AACA,MAAMZ,WAAWyC,MAAM7B,IAAN,CAAW+B,IAA5B;AACA,MAAMC,eAAe,0CAA0BH,KAA1B,CAArB;AACA,MAAMvC,cAAc,+BAAeuC,KAAf,CAApB;;AAEA,MAAMI,eAAe,gCAAkB3B,UAAlB,EAA8BlB,QAA9B,CAArB;AACA,MAAM8C,iBAAiB,sCAAwB5B,UAAxB,CAAvB;AACA,MAAMP,WAAWkC,aAAa9B,GAAb,CAAiB,uBAAe;AAC/C,QAAMgC,QAAQD,eAAeE,WAAf,CAAd;;AAEA,QAAI/B,gBAAgB,+BAAiB8B,KAAjB,EAAwB/C,QAAxB,CAApB;AACAiB,oBAAgB,6BAAeA,aAAf,EAA8BjB,QAA9B,CAAhB;AACA,QAAMiD,oBAAoB/B,WAAWP,QAAX,CAAoBqC,WAApB,CAA1B;AACA,QAAM1C,OAAOsC,aAAaM,QAAb,CAAsBF,WAAtB,CAAb;AACA,QAAMzC,WAAW,0BAAYwC,KAAZ,EAAmB/C,QAAnB,CAAjB;AACA,QAAMqB,0BAA0Bd,SAAS4C,IAAT,CAAc;AAAA,aAAO,CAACjD,YAAYkD,GAAZ,CAAgBC,GAAhB,CAAR;AAAA,KAAd,CAAhC;;AAEA,WAAO;AACLpC,kCADK;AAELC,kBAAY+B,iBAFP;AAGL5C,YAAM2C,WAHD;AAIL1C,gBAJK;AAKLC,wBALK;AAMLc;AANK,KAAP;AAQD,GAlBgB,CAAjB;;AAoBA,SAAO;AACLV,sBADK;AAELC,cAFK;AAGLZ,sBAHK;AAILkB,0BAJK;AAKLL,4BALK;AAMLZ,sBANK;AAOLC;AAPK,GAAP;AASD;;AAED,IAAMoD,qBAAqB;AACzB9C,iDADyB;AAEzBC,+CAFyB;AAGzB8B,2BAHyB;AAIzBD,mCAJyB;AAKzBlC,yCALyB;AAMzBmB;AANyB,CAA3B;;AASAzB,eAAeyD,SAAf,GAA2B;AACzB5C,YAAU6C,oBAAUC,KAAV,CAAgBC,UADD;AAEzBlD,sBAAoBgD,oBAAUG,IAAV,CAAeD,UAFV;AAGzB9C,QAAM4C,oBAAUI,MAAV,CAAiBF,UAHE;AAIzB1D,YAAUwD,oBAAUI,MAAV,CAAiBF,UAJF;AAKzBxC,cAAYsC,oBAAUI,MAAV,CAAiBF,UALJ;AAMzB7C,eAAa2C,oBAAUI,MANE;AAOzBpB,aAAWgB,oBAAUG,IAPI;AAQzBlD,qBAAmB+C,oBAAUG,IAAV,CAAeD,UART;AASzBzD,YAAUuD,oBAAUC,KAAV,CAAgBC,UATD;AAUzBnB,WAASiB,oBAAUG,IAAV,CAAeD,UAVC;AAWzBpB,eAAakB,oBAAUG,IAAV,CAAeD,UAXH;AAYzBtD,kBAAgBoD,oBAAUG,IAAV,CAAeD,UAZN;AAazBnC,cAAYiC,oBAAUG,IAAV,CAAeD,UAbF;AAczBxD,eAAasD,oBAAUI,MAAV,CAAiBF;AAdL,CAA3B;;kBAiBe,6BAAW,yBAAQ/D,eAAR,EAAyB2D,kBAAzB,EAA6CxD,cAA7C,CAAX,C;;AAEf;;QACSA,c,GAAAA,c","file":"ReviewChapters.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport Scroll from 'react-scroll';\n\nimport ReviewCollapsibleChapter from './ReviewCollapsibleChapter';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActiveChapters,\n getActivePages,\n getPageKeys\n} from '../helpers';\nimport {\n getReviewPageOpenChapters,\n getViewedPages\n} from '../state/selectors';\nimport {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n} from '../actions';\n\n\nconst scroller = Scroll.scroller;\nclass ReviewChapters extends React.Component {\n\n componentDidMount() {\n const {\n formData,\n pageList\n } = this.props;\n const viewedPages = new Set(getPageKeys(pageList, formData));\n this.props.setViewedPages(viewedPages);\n }\n\n handleToggleChapter({ name, open, pageKeys }) {\n if (open) {\n this.props.closeReviewChapter(name, pageKeys);\n } else {\n this.props.openReviewChapter(name);\n this.scrollToChapter(name);\n }\n }\n\n scrollToChapter = (chapterKey) => {\n scroller.scrollTo(`chapter${chapterKey}ScrollElement`, window.Forms.scroll || {\n duration: 500,\n delay: 2,\n smooth: true,\n });\n }\n\n handleEdit = (pageKey, editing, index = null) => {\n const fullPageKey = `${pageKey}${index === null ? '' : index}`;\n if (editing) {\n this.props.setViewedPages([fullPageKey]);\n }\n this.props.setEditMode(pageKey, editing, index);\n }\n\n handleSetData = (...args) => {\n this.props.setData(...args);\n if (this.props.onSetData) {\n this.props.onSetData();\n }\n }\n\n render() {\n const {\n chapters,\n form,\n formContext,\n setValid, viewedPages\n } = this.props;\n\n return (\n
\n
\n {chapters.map(chapter => (\n this.handleSetData(...args)}\n setValid={setValid}\n showUnviewedPageWarning={chapter.showUnviewedPageWarning}\n toggleButtonClicked={() => this.handleToggleChapter(chapter)}\n uploadFile={this.props.uploadFile}\n viewedPages={viewedPages}/>\n ))}\n
\n
\n );\n }\n}\n\nexport function mapStateToProps(state, ownProps) {\n // from ownprops\n const {\n formConfig,\n formContext,\n pageList\n } = ownProps;\n\n // from redux state\n const form = state.form;\n const formData = state.form.data;\n const openChapters = getReviewPageOpenChapters(state);\n const viewedPages = getViewedPages(state);\n\n const chapterNames = getActiveChapters(formConfig, formData);\n const pagesByChapter = createPageListByChapter(formConfig);\n const chapters = chapterNames.map(chapterName => {\n const pages = pagesByChapter[chapterName];\n\n let expandedPages = expandArrayPages(pages, formData);\n expandedPages = getActivePages(expandedPages, formData);\n const chapterFormConfig = formConfig.chapters[chapterName];\n const open = openChapters.includes(chapterName);\n const pageKeys = getPageKeys(pages, formData);\n const showUnviewedPageWarning = pageKeys.some(key => !viewedPages.has(key));\n\n return {\n expandedPages,\n formConfig: chapterFormConfig,\n name: chapterName,\n open,\n pageKeys,\n showUnviewedPageWarning\n };\n });\n\n return {\n chapters,\n form,\n formData,\n formConfig,\n formContext,\n pageList,\n viewedPages\n };\n}\n\nconst mapDispatchToProps = {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n};\n\nReviewChapters.propTypes = {\n chapters: PropTypes.array.isRequired,\n closeReviewChapter: PropTypes.func.isRequired,\n form: PropTypes.object.isRequired,\n formData: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n formContext: PropTypes.object,\n onSetData: PropTypes.func,\n openReviewChapter: PropTypes.func.isRequired,\n pageList: PropTypes.array.isRequired,\n setData: PropTypes.func.isRequired,\n setEditMode: PropTypes.func.isRequired,\n setViewedPages: PropTypes.func.isRequired,\n uploadFile: PropTypes.func.isRequired,\n viewedPages: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ReviewChapters));\n\n// for tests\nexport { ReviewChapters };\n"]} \ No newline at end of file diff --git a/src/js/review/ReviewChapters.jsx b/src/js/review/ReviewChapters.jsx index 51c3679..347efe5 100644 --- a/src/js/review/ReviewChapters.jsx +++ b/src/js/review/ReviewChapters.jsx @@ -75,8 +75,7 @@ class ReviewChapters extends React.Component { chapters, form, formContext, - setValid, - viewedPages + setValid, viewedPages } = this.props; return ( @@ -106,7 +105,7 @@ class ReviewChapters extends React.Component { } } -function mapStateToProps(state, ownProps) { +export function mapStateToProps(state, ownProps) { // from ownprops const { formConfig, diff --git a/test/js/review/ReviewChapters.unit.spec.jsx b/test/js/review/ReviewChapters.unit.spec.jsx index 57e3139..900b2db 100644 --- a/test/js/review/ReviewChapters.unit.spec.jsx +++ b/test/js/review/ReviewChapters.unit.spec.jsx @@ -3,7 +3,7 @@ import { expect } from 'chai'; import { mount } from 'enzyme'; import sinon from 'sinon'; -import { ReviewChapters } from '../../../src/js/review/ReviewChapters'; +import { ReviewChapters, mapStateToProps } from '../../../src/js/review/ReviewChapters'; describe('Schemaform review: ReviewChapters', () => { it('should handle editing', () => { @@ -105,4 +105,43 @@ describe('Schemaform review: ReviewChapters', () => { instance.handleToggleChapter({ name: 'chapter3', open: true, pageKeys: 0 }); expect(closeReviewChapter.calledWith('chapter3', 0)).to.be.true; }); + + it('should pass index to depends for pagePerItem pages', () => { + const formData = { + testArray: [{}] + }; + + const dependsStub = sinon.stub(); + dependsStub.withArgs(formData, 0).returns(true); + + mapStateToProps({ + form: { + pages: {}, + submission: {}, + reviewPageView: { + openChapters: [], + viewedPages: new Set() + }, + data: formData + } + }, { + formConfig: { + chapters: { + test: { + pages: { + testPage: { + path: '/testing/:index', + pagePerItem: true, + arrayPath: 'testArray', + depends: dependsStub + } + } + } + } + }, + pageList: [{}] + }); + + expect(dependsStub.calledWith(formData, 0)); + }); }); From 31fd75476c5a12a4c25a0edf093eb246fbb7f0a7 Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Fri, 14 Sep 2018 14:27:27 -0400 Subject: [PATCH 4/9] Add helper function --- lib/js/helpers.js | 23 +++++++++++++++++++---- lib/js/helpers.js.map | 2 +- lib/js/review/ReviewChapters.js | 3 +-- lib/js/review/ReviewChapters.js.map | 2 +- lib/js/review/SubmitController.js | 3 +-- lib/js/review/SubmitController.js.map | 2 +- lib/js/routing.js | 5 +---- lib/js/routing.js.map | 2 +- src/js/helpers.js | 23 +++++++++++++++++++---- src/js/review/ReviewChapters.jsx | 6 ++---- src/js/review/SubmitController.jsx | 6 ++---- src/js/routing.js | 7 ++----- 12 files changed, 51 insertions(+), 33 deletions(-) diff --git a/lib/js/helpers.js b/lib/js/helpers.js index 12b6016..0796b7e 100644 --- a/lib/js/helpers.js +++ b/lib/js/helpers.js @@ -68,6 +68,7 @@ exports.checkValidSchema = checkValidSchema; exports.setArrayRecordTouched = setArrayRecordTouched; exports.createUSAStateLabels = createUSAStateLabels; exports.expandArrayPages = expandArrayPages; +exports.getActiveExpandedPages = getActiveExpandedPages; exports.getPageKeys = getPageKeys; exports.getActiveChapters = getActiveChapters; exports.omitRequired = omitRequired; @@ -626,6 +627,22 @@ function expandArrayPages(pageList, data) { return result.currentList; } +/** + * Gets active and expanded pages, in the correct order + * + * Any `showPagePerItem` pages are expanded to create items for each array item. + * We update the `path` for each of those pages to replace `:index` with the current item index. + * + * @param pages {Array} List of page configs + * @param data {Object} Current form data + * @returns {Array} A list of pages, includeing individual array + * pages that are active + */ +function getActiveExpandedPages(pages, data) { + var expandedPages = expandArrayPages(pages, data); + return getActivePages(expandedPages, data); +} + /** * getPageKeys returns a list of keys for the currently active pages * @@ -635,8 +652,7 @@ function expandArrayPages(pageList, data) { * and the index if it’s a pagePerItem page */ function getPageKeys(pages, formData) { - var eligiblePageList = getActivePages(pages, formData); - var expandedPageList = expandArrayPages(eligiblePageList, formData); + var expandedPageList = getActiveExpandedPages(pages, formData); return expandedPageList.map(function (page) { var pageKey = page.pageKey; @@ -657,8 +673,7 @@ function getPageKeys(pages, formData) { function getActiveChapters(formConfig, formData) { var formPages = createFormPageList(formConfig); var pageList = createPageList(formConfig, formPages); - var eligiblePageList = getActivePages(pageList, formData); - var expandedPageList = expandArrayPages(eligiblePageList, formData); + var expandedPageList = getActiveExpandedPages(pageList, formData); return (0, _uniq3.default)(expandedPageList.map(function (p) { return p.chapterKey; diff --git a/lib/js/helpers.js.map b/lib/js/helpers.js.map index e083297..df78793 100644 --- a/lib/js/helpers.js.map +++ b/lib/js/helpers.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/js/helpers.js"],"names":["isActivePage","getActivePages","getActiveProperties","getInactivePages","createFormPageList","createPageListByChapter","createPageList","createRoutes","formatISOPartialDate","formatReviewDate","parseISODate","filterViewFields","filterInactivePageData","stringifyFormReplacer","isInProgress","transformForSubmit","getArrayFields","hasFieldsOtherThanArray","getNonArraySchema","checkValidSchema","setArrayRecordTouched","createUSAStateLabels","expandArrayPages","getPageKeys","getActiveChapters","omitRequired","page","data","depends","index","Array","isArray","some","condition","undefined","pages","filter","activePages","allProperties","forEach","schema","push","Object","keys","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","map","chapterKey","pageKey","concat","formPages","introduction","path","urlPrefix","routes","component","FormPage","pageConfig","ReviewPage","confirmation","onEnter","nextState","replace","formatDayMonth","val","dayOrMonth","toString","Number","length","formatYear","month","day","year","dateString","monthYear","split","newData","nextProp","field","newArray","item","startsWith","inactivePages","form","activeProperties","formData","currentData","prop","includes","key","value","country","street","city","postalCode","zipcode","fields","every","widget","id","confirmationCode","file","newValues","v","pathName","trimmedPathname","endsWith","replacer","withoutInactivePages","withoutViewFields","JSON","stringify","isHiddenField","findArrays","obj","ui","type","definitions","uiSchema","$ref","newProperties","current","next","newSchema","required","newRequired","pureWithDeepEquals","props","nextProps","errors","join","propName","items","additionalItems","Error","prefix","states","USA","label","generateArrayPages","arrayPages","arrayPath","itemFilter","result","acc","nextPage","lastArrayPath","currentList","showPagePerItem","newList","eligiblePageList","expandedPageList","p"],"mappings":"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","file":"helpers.js","sourcesContent":["import _ from 'lodash/fp';\nimport shouldUpdate from 'recompose/shouldUpdate';\nimport { deepEquals } from '@department-of-veterans-affairs/react-jsonschema-form/lib/utils';\n\nimport FormPage from './containers/FormPage';\nimport ReviewPage from './review/ReviewPage';\n\n// An active page is one that will be shown to the user.\n// Pages become inactive if they are conditionally shown based\n// on answers to previous questions.\nexport function isActivePage(page, data) {\n if (typeof page.depends === 'function') {\n return page.depends(data, page.index);\n }\n\n if (Array.isArray(page.depends)) {\n return page.depends.some(condition => _.matches(condition)(data));\n }\n\n return page.depends === undefined || _.matches(page.depends)(data);\n}\n\nexport function getActivePages(pages, data) {\n return pages.filter(page => isActivePage(page, data));\n}\n\nexport function getActiveProperties(activePages) {\n const allProperties = [];\n activePages.forEach(page => {\n if (page.schema) {\n allProperties.push(...Object.keys(page.schema.properties));\n }\n });\n return _.uniq(allProperties);\n}\n\nexport function getInactivePages(pages, data) {\n return pages.filter(page => !isActivePage(page, data));\n}\n\nexport function createFormPageList(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((pageList, chapter) => {\n const chapterTitle = formConfig.chapters[chapter].title;\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n chapterTitle,\n chapterKey: chapter,\n pageKey: page\n });\n });\n return pageList.concat(pages);\n }, []);\n}\n\nexport function createPageListByChapter(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((chapters, chapter) => {\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n pageKey: page,\n chapterKey: chapter\n });\n });\n return _.set(chapter, pages, chapters);\n }, {});\n}\n\nexport function createPageList(formConfig, formPages) {\n let pageList = formPages;\n if (formConfig.introduction) {\n pageList = [\n {\n pageKey: 'introduction',\n path: 'introduction'\n }\n ].concat(pageList);\n }\n\n return pageList\n .concat([\n {\n pageKey: 'review-and-submit',\n path: 'review-and-submit',\n chapterKey: 'review'\n }\n ])\n .map(page => {\n return _.set('path', `${formConfig.urlPrefix || ''}${page.path}`, page);\n });\n}\n\n/*\n * Create the routes based on a form config. This goes through each chapter in a form\n * config, pulls out the config for each page, then generates a list of Route components with the\n * config as props\n */\nexport function createRoutes(formConfig) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n let routes = formPages\n .map(page => {\n return {\n path: page.path,\n component: page.component || FormPage,\n pageConfig: page,\n pageList,\n urlPrefix: formConfig.urlPrefix\n };\n });\n if (formConfig.introduction) {\n routes = [\n {\n path: 'introduction',\n component: formConfig.introduction,\n formConfig,\n pageList\n }\n ].concat(routes);\n }\n\n return routes.concat([\n {\n path: 'review-and-submit',\n formConfig,\n component: ReviewPage,\n pageList\n },\n {\n path: 'confirmation',\n component: formConfig.confirmation\n },\n {\n path: '*',\n onEnter: (nextState, replace) => replace(formConfig.urlPrefix || '/')\n }\n ]);\n}\n\nfunction formatDayMonth(val) {\n if (val) {\n const dayOrMonth = val.toString();\n if (Number(dayOrMonth) && dayOrMonth.length === 1) {\n return `0${val}`;\n } else if (Number(dayOrMonth)) {\n return dayOrMonth;\n }\n }\n\n return 'XX';\n}\n\nfunction formatYear(val) {\n if (!val || !val.length) {\n return 'XXXX';\n }\n\n return val;\n}\n\nexport function formatISOPartialDate({ month, day, year }) {\n if (month || day || year) {\n return `${formatYear(year)}-${formatDayMonth(month)}-${formatDayMonth(day)}`;\n }\n\n return undefined;\n}\n\nexport function formatReviewDate(dateString, monthYear = false) {\n if (dateString) {\n const [year, month, day] = dateString.split('-', 3);\n\n return monthYear\n ? `${formatDayMonth(month)}/${formatYear(year)}`\n : `${formatDayMonth(month)}/${formatDayMonth(day)}/${formatYear(year)}`;\n }\n\n return undefined;\n}\nexport function parseISODate(dateString) {\n if (typeof dateString === 'string') {\n const [year, month, day] = dateString.split('-', 3);\n\n return {\n month: month === 'XX' ? '' : Number(month).toString(),\n day: day === 'XX' ? '' : Number(day).toString(),\n year: year === 'XXXX' ? '' : year\n };\n }\n\n return {\n month: '',\n day: '',\n year: ''\n };\n}\n\n/*\n * Removes 'view:' fields from data object\n */\nexport function filterViewFields(data) {\n return Object.keys(data).reduce((newData, nextProp) => {\n const field = data[nextProp];\n\n if (Array.isArray(field)) {\n const newArray = field.map((item) => filterViewFields(item));\n\n return _.set(nextProp, newArray, newData);\n }\n\n if (typeof field === 'object') {\n if (nextProp.startsWith('view:')) {\n return _.assign(newData, filterViewFields(field));\n }\n return _.set(nextProp, filterViewFields(field), newData);\n }\n\n if (!nextProp.startsWith('view:')) {\n return _.set(nextProp, field, newData);\n }\n\n return newData;\n }, {});\n}\n\nexport function filterInactivePageData(inactivePages, activePages, form) {\n const activeProperties = getActiveProperties(activePages);\n let newData;\n\n return inactivePages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n newData = currentData;\n if (!activeProperties.includes(prop)) {\n delete newData[prop];\n }\n return newData;\n }, formData);\n }, form.data);\n}\n\nexport function stringifyFormReplacer(key, value) {\n // an object with country is an address\n if (value && typeof value.country !== 'undefined' &&\n (!value.street || !value.city || (!value.postalCode && !value.zipcode))) {\n return undefined;\n }\n\n // clean up empty objects, which we have no reason to send\n if (typeof value === 'object') {\n const fields = Object.keys(value);\n if (fields.length === 0 || fields.every(field => value[field] === undefined)) {\n return undefined;\n }\n\n // autosuggest widgets save value and label info, but we should just return the value\n if (value.widget === 'autosuggest') {\n return value.id;\n }\n\n // Exclude file data\n if (value.confirmationCode && value.file) {\n return _.omit('file', value);\n }\n }\n\n // Clean up empty objects in arrays\n if (Array.isArray(value)) {\n const newValues = value.filter(v => !!stringifyFormReplacer(key, v));\n // If every item in the array is cleared, remove the whole array\n return newValues.length > 0 ? newValues : undefined;\n }\n\n return value;\n}\n\nexport function isInProgress(pathName) {\n const trimmedPathname = pathName.replace(/\\/$/, '');\n return !(\n trimmedPathname.endsWith('introduction')\n || trimmedPathname.endsWith('confirmation')\n || trimmedPathname.endsWith('form-saved')\n || trimmedPathname.endsWith('error')\n );\n}\n\n/*\n * Normal transform for schemaform data\n */\nexport function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) {\n const activePages = getActivePages(createFormPageList(formConfig), form.data);\n const inactivePages = getInactivePages(createFormPageList(formConfig), form.data);\n const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form);\n const withoutViewFields = filterViewFields(withoutInactivePages);\n\n return JSON.stringify(withoutViewFields, replacer) || '{}';\n}\n\nfunction isHiddenField(schema) {\n return !!schema['ui:collapsed'] || !!schema['ui:hidden'];\n}\n\n/*\n * Pull the array fields from a schema. Used to separate out array fields\n * from the rest of page to be displayed on the review page\n */\nexport function getArrayFields(data) {\n const fields = [];\n const findArrays = (obj, ui, path = []) => {\n if (obj.type === 'array' && !isHiddenField(obj) && !_.get('ui:options.keepInPageOnReview', ui)) {\n fields.push({\n path,\n schema: _.set('definitions', data.schema.definitions, obj),\n uiSchema: _.get(path, data.uiSchema) || data.uiSchema\n });\n }\n\n if (obj.type === 'object' && !isHiddenField(obj)) {\n Object.keys(obj.properties).forEach(prop => {\n findArrays(obj.properties[prop], ui[prop], path.concat(prop));\n });\n }\n };\n\n findArrays(data.schema, data.uiSchema);\n\n return fields;\n}\n\n/*\n * Checks to see if there are non array fields in a page schema, so that\n * we don’t show a blank page header on the review page if a page is just\n * a growable table\n */\nexport function hasFieldsOtherThanArray(schema) {\n if (schema.$ref || (schema.type !== 'object' && schema.type !== 'array')) {\n return true;\n }\n\n if (schema.type === 'object') {\n return Object.keys(schema.properties).some(nextProp => {\n return hasFieldsOtherThanArray(schema.properties[nextProp]);\n });\n }\n\n return false;\n}\n\n/*\n * Return a schema without array fields. If the schema has only array fields,\n * then return undefined (because there’s no reason to use an object schema with\n * no properties)\n */\nexport function getNonArraySchema(schema, uiSchema = {}) {\n if (schema.type === 'array' && !_.get('ui:options.keepInPageOnReview', uiSchema)) {\n return undefined;\n }\n\n if (schema.type === 'object') {\n const newProperties = Object.keys(schema.properties).reduce((current, next) => {\n const newSchema = getNonArraySchema(schema.properties[next], uiSchema[next]);\n\n if (typeof newSchema === 'undefined') {\n return _.unset(next, current);\n }\n\n if (newSchema !== schema.properties[next]) {\n return _.set(next, newSchema, current);\n }\n\n return current;\n }, schema.properties);\n\n if (Object.keys(newProperties).length === 0) {\n return undefined;\n }\n\n if (newProperties !== schema.properties) {\n let newSchema = _.set('properties', newProperties, schema);\n if (newSchema.required) {\n const newRequired = _.intersection(Object.keys(newSchema.properties), newSchema.required);\n if (newRequired.length !== newSchema.required.length) {\n newSchema = _.set('required', newRequired, newSchema);\n }\n }\n\n return newSchema;\n }\n }\n\n return schema;\n}\n\n\nexport const pureWithDeepEquals = shouldUpdate((props, nextProps) => {\n return !deepEquals(props, nextProps);\n});\n\n/**\n * Recursively checks to see if the schema is valid.\n *\n * Note: This only returns true. If the schema is invalid, an error is thrown to\n * stop everything.\n *\n * @param {Object} schema - The schema in question\n * @return {bool} - true if we succeed\n * @throws {Error} - If the schema is invalid\n */\nexport function checkValidSchema(schema, errors = [], path = ['root']) {\n if (typeof schema.type !== 'string') {\n errors.push(`Missing type in ${path.join('.')} schema.`);\n }\n\n if (schema.type === 'object') {\n if (typeof schema.properties !== 'object') {\n errors.push(`Missing object properties in ${path.join('.')} schema.`);\n } else {\n Object.keys(schema.properties).forEach((propName) => {\n checkValidSchema(schema.properties[propName], errors, [...path, propName]);\n });\n }\n }\n\n if (schema.type === 'array') {\n // We check this both before items is turned into additionalItems and after,\n // so we need to account for it being both an object and an array.\n if (Array.isArray(schema.items)) {\n if (!schema.additionalItems) {\n errors.push(`${path.join('.')} should contain additionalItems when items is an array.`);\n }\n schema.items.forEach((item, index) => {\n checkValidSchema(item, errors, [...path, 'items', index]);\n });\n } else if (typeof schema.items === 'object') {\n if (schema.additionalItems) {\n errors.push(`${path.join('.')} should not contain additionalItems when items is an object.`);\n }\n checkValidSchema(schema.items, errors, [...path, 'items']);\n } else {\n errors.push(`Missing items schema in ${path.join('.')}.`);\n }\n\n // Check additionalItems\n if (schema.additionalItems) {\n checkValidSchema(schema.additionalItems, errors, [...path, 'additionalItems']);\n }\n }\n\n // We’ve recursed all the way back down to ['root']; throw an error containing\n // all the error messages.\n if (path.length === 1 && errors.length > 0) {\n // console.log(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')} -- ${path.join('.')}`);\n throw new Error(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')}`);\n } else {\n return true;\n }\n}\n\nexport function setArrayRecordTouched(prefix, index) {\n return { [`${prefix}_${index}`]: true };\n}\n\nexport function createUSAStateLabels(states) {\n return states.USA.reduce((current, { label, value }) => {\n return _.merge(current, { [value]: label });\n }, {});\n}\n\n/*\n * Take a list of pages and create versions of them\n * for each item in an array\n */\nfunction generateArrayPages(arrayPages, data) {\n const items = _.get(arrayPages[0].arrayPath, data) || [];\n return items\n .reduce((pages, item, index) =>\n pages.concat(arrayPages.map(page =>\n _.assign(page, {\n path: page.path.replace(':index', index),\n index\n })\n )),\n []\n )\n // doing this after the map so that we don’t change indexes\n .filter(page => !page.itemFilter || page.itemFilter(items[page.index]));\n}\n\n/*\n * We want to generate the pages we need for each item in the array\n * being used by an array page. We also want to group those pages by item.\n * So, this grabs contiguous sections of array pages and at the end generates\n * the right number of pages based on the items in the array\n */\nexport function expandArrayPages(pageList, data) {\n const result = pageList.reduce((acc, nextPage) => {\n const { lastArrayPath, arrayPages, currentList } = acc;\n // If we see an array page and we’re starting a section or in the middle of one, just add it\n // to the temporary array\n if (nextPage.showPagePerItem && (!lastArrayPath || nextPage.arrayPath === lastArrayPath)) {\n arrayPages.push(nextPage);\n return acc;\n // Now we’ve hit the end of a section of array pages using the same array, so\n // actually generate the pages now\n } else if (nextPage.arrayPath !== lastArrayPath && !!arrayPages.length) {\n const newList = currentList.concat(generateArrayPages(arrayPages, data), nextPage);\n return _.assign(acc, {\n lastArrayPath: null,\n arrayPages: [],\n currentList: newList\n });\n }\n\n return _.set('currentList', currentList.concat(nextPage), acc);\n }, { lastArrayPath: null, arrayPages: [], currentList: [] });\n\n if (result.arrayPages.length > 0) {\n return result.currentList.concat(generateArrayPages(result.arrayPages, data));\n }\n\n return result.currentList;\n}\n\n/**\n * getPageKeys returns a list of keys for the currently active pages\n *\n * @param pages {Array} List of page configs\n * @param formData {Object} Current form data\n * @returns {Array} A list of page keys from the page config\n * and the index if it’s a pagePerItem page\n */\nexport function getPageKeys(pages, formData) {\n const eligiblePageList = getActivePages(pages, formData);\n const expandedPageList = expandArrayPages(eligiblePageList, formData);\n\n return expandedPageList.map(page => {\n let pageKey = page.pageKey;\n if (typeof page.index !== 'undefined') {\n pageKey += page.index;\n }\n return pageKey;\n });\n}\n\n/**\n * getActiveChapters returns the list of chapter keys with active pages\n *\n * @param formConfig {Object} The form config object\n * @param formData {Object} The current form data\n * @returns {Array} The list of chapter key strings for active chapters\n */\nexport function getActiveChapters(formConfig, formData) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n const eligiblePageList = getActivePages(pageList, formData);\n const expandedPageList = expandArrayPages(eligiblePageList, formData);\n\n return _.uniq(expandedPageList.map(p => p.chapterKey).filter(key => !!key && key !== 'review'));\n}\n\n/**\n * Returns the schema, omitting all `required` arrays.\n *\n * @param schema {Object}\n * @returns {Object} The schema without any `required` arrays\n */\nexport function omitRequired(schema) {\n if (typeof schema !== 'object' || Array.isArray(schema)) {\n return schema;\n }\n\n const newSchema = _.omit('required', schema);\n Object.keys(newSchema).forEach(key => {\n newSchema[key] = omitRequired(newSchema[key]);\n });\n\n return newSchema;\n}\n"]} \ No newline at end of file +{"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","getActiveExpandedPages","getPageKeys","getActiveChapters","omitRequired","page","data","depends","index","Array","isArray","some","condition","undefined","pages","filter","activePages","allProperties","forEach","schema","push","Object","keys","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","map","chapterKey","pageKey","concat","formPages","introduction","path","urlPrefix","routes","component","FormPage","pageConfig","ReviewPage","confirmation","onEnter","nextState","replace","formatDayMonth","val","dayOrMonth","toString","Number","length","formatYear","month","day","year","dateString","monthYear","split","newData","nextProp","field","newArray","item","startsWith","inactivePages","form","activeProperties","formData","currentData","prop","includes","key","value","country","street","city","postalCode","zipcode","fields","every","widget","id","confirmationCode","file","newValues","v","pathName","trimmedPathname","endsWith","replacer","withoutInactivePages","withoutViewFields","JSON","stringify","isHiddenField","findArrays","obj","ui","type","definitions","uiSchema","$ref","newProperties","current","next","newSchema","required","newRequired","pureWithDeepEquals","props","nextProps","errors","join","propName","items","additionalItems","Error","prefix","states","USA","label","generateArrayPages","arrayPages","arrayPath","itemFilter","result","acc","nextPage","lastArrayPath","currentList","showPagePerItem","newList","expandedPages","expandedPageList","p"],"mappings":"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","file":"helpers.js","sourcesContent":["import _ from 'lodash/fp';\nimport shouldUpdate from 'recompose/shouldUpdate';\nimport { deepEquals } from '@department-of-veterans-affairs/react-jsonschema-form/lib/utils';\n\nimport FormPage from './containers/FormPage';\nimport ReviewPage from './review/ReviewPage';\n\n// An active page is one that will be shown to the user.\n// Pages become inactive if they are conditionally shown based\n// on answers to previous questions.\nexport function isActivePage(page, data) {\n if (typeof page.depends === 'function') {\n return page.depends(data, page.index);\n }\n\n if (Array.isArray(page.depends)) {\n return page.depends.some(condition => _.matches(condition)(data));\n }\n\n return page.depends === undefined || _.matches(page.depends)(data);\n}\n\nexport function getActivePages(pages, data) {\n return pages.filter(page => isActivePage(page, data));\n}\n\nexport function getActiveProperties(activePages) {\n const allProperties = [];\n activePages.forEach(page => {\n if (page.schema) {\n allProperties.push(...Object.keys(page.schema.properties));\n }\n });\n return _.uniq(allProperties);\n}\n\nexport function getInactivePages(pages, data) {\n return pages.filter(page => !isActivePage(page, data));\n}\n\nexport function createFormPageList(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((pageList, chapter) => {\n const chapterTitle = formConfig.chapters[chapter].title;\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n chapterTitle,\n chapterKey: chapter,\n pageKey: page\n });\n });\n return pageList.concat(pages);\n }, []);\n}\n\nexport function createPageListByChapter(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((chapters, chapter) => {\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n pageKey: page,\n chapterKey: chapter\n });\n });\n return _.set(chapter, pages, chapters);\n }, {});\n}\n\nexport function createPageList(formConfig, formPages) {\n let pageList = formPages;\n if (formConfig.introduction) {\n pageList = [\n {\n pageKey: 'introduction',\n path: 'introduction'\n }\n ].concat(pageList);\n }\n\n return pageList\n .concat([\n {\n pageKey: 'review-and-submit',\n path: 'review-and-submit',\n chapterKey: 'review'\n }\n ])\n .map(page => {\n return _.set('path', `${formConfig.urlPrefix || ''}${page.path}`, page);\n });\n}\n\n/*\n * Create the routes based on a form config. This goes through each chapter in a form\n * config, pulls out the config for each page, then generates a list of Route components with the\n * config as props\n */\nexport function createRoutes(formConfig) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n let routes = formPages\n .map(page => {\n return {\n path: page.path,\n component: page.component || FormPage,\n pageConfig: page,\n pageList,\n urlPrefix: formConfig.urlPrefix\n };\n });\n if (formConfig.introduction) {\n routes = [\n {\n path: 'introduction',\n component: formConfig.introduction,\n formConfig,\n pageList\n }\n ].concat(routes);\n }\n\n return routes.concat([\n {\n path: 'review-and-submit',\n formConfig,\n component: ReviewPage,\n pageList\n },\n {\n path: 'confirmation',\n component: formConfig.confirmation\n },\n {\n path: '*',\n onEnter: (nextState, replace) => replace(formConfig.urlPrefix || '/')\n }\n ]);\n}\n\nfunction formatDayMonth(val) {\n if (val) {\n const dayOrMonth = val.toString();\n if (Number(dayOrMonth) && dayOrMonth.length === 1) {\n return `0${val}`;\n } else if (Number(dayOrMonth)) {\n return dayOrMonth;\n }\n }\n\n return 'XX';\n}\n\nfunction formatYear(val) {\n if (!val || !val.length) {\n return 'XXXX';\n }\n\n return val;\n}\n\nexport function formatISOPartialDate({ month, day, year }) {\n if (month || day || year) {\n return `${formatYear(year)}-${formatDayMonth(month)}-${formatDayMonth(day)}`;\n }\n\n return undefined;\n}\n\nexport function formatReviewDate(dateString, monthYear = false) {\n if (dateString) {\n const [year, month, day] = dateString.split('-', 3);\n\n return monthYear\n ? `${formatDayMonth(month)}/${formatYear(year)}`\n : `${formatDayMonth(month)}/${formatDayMonth(day)}/${formatYear(year)}`;\n }\n\n return undefined;\n}\nexport function parseISODate(dateString) {\n if (typeof dateString === 'string') {\n const [year, month, day] = dateString.split('-', 3);\n\n return {\n month: month === 'XX' ? '' : Number(month).toString(),\n day: day === 'XX' ? '' : Number(day).toString(),\n year: year === 'XXXX' ? '' : year\n };\n }\n\n return {\n month: '',\n day: '',\n year: ''\n };\n}\n\n/*\n * Removes 'view:' fields from data object\n */\nexport function filterViewFields(data) {\n return Object.keys(data).reduce((newData, nextProp) => {\n const field = data[nextProp];\n\n if (Array.isArray(field)) {\n const newArray = field.map((item) => filterViewFields(item));\n\n return _.set(nextProp, newArray, newData);\n }\n\n if (typeof field === 'object') {\n if (nextProp.startsWith('view:')) {\n return _.assign(newData, filterViewFields(field));\n }\n return _.set(nextProp, filterViewFields(field), newData);\n }\n\n if (!nextProp.startsWith('view:')) {\n return _.set(nextProp, field, newData);\n }\n\n return newData;\n }, {});\n}\n\nexport function filterInactivePageData(inactivePages, activePages, form) {\n const activeProperties = getActiveProperties(activePages);\n let newData;\n\n return inactivePages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n newData = currentData;\n if (!activeProperties.includes(prop)) {\n delete newData[prop];\n }\n return newData;\n }, formData);\n }, form.data);\n}\n\nexport function stringifyFormReplacer(key, value) {\n // an object with country is an address\n if (value && typeof value.country !== 'undefined' &&\n (!value.street || !value.city || (!value.postalCode && !value.zipcode))) {\n return undefined;\n }\n\n // clean up empty objects, which we have no reason to send\n if (typeof value === 'object') {\n const fields = Object.keys(value);\n if (fields.length === 0 || fields.every(field => value[field] === undefined)) {\n return undefined;\n }\n\n // autosuggest widgets save value and label info, but we should just return the value\n if (value.widget === 'autosuggest') {\n return value.id;\n }\n\n // Exclude file data\n if (value.confirmationCode && value.file) {\n return _.omit('file', value);\n }\n }\n\n // Clean up empty objects in arrays\n if (Array.isArray(value)) {\n const newValues = value.filter(v => !!stringifyFormReplacer(key, v));\n // If every item in the array is cleared, remove the whole array\n return newValues.length > 0 ? newValues : undefined;\n }\n\n return value;\n}\n\nexport function isInProgress(pathName) {\n const trimmedPathname = pathName.replace(/\\/$/, '');\n return !(\n trimmedPathname.endsWith('introduction')\n || trimmedPathname.endsWith('confirmation')\n || trimmedPathname.endsWith('form-saved')\n || trimmedPathname.endsWith('error')\n );\n}\n\n/*\n * Normal transform for schemaform data\n */\nexport function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) {\n const activePages = getActivePages(createFormPageList(formConfig), form.data);\n const inactivePages = getInactivePages(createFormPageList(formConfig), form.data);\n const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form);\n const withoutViewFields = filterViewFields(withoutInactivePages);\n\n return JSON.stringify(withoutViewFields, replacer) || '{}';\n}\n\nfunction isHiddenField(schema) {\n return !!schema['ui:collapsed'] || !!schema['ui:hidden'];\n}\n\n/*\n * Pull the array fields from a schema. Used to separate out array fields\n * from the rest of page to be displayed on the review page\n */\nexport function getArrayFields(data) {\n const fields = [];\n const findArrays = (obj, ui, path = []) => {\n if (obj.type === 'array' && !isHiddenField(obj) && !_.get('ui:options.keepInPageOnReview', ui)) {\n fields.push({\n path,\n schema: _.set('definitions', data.schema.definitions, obj),\n uiSchema: _.get(path, data.uiSchema) || data.uiSchema\n });\n }\n\n if (obj.type === 'object' && !isHiddenField(obj)) {\n Object.keys(obj.properties).forEach(prop => {\n findArrays(obj.properties[prop], ui[prop], path.concat(prop));\n });\n }\n };\n\n findArrays(data.schema, data.uiSchema);\n\n return fields;\n}\n\n/*\n * Checks to see if there are non array fields in a page schema, so that\n * we don’t show a blank page header on the review page if a page is just\n * a growable table\n */\nexport function hasFieldsOtherThanArray(schema) {\n if (schema.$ref || (schema.type !== 'object' && schema.type !== 'array')) {\n return true;\n }\n\n if (schema.type === 'object') {\n return Object.keys(schema.properties).some(nextProp => {\n return hasFieldsOtherThanArray(schema.properties[nextProp]);\n });\n }\n\n return false;\n}\n\n/*\n * Return a schema without array fields. If the schema has only array fields,\n * then return undefined (because there’s no reason to use an object schema with\n * no properties)\n */\nexport function getNonArraySchema(schema, uiSchema = {}) {\n if (schema.type === 'array' && !_.get('ui:options.keepInPageOnReview', uiSchema)) {\n return undefined;\n }\n\n if (schema.type === 'object') {\n const newProperties = Object.keys(schema.properties).reduce((current, next) => {\n const newSchema = getNonArraySchema(schema.properties[next], uiSchema[next]);\n\n if (typeof newSchema === 'undefined') {\n return _.unset(next, current);\n }\n\n if (newSchema !== schema.properties[next]) {\n return _.set(next, newSchema, current);\n }\n\n return current;\n }, schema.properties);\n\n if (Object.keys(newProperties).length === 0) {\n return undefined;\n }\n\n if (newProperties !== schema.properties) {\n let newSchema = _.set('properties', newProperties, schema);\n if (newSchema.required) {\n const newRequired = _.intersection(Object.keys(newSchema.properties), newSchema.required);\n if (newRequired.length !== newSchema.required.length) {\n newSchema = _.set('required', newRequired, newSchema);\n }\n }\n\n return newSchema;\n }\n }\n\n return schema;\n}\n\n\nexport const pureWithDeepEquals = shouldUpdate((props, nextProps) => {\n return !deepEquals(props, nextProps);\n});\n\n/**\n * Recursively checks to see if the schema is valid.\n *\n * Note: This only returns true. If the schema is invalid, an error is thrown to\n * stop everything.\n *\n * @param {Object} schema - The schema in question\n * @return {bool} - true if we succeed\n * @throws {Error} - If the schema is invalid\n */\nexport function checkValidSchema(schema, errors = [], path = ['root']) {\n if (typeof schema.type !== 'string') {\n errors.push(`Missing type in ${path.join('.')} schema.`);\n }\n\n if (schema.type === 'object') {\n if (typeof schema.properties !== 'object') {\n errors.push(`Missing object properties in ${path.join('.')} schema.`);\n } else {\n Object.keys(schema.properties).forEach((propName) => {\n checkValidSchema(schema.properties[propName], errors, [...path, propName]);\n });\n }\n }\n\n if (schema.type === 'array') {\n // We check this both before items is turned into additionalItems and after,\n // so we need to account for it being both an object and an array.\n if (Array.isArray(schema.items)) {\n if (!schema.additionalItems) {\n errors.push(`${path.join('.')} should contain additionalItems when items is an array.`);\n }\n schema.items.forEach((item, index) => {\n checkValidSchema(item, errors, [...path, 'items', index]);\n });\n } else if (typeof schema.items === 'object') {\n if (schema.additionalItems) {\n errors.push(`${path.join('.')} should not contain additionalItems when items is an object.`);\n }\n checkValidSchema(schema.items, errors, [...path, 'items']);\n } else {\n errors.push(`Missing items schema in ${path.join('.')}.`);\n }\n\n // Check additionalItems\n if (schema.additionalItems) {\n checkValidSchema(schema.additionalItems, errors, [...path, 'additionalItems']);\n }\n }\n\n // We’ve recursed all the way back down to ['root']; throw an error containing\n // all the error messages.\n if (path.length === 1 && errors.length > 0) {\n // console.log(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')} -- ${path.join('.')}`);\n throw new Error(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')}`);\n } else {\n return true;\n }\n}\n\nexport function setArrayRecordTouched(prefix, index) {\n return { [`${prefix}_${index}`]: true };\n}\n\nexport function createUSAStateLabels(states) {\n return states.USA.reduce((current, { label, value }) => {\n return _.merge(current, { [value]: label });\n }, {});\n}\n\n/*\n * Take a list of pages and create versions of them\n * for each item in an array\n */\nfunction generateArrayPages(arrayPages, data) {\n const items = _.get(arrayPages[0].arrayPath, data) || [];\n return items\n .reduce((pages, item, index) =>\n pages.concat(arrayPages.map(page =>\n _.assign(page, {\n path: page.path.replace(':index', index),\n index\n })\n )),\n []\n )\n // doing this after the map so that we don’t change indexes\n .filter(page => !page.itemFilter || page.itemFilter(items[page.index]));\n}\n\n/*\n * We want to generate the pages we need for each item in the array\n * being used by an array page. We also want to group those pages by item.\n * So, this grabs contiguous sections of array pages and at the end generates\n * the right number of pages based on the items in the array\n */\nexport function expandArrayPages(pageList, data) {\n const result = pageList.reduce((acc, nextPage) => {\n const { lastArrayPath, arrayPages, currentList } = acc;\n // If we see an array page and we’re starting a section or in the middle of one, just add it\n // to the temporary array\n if (nextPage.showPagePerItem && (!lastArrayPath || nextPage.arrayPath === lastArrayPath)) {\n arrayPages.push(nextPage);\n return acc;\n // Now we’ve hit the end of a section of array pages using the same array, so\n // actually generate the pages now\n } else if (nextPage.arrayPath !== lastArrayPath && !!arrayPages.length) {\n const newList = currentList.concat(generateArrayPages(arrayPages, data), nextPage);\n return _.assign(acc, {\n lastArrayPath: null,\n arrayPages: [],\n currentList: newList\n });\n }\n\n return _.set('currentList', currentList.concat(nextPage), acc);\n }, { lastArrayPath: null, arrayPages: [], currentList: [] });\n\n if (result.arrayPages.length > 0) {\n return result.currentList.concat(generateArrayPages(result.arrayPages, data));\n }\n\n return result.currentList;\n}\n\n/**\n * Gets active and expanded pages, in the correct order\n *\n * Any `showPagePerItem` pages are expanded to create items for each array item.\n * We update the `path` for each of those pages to replace `:index` with the current item index.\n *\n * @param pages {Array} List of page configs\n * @param data {Object} Current form data\n * @returns {Array} A list of pages, includeing individual array\n * pages that are active\n */\nexport function getActiveExpandedPages(pages, data) {\n const expandedPages = expandArrayPages(pages, data);\n return getActivePages(expandedPages, data);\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 expandedPageList = getActiveExpandedPages(pages, 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 expandedPageList = getActiveExpandedPages(pageList, 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"]} \ No newline at end of file diff --git a/lib/js/review/ReviewChapters.js b/lib/js/review/ReviewChapters.js index 0481054..68d4c2c 100644 --- a/lib/js/review/ReviewChapters.js +++ b/lib/js/review/ReviewChapters.js @@ -184,8 +184,7 @@ function mapStateToProps(state, ownProps) { var chapters = chapterNames.map(function (chapterName) { var pages = pagesByChapter[chapterName]; - var expandedPages = (0, _helpers.expandArrayPages)(pages, formData); - expandedPages = (0, _helpers.getActivePages)(expandedPages, formData); + var expandedPages = (0, _helpers.getActiveExpandedPages)(pages, formData); var chapterFormConfig = formConfig.chapters[chapterName]; var open = openChapters.includes(chapterName); var pageKeys = (0, _helpers.getPageKeys)(pages, formData); diff --git a/lib/js/review/ReviewChapters.js.map b/lib/js/review/ReviewChapters.js.map index e86fac0..dd80ef8 100644 --- a/lib/js/review/ReviewChapters.js.map +++ b/lib/js/review/ReviewChapters.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/review/ReviewChapters.jsx"],"names":["mapStateToProps","scroller","Scroll","ReviewChapters","props","formData","pageList","viewedPages","Set","setViewedPages","name","open","pageKeys","closeReviewChapter","openReviewChapter","scrollToChapter","chapters","form","formContext","setValid","map","chapter","expandedPages","formConfig","handleEdit","handleSetData","showUnviewedPageWarning","handleToggleChapter","uploadFile","React","Component","chapterKey","scrollTo","window","Forms","scroll","duration","delay","smooth","pageKey","editing","index","fullPageKey","setEditMode","setData","onSetData","state","ownProps","data","openChapters","chapterNames","pagesByChapter","pages","chapterName","chapterFormConfig","includes","some","has","key","mapDispatchToProps","propTypes","PropTypes","array","isRequired","func","object"],"mappings":"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","file":"ReviewChapters.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport Scroll from 'react-scroll';\n\nimport ReviewCollapsibleChapter from './ReviewCollapsibleChapter';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActiveChapters,\n getActivePages,\n getPageKeys\n} from '../helpers';\nimport {\n getReviewPageOpenChapters,\n getViewedPages\n} from '../state/selectors';\nimport {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n} from '../actions';\n\n\nconst scroller = Scroll.scroller;\nclass ReviewChapters extends React.Component {\n\n componentDidMount() {\n const {\n formData,\n pageList\n } = this.props;\n const viewedPages = new Set(getPageKeys(pageList, formData));\n this.props.setViewedPages(viewedPages);\n }\n\n handleToggleChapter({ name, open, pageKeys }) {\n if (open) {\n this.props.closeReviewChapter(name, pageKeys);\n } else {\n this.props.openReviewChapter(name);\n this.scrollToChapter(name);\n }\n }\n\n scrollToChapter = (chapterKey) => {\n scroller.scrollTo(`chapter${chapterKey}ScrollElement`, window.Forms.scroll || {\n duration: 500,\n delay: 2,\n smooth: true,\n });\n }\n\n handleEdit = (pageKey, editing, index = null) => {\n const fullPageKey = `${pageKey}${index === null ? '' : index}`;\n if (editing) {\n this.props.setViewedPages([fullPageKey]);\n }\n this.props.setEditMode(pageKey, editing, index);\n }\n\n handleSetData = (...args) => {\n this.props.setData(...args);\n if (this.props.onSetData) {\n this.props.onSetData();\n }\n }\n\n render() {\n const {\n chapters,\n form,\n formContext,\n setValid, viewedPages\n } = this.props;\n\n return (\n
\n
\n {chapters.map(chapter => (\n this.handleSetData(...args)}\n setValid={setValid}\n showUnviewedPageWarning={chapter.showUnviewedPageWarning}\n toggleButtonClicked={() => this.handleToggleChapter(chapter)}\n uploadFile={this.props.uploadFile}\n viewedPages={viewedPages}/>\n ))}\n
\n
\n );\n }\n}\n\nexport function mapStateToProps(state, ownProps) {\n // from ownprops\n const {\n formConfig,\n formContext,\n pageList\n } = ownProps;\n\n // from redux state\n const form = state.form;\n const formData = state.form.data;\n const openChapters = getReviewPageOpenChapters(state);\n const viewedPages = getViewedPages(state);\n\n const chapterNames = getActiveChapters(formConfig, formData);\n const pagesByChapter = createPageListByChapter(formConfig);\n const chapters = chapterNames.map(chapterName => {\n const pages = pagesByChapter[chapterName];\n\n let expandedPages = expandArrayPages(pages, formData);\n expandedPages = getActivePages(expandedPages, formData);\n const chapterFormConfig = formConfig.chapters[chapterName];\n const open = openChapters.includes(chapterName);\n const pageKeys = getPageKeys(pages, formData);\n const showUnviewedPageWarning = pageKeys.some(key => !viewedPages.has(key));\n\n return {\n expandedPages,\n formConfig: chapterFormConfig,\n name: chapterName,\n open,\n pageKeys,\n showUnviewedPageWarning\n };\n });\n\n return {\n chapters,\n form,\n formData,\n formConfig,\n formContext,\n pageList,\n viewedPages\n };\n}\n\nconst mapDispatchToProps = {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n};\n\nReviewChapters.propTypes = {\n chapters: PropTypes.array.isRequired,\n closeReviewChapter: PropTypes.func.isRequired,\n form: PropTypes.object.isRequired,\n formData: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n formContext: PropTypes.object,\n onSetData: PropTypes.func,\n openReviewChapter: PropTypes.func.isRequired,\n pageList: PropTypes.array.isRequired,\n setData: PropTypes.func.isRequired,\n setEditMode: PropTypes.func.isRequired,\n setViewedPages: PropTypes.func.isRequired,\n uploadFile: PropTypes.func.isRequired,\n viewedPages: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ReviewChapters));\n\n// for tests\nexport { ReviewChapters };\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/review/ReviewChapters.jsx"],"names":["mapStateToProps","scroller","Scroll","ReviewChapters","props","formData","pageList","viewedPages","Set","setViewedPages","name","open","pageKeys","closeReviewChapter","openReviewChapter","scrollToChapter","chapters","form","formContext","setValid","map","chapter","expandedPages","formConfig","handleEdit","handleSetData","showUnviewedPageWarning","handleToggleChapter","uploadFile","React","Component","chapterKey","scrollTo","window","Forms","scroll","duration","delay","smooth","pageKey","editing","index","fullPageKey","setEditMode","setData","onSetData","state","ownProps","data","openChapters","chapterNames","pagesByChapter","pages","chapterName","chapterFormConfig","includes","some","has","key","mapDispatchToProps","propTypes","PropTypes","array","isRequired","func","object"],"mappings":"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","file":"ReviewChapters.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport Scroll from 'react-scroll';\n\nimport ReviewCollapsibleChapter from './ReviewCollapsibleChapter';\nimport {\n createPageListByChapter,\n getActiveExpandedPages,\n getActiveChapters,\n getPageKeys\n} from '../helpers';\nimport {\n getReviewPageOpenChapters,\n getViewedPages\n} from '../state/selectors';\nimport {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n} from '../actions';\n\n\nconst scroller = Scroll.scroller;\nclass ReviewChapters extends React.Component {\n\n componentDidMount() {\n const {\n formData,\n pageList\n } = this.props;\n const viewedPages = new Set(getPageKeys(pageList, formData));\n this.props.setViewedPages(viewedPages);\n }\n\n handleToggleChapter({ name, open, pageKeys }) {\n if (open) {\n this.props.closeReviewChapter(name, pageKeys);\n } else {\n this.props.openReviewChapter(name);\n this.scrollToChapter(name);\n }\n }\n\n scrollToChapter = (chapterKey) => {\n scroller.scrollTo(`chapter${chapterKey}ScrollElement`, window.Forms.scroll || {\n duration: 500,\n delay: 2,\n smooth: true,\n });\n }\n\n handleEdit = (pageKey, editing, index = null) => {\n const fullPageKey = `${pageKey}${index === null ? '' : index}`;\n if (editing) {\n this.props.setViewedPages([fullPageKey]);\n }\n this.props.setEditMode(pageKey, editing, index);\n }\n\n handleSetData = (...args) => {\n this.props.setData(...args);\n if (this.props.onSetData) {\n this.props.onSetData();\n }\n }\n\n render() {\n const {\n chapters,\n form,\n formContext,\n setValid, viewedPages\n } = this.props;\n\n return (\n
\n
\n {chapters.map(chapter => (\n this.handleSetData(...args)}\n setValid={setValid}\n showUnviewedPageWarning={chapter.showUnviewedPageWarning}\n toggleButtonClicked={() => this.handleToggleChapter(chapter)}\n uploadFile={this.props.uploadFile}\n viewedPages={viewedPages}/>\n ))}\n
\n
\n );\n }\n}\n\nexport function mapStateToProps(state, ownProps) {\n // from ownprops\n const {\n formConfig,\n formContext,\n pageList\n } = ownProps;\n\n // from redux state\n const form = state.form;\n const formData = state.form.data;\n const openChapters = getReviewPageOpenChapters(state);\n const viewedPages = getViewedPages(state);\n\n const chapterNames = getActiveChapters(formConfig, formData);\n const pagesByChapter = createPageListByChapter(formConfig);\n const chapters = chapterNames.map(chapterName => {\n const pages = pagesByChapter[chapterName];\n\n const expandedPages = getActiveExpandedPages(pages, formData);\n const chapterFormConfig = formConfig.chapters[chapterName];\n const open = openChapters.includes(chapterName);\n const pageKeys = getPageKeys(pages, formData);\n const showUnviewedPageWarning = pageKeys.some(key => !viewedPages.has(key));\n\n return {\n expandedPages,\n formConfig: chapterFormConfig,\n name: chapterName,\n open,\n pageKeys,\n showUnviewedPageWarning\n };\n });\n\n return {\n chapters,\n form,\n formData,\n formConfig,\n formContext,\n pageList,\n viewedPages\n };\n}\n\nconst mapDispatchToProps = {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n};\n\nReviewChapters.propTypes = {\n chapters: PropTypes.array.isRequired,\n closeReviewChapter: PropTypes.func.isRequired,\n form: PropTypes.object.isRequired,\n formData: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n formContext: PropTypes.object,\n onSetData: PropTypes.func,\n openReviewChapter: PropTypes.func.isRequired,\n pageList: PropTypes.array.isRequired,\n setData: PropTypes.func.isRequired,\n setEditMode: PropTypes.func.isRequired,\n setViewedPages: PropTypes.func.isRequired,\n uploadFile: PropTypes.func.isRequired,\n viewedPages: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ReviewChapters));\n\n// for tests\nexport { ReviewChapters };\n"]} \ No newline at end of file diff --git a/lib/js/review/SubmitController.js b/lib/js/review/SubmitController.js index 6995a75..753366c 100644 --- a/lib/js/review/SubmitController.js +++ b/lib/js/review/SubmitController.js @@ -69,8 +69,7 @@ var SubmitController = function (_React$Component) { router = _this$props.router; - var eligiblePageList = (0, _helpers.getActivePages)(pageList, form.data); - var expandedPageList = (0, _helpers.expandArrayPages)(eligiblePageList, _this.props.form.data); + var expandedPageList = (0, _helpers.getActiveExpandedPages)(pageList, form.data); // TODO: Fix this bug that assumes there is a confirmation page. // Actually, it assumes the app also doesn't add routes at the end! diff --git a/lib/js/review/SubmitController.js.map b/lib/js/review/SubmitController.js.map index e076402..8b897d8 100644 --- a/lib/js/review/SubmitController.js.map +++ b/lib/js/review/SubmitController.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","eligiblePageList","data","expandedPageList","push","length","path","handleSubmit","pagesByChapter","preSubmit","setSubmission","isValid","errors","recordEvent","console","log","bind","event","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n expandArrayPages,\n getActivePages\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const eligiblePageList = getActivePages(pageList, form.data);\n const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent :\n console.log.bind(console); // eslint-disable-line no-console\n\n recordEvent({ event: 'validation-failed-on-submit', errors });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/review/SubmitController.jsx"],"names":["SubmitController","getPreSubmit","required","field","label","error","formConfig","preSubmitInfo","goBack","props","form","pageList","router","expandedPageList","data","push","length","path","handleSubmit","pagesByChapter","preSubmit","setSubmission","isValid","errors","recordEvent","console","log","bind","event","submitForm","nextProps","nextStatus","submission","status","previousStatus","newRoute","urlPrefix","showPreSubmitError","renderErrorMessage","setPreSubmit","target","value","React","Component","mapStateToProps","state","ownProps","hasAttemptedSubmit","mapDispatchToProps","propTypes","PropTypes","object","isRequired","array","func"],"mappings":"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","file":"SubmitController.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\n\nimport SubmitButtons from './SubmitButtons';\nimport { PreSubmitSection } from '../components/PreSubmitSection';\nimport { isValidForm } from '../validation';\nimport {\n createPageListByChapter,\n getActiveExpandedPages\n} from '../helpers';\nimport {\n setPreSubmit,\n setSubmission,\n submitForm\n} from '../actions';\n\nclass SubmitController extends React.Component {\n\n componentWillReceiveProps(nextProps) {\n const nextStatus = nextProps.form.submission.status;\n const previousStatus = this.props.form.submission.status;\n if (nextStatus !== previousStatus && nextStatus === 'applicationSubmitted') {\n const newRoute = `${nextProps.formConfig.urlPrefix}confirmation`;\n this.props.router.push(newRoute);\n }\n }\n\n getPreSubmit = formConfig => {\n return {\n required: false,\n field: 'AGREED',\n label: 'I agree to the terms and conditions.',\n error: 'You must accept the agreement before submitting.',\n ...formConfig.preSubmitInfo\n };\n }\n\n goBack = () => {\n const {\n form,\n pageList,\n router\n } = this.props;\n\n const expandedPageList = getActiveExpandedPages(pageList, form.data);\n\n // TODO: Fix this bug that assumes there is a confirmation page.\n // Actually, it assumes the app also doesn't add routes at the end!\n // A component at this level should not need to know these things!\n router.push(expandedPageList[expandedPageList.length - 2].path);\n }\n\n handleSubmit = () => {\n const {\n form,\n formConfig,\n pagesByChapter\n } = this.props;\n\n // If a pre-submit agreement is required, make sure it was accepted\n const preSubmit = this.getPreSubmit(formConfig);\n if (preSubmit.required && !form.data[preSubmit.field]) {\n this.props.setSubmission('hasAttemptedSubmit', true);\n // is displaying an error for this case\n return;\n }\n\n // Validation errors in this situation are not visible, so we’d\n // like to know if they’re common\n const { isValid, errors } = isValidForm(form, pagesByChapter);\n if (!isValid) {\n const recordEvent = formConfig.recordEvent ?\n formConfig.recordEvent :\n console.log.bind(console); // eslint-disable-line no-console\n\n recordEvent({ event: 'validation-failed-on-submit', errors });\n this.props.setSubmission('status', 'validationError');\n this.props.setSubmission('hasAttemptedSubmit', true);\n return;\n }\n\n // User accepted if required, and no errors, so submit\n this.props.submitForm(formConfig, form);\n }\n\n render() {\n const {\n form,\n formConfig,\n showPreSubmitError,\n renderErrorMessage\n } = this.props;\n const preSubmit = this.getPreSubmit(formConfig);\n\n return (\n
\n this.props.setPreSubmit(preSubmit.field, event.target.value)}\n checked={form.data[preSubmit.field]}\n showError={showPreSubmitError}/>\n \n
\n );\n }\n}\n\nfunction mapStateToProps(state, ownProps) {\n const {\n formConfig,\n pageList,\n renderErrorMessage\n } = ownProps;\n const router = ownProps.router;\n\n const form = state.form;\n const pagesByChapter = createPageListByChapter(formConfig);\n const submission = form.submission;\n const showPreSubmitError = submission.hasAttemptedSubmit;\n\n return {\n form,\n formConfig,\n pagesByChapter,\n pageList,\n renderErrorMessage,\n router,\n submission,\n showPreSubmitError\n };\n}\n\nconst mapDispatchToProps = {\n setPreSubmit,\n setSubmission,\n submitForm\n};\n\nSubmitController.propTypes = {\n form: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n pagesByChapter: PropTypes.object.isRequired,\n pageList: PropTypes.array.isRequired,\n renderErrorMessage: PropTypes.func,\n router: PropTypes.object.isRequired,\n setPreSubmit: PropTypes.func.isRequired,\n setSubmission: PropTypes.func.isRequired,\n submitForm: PropTypes.func.isRequired,\n submission: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(SubmitController));\n\n// for tests\nexport { SubmitController };\n"]} \ No newline at end of file diff --git a/lib/js/routing.js b/lib/js/routing.js index 5caacea..f7ebe40 100644 --- a/lib/js/routing.js +++ b/lib/js/routing.js @@ -20,10 +20,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de * their dependencies and therefore should be skipped. */ function getEligiblePages(pageList, data, pathname) { - // Any `showPagePerItem` pages are expanded to create items for each array item. - // We update the `path` for each of those pages to replace `:index` with the current item index. - var expandedPageList = (0, _helpers.expandArrayPages)(pageList, data); - var eligiblePageList = (0, _helpers.getActivePages)(expandedPageList, data); + var eligiblePageList = (0, _helpers.getActiveExpandedPages)(pageList, data); var pageIndex = (0, _findIndex3.default)(function (item) { return item.path === pathname; }, eligiblePageList); diff --git a/lib/js/routing.js.map b/lib/js/routing.js.map index c15e4d6..5d96a65 100644 --- a/lib/js/routing.js.map +++ b/lib/js/routing.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/js/routing.js"],"names":["getNextPagePath","getPreviousPagePath","getEligiblePages","pageList","data","pathname","expandedPageList","eligiblePageList","pageIndex","item","path","pages","page"],"mappings":";;;;;;;;;;QAgBgBA,e,GAAAA,e;QAKAC,mB,GAAAA,mB;;AApBhB;;;;AAEA;;;;AAIA,SAASC,gBAAT,CAA0BC,QAA1B,EAAoCC,IAApC,EAA0CC,QAA1C,EAAoD;AAClD;AACA;AACA,MAAMC,mBAAmB,+BAAiBH,QAAjB,EAA2BC,IAA3B,CAAzB;AACA,MAAMG,mBAAmB,6BAAeD,gBAAf,EAAiCF,IAAjC,CAAzB;AACA,MAAMI,YAAY,yBAAY;AAAA,WAAQC,KAAKC,IAAL,KAAcL,QAAtB;AAAA,GAAZ,EAA4CE,gBAA5C,CAAlB;AACA,SAAO,EAAEI,OAAOJ,gBAAT,EAA2BC,oBAA3B,EAAP;AACD;;AAEM,SAASR,eAAT,CAAyBG,QAAzB,EAAmCC,IAAnC,EAAyCC,QAAzC,EAAmD;AAAA,0BAC3BH,iBAAiBC,QAAjB,EAA2BC,IAA3B,EAAiCC,QAAjC,CAD2B;AAAA,MAChDM,KADgD,qBAChDA,KADgD;AAAA,MACzCH,SADyC,qBACzCA,SADyC;;AAExD,SAAOG,MAAMH,YAAY,CAAlB,EAAqBE,IAA5B;AACD;;AAEM,SAAST,mBAAT,CAA6BE,QAA7B,EAAuCC,IAAvC,EAA6CC,QAA7C,EAAuD;AAAA,2BAC/BH,iBAAiBC,QAAjB,EAA2BC,IAA3B,EAAiCC,QAAjC,CAD+B;AAAA,MACpDM,KADoD,sBACpDA,KADoD;AAAA,MAC7CH,SAD6C,sBAC7CA,SAD6C;AAE5D;AACA;;;AACA,MAAMI,OAAOJ,aAAa,CAAb,GAAiBA,YAAY,CAA7B,GAAiC,CAA9C;AACA,SAAOG,MAAMC,IAAN,EAAYF,IAAnB;AACD","file":"routing.js","sourcesContent":["import _ from 'lodash/fp';\nimport { expandArrayPages, getActivePages } from './helpers';\n\n/*\n * Returns the page list without conditional pages that have not satisfied\n * their dependencies and therefore should be skipped.\n */\nfunction getEligiblePages(pageList, data, pathname) {\n // Any `showPagePerItem` pages are expanded to create items for each array item.\n // We update the `path` for each of those pages to replace `:index` with the current item index.\n const expandedPageList = expandArrayPages(pageList, data);\n const eligiblePageList = getActivePages(expandedPageList, data);\n const pageIndex = _.findIndex(item => item.path === pathname, eligiblePageList);\n return { pages: eligiblePageList, pageIndex };\n}\n\nexport function getNextPagePath(pageList, data, pathname) {\n const { pages, pageIndex } = getEligiblePages(pageList, data, pathname);\n return pages[pageIndex + 1].path;\n}\n\nexport function getPreviousPagePath(pageList, data, pathname) {\n const { pages, pageIndex } = getEligiblePages(pageList, data, pathname);\n // if we found the current page, go to previous one\n // if not, go back to the beginning because they shouldn’t be here\n const page = pageIndex >= 0 ? pageIndex - 1 : 0;\n return pages[page].path;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../src/js/routing.js"],"names":["getNextPagePath","getPreviousPagePath","getEligiblePages","pageList","data","pathname","eligiblePageList","pageIndex","item","path","pages","page"],"mappings":";;;;;;;;;;QAagBA,e,GAAAA,e;QAKAC,mB,GAAAA,mB;;AAjBhB;;;;AAEA;;;;AAIA,SAASC,gBAAT,CAA0BC,QAA1B,EAAoCC,IAApC,EAA0CC,QAA1C,EAAoD;AAClD,MAAMC,mBAAmB,qCAAuBH,QAAvB,EAAiCC,IAAjC,CAAzB;AACA,MAAMG,YAAY,yBAAY;AAAA,WAAQC,KAAKC,IAAL,KAAcJ,QAAtB;AAAA,GAAZ,EAA4CC,gBAA5C,CAAlB;AACA,SAAO,EAAEI,OAAOJ,gBAAT,EAA2BC,oBAA3B,EAAP;AACD;;AAEM,SAASP,eAAT,CAAyBG,QAAzB,EAAmCC,IAAnC,EAAyCC,QAAzC,EAAmD;AAAA,0BAC3BH,iBAAiBC,QAAjB,EAA2BC,IAA3B,EAAiCC,QAAjC,CAD2B;AAAA,MAChDK,KADgD,qBAChDA,KADgD;AAAA,MACzCH,SADyC,qBACzCA,SADyC;;AAExD,SAAOG,MAAMH,YAAY,CAAlB,EAAqBE,IAA5B;AACD;;AAEM,SAASR,mBAAT,CAA6BE,QAA7B,EAAuCC,IAAvC,EAA6CC,QAA7C,EAAuD;AAAA,2BAC/BH,iBAAiBC,QAAjB,EAA2BC,IAA3B,EAAiCC,QAAjC,CAD+B;AAAA,MACpDK,KADoD,sBACpDA,KADoD;AAAA,MAC7CH,SAD6C,sBAC7CA,SAD6C;AAE5D;AACA;;;AACA,MAAMI,OAAOJ,aAAa,CAAb,GAAiBA,YAAY,CAA7B,GAAiC,CAA9C;AACA,SAAOG,MAAMC,IAAN,EAAYF,IAAnB;AACD","file":"routing.js","sourcesContent":["import _ from 'lodash/fp';\nimport { getActiveExpandedPages } from './helpers';\n\n/*\n * Returns the page list without conditional pages that have not satisfied\n * their dependencies and therefore should be skipped.\n */\nfunction getEligiblePages(pageList, data, pathname) {\n const eligiblePageList = getActiveExpandedPages(pageList, data);\n const pageIndex = _.findIndex(item => item.path === pathname, eligiblePageList);\n return { pages: eligiblePageList, pageIndex };\n}\n\nexport function getNextPagePath(pageList, data, pathname) {\n const { pages, pageIndex } = getEligiblePages(pageList, data, pathname);\n return pages[pageIndex + 1].path;\n}\n\nexport function getPreviousPagePath(pageList, data, pathname) {\n const { pages, pageIndex } = getEligiblePages(pageList, data, pathname);\n // if we found the current page, go to previous one\n // if not, go back to the beginning because they shouldn’t be here\n const page = pageIndex >= 0 ? pageIndex - 1 : 0;\n return pages[page].path;\n}\n"]} \ No newline at end of file diff --git a/src/js/helpers.js b/src/js/helpers.js index b207c6b..c4d2565 100644 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -523,6 +523,22 @@ export function expandArrayPages(pageList, data) { return result.currentList; } +/** + * Gets active and expanded pages, in the correct order + * + * Any `showPagePerItem` pages are expanded to create items for each array item. + * We update the `path` for each of those pages to replace `:index` with the current item index. + * + * @param pages {Array} List of page configs + * @param data {Object} Current form data + * @returns {Array} A list of pages, includeing individual array + * pages that are active + */ +export function getActiveExpandedPages(pages, data) { + const expandedPages = expandArrayPages(pages, data); + return getActivePages(expandedPages, data); +} + /** * getPageKeys returns a list of keys for the currently active pages * @@ -532,8 +548,7 @@ export function expandArrayPages(pageList, data) { * and the index if it’s a pagePerItem page */ export function getPageKeys(pages, formData) { - const eligiblePageList = getActivePages(pages, formData); - const expandedPageList = expandArrayPages(eligiblePageList, formData); + const expandedPageList = getActiveExpandedPages(pages, formData); return expandedPageList.map(page => { let pageKey = page.pageKey; @@ -554,8 +569,7 @@ export function getPageKeys(pages, formData) { export function getActiveChapters(formConfig, formData) { const formPages = createFormPageList(formConfig); const pageList = createPageList(formConfig, formPages); - const eligiblePageList = getActivePages(pageList, formData); - const expandedPageList = expandArrayPages(eligiblePageList, formData); + const expandedPageList = getActiveExpandedPages(pageList, formData); return _.uniq(expandedPageList.map(p => p.chapterKey).filter(key => !!key && key !== 'review')); } @@ -578,3 +592,4 @@ export function omitRequired(schema) { return newSchema; } + diff --git a/src/js/review/ReviewChapters.jsx b/src/js/review/ReviewChapters.jsx index 347efe5..ce45cd7 100644 --- a/src/js/review/ReviewChapters.jsx +++ b/src/js/review/ReviewChapters.jsx @@ -7,9 +7,8 @@ import Scroll from 'react-scroll'; import ReviewCollapsibleChapter from './ReviewCollapsibleChapter'; import { createPageListByChapter, - expandArrayPages, + getActiveExpandedPages, getActiveChapters, - getActivePages, getPageKeys } from '../helpers'; import { @@ -124,8 +123,7 @@ export function mapStateToProps(state, ownProps) { const chapters = chapterNames.map(chapterName => { const pages = pagesByChapter[chapterName]; - let expandedPages = expandArrayPages(pages, formData); - expandedPages = getActivePages(expandedPages, formData); + const expandedPages = getActiveExpandedPages(pages, formData); const chapterFormConfig = formConfig.chapters[chapterName]; const open = openChapters.includes(chapterName); const pageKeys = getPageKeys(pages, formData); diff --git a/src/js/review/SubmitController.jsx b/src/js/review/SubmitController.jsx index 9d2c77c..7b5242f 100644 --- a/src/js/review/SubmitController.jsx +++ b/src/js/review/SubmitController.jsx @@ -8,8 +8,7 @@ import { PreSubmitSection } from '../components/PreSubmitSection'; import { isValidForm } from '../validation'; import { createPageListByChapter, - expandArrayPages, - getActivePages + getActiveExpandedPages } from '../helpers'; import { setPreSubmit, @@ -45,8 +44,7 @@ class SubmitController extends React.Component { router } = this.props; - const eligiblePageList = getActivePages(pageList, form.data); - const expandedPageList = expandArrayPages(eligiblePageList, this.props.form.data); + const expandedPageList = getActiveExpandedPages(pageList, form.data); // TODO: Fix this bug that assumes there is a confirmation page. // Actually, it assumes the app also doesn't add routes at the end! diff --git a/src/js/routing.js b/src/js/routing.js index 92946bf..725ebcd 100644 --- a/src/js/routing.js +++ b/src/js/routing.js @@ -1,15 +1,12 @@ import _ from 'lodash/fp'; -import { expandArrayPages, getActivePages } from './helpers'; +import { getActiveExpandedPages } from './helpers'; /* * Returns the page list without conditional pages that have not satisfied * their dependencies and therefore should be skipped. */ function getEligiblePages(pageList, data, pathname) { - // Any `showPagePerItem` pages are expanded to create items for each array item. - // We update the `path` for each of those pages to replace `:index` with the current item index. - const expandedPageList = expandArrayPages(pageList, data); - const eligiblePageList = getActivePages(expandedPageList, data); + const eligiblePageList = getActiveExpandedPages(pageList, data); const pageIndex = _.findIndex(item => item.path === pathname, eligiblePageList); return { pages: eligiblePageList, pageIndex }; } From e9993960398192da5812ad9918b00a9e17f06fe1 Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Fri, 14 Sep 2018 14:28:26 -0400 Subject: [PATCH 5/9] Fix typo --- src/js/helpers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/helpers.js b/src/js/helpers.js index c4d2565..6e46c53 100644 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -531,7 +531,7 @@ export function expandArrayPages(pageList, data) { * * @param pages {Array} List of page configs * @param data {Object} Current form data - * @returns {Array} A list of pages, includeing individual array + * @returns {Array} A list of pages, including individual array * pages that are active */ export function getActiveExpandedPages(pages, data) { From ccd28fa0ef71c8d35b25ad8a28e1eec8007323b2 Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Fri, 14 Sep 2018 14:30:06 -0400 Subject: [PATCH 6/9] Fix bad change --- src/js/review/ReviewChapters.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/js/review/ReviewChapters.jsx b/src/js/review/ReviewChapters.jsx index ce45cd7..c06e4d6 100644 --- a/src/js/review/ReviewChapters.jsx +++ b/src/js/review/ReviewChapters.jsx @@ -74,7 +74,8 @@ class ReviewChapters extends React.Component { chapters, form, formContext, - setValid, viewedPages + setValid, + viewedPages } = this.props; return ( From 4fb0362a2d8c7c9eccc0feeeffb8c0d92e1f934f Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Fri, 14 Sep 2018 14:30:33 -0400 Subject: [PATCH 7/9] Run prod build --- lib/js/helpers.js | 2 +- lib/js/helpers.js.map | 2 +- lib/js/review/ReviewChapters.js.map | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/js/helpers.js b/lib/js/helpers.js index 0796b7e..9406db0 100644 --- a/lib/js/helpers.js +++ b/lib/js/helpers.js @@ -635,7 +635,7 @@ function expandArrayPages(pageList, data) { * * @param pages {Array} List of page configs * @param data {Object} Current form data - * @returns {Array} A list of pages, includeing individual array + * @returns {Array} A list of pages, including individual array * pages that are active */ function getActiveExpandedPages(pages, data) { diff --git a/lib/js/helpers.js.map b/lib/js/helpers.js.map index df78793..f46f189 100644 --- a/lib/js/helpers.js.map +++ b/lib/js/helpers.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/js/helpers.js"],"names":["isActivePage","getActivePages","getActiveProperties","getInactivePages","createFormPageList","createPageListByChapter","createPageList","createRoutes","formatISOPartialDate","formatReviewDate","parseISODate","filterViewFields","filterInactivePageData","stringifyFormReplacer","isInProgress","transformForSubmit","getArrayFields","hasFieldsOtherThanArray","getNonArraySchema","checkValidSchema","setArrayRecordTouched","createUSAStateLabels","expandArrayPages","getActiveExpandedPages","getPageKeys","getActiveChapters","omitRequired","page","data","depends","index","Array","isArray","some","condition","undefined","pages","filter","activePages","allProperties","forEach","schema","push","Object","keys","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","map","chapterKey","pageKey","concat","formPages","introduction","path","urlPrefix","routes","component","FormPage","pageConfig","ReviewPage","confirmation","onEnter","nextState","replace","formatDayMonth","val","dayOrMonth","toString","Number","length","formatYear","month","day","year","dateString","monthYear","split","newData","nextProp","field","newArray","item","startsWith","inactivePages","form","activeProperties","formData","currentData","prop","includes","key","value","country","street","city","postalCode","zipcode","fields","every","widget","id","confirmationCode","file","newValues","v","pathName","trimmedPathname","endsWith","replacer","withoutInactivePages","withoutViewFields","JSON","stringify","isHiddenField","findArrays","obj","ui","type","definitions","uiSchema","$ref","newProperties","current","next","newSchema","required","newRequired","pureWithDeepEquals","props","nextProps","errors","join","propName","items","additionalItems","Error","prefix","states","USA","label","generateArrayPages","arrayPages","arrayPath","itemFilter","result","acc","nextPage","lastArrayPath","currentList","showPagePerItem","newList","expandedPages","expandedPageList","p"],"mappings":"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","file":"helpers.js","sourcesContent":["import _ from 'lodash/fp';\nimport shouldUpdate from 'recompose/shouldUpdate';\nimport { deepEquals } from '@department-of-veterans-affairs/react-jsonschema-form/lib/utils';\n\nimport FormPage from './containers/FormPage';\nimport ReviewPage from './review/ReviewPage';\n\n// An active page is one that will be shown to the user.\n// Pages become inactive if they are conditionally shown based\n// on answers to previous questions.\nexport function isActivePage(page, data) {\n if (typeof page.depends === 'function') {\n return page.depends(data, page.index);\n }\n\n if (Array.isArray(page.depends)) {\n return page.depends.some(condition => _.matches(condition)(data));\n }\n\n return page.depends === undefined || _.matches(page.depends)(data);\n}\n\nexport function getActivePages(pages, data) {\n return pages.filter(page => isActivePage(page, data));\n}\n\nexport function getActiveProperties(activePages) {\n const allProperties = [];\n activePages.forEach(page => {\n if (page.schema) {\n allProperties.push(...Object.keys(page.schema.properties));\n }\n });\n return _.uniq(allProperties);\n}\n\nexport function getInactivePages(pages, data) {\n return pages.filter(page => !isActivePage(page, data));\n}\n\nexport function createFormPageList(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((pageList, chapter) => {\n const chapterTitle = formConfig.chapters[chapter].title;\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n chapterTitle,\n chapterKey: chapter,\n pageKey: page\n });\n });\n return pageList.concat(pages);\n }, []);\n}\n\nexport function createPageListByChapter(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((chapters, chapter) => {\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n pageKey: page,\n chapterKey: chapter\n });\n });\n return _.set(chapter, pages, chapters);\n }, {});\n}\n\nexport function createPageList(formConfig, formPages) {\n let pageList = formPages;\n if (formConfig.introduction) {\n pageList = [\n {\n pageKey: 'introduction',\n path: 'introduction'\n }\n ].concat(pageList);\n }\n\n return pageList\n .concat([\n {\n pageKey: 'review-and-submit',\n path: 'review-and-submit',\n chapterKey: 'review'\n }\n ])\n .map(page => {\n return _.set('path', `${formConfig.urlPrefix || ''}${page.path}`, page);\n });\n}\n\n/*\n * Create the routes based on a form config. This goes through each chapter in a form\n * config, pulls out the config for each page, then generates a list of Route components with the\n * config as props\n */\nexport function createRoutes(formConfig) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n let routes = formPages\n .map(page => {\n return {\n path: page.path,\n component: page.component || FormPage,\n pageConfig: page,\n pageList,\n urlPrefix: formConfig.urlPrefix\n };\n });\n if (formConfig.introduction) {\n routes = [\n {\n path: 'introduction',\n component: formConfig.introduction,\n formConfig,\n pageList\n }\n ].concat(routes);\n }\n\n return routes.concat([\n {\n path: 'review-and-submit',\n formConfig,\n component: ReviewPage,\n pageList\n },\n {\n path: 'confirmation',\n component: formConfig.confirmation\n },\n {\n path: '*',\n onEnter: (nextState, replace) => replace(formConfig.urlPrefix || '/')\n }\n ]);\n}\n\nfunction formatDayMonth(val) {\n if (val) {\n const dayOrMonth = val.toString();\n if (Number(dayOrMonth) && dayOrMonth.length === 1) {\n return `0${val}`;\n } else if (Number(dayOrMonth)) {\n return dayOrMonth;\n }\n }\n\n return 'XX';\n}\n\nfunction formatYear(val) {\n if (!val || !val.length) {\n return 'XXXX';\n }\n\n return val;\n}\n\nexport function formatISOPartialDate({ month, day, year }) {\n if (month || day || year) {\n return `${formatYear(year)}-${formatDayMonth(month)}-${formatDayMonth(day)}`;\n }\n\n return undefined;\n}\n\nexport function formatReviewDate(dateString, monthYear = false) {\n if (dateString) {\n const [year, month, day] = dateString.split('-', 3);\n\n return monthYear\n ? `${formatDayMonth(month)}/${formatYear(year)}`\n : `${formatDayMonth(month)}/${formatDayMonth(day)}/${formatYear(year)}`;\n }\n\n return undefined;\n}\nexport function parseISODate(dateString) {\n if (typeof dateString === 'string') {\n const [year, month, day] = dateString.split('-', 3);\n\n return {\n month: month === 'XX' ? '' : Number(month).toString(),\n day: day === 'XX' ? '' : Number(day).toString(),\n year: year === 'XXXX' ? '' : year\n };\n }\n\n return {\n month: '',\n day: '',\n year: ''\n };\n}\n\n/*\n * Removes 'view:' fields from data object\n */\nexport function filterViewFields(data) {\n return Object.keys(data).reduce((newData, nextProp) => {\n const field = data[nextProp];\n\n if (Array.isArray(field)) {\n const newArray = field.map((item) => filterViewFields(item));\n\n return _.set(nextProp, newArray, newData);\n }\n\n if (typeof field === 'object') {\n if (nextProp.startsWith('view:')) {\n return _.assign(newData, filterViewFields(field));\n }\n return _.set(nextProp, filterViewFields(field), newData);\n }\n\n if (!nextProp.startsWith('view:')) {\n return _.set(nextProp, field, newData);\n }\n\n return newData;\n }, {});\n}\n\nexport function filterInactivePageData(inactivePages, activePages, form) {\n const activeProperties = getActiveProperties(activePages);\n let newData;\n\n return inactivePages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n newData = currentData;\n if (!activeProperties.includes(prop)) {\n delete newData[prop];\n }\n return newData;\n }, formData);\n }, form.data);\n}\n\nexport function stringifyFormReplacer(key, value) {\n // an object with country is an address\n if (value && typeof value.country !== 'undefined' &&\n (!value.street || !value.city || (!value.postalCode && !value.zipcode))) {\n return undefined;\n }\n\n // clean up empty objects, which we have no reason to send\n if (typeof value === 'object') {\n const fields = Object.keys(value);\n if (fields.length === 0 || fields.every(field => value[field] === undefined)) {\n return undefined;\n }\n\n // autosuggest widgets save value and label info, but we should just return the value\n if (value.widget === 'autosuggest') {\n return value.id;\n }\n\n // Exclude file data\n if (value.confirmationCode && value.file) {\n return _.omit('file', value);\n }\n }\n\n // Clean up empty objects in arrays\n if (Array.isArray(value)) {\n const newValues = value.filter(v => !!stringifyFormReplacer(key, v));\n // If every item in the array is cleared, remove the whole array\n return newValues.length > 0 ? newValues : undefined;\n }\n\n return value;\n}\n\nexport function isInProgress(pathName) {\n const trimmedPathname = pathName.replace(/\\/$/, '');\n return !(\n trimmedPathname.endsWith('introduction')\n || trimmedPathname.endsWith('confirmation')\n || trimmedPathname.endsWith('form-saved')\n || trimmedPathname.endsWith('error')\n );\n}\n\n/*\n * Normal transform for schemaform data\n */\nexport function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) {\n const activePages = getActivePages(createFormPageList(formConfig), form.data);\n const inactivePages = getInactivePages(createFormPageList(formConfig), form.data);\n const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form);\n const withoutViewFields = filterViewFields(withoutInactivePages);\n\n return JSON.stringify(withoutViewFields, replacer) || '{}';\n}\n\nfunction isHiddenField(schema) {\n return !!schema['ui:collapsed'] || !!schema['ui:hidden'];\n}\n\n/*\n * Pull the array fields from a schema. Used to separate out array fields\n * from the rest of page to be displayed on the review page\n */\nexport function getArrayFields(data) {\n const fields = [];\n const findArrays = (obj, ui, path = []) => {\n if (obj.type === 'array' && !isHiddenField(obj) && !_.get('ui:options.keepInPageOnReview', ui)) {\n fields.push({\n path,\n schema: _.set('definitions', data.schema.definitions, obj),\n uiSchema: _.get(path, data.uiSchema) || data.uiSchema\n });\n }\n\n if (obj.type === 'object' && !isHiddenField(obj)) {\n Object.keys(obj.properties).forEach(prop => {\n findArrays(obj.properties[prop], ui[prop], path.concat(prop));\n });\n }\n };\n\n findArrays(data.schema, data.uiSchema);\n\n return fields;\n}\n\n/*\n * Checks to see if there are non array fields in a page schema, so that\n * we don’t show a blank page header on the review page if a page is just\n * a growable table\n */\nexport function hasFieldsOtherThanArray(schema) {\n if (schema.$ref || (schema.type !== 'object' && schema.type !== 'array')) {\n return true;\n }\n\n if (schema.type === 'object') {\n return Object.keys(schema.properties).some(nextProp => {\n return hasFieldsOtherThanArray(schema.properties[nextProp]);\n });\n }\n\n return false;\n}\n\n/*\n * Return a schema without array fields. If the schema has only array fields,\n * then return undefined (because there’s no reason to use an object schema with\n * no properties)\n */\nexport function getNonArraySchema(schema, uiSchema = {}) {\n if (schema.type === 'array' && !_.get('ui:options.keepInPageOnReview', uiSchema)) {\n return undefined;\n }\n\n if (schema.type === 'object') {\n const newProperties = Object.keys(schema.properties).reduce((current, next) => {\n const newSchema = getNonArraySchema(schema.properties[next], uiSchema[next]);\n\n if (typeof newSchema === 'undefined') {\n return _.unset(next, current);\n }\n\n if (newSchema !== schema.properties[next]) {\n return _.set(next, newSchema, current);\n }\n\n return current;\n }, schema.properties);\n\n if (Object.keys(newProperties).length === 0) {\n return undefined;\n }\n\n if (newProperties !== schema.properties) {\n let newSchema = _.set('properties', newProperties, schema);\n if (newSchema.required) {\n const newRequired = _.intersection(Object.keys(newSchema.properties), newSchema.required);\n if (newRequired.length !== newSchema.required.length) {\n newSchema = _.set('required', newRequired, newSchema);\n }\n }\n\n return newSchema;\n }\n }\n\n return schema;\n}\n\n\nexport const pureWithDeepEquals = shouldUpdate((props, nextProps) => {\n return !deepEquals(props, nextProps);\n});\n\n/**\n * Recursively checks to see if the schema is valid.\n *\n * Note: This only returns true. If the schema is invalid, an error is thrown to\n * stop everything.\n *\n * @param {Object} schema - The schema in question\n * @return {bool} - true if we succeed\n * @throws {Error} - If the schema is invalid\n */\nexport function checkValidSchema(schema, errors = [], path = ['root']) {\n if (typeof schema.type !== 'string') {\n errors.push(`Missing type in ${path.join('.')} schema.`);\n }\n\n if (schema.type === 'object') {\n if (typeof schema.properties !== 'object') {\n errors.push(`Missing object properties in ${path.join('.')} schema.`);\n } else {\n Object.keys(schema.properties).forEach((propName) => {\n checkValidSchema(schema.properties[propName], errors, [...path, propName]);\n });\n }\n }\n\n if (schema.type === 'array') {\n // We check this both before items is turned into additionalItems and after,\n // so we need to account for it being both an object and an array.\n if (Array.isArray(schema.items)) {\n if (!schema.additionalItems) {\n errors.push(`${path.join('.')} should contain additionalItems when items is an array.`);\n }\n schema.items.forEach((item, index) => {\n checkValidSchema(item, errors, [...path, 'items', index]);\n });\n } else if (typeof schema.items === 'object') {\n if (schema.additionalItems) {\n errors.push(`${path.join('.')} should not contain additionalItems when items is an object.`);\n }\n checkValidSchema(schema.items, errors, [...path, 'items']);\n } else {\n errors.push(`Missing items schema in ${path.join('.')}.`);\n }\n\n // Check additionalItems\n if (schema.additionalItems) {\n checkValidSchema(schema.additionalItems, errors, [...path, 'additionalItems']);\n }\n }\n\n // We’ve recursed all the way back down to ['root']; throw an error containing\n // all the error messages.\n if (path.length === 1 && errors.length > 0) {\n // console.log(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')} -- ${path.join('.')}`);\n throw new Error(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')}`);\n } else {\n return true;\n }\n}\n\nexport function setArrayRecordTouched(prefix, index) {\n return { [`${prefix}_${index}`]: true };\n}\n\nexport function createUSAStateLabels(states) {\n return states.USA.reduce((current, { label, value }) => {\n return _.merge(current, { [value]: label });\n }, {});\n}\n\n/*\n * Take a list of pages and create versions of them\n * for each item in an array\n */\nfunction generateArrayPages(arrayPages, data) {\n const items = _.get(arrayPages[0].arrayPath, data) || [];\n return items\n .reduce((pages, item, index) =>\n pages.concat(arrayPages.map(page =>\n _.assign(page, {\n path: page.path.replace(':index', index),\n index\n })\n )),\n []\n )\n // doing this after the map so that we don’t change indexes\n .filter(page => !page.itemFilter || page.itemFilter(items[page.index]));\n}\n\n/*\n * We want to generate the pages we need for each item in the array\n * being used by an array page. We also want to group those pages by item.\n * So, this grabs contiguous sections of array pages and at the end generates\n * the right number of pages based on the items in the array\n */\nexport function expandArrayPages(pageList, data) {\n const result = pageList.reduce((acc, nextPage) => {\n const { lastArrayPath, arrayPages, currentList } = acc;\n // If we see an array page and we’re starting a section or in the middle of one, just add it\n // to the temporary array\n if (nextPage.showPagePerItem && (!lastArrayPath || nextPage.arrayPath === lastArrayPath)) {\n arrayPages.push(nextPage);\n return acc;\n // Now we’ve hit the end of a section of array pages using the same array, so\n // actually generate the pages now\n } else if (nextPage.arrayPath !== lastArrayPath && !!arrayPages.length) {\n const newList = currentList.concat(generateArrayPages(arrayPages, data), nextPage);\n return _.assign(acc, {\n lastArrayPath: null,\n arrayPages: [],\n currentList: newList\n });\n }\n\n return _.set('currentList', currentList.concat(nextPage), acc);\n }, { lastArrayPath: null, arrayPages: [], currentList: [] });\n\n if (result.arrayPages.length > 0) {\n return result.currentList.concat(generateArrayPages(result.arrayPages, data));\n }\n\n return result.currentList;\n}\n\n/**\n * Gets active and expanded pages, in the correct order\n *\n * Any `showPagePerItem` pages are expanded to create items for each array item.\n * We update the `path` for each of those pages to replace `:index` with the current item index.\n *\n * @param pages {Array} List of page configs\n * @param data {Object} Current form data\n * @returns {Array} A list of pages, includeing individual array\n * pages that are active\n */\nexport function getActiveExpandedPages(pages, data) {\n const expandedPages = expandArrayPages(pages, data);\n return getActivePages(expandedPages, data);\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 expandedPageList = getActiveExpandedPages(pages, 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 expandedPageList = getActiveExpandedPages(pageList, 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"]} \ 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","getActiveExpandedPages","getPageKeys","getActiveChapters","omitRequired","page","data","depends","index","Array","isArray","some","condition","undefined","pages","filter","activePages","allProperties","forEach","schema","push","Object","keys","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","map","chapterKey","pageKey","concat","formPages","introduction","path","urlPrefix","routes","component","FormPage","pageConfig","ReviewPage","confirmation","onEnter","nextState","replace","formatDayMonth","val","dayOrMonth","toString","Number","length","formatYear","month","day","year","dateString","monthYear","split","newData","nextProp","field","newArray","item","startsWith","inactivePages","form","activeProperties","formData","currentData","prop","includes","key","value","country","street","city","postalCode","zipcode","fields","every","widget","id","confirmationCode","file","newValues","v","pathName","trimmedPathname","endsWith","replacer","withoutInactivePages","withoutViewFields","JSON","stringify","isHiddenField","findArrays","obj","ui","type","definitions","uiSchema","$ref","newProperties","current","next","newSchema","required","newRequired","pureWithDeepEquals","props","nextProps","errors","join","propName","items","additionalItems","Error","prefix","states","USA","label","generateArrayPages","arrayPages","arrayPath","itemFilter","result","acc","nextPage","lastArrayPath","currentList","showPagePerItem","newList","expandedPages","expandedPageList","p"],"mappings":"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","file":"helpers.js","sourcesContent":["import _ from 'lodash/fp';\nimport shouldUpdate from 'recompose/shouldUpdate';\nimport { deepEquals } from '@department-of-veterans-affairs/react-jsonschema-form/lib/utils';\n\nimport FormPage from './containers/FormPage';\nimport ReviewPage from './review/ReviewPage';\n\n// An active page is one that will be shown to the user.\n// Pages become inactive if they are conditionally shown based\n// on answers to previous questions.\nexport function isActivePage(page, data) {\n if (typeof page.depends === 'function') {\n return page.depends(data, page.index);\n }\n\n if (Array.isArray(page.depends)) {\n return page.depends.some(condition => _.matches(condition)(data));\n }\n\n return page.depends === undefined || _.matches(page.depends)(data);\n}\n\nexport function getActivePages(pages, data) {\n return pages.filter(page => isActivePage(page, data));\n}\n\nexport function getActiveProperties(activePages) {\n const allProperties = [];\n activePages.forEach(page => {\n if (page.schema) {\n allProperties.push(...Object.keys(page.schema.properties));\n }\n });\n return _.uniq(allProperties);\n}\n\nexport function getInactivePages(pages, data) {\n return pages.filter(page => !isActivePage(page, data));\n}\n\nexport function createFormPageList(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((pageList, chapter) => {\n const chapterTitle = formConfig.chapters[chapter].title;\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n chapterTitle,\n chapterKey: chapter,\n pageKey: page\n });\n });\n return pageList.concat(pages);\n }, []);\n}\n\nexport function createPageListByChapter(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((chapters, chapter) => {\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n pageKey: page,\n chapterKey: chapter\n });\n });\n return _.set(chapter, pages, chapters);\n }, {});\n}\n\nexport function createPageList(formConfig, formPages) {\n let pageList = formPages;\n if (formConfig.introduction) {\n pageList = [\n {\n pageKey: 'introduction',\n path: 'introduction'\n }\n ].concat(pageList);\n }\n\n return pageList\n .concat([\n {\n pageKey: 'review-and-submit',\n path: 'review-and-submit',\n chapterKey: 'review'\n }\n ])\n .map(page => {\n return _.set('path', `${formConfig.urlPrefix || ''}${page.path}`, page);\n });\n}\n\n/*\n * Create the routes based on a form config. This goes through each chapter in a form\n * config, pulls out the config for each page, then generates a list of Route components with the\n * config as props\n */\nexport function createRoutes(formConfig) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n let routes = formPages\n .map(page => {\n return {\n path: page.path,\n component: page.component || FormPage,\n pageConfig: page,\n pageList,\n urlPrefix: formConfig.urlPrefix\n };\n });\n if (formConfig.introduction) {\n routes = [\n {\n path: 'introduction',\n component: formConfig.introduction,\n formConfig,\n pageList\n }\n ].concat(routes);\n }\n\n return routes.concat([\n {\n path: 'review-and-submit',\n formConfig,\n component: ReviewPage,\n pageList\n },\n {\n path: 'confirmation',\n component: formConfig.confirmation\n },\n {\n path: '*',\n onEnter: (nextState, replace) => replace(formConfig.urlPrefix || '/')\n }\n ]);\n}\n\nfunction formatDayMonth(val) {\n if (val) {\n const dayOrMonth = val.toString();\n if (Number(dayOrMonth) && dayOrMonth.length === 1) {\n return `0${val}`;\n } else if (Number(dayOrMonth)) {\n return dayOrMonth;\n }\n }\n\n return 'XX';\n}\n\nfunction formatYear(val) {\n if (!val || !val.length) {\n return 'XXXX';\n }\n\n return val;\n}\n\nexport function formatISOPartialDate({ month, day, year }) {\n if (month || day || year) {\n return `${formatYear(year)}-${formatDayMonth(month)}-${formatDayMonth(day)}`;\n }\n\n return undefined;\n}\n\nexport function formatReviewDate(dateString, monthYear = false) {\n if (dateString) {\n const [year, month, day] = dateString.split('-', 3);\n\n return monthYear\n ? `${formatDayMonth(month)}/${formatYear(year)}`\n : `${formatDayMonth(month)}/${formatDayMonth(day)}/${formatYear(year)}`;\n }\n\n return undefined;\n}\nexport function parseISODate(dateString) {\n if (typeof dateString === 'string') {\n const [year, month, day] = dateString.split('-', 3);\n\n return {\n month: month === 'XX' ? '' : Number(month).toString(),\n day: day === 'XX' ? '' : Number(day).toString(),\n year: year === 'XXXX' ? '' : year\n };\n }\n\n return {\n month: '',\n day: '',\n year: ''\n };\n}\n\n/*\n * Removes 'view:' fields from data object\n */\nexport function filterViewFields(data) {\n return Object.keys(data).reduce((newData, nextProp) => {\n const field = data[nextProp];\n\n if (Array.isArray(field)) {\n const newArray = field.map((item) => filterViewFields(item));\n\n return _.set(nextProp, newArray, newData);\n }\n\n if (typeof field === 'object') {\n if (nextProp.startsWith('view:')) {\n return _.assign(newData, filterViewFields(field));\n }\n return _.set(nextProp, filterViewFields(field), newData);\n }\n\n if (!nextProp.startsWith('view:')) {\n return _.set(nextProp, field, newData);\n }\n\n return newData;\n }, {});\n}\n\nexport function filterInactivePageData(inactivePages, activePages, form) {\n const activeProperties = getActiveProperties(activePages);\n let newData;\n\n return inactivePages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n newData = currentData;\n if (!activeProperties.includes(prop)) {\n delete newData[prop];\n }\n return newData;\n }, formData);\n }, form.data);\n}\n\nexport function stringifyFormReplacer(key, value) {\n // an object with country is an address\n if (value && typeof value.country !== 'undefined' &&\n (!value.street || !value.city || (!value.postalCode && !value.zipcode))) {\n return undefined;\n }\n\n // clean up empty objects, which we have no reason to send\n if (typeof value === 'object') {\n const fields = Object.keys(value);\n if (fields.length === 0 || fields.every(field => value[field] === undefined)) {\n return undefined;\n }\n\n // autosuggest widgets save value and label info, but we should just return the value\n if (value.widget === 'autosuggest') {\n return value.id;\n }\n\n // Exclude file data\n if (value.confirmationCode && value.file) {\n return _.omit('file', value);\n }\n }\n\n // Clean up empty objects in arrays\n if (Array.isArray(value)) {\n const newValues = value.filter(v => !!stringifyFormReplacer(key, v));\n // If every item in the array is cleared, remove the whole array\n return newValues.length > 0 ? newValues : undefined;\n }\n\n return value;\n}\n\nexport function isInProgress(pathName) {\n const trimmedPathname = pathName.replace(/\\/$/, '');\n return !(\n trimmedPathname.endsWith('introduction')\n || trimmedPathname.endsWith('confirmation')\n || trimmedPathname.endsWith('form-saved')\n || trimmedPathname.endsWith('error')\n );\n}\n\n/*\n * Normal transform for schemaform data\n */\nexport function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) {\n const activePages = getActivePages(createFormPageList(formConfig), form.data);\n const inactivePages = getInactivePages(createFormPageList(formConfig), form.data);\n const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form);\n const withoutViewFields = filterViewFields(withoutInactivePages);\n\n return JSON.stringify(withoutViewFields, replacer) || '{}';\n}\n\nfunction isHiddenField(schema) {\n return !!schema['ui:collapsed'] || !!schema['ui:hidden'];\n}\n\n/*\n * Pull the array fields from a schema. Used to separate out array fields\n * from the rest of page to be displayed on the review page\n */\nexport function getArrayFields(data) {\n const fields = [];\n const findArrays = (obj, ui, path = []) => {\n if (obj.type === 'array' && !isHiddenField(obj) && !_.get('ui:options.keepInPageOnReview', ui)) {\n fields.push({\n path,\n schema: _.set('definitions', data.schema.definitions, obj),\n uiSchema: _.get(path, data.uiSchema) || data.uiSchema\n });\n }\n\n if (obj.type === 'object' && !isHiddenField(obj)) {\n Object.keys(obj.properties).forEach(prop => {\n findArrays(obj.properties[prop], ui[prop], path.concat(prop));\n });\n }\n };\n\n findArrays(data.schema, data.uiSchema);\n\n return fields;\n}\n\n/*\n * Checks to see if there are non array fields in a page schema, so that\n * we don’t show a blank page header on the review page if a page is just\n * a growable table\n */\nexport function hasFieldsOtherThanArray(schema) {\n if (schema.$ref || (schema.type !== 'object' && schema.type !== 'array')) {\n return true;\n }\n\n if (schema.type === 'object') {\n return Object.keys(schema.properties).some(nextProp => {\n return hasFieldsOtherThanArray(schema.properties[nextProp]);\n });\n }\n\n return false;\n}\n\n/*\n * Return a schema without array fields. If the schema has only array fields,\n * then return undefined (because there’s no reason to use an object schema with\n * no properties)\n */\nexport function getNonArraySchema(schema, uiSchema = {}) {\n if (schema.type === 'array' && !_.get('ui:options.keepInPageOnReview', uiSchema)) {\n return undefined;\n }\n\n if (schema.type === 'object') {\n const newProperties = Object.keys(schema.properties).reduce((current, next) => {\n const newSchema = getNonArraySchema(schema.properties[next], uiSchema[next]);\n\n if (typeof newSchema === 'undefined') {\n return _.unset(next, current);\n }\n\n if (newSchema !== schema.properties[next]) {\n return _.set(next, newSchema, current);\n }\n\n return current;\n }, schema.properties);\n\n if (Object.keys(newProperties).length === 0) {\n return undefined;\n }\n\n if (newProperties !== schema.properties) {\n let newSchema = _.set('properties', newProperties, schema);\n if (newSchema.required) {\n const newRequired = _.intersection(Object.keys(newSchema.properties), newSchema.required);\n if (newRequired.length !== newSchema.required.length) {\n newSchema = _.set('required', newRequired, newSchema);\n }\n }\n\n return newSchema;\n }\n }\n\n return schema;\n}\n\n\nexport const pureWithDeepEquals = shouldUpdate((props, nextProps) => {\n return !deepEquals(props, nextProps);\n});\n\n/**\n * Recursively checks to see if the schema is valid.\n *\n * Note: This only returns true. If the schema is invalid, an error is thrown to\n * stop everything.\n *\n * @param {Object} schema - The schema in question\n * @return {bool} - true if we succeed\n * @throws {Error} - If the schema is invalid\n */\nexport function checkValidSchema(schema, errors = [], path = ['root']) {\n if (typeof schema.type !== 'string') {\n errors.push(`Missing type in ${path.join('.')} schema.`);\n }\n\n if (schema.type === 'object') {\n if (typeof schema.properties !== 'object') {\n errors.push(`Missing object properties in ${path.join('.')} schema.`);\n } else {\n Object.keys(schema.properties).forEach((propName) => {\n checkValidSchema(schema.properties[propName], errors, [...path, propName]);\n });\n }\n }\n\n if (schema.type === 'array') {\n // We check this both before items is turned into additionalItems and after,\n // so we need to account for it being both an object and an array.\n if (Array.isArray(schema.items)) {\n if (!schema.additionalItems) {\n errors.push(`${path.join('.')} should contain additionalItems when items is an array.`);\n }\n schema.items.forEach((item, index) => {\n checkValidSchema(item, errors, [...path, 'items', index]);\n });\n } else if (typeof schema.items === 'object') {\n if (schema.additionalItems) {\n errors.push(`${path.join('.')} should not contain additionalItems when items is an object.`);\n }\n checkValidSchema(schema.items, errors, [...path, 'items']);\n } else {\n errors.push(`Missing items schema in ${path.join('.')}.`);\n }\n\n // Check additionalItems\n if (schema.additionalItems) {\n checkValidSchema(schema.additionalItems, errors, [...path, 'additionalItems']);\n }\n }\n\n // We’ve recursed all the way back down to ['root']; throw an error containing\n // all the error messages.\n if (path.length === 1 && errors.length > 0) {\n // console.log(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')} -- ${path.join('.')}`);\n throw new Error(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')}`);\n } else {\n return true;\n }\n}\n\nexport function setArrayRecordTouched(prefix, index) {\n return { [`${prefix}_${index}`]: true };\n}\n\nexport function createUSAStateLabels(states) {\n return states.USA.reduce((current, { label, value }) => {\n return _.merge(current, { [value]: label });\n }, {});\n}\n\n/*\n * Take a list of pages and create versions of them\n * for each item in an array\n */\nfunction generateArrayPages(arrayPages, data) {\n const items = _.get(arrayPages[0].arrayPath, data) || [];\n return items\n .reduce((pages, item, index) =>\n pages.concat(arrayPages.map(page =>\n _.assign(page, {\n path: page.path.replace(':index', index),\n index\n })\n )),\n []\n )\n // doing this after the map so that we don’t change indexes\n .filter(page => !page.itemFilter || page.itemFilter(items[page.index]));\n}\n\n/*\n * We want to generate the pages we need for each item in the array\n * being used by an array page. We also want to group those pages by item.\n * So, this grabs contiguous sections of array pages and at the end generates\n * the right number of pages based on the items in the array\n */\nexport function expandArrayPages(pageList, data) {\n const result = pageList.reduce((acc, nextPage) => {\n const { lastArrayPath, arrayPages, currentList } = acc;\n // If we see an array page and we’re starting a section or in the middle of one, just add it\n // to the temporary array\n if (nextPage.showPagePerItem && (!lastArrayPath || nextPage.arrayPath === lastArrayPath)) {\n arrayPages.push(nextPage);\n return acc;\n // Now we’ve hit the end of a section of array pages using the same array, so\n // actually generate the pages now\n } else if (nextPage.arrayPath !== lastArrayPath && !!arrayPages.length) {\n const newList = currentList.concat(generateArrayPages(arrayPages, data), nextPage);\n return _.assign(acc, {\n lastArrayPath: null,\n arrayPages: [],\n currentList: newList\n });\n }\n\n return _.set('currentList', currentList.concat(nextPage), acc);\n }, { lastArrayPath: null, arrayPages: [], currentList: [] });\n\n if (result.arrayPages.length > 0) {\n return result.currentList.concat(generateArrayPages(result.arrayPages, data));\n }\n\n return result.currentList;\n}\n\n/**\n * Gets active and expanded pages, in the correct order\n *\n * Any `showPagePerItem` pages are expanded to create items for each array item.\n * We update the `path` for each of those pages to replace `:index` with the current item index.\n *\n * @param pages {Array} List of page configs\n * @param data {Object} Current form data\n * @returns {Array} A list of pages, including individual array\n * pages that are active\n */\nexport function getActiveExpandedPages(pages, data) {\n const expandedPages = expandArrayPages(pages, data);\n return getActivePages(expandedPages, data);\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 expandedPageList = getActiveExpandedPages(pages, 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 expandedPageList = getActiveExpandedPages(pageList, 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"]} \ No newline at end of file diff --git a/lib/js/review/ReviewChapters.js.map b/lib/js/review/ReviewChapters.js.map index dd80ef8..b56cee3 100644 --- a/lib/js/review/ReviewChapters.js.map +++ b/lib/js/review/ReviewChapters.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/review/ReviewChapters.jsx"],"names":["mapStateToProps","scroller","Scroll","ReviewChapters","props","formData","pageList","viewedPages","Set","setViewedPages","name","open","pageKeys","closeReviewChapter","openReviewChapter","scrollToChapter","chapters","form","formContext","setValid","map","chapter","expandedPages","formConfig","handleEdit","handleSetData","showUnviewedPageWarning","handleToggleChapter","uploadFile","React","Component","chapterKey","scrollTo","window","Forms","scroll","duration","delay","smooth","pageKey","editing","index","fullPageKey","setEditMode","setData","onSetData","state","ownProps","data","openChapters","chapterNames","pagesByChapter","pages","chapterName","chapterFormConfig","includes","some","has","key","mapDispatchToProps","propTypes","PropTypes","array","isRequired","func","object"],"mappings":"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","file":"ReviewChapters.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport Scroll from 'react-scroll';\n\nimport ReviewCollapsibleChapter from './ReviewCollapsibleChapter';\nimport {\n createPageListByChapter,\n getActiveExpandedPages,\n getActiveChapters,\n getPageKeys\n} from '../helpers';\nimport {\n getReviewPageOpenChapters,\n getViewedPages\n} from '../state/selectors';\nimport {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n} from '../actions';\n\n\nconst scroller = Scroll.scroller;\nclass ReviewChapters extends React.Component {\n\n componentDidMount() {\n const {\n formData,\n pageList\n } = this.props;\n const viewedPages = new Set(getPageKeys(pageList, formData));\n this.props.setViewedPages(viewedPages);\n }\n\n handleToggleChapter({ name, open, pageKeys }) {\n if (open) {\n this.props.closeReviewChapter(name, pageKeys);\n } else {\n this.props.openReviewChapter(name);\n this.scrollToChapter(name);\n }\n }\n\n scrollToChapter = (chapterKey) => {\n scroller.scrollTo(`chapter${chapterKey}ScrollElement`, window.Forms.scroll || {\n duration: 500,\n delay: 2,\n smooth: true,\n });\n }\n\n handleEdit = (pageKey, editing, index = null) => {\n const fullPageKey = `${pageKey}${index === null ? '' : index}`;\n if (editing) {\n this.props.setViewedPages([fullPageKey]);\n }\n this.props.setEditMode(pageKey, editing, index);\n }\n\n handleSetData = (...args) => {\n this.props.setData(...args);\n if (this.props.onSetData) {\n this.props.onSetData();\n }\n }\n\n render() {\n const {\n chapters,\n form,\n formContext,\n setValid, viewedPages\n } = this.props;\n\n return (\n
\n
\n {chapters.map(chapter => (\n this.handleSetData(...args)}\n setValid={setValid}\n showUnviewedPageWarning={chapter.showUnviewedPageWarning}\n toggleButtonClicked={() => this.handleToggleChapter(chapter)}\n uploadFile={this.props.uploadFile}\n viewedPages={viewedPages}/>\n ))}\n
\n
\n );\n }\n}\n\nexport function mapStateToProps(state, ownProps) {\n // from ownprops\n const {\n formConfig,\n formContext,\n pageList\n } = ownProps;\n\n // from redux state\n const form = state.form;\n const formData = state.form.data;\n const openChapters = getReviewPageOpenChapters(state);\n const viewedPages = getViewedPages(state);\n\n const chapterNames = getActiveChapters(formConfig, formData);\n const pagesByChapter = createPageListByChapter(formConfig);\n const chapters = chapterNames.map(chapterName => {\n const pages = pagesByChapter[chapterName];\n\n const expandedPages = getActiveExpandedPages(pages, formData);\n const chapterFormConfig = formConfig.chapters[chapterName];\n const open = openChapters.includes(chapterName);\n const pageKeys = getPageKeys(pages, formData);\n const showUnviewedPageWarning = pageKeys.some(key => !viewedPages.has(key));\n\n return {\n expandedPages,\n formConfig: chapterFormConfig,\n name: chapterName,\n open,\n pageKeys,\n showUnviewedPageWarning\n };\n });\n\n return {\n chapters,\n form,\n formData,\n formConfig,\n formContext,\n pageList,\n viewedPages\n };\n}\n\nconst mapDispatchToProps = {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n};\n\nReviewChapters.propTypes = {\n chapters: PropTypes.array.isRequired,\n closeReviewChapter: PropTypes.func.isRequired,\n form: PropTypes.object.isRequired,\n formData: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n formContext: PropTypes.object,\n onSetData: PropTypes.func,\n openReviewChapter: PropTypes.func.isRequired,\n pageList: PropTypes.array.isRequired,\n setData: PropTypes.func.isRequired,\n setEditMode: PropTypes.func.isRequired,\n setViewedPages: PropTypes.func.isRequired,\n uploadFile: PropTypes.func.isRequired,\n viewedPages: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ReviewChapters));\n\n// for tests\nexport { ReviewChapters };\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/review/ReviewChapters.jsx"],"names":["mapStateToProps","scroller","Scroll","ReviewChapters","props","formData","pageList","viewedPages","Set","setViewedPages","name","open","pageKeys","closeReviewChapter","openReviewChapter","scrollToChapter","chapters","form","formContext","setValid","map","chapter","expandedPages","formConfig","handleEdit","handleSetData","showUnviewedPageWarning","handleToggleChapter","uploadFile","React","Component","chapterKey","scrollTo","window","Forms","scroll","duration","delay","smooth","pageKey","editing","index","fullPageKey","setEditMode","setData","onSetData","state","ownProps","data","openChapters","chapterNames","pagesByChapter","pages","chapterName","chapterFormConfig","includes","some","has","key","mapDispatchToProps","propTypes","PropTypes","array","isRequired","func","object"],"mappings":"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","file":"ReviewChapters.js","sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { connect } from 'react-redux';\nimport { withRouter } from 'react-router';\nimport Scroll from 'react-scroll';\n\nimport ReviewCollapsibleChapter from './ReviewCollapsibleChapter';\nimport {\n createPageListByChapter,\n getActiveExpandedPages,\n getActiveChapters,\n getPageKeys\n} from '../helpers';\nimport {\n getReviewPageOpenChapters,\n getViewedPages\n} from '../state/selectors';\nimport {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n} from '../actions';\n\n\nconst scroller = Scroll.scroller;\nclass ReviewChapters extends React.Component {\n\n componentDidMount() {\n const {\n formData,\n pageList\n } = this.props;\n const viewedPages = new Set(getPageKeys(pageList, formData));\n this.props.setViewedPages(viewedPages);\n }\n\n handleToggleChapter({ name, open, pageKeys }) {\n if (open) {\n this.props.closeReviewChapter(name, pageKeys);\n } else {\n this.props.openReviewChapter(name);\n this.scrollToChapter(name);\n }\n }\n\n scrollToChapter = (chapterKey) => {\n scroller.scrollTo(`chapter${chapterKey}ScrollElement`, window.Forms.scroll || {\n duration: 500,\n delay: 2,\n smooth: true,\n });\n }\n\n handleEdit = (pageKey, editing, index = null) => {\n const fullPageKey = `${pageKey}${index === null ? '' : index}`;\n if (editing) {\n this.props.setViewedPages([fullPageKey]);\n }\n this.props.setEditMode(pageKey, editing, index);\n }\n\n handleSetData = (...args) => {\n this.props.setData(...args);\n if (this.props.onSetData) {\n this.props.onSetData();\n }\n }\n\n render() {\n const {\n chapters,\n form,\n formContext,\n setValid,\n viewedPages\n } = this.props;\n\n return (\n
\n
\n {chapters.map(chapter => (\n this.handleSetData(...args)}\n setValid={setValid}\n showUnviewedPageWarning={chapter.showUnviewedPageWarning}\n toggleButtonClicked={() => this.handleToggleChapter(chapter)}\n uploadFile={this.props.uploadFile}\n viewedPages={viewedPages}/>\n ))}\n
\n
\n );\n }\n}\n\nexport function mapStateToProps(state, ownProps) {\n // from ownprops\n const {\n formConfig,\n formContext,\n pageList\n } = ownProps;\n\n // from redux state\n const form = state.form;\n const formData = state.form.data;\n const openChapters = getReviewPageOpenChapters(state);\n const viewedPages = getViewedPages(state);\n\n const chapterNames = getActiveChapters(formConfig, formData);\n const pagesByChapter = createPageListByChapter(formConfig);\n const chapters = chapterNames.map(chapterName => {\n const pages = pagesByChapter[chapterName];\n\n const expandedPages = getActiveExpandedPages(pages, formData);\n const chapterFormConfig = formConfig.chapters[chapterName];\n const open = openChapters.includes(chapterName);\n const pageKeys = getPageKeys(pages, formData);\n const showUnviewedPageWarning = pageKeys.some(key => !viewedPages.has(key));\n\n return {\n expandedPages,\n formConfig: chapterFormConfig,\n name: chapterName,\n open,\n pageKeys,\n showUnviewedPageWarning\n };\n });\n\n return {\n chapters,\n form,\n formData,\n formConfig,\n formContext,\n pageList,\n viewedPages\n };\n}\n\nconst mapDispatchToProps = {\n closeReviewChapter,\n openReviewChapter,\n setData,\n setEditMode,\n setViewedPages,\n uploadFile\n};\n\nReviewChapters.propTypes = {\n chapters: PropTypes.array.isRequired,\n closeReviewChapter: PropTypes.func.isRequired,\n form: PropTypes.object.isRequired,\n formData: PropTypes.object.isRequired,\n formConfig: PropTypes.object.isRequired,\n formContext: PropTypes.object,\n onSetData: PropTypes.func,\n openReviewChapter: PropTypes.func.isRequired,\n pageList: PropTypes.array.isRequired,\n setData: PropTypes.func.isRequired,\n setEditMode: PropTypes.func.isRequired,\n setViewedPages: PropTypes.func.isRequired,\n uploadFile: PropTypes.func.isRequired,\n viewedPages: PropTypes.object.isRequired\n};\n\nexport default withRouter(connect(mapStateToProps, mapDispatchToProps)(ReviewChapters));\n\n// for tests\nexport { ReviewChapters };\n"]} \ No newline at end of file From 663278005bcd3018288c04bc67a7317d055000eb Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Fri, 14 Sep 2018 15:03:42 -0400 Subject: [PATCH 8/9] Update nav with new helper --- lib/js/components/FormNav.js | 5 +---- lib/js/components/FormNav.js.map | 2 +- src/js/components/FormNav.jsx | 8 ++------ 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/lib/js/components/FormNav.js b/lib/js/components/FormNav.js index 5e7014d..2b62df5 100644 --- a/lib/js/components/FormNav.js +++ b/lib/js/components/FormNav.js @@ -62,10 +62,7 @@ var FormNav = function (_React$Component) { var formPages = (0, _helpers.createFormPageList)(formConfig); var pageList = (0, _helpers.createPageList)(formConfig, formPages); - // These lines are also in src/applications/common/schemaform/routing.js#getEligiblePages - // TODO: Pull this logic out to be used in routing.js only - var expandedPageList = (0, _helpers.expandArrayPages)(pageList, formData); - var eligiblePageList = (0, _helpers.getActivePages)(expandedPageList, formData); + var eligiblePageList = (0, _helpers.getActiveExpandedPages)(pageList, formData); var chapters = (0, _uniq3.default)(eligiblePageList.map(function (p) { return p.chapterKey; diff --git a/lib/js/components/FormNav.js.map b/lib/js/components/FormNav.js.map index ba8cb67..bf82c05 100644 --- a/lib/js/components/FormNav.js.map +++ b/lib/js/components/FormNav.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/js/components/FormNav.jsx"],"names":["FormNav","newProps","props","formConfig","currentPath","formData","formPages","pageList","expandedPageList","eligiblePageList","chapters","map","p","chapterKey","filter","key","page","path","find","urlPrefix","current","chapterName","indexOf","title","length","React","Component"],"mappings":";;;;;;;;;;;;AAAA;;;;AAEA;;;;AAEA;;;;AAEA;;;;;;;;;;IAOqBA,O;;;;;;;;;;;;AACnB;0CACsBC,Q,EAAU;AAC9B,aAAO,CAAC,4BAAa,KAAKC,KAAlB,EAAyBD,QAAzB,CAAR;AACD;;;6BACQ;AAAA,mBACuC,KAAKC,KAD5C;AAAA,UACCC,UADD,UACCA,UADD;AAAA,UACaC,WADb,UACaA,WADb;AAAA,UAC0BC,QAD1B,UAC0BA,QAD1B;;AAGP;AACA;;AACA,UAAMC,YAAY,iCAAmBH,UAAnB,CAAlB;AACA,UAAMI,WAAW,6BAAeJ,UAAf,EAA2BG,SAA3B,CAAjB;;AAEA;AACA;AACA,UAAME,mBAAmB,+BAAiBD,QAAjB,EAA2BF,QAA3B,CAAzB;AACA,UAAMI,mBAAmB,6BAAeD,gBAAf,EAAiCH,QAAjC,CAAzB;;AAEA,UAAMK,WAAW,oBAAOD,iBACrBE,GADqB,CACjB;AAAA,eAAKC,EAAEC,UAAP;AAAA,OADiB,EAErBC,MAFqB,CAEd;AAAA,eAAO,CAAC,CAACC,GAAT;AAAA,OAFc,CAAP,CAAjB;;AAKA,UAAIC,OAAOP,iBAAiBK,MAAjB,CAAwB;AAAA,eAAKF,EAAEK,IAAF,KAAWb,WAAhB;AAAA,OAAxB,EAAqD,CAArD,CAAX;AACA;AACA;AACA;AACA,UAAI,CAACY,IAAL,EAAW;AACTA,eAAOV,UAAUY,IAAV,CAAe;AAAA,iBAAK,KAAGf,WAAWgB,SAAd,GAA0BP,EAAEK,IAA5B,KAAuCb,WAA5C;AAAA,SAAf,CAAP;AACD;;AAED,UAAIgB,gBAAJ;AACA,UAAIC,oBAAJ;AACA,UAAIL,IAAJ,EAAU;AACRI,kBAAUV,SAASY,OAAT,CAAiBN,KAAKH,UAAtB,IAAoC,CAA9C;AACA;AACAQ,sBAAcL,KAAKH,UAAL,KAAoB,QAApB,GACV,oBADU,GAEVV,WAAWO,QAAX,CAAoBM,KAAKH,UAAzB,EAAqCU,KAFzC;AAGA,YAAI,OAAOF,WAAP,KAAuB,UAA3B,EAAuC;AACrCA,wBAAcA,aAAd;AACD;AACF;;AAED,aACE;AAAA;AAAA;AACE,sCAAC,8BAAD,IAAsB,OAAOX,SAASc,MAAtC,EAA8C,SAASJ,OAAvD,GADF;AAEE;AAAA;AAAA,YAAK,WAAU,6BAAf;AACE;AAAA;AAAA;AACE,oBAAK,aADP;AAEE,+BAAeA,OAFjB;AAGE,+BAAc,GAHhB;AAIE,0CAAwBA,OAAxB,YAAsCV,SAASc,MAA/C,UAA0DH,WAJ5D;AAKE,+BAAeX,SAASc,MAL1B;AAME,yBAAU,kCANZ;AAOE;AAAA;AAAA;AAAI;AAAA;AAAA,kBAAM,WAAU,2BAAhB;AAA6CJ;AAA7C,eAAJ;AAAA;AAAiE;AAAA;AAAA,kBAAM,WAAU,oBAAhB;AAAA;AAAyCV,yBAASc;AAAlD,eAAjE;AAAA;AAAmIH;AAAnI;AAPF;AADF;AAFF,OADF;AAgBD;;;;EA5DkCI,gBAAMC,S;;kBAAtB1B,O","file":"FormNav.js","sourcesContent":["import React from 'react';\nimport _ from 'lodash/fp';\nimport shallowEqual from 'recompose/shallowEqual';\n\nimport SegmentedProgressBar from './SegmentedProgressBar';\n\nimport {\n createFormPageList,\n createPageList,\n expandArrayPages,\n getActivePages\n} from '../helpers';\n\nexport default class FormNav extends React.Component {\n // The formConfig transforming is a little heavy, so skip it if we can\n shouldComponentUpdate(newProps) {\n return !shallowEqual(this.props, newProps);\n }\n render() {\n const { formConfig, currentPath, formData } = this.props;\n\n // This is converting the config into a list of pages with chapter keys,\n // finding the current page, then getting the chapter name using the key\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n\n // These lines are also in src/applications/common/schemaform/routing.js#getEligiblePages\n // TODO: Pull this logic out to be used in routing.js only\n const expandedPageList = expandArrayPages(pageList, formData);\n const eligiblePageList = getActivePages(expandedPageList, formData);\n\n const chapters = _.uniq(eligiblePageList\n .map(p => p.chapterKey)\n .filter(key => !!key)\n );\n\n let page = eligiblePageList.filter(p => p.path === currentPath)[0];\n // If the page isn’t active, it won’t be in the eligiblePageList\n // This is a fallback to still find the chapter name if you open the page directly\n // (the chapter index will probably be wrong, but this isn’t a scenario that happens in normal use)\n if (!page) {\n page = formPages.find(p => `${formConfig.urlPrefix}${p.path}` === currentPath);\n }\n\n let current;\n let chapterName;\n if (page) {\n current = chapters.indexOf(page.chapterKey) + 1;\n // The review page is always part of our forms, but isn’t listed in chapter list\n chapterName = page.chapterKey === 'review'\n ? 'Review Application'\n : formConfig.chapters[page.chapterKey].title;\n if (typeof chapterName === 'function') {\n chapterName = chapterName();\n }\n }\n\n return (\n
\n \n
\n \n

{current} of {chapters.length} {chapterName}

\n
\n
\n \n );\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../../src/js/components/FormNav.jsx"],"names":["FormNav","newProps","props","formConfig","currentPath","formData","formPages","pageList","eligiblePageList","chapters","map","p","chapterKey","filter","key","page","path","find","urlPrefix","current","chapterName","indexOf","title","length","React","Component"],"mappings":";;;;;;;;;;;;AAAA;;;;AAEA;;;;AAEA;;;;AAEA;;;;;;;;;;IAMqBA,O;;;;;;;;;;;;AACnB;0CACsBC,Q,EAAU;AAC9B,aAAO,CAAC,4BAAa,KAAKC,KAAlB,EAAyBD,QAAzB,CAAR;AACD;;;6BACQ;AAAA,mBACuC,KAAKC,KAD5C;AAAA,UACCC,UADD,UACCA,UADD;AAAA,UACaC,WADb,UACaA,WADb;AAAA,UAC0BC,QAD1B,UAC0BA,QAD1B;;AAGP;AACA;;AACA,UAAMC,YAAY,iCAAmBH,UAAnB,CAAlB;AACA,UAAMI,WAAW,6BAAeJ,UAAf,EAA2BG,SAA3B,CAAjB;;AAEA,UAAME,mBAAmB,qCAAuBD,QAAvB,EAAiCF,QAAjC,CAAzB;;AAEA,UAAMI,WAAW,oBAAOD,iBACrBE,GADqB,CACjB;AAAA,eAAKC,EAAEC,UAAP;AAAA,OADiB,EAErBC,MAFqB,CAEd;AAAA,eAAO,CAAC,CAACC,GAAT;AAAA,OAFc,CAAP,CAAjB;;AAKA,UAAIC,OAAOP,iBAAiBK,MAAjB,CAAwB;AAAA,eAAKF,EAAEK,IAAF,KAAWZ,WAAhB;AAAA,OAAxB,EAAqD,CAArD,CAAX;AACA;AACA;AACA;AACA,UAAI,CAACW,IAAL,EAAW;AACTA,eAAOT,UAAUW,IAAV,CAAe;AAAA,iBAAK,KAAGd,WAAWe,SAAd,GAA0BP,EAAEK,IAA5B,KAAuCZ,WAA5C;AAAA,SAAf,CAAP;AACD;;AAED,UAAIe,gBAAJ;AACA,UAAIC,oBAAJ;AACA,UAAIL,IAAJ,EAAU;AACRI,kBAAUV,SAASY,OAAT,CAAiBN,KAAKH,UAAtB,IAAoC,CAA9C;AACA;AACAQ,sBAAcL,KAAKH,UAAL,KAAoB,QAApB,GACV,oBADU,GAEVT,WAAWM,QAAX,CAAoBM,KAAKH,UAAzB,EAAqCU,KAFzC;AAGA,YAAI,OAAOF,WAAP,KAAuB,UAA3B,EAAuC;AACrCA,wBAAcA,aAAd;AACD;AACF;;AAED,aACE;AAAA;AAAA;AACE,sCAAC,8BAAD,IAAsB,OAAOX,SAASc,MAAtC,EAA8C,SAASJ,OAAvD,GADF;AAEE;AAAA;AAAA,YAAK,WAAU,6BAAf;AACE;AAAA;AAAA;AACE,oBAAK,aADP;AAEE,+BAAeA,OAFjB;AAGE,+BAAc,GAHhB;AAIE,0CAAwBA,OAAxB,YAAsCV,SAASc,MAA/C,UAA0DH,WAJ5D;AAKE,+BAAeX,SAASc,MAL1B;AAME,yBAAU,kCANZ;AAOE;AAAA;AAAA;AAAI;AAAA;AAAA,kBAAM,WAAU,2BAAhB;AAA6CJ;AAA7C,eAAJ;AAAA;AAAiE;AAAA;AAAA,kBAAM,WAAU,oBAAhB;AAAA;AAAyCV,yBAASc;AAAlD,eAAjE;AAAA;AAAmIH;AAAnI;AAPF;AADF;AAFF,OADF;AAgBD;;;;EAzDkCI,gBAAMC,S;;kBAAtBzB,O","file":"FormNav.js","sourcesContent":["import React from 'react';\nimport _ from 'lodash/fp';\nimport shallowEqual from 'recompose/shallowEqual';\n\nimport SegmentedProgressBar from './SegmentedProgressBar';\n\nimport {\n createFormPageList,\n createPageList,\n getActiveExpandedPages\n} from '../helpers';\n\nexport default class FormNav extends React.Component {\n // The formConfig transforming is a little heavy, so skip it if we can\n shouldComponentUpdate(newProps) {\n return !shallowEqual(this.props, newProps);\n }\n render() {\n const { formConfig, currentPath, formData } = this.props;\n\n // This is converting the config into a list of pages with chapter keys,\n // finding the current page, then getting the chapter name using the key\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n\n const eligiblePageList = getActiveExpandedPages(pageList, formData);\n\n const chapters = _.uniq(eligiblePageList\n .map(p => p.chapterKey)\n .filter(key => !!key)\n );\n\n let page = eligiblePageList.filter(p => p.path === currentPath)[0];\n // If the page isn’t active, it won’t be in the eligiblePageList\n // This is a fallback to still find the chapter name if you open the page directly\n // (the chapter index will probably be wrong, but this isn’t a scenario that happens in normal use)\n if (!page) {\n page = formPages.find(p => `${formConfig.urlPrefix}${p.path}` === currentPath);\n }\n\n let current;\n let chapterName;\n if (page) {\n current = chapters.indexOf(page.chapterKey) + 1;\n // The review page is always part of our forms, but isn’t listed in chapter list\n chapterName = page.chapterKey === 'review'\n ? 'Review Application'\n : formConfig.chapters[page.chapterKey].title;\n if (typeof chapterName === 'function') {\n chapterName = chapterName();\n }\n }\n\n return (\n
\n \n
\n \n

{current} of {chapters.length} {chapterName}

\n
\n
\n \n );\n }\n}\n"]} \ No newline at end of file diff --git a/src/js/components/FormNav.jsx b/src/js/components/FormNav.jsx index 64d6091..ec8816f 100644 --- a/src/js/components/FormNav.jsx +++ b/src/js/components/FormNav.jsx @@ -7,8 +7,7 @@ import SegmentedProgressBar from './SegmentedProgressBar'; import { createFormPageList, createPageList, - expandArrayPages, - getActivePages + getActiveExpandedPages } from '../helpers'; export default class FormNav extends React.Component { @@ -24,10 +23,7 @@ export default class FormNav extends React.Component { const formPages = createFormPageList(formConfig); const pageList = createPageList(formConfig, formPages); - // These lines are also in src/applications/common/schemaform/routing.js#getEligiblePages - // TODO: Pull this logic out to be used in routing.js only - const expandedPageList = expandArrayPages(pageList, formData); - const eligiblePageList = getActivePages(expandedPageList, formData); + const eligiblePageList = getActiveExpandedPages(pageList, formData); const chapters = _.uniq(eligiblePageList .map(p => p.chapterKey) From 5ece651bf60d36c4bd111cd75644009280c2e9db Mon Sep 17 00:00:00 2001 From: Jeff Balboni Date: Mon, 17 Sep 2018 14:07:26 -0400 Subject: [PATCH 9/9] Update transform to handle pagePerItem depends functions --- lib/js/helpers.js | 31 ++++++------- lib/js/helpers.js.map | 2 +- src/js/helpers.js | 25 +++++------ test/js/helpers.unit.spec.js | 84 ++++++++++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+), 28 deletions(-) diff --git a/lib/js/helpers.js b/lib/js/helpers.js index 9406db0..ad6de92 100644 --- a/lib/js/helpers.js +++ b/lib/js/helpers.js @@ -60,7 +60,6 @@ exports.filterViewFields = filterViewFields; exports.filterInactivePageData = filterInactivePageData; exports.stringifyFormReplacer = stringifyFormReplacer; exports.isInProgress = isInProgress; -exports.transformForSubmit = transformForSubmit; exports.getArrayFields = getArrayFields; exports.hasFieldsOtherThanArray = hasFieldsOtherThanArray; exports.getNonArraySchema = getNonArraySchema; @@ -72,6 +71,7 @@ exports.getActiveExpandedPages = getActiveExpandedPages; exports.getPageKeys = getPageKeys; exports.getActiveChapters = getActiveChapters; exports.omitRequired = omitRequired; +exports.transformForSubmit = transformForSubmit; var _shouldUpdate = require('recompose/shouldUpdate'); @@ -376,20 +376,6 @@ function isInProgress(pathName) { return !(trimmedPathname.endsWith('introduction') || trimmedPathname.endsWith('confirmation') || trimmedPathname.endsWith('form-saved') || trimmedPathname.endsWith('error')); } -/* - * Normal transform for schemaform data - */ -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 = filterInactivePageData(inactivePages, activePages, form); - var withoutViewFields = filterViewFields(withoutInactivePages); - - return JSON.stringify(withoutViewFields, replacer) || '{}'; -} - function isHiddenField(schema) { return !!schema['ui:collapsed'] || !!schema['ui:hidden']; } @@ -700,4 +686,19 @@ function omitRequired(schema) { return newSchema; } + +/* + * Normal transform for schemaform data + */ +function transformForSubmit(formConfig, form) { + var replacer = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringifyFormReplacer; + + var expandedPages = expandArrayPages(createFormPageList(formConfig), form.data); + var activePages = getActivePages(expandedPages, form.data); + var inactivePages = getInactivePages(expandedPages, form.data); + var withoutInactivePages = filterInactivePageData(inactivePages, activePages, form); + var withoutViewFields = filterViewFields(withoutInactivePages); + + return JSON.stringify(withoutViewFields, replacer) || '{}'; +} //# sourceMappingURL=helpers.js.map \ No newline at end of file diff --git a/lib/js/helpers.js.map b/lib/js/helpers.js.map index f46f189..e017679 100644 --- a/lib/js/helpers.js.map +++ b/lib/js/helpers.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../src/js/helpers.js"],"names":["isActivePage","getActivePages","getActiveProperties","getInactivePages","createFormPageList","createPageListByChapter","createPageList","createRoutes","formatISOPartialDate","formatReviewDate","parseISODate","filterViewFields","filterInactivePageData","stringifyFormReplacer","isInProgress","transformForSubmit","getArrayFields","hasFieldsOtherThanArray","getNonArraySchema","checkValidSchema","setArrayRecordTouched","createUSAStateLabels","expandArrayPages","getActiveExpandedPages","getPageKeys","getActiveChapters","omitRequired","page","data","depends","index","Array","isArray","some","condition","undefined","pages","filter","activePages","allProperties","forEach","schema","push","Object","keys","properties","formConfig","chapters","reduce","pageList","chapter","chapterTitle","title","map","chapterKey","pageKey","concat","formPages","introduction","path","urlPrefix","routes","component","FormPage","pageConfig","ReviewPage","confirmation","onEnter","nextState","replace","formatDayMonth","val","dayOrMonth","toString","Number","length","formatYear","month","day","year","dateString","monthYear","split","newData","nextProp","field","newArray","item","startsWith","inactivePages","form","activeProperties","formData","currentData","prop","includes","key","value","country","street","city","postalCode","zipcode","fields","every","widget","id","confirmationCode","file","newValues","v","pathName","trimmedPathname","endsWith","replacer","withoutInactivePages","withoutViewFields","JSON","stringify","isHiddenField","findArrays","obj","ui","type","definitions","uiSchema","$ref","newProperties","current","next","newSchema","required","newRequired","pureWithDeepEquals","props","nextProps","errors","join","propName","items","additionalItems","Error","prefix","states","USA","label","generateArrayPages","arrayPages","arrayPath","itemFilter","result","acc","nextPage","lastArrayPath","currentList","showPagePerItem","newList","expandedPages","expandedPageList","p"],"mappings":"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","file":"helpers.js","sourcesContent":["import _ from 'lodash/fp';\nimport shouldUpdate from 'recompose/shouldUpdate';\nimport { deepEquals } from '@department-of-veterans-affairs/react-jsonschema-form/lib/utils';\n\nimport FormPage from './containers/FormPage';\nimport ReviewPage from './review/ReviewPage';\n\n// An active page is one that will be shown to the user.\n// Pages become inactive if they are conditionally shown based\n// on answers to previous questions.\nexport function isActivePage(page, data) {\n if (typeof page.depends === 'function') {\n return page.depends(data, page.index);\n }\n\n if (Array.isArray(page.depends)) {\n return page.depends.some(condition => _.matches(condition)(data));\n }\n\n return page.depends === undefined || _.matches(page.depends)(data);\n}\n\nexport function getActivePages(pages, data) {\n return pages.filter(page => isActivePage(page, data));\n}\n\nexport function getActiveProperties(activePages) {\n const allProperties = [];\n activePages.forEach(page => {\n if (page.schema) {\n allProperties.push(...Object.keys(page.schema.properties));\n }\n });\n return _.uniq(allProperties);\n}\n\nexport function getInactivePages(pages, data) {\n return pages.filter(page => !isActivePage(page, data));\n}\n\nexport function createFormPageList(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((pageList, chapter) => {\n const chapterTitle = formConfig.chapters[chapter].title;\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n chapterTitle,\n chapterKey: chapter,\n pageKey: page\n });\n });\n return pageList.concat(pages);\n }, []);\n}\n\nexport function createPageListByChapter(formConfig) {\n return Object.keys(formConfig.chapters)\n .reduce((chapters, chapter) => {\n const pages = Object.keys(formConfig.chapters[chapter].pages)\n .map(page => {\n return _.assign(formConfig.chapters[chapter].pages[page], {\n pageKey: page,\n chapterKey: chapter\n });\n });\n return _.set(chapter, pages, chapters);\n }, {});\n}\n\nexport function createPageList(formConfig, formPages) {\n let pageList = formPages;\n if (formConfig.introduction) {\n pageList = [\n {\n pageKey: 'introduction',\n path: 'introduction'\n }\n ].concat(pageList);\n }\n\n return pageList\n .concat([\n {\n pageKey: 'review-and-submit',\n path: 'review-and-submit',\n chapterKey: 'review'\n }\n ])\n .map(page => {\n return _.set('path', `${formConfig.urlPrefix || ''}${page.path}`, page);\n });\n}\n\n/*\n * Create the routes based on a form config. This goes through each chapter in a form\n * config, pulls out the config for each page, then generates a list of Route components with the\n * config as props\n */\nexport function createRoutes(formConfig) {\n const formPages = createFormPageList(formConfig);\n const pageList = createPageList(formConfig, formPages);\n let routes = formPages\n .map(page => {\n return {\n path: page.path,\n component: page.component || FormPage,\n pageConfig: page,\n pageList,\n urlPrefix: formConfig.urlPrefix\n };\n });\n if (formConfig.introduction) {\n routes = [\n {\n path: 'introduction',\n component: formConfig.introduction,\n formConfig,\n pageList\n }\n ].concat(routes);\n }\n\n return routes.concat([\n {\n path: 'review-and-submit',\n formConfig,\n component: ReviewPage,\n pageList\n },\n {\n path: 'confirmation',\n component: formConfig.confirmation\n },\n {\n path: '*',\n onEnter: (nextState, replace) => replace(formConfig.urlPrefix || '/')\n }\n ]);\n}\n\nfunction formatDayMonth(val) {\n if (val) {\n const dayOrMonth = val.toString();\n if (Number(dayOrMonth) && dayOrMonth.length === 1) {\n return `0${val}`;\n } else if (Number(dayOrMonth)) {\n return dayOrMonth;\n }\n }\n\n return 'XX';\n}\n\nfunction formatYear(val) {\n if (!val || !val.length) {\n return 'XXXX';\n }\n\n return val;\n}\n\nexport function formatISOPartialDate({ month, day, year }) {\n if (month || day || year) {\n return `${formatYear(year)}-${formatDayMonth(month)}-${formatDayMonth(day)}`;\n }\n\n return undefined;\n}\n\nexport function formatReviewDate(dateString, monthYear = false) {\n if (dateString) {\n const [year, month, day] = dateString.split('-', 3);\n\n return monthYear\n ? `${formatDayMonth(month)}/${formatYear(year)}`\n : `${formatDayMonth(month)}/${formatDayMonth(day)}/${formatYear(year)}`;\n }\n\n return undefined;\n}\nexport function parseISODate(dateString) {\n if (typeof dateString === 'string') {\n const [year, month, day] = dateString.split('-', 3);\n\n return {\n month: month === 'XX' ? '' : Number(month).toString(),\n day: day === 'XX' ? '' : Number(day).toString(),\n year: year === 'XXXX' ? '' : year\n };\n }\n\n return {\n month: '',\n day: '',\n year: ''\n };\n}\n\n/*\n * Removes 'view:' fields from data object\n */\nexport function filterViewFields(data) {\n return Object.keys(data).reduce((newData, nextProp) => {\n const field = data[nextProp];\n\n if (Array.isArray(field)) {\n const newArray = field.map((item) => filterViewFields(item));\n\n return _.set(nextProp, newArray, newData);\n }\n\n if (typeof field === 'object') {\n if (nextProp.startsWith('view:')) {\n return _.assign(newData, filterViewFields(field));\n }\n return _.set(nextProp, filterViewFields(field), newData);\n }\n\n if (!nextProp.startsWith('view:')) {\n return _.set(nextProp, field, newData);\n }\n\n return newData;\n }, {});\n}\n\nexport function filterInactivePageData(inactivePages, activePages, form) {\n const activeProperties = getActiveProperties(activePages);\n let newData;\n\n return inactivePages.reduce((formData, page) => {\n return Object.keys(page.schema.properties)\n .reduce((currentData, prop) => {\n newData = currentData;\n if (!activeProperties.includes(prop)) {\n delete newData[prop];\n }\n return newData;\n }, formData);\n }, form.data);\n}\n\nexport function stringifyFormReplacer(key, value) {\n // an object with country is an address\n if (value && typeof value.country !== 'undefined' &&\n (!value.street || !value.city || (!value.postalCode && !value.zipcode))) {\n return undefined;\n }\n\n // clean up empty objects, which we have no reason to send\n if (typeof value === 'object') {\n const fields = Object.keys(value);\n if (fields.length === 0 || fields.every(field => value[field] === undefined)) {\n return undefined;\n }\n\n // autosuggest widgets save value and label info, but we should just return the value\n if (value.widget === 'autosuggest') {\n return value.id;\n }\n\n // Exclude file data\n if (value.confirmationCode && value.file) {\n return _.omit('file', value);\n }\n }\n\n // Clean up empty objects in arrays\n if (Array.isArray(value)) {\n const newValues = value.filter(v => !!stringifyFormReplacer(key, v));\n // If every item in the array is cleared, remove the whole array\n return newValues.length > 0 ? newValues : undefined;\n }\n\n return value;\n}\n\nexport function isInProgress(pathName) {\n const trimmedPathname = pathName.replace(/\\/$/, '');\n return !(\n trimmedPathname.endsWith('introduction')\n || trimmedPathname.endsWith('confirmation')\n || trimmedPathname.endsWith('form-saved')\n || trimmedPathname.endsWith('error')\n );\n}\n\n/*\n * Normal transform for schemaform data\n */\nexport function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) {\n const activePages = getActivePages(createFormPageList(formConfig), form.data);\n const inactivePages = getInactivePages(createFormPageList(formConfig), form.data);\n const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form);\n const withoutViewFields = filterViewFields(withoutInactivePages);\n\n return JSON.stringify(withoutViewFields, replacer) || '{}';\n}\n\nfunction isHiddenField(schema) {\n return !!schema['ui:collapsed'] || !!schema['ui:hidden'];\n}\n\n/*\n * Pull the array fields from a schema. Used to separate out array fields\n * from the rest of page to be displayed on the review page\n */\nexport function getArrayFields(data) {\n const fields = [];\n const findArrays = (obj, ui, path = []) => {\n if (obj.type === 'array' && !isHiddenField(obj) && !_.get('ui:options.keepInPageOnReview', ui)) {\n fields.push({\n path,\n schema: _.set('definitions', data.schema.definitions, obj),\n uiSchema: _.get(path, data.uiSchema) || data.uiSchema\n });\n }\n\n if (obj.type === 'object' && !isHiddenField(obj)) {\n Object.keys(obj.properties).forEach(prop => {\n findArrays(obj.properties[prop], ui[prop], path.concat(prop));\n });\n }\n };\n\n findArrays(data.schema, data.uiSchema);\n\n return fields;\n}\n\n/*\n * Checks to see if there are non array fields in a page schema, so that\n * we don’t show a blank page header on the review page if a page is just\n * a growable table\n */\nexport function hasFieldsOtherThanArray(schema) {\n if (schema.$ref || (schema.type !== 'object' && schema.type !== 'array')) {\n return true;\n }\n\n if (schema.type === 'object') {\n return Object.keys(schema.properties).some(nextProp => {\n return hasFieldsOtherThanArray(schema.properties[nextProp]);\n });\n }\n\n return false;\n}\n\n/*\n * Return a schema without array fields. If the schema has only array fields,\n * then return undefined (because there’s no reason to use an object schema with\n * no properties)\n */\nexport function getNonArraySchema(schema, uiSchema = {}) {\n if (schema.type === 'array' && !_.get('ui:options.keepInPageOnReview', uiSchema)) {\n return undefined;\n }\n\n if (schema.type === 'object') {\n const newProperties = Object.keys(schema.properties).reduce((current, next) => {\n const newSchema = getNonArraySchema(schema.properties[next], uiSchema[next]);\n\n if (typeof newSchema === 'undefined') {\n return _.unset(next, current);\n }\n\n if (newSchema !== schema.properties[next]) {\n return _.set(next, newSchema, current);\n }\n\n return current;\n }, schema.properties);\n\n if (Object.keys(newProperties).length === 0) {\n return undefined;\n }\n\n if (newProperties !== schema.properties) {\n let newSchema = _.set('properties', newProperties, schema);\n if (newSchema.required) {\n const newRequired = _.intersection(Object.keys(newSchema.properties), newSchema.required);\n if (newRequired.length !== newSchema.required.length) {\n newSchema = _.set('required', newRequired, newSchema);\n }\n }\n\n return newSchema;\n }\n }\n\n return schema;\n}\n\n\nexport const pureWithDeepEquals = shouldUpdate((props, nextProps) => {\n return !deepEquals(props, nextProps);\n});\n\n/**\n * Recursively checks to see if the schema is valid.\n *\n * Note: This only returns true. If the schema is invalid, an error is thrown to\n * stop everything.\n *\n * @param {Object} schema - The schema in question\n * @return {bool} - true if we succeed\n * @throws {Error} - If the schema is invalid\n */\nexport function checkValidSchema(schema, errors = [], path = ['root']) {\n if (typeof schema.type !== 'string') {\n errors.push(`Missing type in ${path.join('.')} schema.`);\n }\n\n if (schema.type === 'object') {\n if (typeof schema.properties !== 'object') {\n errors.push(`Missing object properties in ${path.join('.')} schema.`);\n } else {\n Object.keys(schema.properties).forEach((propName) => {\n checkValidSchema(schema.properties[propName], errors, [...path, propName]);\n });\n }\n }\n\n if (schema.type === 'array') {\n // We check this both before items is turned into additionalItems and after,\n // so we need to account for it being both an object and an array.\n if (Array.isArray(schema.items)) {\n if (!schema.additionalItems) {\n errors.push(`${path.join('.')} should contain additionalItems when items is an array.`);\n }\n schema.items.forEach((item, index) => {\n checkValidSchema(item, errors, [...path, 'items', index]);\n });\n } else if (typeof schema.items === 'object') {\n if (schema.additionalItems) {\n errors.push(`${path.join('.')} should not contain additionalItems when items is an object.`);\n }\n checkValidSchema(schema.items, errors, [...path, 'items']);\n } else {\n errors.push(`Missing items schema in ${path.join('.')}.`);\n }\n\n // Check additionalItems\n if (schema.additionalItems) {\n checkValidSchema(schema.additionalItems, errors, [...path, 'additionalItems']);\n }\n }\n\n // We’ve recursed all the way back down to ['root']; throw an error containing\n // all the error messages.\n if (path.length === 1 && errors.length > 0) {\n // console.log(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')} -- ${path.join('.')}`);\n throw new Error(`Error${errors.length > 1 ? 's' : ''} found in schema: ${errors.join(' ')}`);\n } else {\n return true;\n }\n}\n\nexport function setArrayRecordTouched(prefix, index) {\n return { [`${prefix}_${index}`]: true };\n}\n\nexport function createUSAStateLabels(states) {\n return states.USA.reduce((current, { label, value }) => {\n return _.merge(current, { [value]: label });\n }, {});\n}\n\n/*\n * Take a list of pages and create versions of them\n * for each item in an array\n */\nfunction generateArrayPages(arrayPages, data) {\n const items = _.get(arrayPages[0].arrayPath, data) || [];\n return items\n .reduce((pages, item, index) =>\n pages.concat(arrayPages.map(page =>\n _.assign(page, {\n path: page.path.replace(':index', index),\n index\n })\n )),\n []\n )\n // doing this after the map so that we don’t change indexes\n .filter(page => !page.itemFilter || page.itemFilter(items[page.index]));\n}\n\n/*\n * We want to generate the pages we need for each item in the array\n * being used by an array page. We also want to group those pages by item.\n * So, this grabs contiguous sections of array pages and at the end generates\n * the right number of pages based on the items in the array\n */\nexport function expandArrayPages(pageList, data) {\n const result = pageList.reduce((acc, nextPage) => {\n const { lastArrayPath, arrayPages, currentList } = acc;\n // If we see an array page and we’re starting a section or in the middle of one, just add it\n // to the temporary array\n if (nextPage.showPagePerItem && (!lastArrayPath || nextPage.arrayPath === lastArrayPath)) {\n arrayPages.push(nextPage);\n return acc;\n // Now we’ve hit the end of a section of array pages using the same array, so\n // actually generate the pages now\n } else if (nextPage.arrayPath !== lastArrayPath && !!arrayPages.length) {\n const newList = currentList.concat(generateArrayPages(arrayPages, data), nextPage);\n return _.assign(acc, {\n lastArrayPath: null,\n arrayPages: [],\n currentList: newList\n });\n }\n\n return _.set('currentList', currentList.concat(nextPage), acc);\n }, { lastArrayPath: null, arrayPages: [], currentList: [] });\n\n if (result.arrayPages.length > 0) {\n return result.currentList.concat(generateArrayPages(result.arrayPages, data));\n }\n\n return result.currentList;\n}\n\n/**\n * Gets active and expanded pages, in the correct order\n *\n * Any `showPagePerItem` pages are expanded to create items for each array item.\n * We update the `path` for each of those pages to replace `:index` with the current item index.\n *\n * @param pages {Array} List of page configs\n * @param data {Object} Current form data\n * @returns {Array} A list of pages, including individual array\n * pages that are active\n */\nexport function getActiveExpandedPages(pages, data) {\n const expandedPages = expandArrayPages(pages, data);\n return getActivePages(expandedPages, data);\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 expandedPageList = getActiveExpandedPages(pages, 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 expandedPageList = getActiveExpandedPages(pageList, 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"]} \ 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","getArrayFields","hasFieldsOtherThanArray","getNonArraySchema","checkValidSchema","setArrayRecordTouched","createUSAStateLabels","expandArrayPages","getActiveExpandedPages","getPageKeys","getActiveChapters","omitRequired","transformForSubmit","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","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","expandedPages","expandedPageList","p","replacer","withoutInactivePages","withoutViewFields","JSON","stringify"],"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\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 * Gets active and expanded pages, in the correct order\n *\n * Any `showPagePerItem` pages are expanded to create items for each array item.\n * We update the `path` for each of those pages to replace `:index` with the current item index.\n *\n * @param pages {Array} List of page configs\n * @param data {Object} Current form data\n * @returns {Array} A list of pages, including individual array\n * pages that are active\n */\nexport function getActiveExpandedPages(pages, data) {\n const expandedPages = expandArrayPages(pages, data);\n return getActivePages(expandedPages, data);\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 expandedPageList = getActiveExpandedPages(pages, 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 expandedPageList = getActiveExpandedPages(pageList, 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 * Normal transform for schemaform data\n */\nexport function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) {\n const expandedPages = expandArrayPages(createFormPageList(formConfig), form.data);\n const activePages = getActivePages(expandedPages, form.data);\n const inactivePages = getInactivePages(expandedPages, form.data);\n const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form);\n const withoutViewFields = filterViewFields(withoutInactivePages);\n\n return JSON.stringify(withoutViewFields, replacer) || '{}';\n}\n\n"]} \ No newline at end of file diff --git a/src/js/helpers.js b/src/js/helpers.js index 6e46c53..bae80a3 100644 --- a/src/js/helpers.js +++ b/src/js/helpers.js @@ -286,18 +286,6 @@ 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 = filterInactivePageData(inactivePages, activePages, form); - const withoutViewFields = filterViewFields(withoutInactivePages); - - return JSON.stringify(withoutViewFields, replacer) || '{}'; -} - function isHiddenField(schema) { return !!schema['ui:collapsed'] || !!schema['ui:hidden']; } @@ -593,3 +581,16 @@ export function omitRequired(schema) { return newSchema; } +/* + * Normal transform for schemaform data + */ +export function transformForSubmit(formConfig, form, replacer = stringifyFormReplacer) { + const expandedPages = expandArrayPages(createFormPageList(formConfig), form.data); + const activePages = getActivePages(expandedPages, form.data); + const inactivePages = getInactivePages(expandedPages, form.data); + const withoutInactivePages = filterInactivePageData(inactivePages, activePages, form); + const withoutViewFields = filterViewFields(withoutInactivePages); + + return JSON.stringify(withoutViewFields, replacer) || '{}'; +} + diff --git a/test/js/helpers.unit.spec.js b/test/js/helpers.unit.spec.js index f7f9ad9..b5af1ad 100644 --- a/test/js/helpers.unit.spec.js +++ b/test/js/helpers.unit.spec.js @@ -528,6 +528,90 @@ describe('Schemaform helpers:', () => { expect(output.someField2).to.equal('1'); }); + it('should not remove inactive pagePerItem pages if some of the pages are active', () => { + const formConfig = { + chapters: { + chapter1: { + pages: { + page1: { + showPagePerItem: true, + arrayPath: 'testArray', + path: '/test/:index', + schema: { + type: 'object', + properties: { + testArray: { + type: 'array', + items: { + type: 'object', + properties: { + isActive: { type: 'boolean' } + } + } + } + } + }, + depends: (data, index) => data.testArray[index].isActive + } + } + } + } + }; + const formData = { + data: { + testArray: [ + { isActive: true }, + { isActive: false } + ] + } + }; + + const output = JSON.parse(transformForSubmit(formConfig, formData)); + + expect(output.testArray).not.to.be.undefined; + }); + it('should remove inactive pagePerItem pages if none of the pages are active', () => { + const formConfig = { + chapters: { + chapter1: { + pages: { + page1: { + showPagePerItem: true, + arrayPath: 'testArray', + path: '/test/:index', + schema: { + type: 'object', + properties: { + testArray: { + type: 'array', + items: { + type: 'object', + properties: { + isActive: { type: 'boolean' } + } + } + } + } + }, + depends: (data, index) => data.testArray[index].isActive + } + } + } + } + }; + const formData = { + data: { + testArray: [ + { isActive: false }, + { isActive: false } + ] + } + }; + + const output = JSON.parse(transformForSubmit(formConfig, formData)); + + expect(output.testArray).to.be.undefined; + }); }); describe('setArrayRecordTouched', () => { /* eslint-disable camelcase */