@oneblink/apps-react 6.1.0-beta.4 → 6.1.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -337,6 +337,7 @@ function OneBlinkFormBase({ googleMapsApiKey, abnLookupAuthenticationGuid, captc
337
337
  allowNavigation();
338
338
  // transplant injected options on the definition
339
339
  const elementsWithInjectedOptions = injectOptionsAcrossAllElements({
340
+ contextElements: definition.elements,
340
341
  elements: definition.elements,
341
342
  submission: submissionData.submission,
342
343
  taskContext: taskContextValue,
@@ -1 +1 @@
1
- {"version":3,"file":"OneBlinkFormBase.js","sourceRoot":"","sources":["../src/OneBlinkFormBase.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EACL,WAAW,IAAI,cAAc,EAC7B,aAAa,EACb,OAAO,GACR,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,UAAU,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,mBAAmB,EAAqB,MAAM,gBAAgB,CAAA;AAOvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAGnD,OAAO,KAAK,MAAM,6BAA6B,CAAA;AAC/C,OAAO,wBAAwB,MAAM,qCAAqC,CAAA;AAC1E,OAAO,gBAAgB,MAAM,wCAAwC,CAAA;AACrE,OAAO,iBAAiB,MAAM,2BAA2B,CAAA;AACzD,OAAO,mBAAmB,MAAM,6BAA6B,CAAA;AAC7D,OAAO,QAAQ,MAAM,kBAAkB,CAAA;AACvC,OAAO,UAAU,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,iCAAiC,EAAE,MAAM,sCAAsC,CAAA;AACxF,OAAO,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAA;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,EAAE,kCAAkC,EAAE,MAAM,wCAAwC,CAAA;AAC3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAA;AAChF,OAAO,YAAY,MAAM,sBAAsB,CAAA;AAC/C,OAAO,uBAAuB,MAAM,+CAA+C,CAAA;AAOnF,OAAO,mBAAmB,MAAM,gCAAgC,CAAA;AAChE,OAAO,wBAAwB,MAAM,qCAAqC,CAAA;AAC1E,OAAO,uBAAuB,MAAM,oCAAoC,CAAA;AACxE,OAAO,OAAO,MAAM,iBAAiB,CAAA;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAA;AAC7E,OAAO,YAAY,MAAM,2BAA2B,CAAA;AAgHpD,SAAS,gBAAgB,CAAC,EACxB,gBAAgB,EAChB,2BAA2B,EAC3B,cAAc,EACd,UAAU,EACV,QAAQ,EACR,SAAS,EACT,UAAU,EACV,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,aAAa,EACb,yBAAyB,EACzB,qBAAqB,EACrB,kBAAkB,EAClB,UAAU,EAAE,cAAc,EAC1B,kBAAkB,EAClB,eAAe,EACf,IAAI,EACJ,SAAS,EACT,iBAAiB,EACjB,kBAAkB,GACZ;;IACN,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,CAAA;IAElD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CACzB,GAAG,EAAE,CACH,cAAc,CAAC;QACb,OAAO,EAAE;YACP,OAAO,EAAE;gBACP,IAAI,EAAE,aAAa,IAAI,SAAS;aACjC;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS;aAChB;SACF;KACF,CAAC,EACJ,CAAC,aAAa,CAAC,CAChB,CAAA;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACpC,IAAI,CAAC,CAAC,cAAc,IAAI,cAAc,KAAK,YAAY,EAAE;YACvD,OAAO,cAAc,KAAK,KAAK,CAAA;SAChC;QACD,OAAO,mBAAmB,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAA;IAC5D,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAA;IAEhC,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC1C,OAAO;YACL,IAAI;YACJ,SAAS;YACT,iBAAiB;SAClB,CAAA;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC,CAAA;IAExC,EAAE;IACF,EAAE;IACF,0BAA0B;IAE1B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAA0B,GAAG,EAAE;QACxD,IAAI,UAAU,CAAC,WAAW,EAAE;YAC1B,OAAO,UAAU,CAAC,QAAQ,CAAC,MAAM,CAC/B,CACE,YAAqC,EACrC,WAAkC,EAClC,EAAE;gBACF,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE;oBAC/B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;iBAC/B;gBACD,OAAO,YAAY,CAAA;YACrB,CAAC,EACD,EAAE,CACH,CAAA;SACF;aAAM;YACL,OAAO;gBACL;oBACE,IAAI,EAAE,MAAM;oBACZ,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;oBAC5B,KAAK,EAAE,UAAU,CAAC,IAAI;oBACtB,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,iBAAiB,EAAE,KAAK;oBACxB,sCAAsC,EAAE,KAAK;iBAC9C;aACF,CAAA;SACF;IACH,CAAC,EAAE;QACD,UAAU,CAAC,QAAQ;QACnB,UAAU,CAAC,EAAE;QACb,UAAU,CAAC,WAAW;QACtB,UAAU,CAAC,IAAI;KAChB,CAAC,CAAA;IAEF,aAAa;IACb,EAAE;IACF,EAAE;IAEF,EAAE;IACF,EAAE;IACF,0BAA0B;IAE1B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAA;IAE5B,MAAM,CACJ,EAAE,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,YAAY,EAAE,EACtE,sBAAsB,EACvB,GAAG,KAAK,CAAC,QAAQ,CAKf;QACD,OAAO,EAAE,KAAK;QACd,mBAAmB,EAAE,KAAK;QAC1B,sBAAsB,EAAE,IAAI;QAC5B,YAAY,EAAE,IAAI;KACnB,CAAC,CAAA;IACF,MAAM,CAAC,8BAA8B,EAAE,iCAAiC,CAAC,GACvE,KAAK,CAAC,QAAQ,CAAU,KAAK,CAAC,CAAA;IAChC,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,GAC/D,KAAK,CAAC,QAAQ,CAAU,KAAK,CAAC,CAAA;IAChC,MAAM,uBAAuB,GAAG,KAAK,CAAC,WAAW,CAE/C,CAAC,QAAQ,EAAE,EAAE;QACb,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,GAAG,OAAO;YACV,YAAY,EAAE,QAAQ;YACtB,sBAAsB,EAAE,KAAK;SAC9B,CAAC,CAAC,CAAA;QACH,OAAO,KAAK,CAAA;IACd,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7C,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,GAAG,OAAO;YACV,YAAY,EAAE,IAAI;YAClB,sBAAsB,EAAE,IAAI;SAC7B,CAAC,CAAC,CAAA;IACL,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,2BAA2B,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACzD,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,GAAG,OAAO;YACV,mBAAmB,EAAE,IAAI;YACzB,sBAAsB,EAAE,IAAI;SAC7B,CAAC,CAAC,CAAA;IACL,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,sBAAsB,EAAE;YAC1B,wEAAwE;YACxE,IAAI,YAAY,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC9D,IAAI,kBAAkB,EAAE;oBACtB,kBAAkB,EAAE,CAAA;iBACrB;aACF;iBAAM;gBACL,QAAQ,EAAE,CAAA;aACX;SACF;IACH,CAAC,EAAE;QACD,YAAY;QACZ,kBAAkB;QAClB,sBAAsB;QACtB,OAAO;QACP,QAAQ;KACT,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC1C,IAAI,OAAO,EAAE;YACX,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACnC,GAAG,OAAO;gBACV,sBAAsB,EAAE,KAAK;aAC9B,CAAC,CAAC,CAAA;SACJ;aAAM;YACL,QAAQ,EAAE,CAAA;SACX;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEvB,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7C,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,GAAG,OAAO;YACV,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAC,CAAA;IACL,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,6BAA6B;IAC7B,EAAE;IACF,EAAE;IAEF,EAAE;IACF,EAAE;IACF,4BAA4B;IAE5B,MAAM,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,GAC7D,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IAE7C,aAAa;IACb,EAAE;IACF,EAAE;IAEF,EAAE;IACF,EAAE;IACF,qBAAqB;IAErB,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;IAE7C,MAAM,sBAAsB,GAAG,KAAK,CAAC,OAAO,CAG1C,GAAG,EAAE,CACH,CAAC,UAAU;QACT,CAAC,CAAC,QAAQ,CACN,UAAU,EACV,8BAA8B,EAC9B,eAAe,aAAf,eAAe,cAAf,eAAe,GAAI,EAAE,CACtB;QACH,CAAC,CAAC,SAAS,EACf;QACE,8BAA8B;QAC9B,UAAU;QACV,UAAU;QACV,QAAQ;QACR,eAAe;KAChB,CACF,CAAA;IAED,aAAa;IACb,EAAE;IACF,EAAE;IAEF,EAAE;IACF,EAAE;IACF,gBAAgB;IAEhB,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEzE,MAAM,EACJ,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,4BAA4B,EAC5B,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,+BAA+B,GAChC,GAAG,QAAQ,CAAC;QACX,kBAAkB;QAClB,KAAK;QACL,sBAAsB;QACtB,8BAA8B;KAC/B,CAAC,CAAA;IAEF,aAAa;IACb,EAAE;IACF,EAAE;IAEF,EAAE;IACF,EAAE;IACF,sBAAsB;IAEtB,MAAM,wBAAwB,GAAG,KAAK,CAAC,WAAW,CAChD,CAAC,eAAwB,EAAE,EAAE;QAC3B,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,wBAAwB,CACvD,UAAU,EACV,UAAU,CAAC,QAAQ,EACnB,8BAA8B,EAC9B,eAAe,CAChB,CAAA;QACD,OAAO;YACL,UAAU,EAAE,KAAK;YACjB,aAAa;SACd,CAAA;IACH,CAAC,EACD,CAAC,UAAU,CAAC,QAAQ,EAAE,8BAA8B,EAAE,UAAU,CAAC,CAClE,CAAA;IAED,MAAM,6BAA6B,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxE,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,MAAM,0BAA0B,GAAG,6BAA6B,CAAC,OAAO,CAAA;QACxE,IAAI,0BAA0B,EAAE;YAC9B,OAAO,CAAC,GAAG,CACT,4DAA4D,EAC5D,0BAA0B,CAC3B,CAAA;YACD,UAAU,CAAC,WAAW,CAAC;gBACrB,QAAQ,EAAE,cAAc;gBACxB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,0BAA0B;aACrC,CAAC,CAAA;SACH;QACD,OAAO,GAAG,EAAE;YACV,UAAU,CAAC,aAAa,EAAE,CAAA;QAC5B,CAAC,CAAA;IACH,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,MAAM,8BAA8B,GAAG,KAAK,CAAC,WAAW,CACtD,CAAC,UAA0D,EAAE,EAAE;QAC7D,+DAA+D;QAC/D,8DAA8D;QAC9D,4DAA4D;QAC5D,0DAA0D;QAC1D,IAAI,SAAS,EAAE;YACb,OAAO,IAAI,CAAA;SACZ;QACD,MAAM,uBAAuB,GAC3B,kBAAkB,CAAC,8BAA8B,CAC/C,UAAU,EACV,UAAU,CACX,CAAA;QAEH,IAAI,uBAAuB,EAAE;YAC3B,IAAI,eAAe,IAAI,CAAC,qBAAqB,EAAE;gBAC7C,UAAU,CAAC,KAAK,CAAC;oBACf,OAAO,EACL,sFAAsF;oBACxF,IAAI,EAAE,YAAY;oBAClB,YAAY,EAAE,wCAAwC;oBACtD,QAAQ,EAAE,IAAI;oBACd,YAAY,EAAE,IAAI;oBAClB,YAAY,EAAE,IAAI;iBACnB,CAAC,CAAA;gBACF,OAAO,KAAK,CAAA;aACb;iBAAM;gBACL,6BAA6B,CAAC,IAAI,CAAC,CAAA;gBACnC,OAAO,KAAK,CAAA;aACb;SACF;QAED,OAAO,IAAI,CAAA;IACb,CAAC,EACD,CAAC,UAAU,EAAE,SAAS,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAChE,CAAA;IAED,MAAM,uBAAuB,GAAG,KAAK,CAAC,WAAW,CAC/C,CAAC,UAA0D,EAAE,EAAE;QAC7D,OAAO,CAAC,mBAAmB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IACrD,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAA;IAED,MAAM,qBAAqB,GAAG,KAAK,CAAC,WAAW,CAC7C,CAAC,UAA0D,EAAE,EAAE;QAC7D,IAAI,wBAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE;YACpD,UAAU,CAAC,KAAK,CAAC;gBACf,OAAO,EACL,uFAAuF;gBACzF,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,yCAAyC;gBACvD,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,IAAI;aACnB,CAAC,CAAA;YACF,OAAO,KAAK,CAAA;SACb;QAED,OAAO,IAAI,CAAA;IACb,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAA;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7C,MAAM,YAAY,GAAG,EAAE,GAAG,UAAU,EAAE,CAAA;QACtC,mBAAmB,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;YACtE,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC9B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAA;aACvC;QACH,CAAC,CAAC,CAAA;QACF,qBAAqB,CAAC,KAAK,CAAC,CAAA;QAC5B,iBAAiB,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,OAAO,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAA;QACjD,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAA;IAExD,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CACpC,CACE,KAEmD,EACnD,qCAA8C,EAC9C,EAAE;QACF,KAAK,CAAC,cAAc,EAAE,CAAA;QACtB,IAAI,QAAQ,IAAI,UAAU;YAAE,OAAM;QAClC,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAE3B,MAAM,cAAc,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAA;QACtD,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;YACrD,OAAM;SACP;QACD,IAAI,sBAAsB,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,CAAA;YACxD,UAAU,CAAC,KAAK,CAAC;gBACf,OAAO,EAAE,8BAA8B;gBACvC,IAAI,EAAE,WAAW;gBACjB,YAAY,EAAE,yCAAyC;gBACvD,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,IAAI;aACnB,CAAC,CAAA;YACF,OAAM;SACP;QACD,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;YACvD,OAAM;SACP;QACD,IACE,CAAC,qCAAqC;YACtC,CAAC,8BAA8B,CAAC,cAAc,CAAC,UAAU,CAAC,EAC1D;YACA,OAAM;SACP;QACD,6BAA6B;QAC7B,MAAM,aAAa,GAAG,uBAAuB,CAC3C,UAAU,EACV,cAAc,CAAC,UAAU,EACzB,yBAAyB,CAC1B,CAAA;QACD,IAAI,aAAa,EAAE;YACjB,iBAAiB,CAAC,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;gBAC5C,GAAG,qBAAqB;gBACxB,UAAU,EAAE,aAAa;aAC1B,CAAC,CAAC,CAAA;YACH,UAAU,CAAC,KAAK,CAAC;gBACf,OAAO,EACL,mKAAmK;gBACrK,IAAI,EAAE,WAAW;gBACjB,YAAY,EAAE,yCAAyC;gBACvD,QAAQ,EAAE,IAAI;gBACd,YAAY,EAAE,IAAI;gBAClB,YAAY,EAAE,IAAI;aACnB,CAAC,CAAA;YACF,OAAM;SACP;QAED,IAAI,SAAS,IAAI,CAAC,qBAAqB,EAAE;YACvC,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAA;YACxE,iCAAiC,CAAC,IAAI,CAAC,CAAA;YACvC,OAAM;SACP;QAED,eAAe,EAAE,CAAA;QAEjB,gDAAgD;QAChD,MAAM,2BAA2B,GAAG,8BAA8B,CAAC;YACjE,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,WAAW,EAAE,gBAAgB;YAC7B,WAAW,EAAE,WAAW,aAAX,WAAW,cAAX,WAAW,GAAI,SAAS;SACtC,CAAC,CAAA;QACF,QAAQ,CAAC;YACP,UAAU,EAAE;gBACV,GAAG,UAAU;gBACb,QAAQ,EAAE,2BAA2B;aACtC;YACD,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,aAAa,EAAE,cAAc,CAAC,aAAa;SAC5C,CAAC,CAAA;QACF,eAAe,EAAE,CAAA;IACnB,CAAC,EACD;QACE,QAAQ;QACR,UAAU;QACV,wBAAwB;QACxB,qBAAqB;QACrB,sBAAsB;QACtB,uBAAuB;QACvB,8BAA8B;QAC9B,UAAU;QACV,yBAAyB;QACzB,SAAS;QACT,qBAAqB;QACrB,eAAe;QACf,gBAAgB;QAChB,WAAW;QACX,QAAQ;QACR,eAAe;QACf,iBAAiB;KAClB,CACF,CAAA;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CACvC,CAAC,qCAA8C,EAAE,EAAE;QACjD,IAAI,QAAQ;YAAE,OAAM;QACpB,IAAI,WAAW,EAAE;YACf,eAAe,EAAE,CAAA;YAEjB,uDAAuD;YACvD,mDAAmD;YACnD,MAAM,EAAE,UAAU,EAAE,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAA;YACtD,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE;gBACtC,OAAM;aACP;YACD,IACE,CAAC,qCAAqC;gBACtC,CAAC,8BAA8B,CAAC,UAAU,CAAC,EAC3C;gBACA,OAAM;aACP;YACD,WAAW,CAAC;gBACV,UAAU;gBACV,UAAU;gBACV,gBAAgB,EAAE,qCAAqC;gBACvD,kBAAkB;aACnB,CAAC,CAAA;SACH;IACH,CAAC,EACD;QACE,eAAe;QACf,8BAA8B;QAC9B,UAAU;QACV,QAAQ;QACR,wBAAwB;QACxB,WAAW;QACX,qBAAqB;QACrB,kBAAkB;KACnB,CACF,CAAA;IAED,MAAM,6BAA6B,GAAG,KAAK,CAAC,WAAW,CACrD,CAAC,CAAkD,EAAE,EAAE;QACrD,6BAA6B,CAAC,KAAK,CAAC,CAAA;QACpC,IAAI,kBAAkB,EAAE;YACtB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;SACtB;aAAM;YACL,eAAe,CAAC,IAAI,CAAC,CAAA;SACtB;IACH,CAAC,EACD;QACE,YAAY;QACZ,6BAA6B;QAC7B,kBAAkB;QAClB,eAAe;KAChB,CACF,CAAA;IACD,MAAM,wBAAwB,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACtD,6BAA6B,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAA;IAEnC,aAAa;IACb,EAAE;IACF,EAAE;IAEF,EAAE;IACF,EAAE;IACF,kBAAkB;IAElB,MAAM,EAAE,uBAAuB,EAAE,GAAG,UAAU,CAC5C,UAAU,CAAC,EAAE,EACb,iBAAiB,CAClB,CAAA;IAED,aAAa;IACb,EAAE;IACF,EAAE;IAEF,EAAE;IACF,EAAE;IACF,wCAAwC;IAExC,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CACpC,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE;QACtC;QACE,gFAAgF;QAChF,kEAAkE;QAClE,mDAAmD;QACnD,CAAC,QAAQ;YACP,OAAO,CAAC,IAAI,KAAK,SAAS;YAC1B,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC;YACjC,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,OAAO,CAAC,IAAI,KAAK,SAAS,EAC1B;YACA,OAAM;SACP;QAED,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACnC,GAAG,OAAO;YACV,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,CAAA;QACH,qFAAqF;QACrF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE;YAChE,iBAAiB,CAAC,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;gBAC5C,GAAG,qBAAqB;gBACxB,UAAU,EAAE;oBACV,GAAG,qBAAqB,CAAC,UAAU;oBACnC,CAAC,OAAO,CAAC,IAAI,CAAC,EACZ,OAAO,KAAK,KAAK,UAAU;wBACzB,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBACvD,CAAC,CAAC,KAAK;iBACZ;aACF,CAAC,CAAC,CAAA;SACJ;aAAM;YACL,iBAAiB,CAAC,CAAC,qBAAqB,EAAE,EAAE;;gBAC1C,OAAO;oBACL,GAAG,qBAAqB;oBACxB,UAAU,EAAE;wBACV,GAAG,qBAAqB,CAAC,UAAU;wBACnC,CAAC,OAAO,CAAC,IAAI,CAAC,EACZ,OAAO,KAAK,KAAK,UAAU;4BACzB,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;4BACvD,CAAC,CAAC,KAAK;qBACZ;oBACD,kBAAkB,EAAE,OAAO;oBAC3B,eAAe,EAAE;wBACf,GAAG,qBAAqB,CAAC,eAAe;wBACxC,CAAC,OAAO,CAAC,IAAI,CAAC,EACZ,OAAO,eAAe,KAAK,UAAU;4BACnC,CAAC,CAAC,eAAe,CACb,MAAA,qBAAqB,CAAC,eAAe,0CAAG,OAAO,CAAC,IAAI,CAAC,CACtD;4BACH,CAAC,CAAC,eAAe;qBACtB;iBACF,CAAA;YACH,CAAC,CAAC,CAAA;SACH;IACH,CAAC,EACD,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAC9B,CAAA;IAED,aAAa;IACb,EAAE;IACF,EAAE;IAEF,MAAM,8BAA8B,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACxD,OAAO,CAAC,CAAC,mBAAmB,CAAC,eAAe,CAC1C,UAAU,CAAC,QAAQ,EACnB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAK,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,EAAE,CAAA,CACzC,CAAA;IACH,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAE7C,MAAM,sBAAsB,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAChD,OAAO,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAkC,EAAE,EAAE;YACrE,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,EAAE;gBAC/B,OAAO,mBAAmB,CAAC,eAAe,CACxC,WAAW,CAAC,QAAQ,EACpB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAK,kBAAkB,aAAlB,kBAAkB,uBAAlB,kBAAkB,CAAE,EAAE,CAAA,CACzC,CAAA;aACF;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,EAAE,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAA;IAEpC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACzD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,kBAAkB,IAAI,8BAA8B,EAAE;gBACxD,IAAI,sBAAsB,EAAE;oBAC1B,SAAS,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAA;iBACrC;gBACD,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAA;gBAC9D,IAAI,OAAO,EAAE;oBACX,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;wBAChC,OAAO,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAA;oBAChD,CAAC,CAAC,CAAA;iBACH;aACF;YACD,aAAa,CAAC,IAAI,CAAC,CAAA;SACpB;IACH,CAAC,EAAE;QACD,kBAAkB;QAClB,UAAU;QACV,sBAAsB;QACtB,8BAA8B;QAC9B,SAAS;KACV,CAAC,CAAA;IAEF,IAAI,qBAAqB,EAAE;QACzB,OAAO,CACL;YACE,6BAAK,SAAS,EAAC,mBAAmB;gBAChC,oBAAC,YAAY,IAAC,SAAS,EAAC,+BAA+B,YAExC;gBACf,4BAAI,SAAS,EAAC,YAAY,6BAA4B;gBACtD,2BAAG,SAAS,EAAC,yCAAyC,IACnD,qBAAqB,CAAC,OAAO,CAC5B;gBACJ,2BAAG,SAAS,EAAC,eAAe,IACzB,mBAAmB,CAAC,kBAAkB,CAAC,IAAI,IAAI,EAAE,CAAC,CACjD,CACA,CACL,CACJ,CAAA;KACF;IAED,OAAO,CACL,oBAAC,aAAa,IAAC,KAAK,EAAE,KAAK;QACzB,oBAAC,qBAAqB,CAAC,QAAQ,IAAC,KAAK,EAAE,UAAU;YAC/C,oBAAC,iCAAiC;gBAChC,oBAAC,iCAAiC;oBAChC,6BACE,SAAS,EAAC,mBAAmB,EAC7B,GAAG,EAAE,6BAA6B;wBAElC,8BACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,yCACT,gBAAgB,GAAG,CACrB,EAAE,EACF,UAAU,QACV,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC;4BAEvC;gCACE,6BAAK,GAAG,EAAE,+BAA+B,GAAI;gCAC5C,sBAAsB,IAAI,CACzB,6BACE,SAAS,EAAE,IAAI,CAAC,qBAAqB,EAAE;wCACrC,WAAW,EAAE,mBAAmB;qCACjC,CAAC;oCAEF,6BACE,SAAS,EAAE,IAAI,CAAC,6BAA6B,EAAE;4CAC7C,WAAW,EAAE,mBAAmB;yCACjC,CAAC,EACF,OAAO,EAAE,qBAAqB;wCAE9B,8BAAM,SAAS,EAAC,mBAAmB;4CACjC,oBAAC,YAAY,8BAAmC,CAC3C;wCACP,6BAAK,SAAS,EAAC,0BAA0B;4CACtC,4BAA4B,CAAC,CAAC,CAAC,CAC9B,8BAAM,SAAS,EAAC,MAAM;gDACpB,oBAAC,YAAY,IAAC,SAAS,EAAC,2BAA2B,cAEpC,CACV,CACR,CAAC,CAAC,CAAC,CACF,8BAAM,SAAS,EAAC,+BAA+B,IAC5C,iBAAiB,CACb,CACR;4CACD,8BAAM,SAAS,EAAC,0DAA0D,IACvE,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAChC,CACH;wCACN,8BAAM,SAAS,EAAC,eAAe;4CAC7B,oBAAC,YAAY,8BAAmC,CAC3C,CACH;oCAEN,6BACE,SAAS,EAAE,IAAI,CAAC,4BAA4B,EAAE;4CAC5C,WAAW,EAAE,mBAAmB;yCACjC,CAAC;wCAEF,6BAAK,SAAS,EAAC,mDAAmD,IAC/D,YAAY,CAAC,GAAG,CACf,CAAC,IAA2B,EAAE,KAAa,EAAE,EAAE;4CAC7C,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;4CAC7C,OAAO,CACL,6BACE,GAAG,EAAE,IAAI,CAAC,EAAE,EACZ,EAAE,EAAE,yBAAyB,IAAI,CAAC,EAAE,EAAE,EACtC,SAAS,EAAE,IAAI,CACb,6BAA6B,EAC7B;oDACE,WAAW,EAAE,WAAW,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;oDACvC,cAAc,EAAE,gBAAgB,GAAG,KAAK;oDACxC,UAAU,EAAE,SAAS;iDACtB,CACF,EACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oDACb,CAAC,CAAC,eAAe,EAAE,CAAA;oDACnB,IAAI,IAAI,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,EAAE;wDAC9B,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;qDACnB;gDACH,CAAC;gDAED,6BACE,SAAS,EAAC,kEAAkE;oDAC5E,uBAAuB;oDACvB,IAAI,EAAE,wBAAwB,KAAK,GAAG,CAAC,EAAE,EACzC,KAAK,EAAE,KAAK,GAAG,CAAC,IAEf,SAAS,CAAC,CAAC,CAAC,CACX,oBAAC,OAAO,IAAC,KAAK,EAAC,iBAAiB;oDAC9B,8BAAM,SAAS,EAAC,iDAAiD;wDAC/D,oBAAC,YAAY,IAAC,SAAS,EAAC,2BAA2B,cAEpC,CACV,CACC,CACX,CAAC,CAAC,CAAC,CACF,kCAAO,KAAK,GAAG,CAAC,CAAQ,CACzB,CACG;gDACN,6BAAK,SAAS,EAAC,8BAA8B;oDAC3C,2BAAG,SAAS,EAAC,qDAAqD,IAC/D,IAAI,CAAC,KAAK,CACT,CACA,CACF,CACP,CAAA;wCACH,CAAC,CACF,CACG,CACF,CACF,CACP;gCAED,6BACE,SAAS,EAAE,IAAI,CAAC,iCAAiC,EAAE;wCACjD,WAAW,EAAE,mBAAmB;qCACjC,CAAC,EACF,OAAO,EAAE,qBAAqB,GAC9B;gCAEF,6BAAK,SAAS,EAAC,OAAO;oCACpB,6BACE,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE;4CAC/B,gBAAgB,EAAE,CAAC,sBAAsB;yCAC1C,CAAC;wCAEF,oBAAC,kBAAkB,CAAC,QAAQ,IAC1B,KAAK,EAAE,uBAAuB;4CAE9B,oBAAC,uBAAuB,CAAC,QAAQ,IAC/B,KAAK,EAAE,gBAAgB;gDAEvB,oBAAC,kCAAkC,CAAC,QAAQ,IAC1C,KAAK,EAAE,2BAA2B;oDAElC,oBAAC,qBAAqB,CAAC,QAAQ,IAC7B,KAAK,EAAE,cAAc;wDAErB,oBAAC,uBAAuB;4DACtB,oBAAC,qBAAqB,CAAC,QAAQ,IAC7B,KAAK,EAAE,UAAU;gEAEjB,oBAAC,WAAW,CAAC,QAAQ,IACnB,KAAK,EAAE,gBAAgB;oEAEvB,oBAAC,yBAAyB,CAAC,QAAQ,IACjC,KAAK,EAAE,kBAAkB,IAExB,YAAY,CAAC,GAAG,CACf,CACE,WAAkC,EAClC,EAAE,CAAC,CACH,oBAAC,gBAAgB,IACf,GAAG,EAAE,WAAW,CAAC,EAAE,EACnB,QAAQ,EACN,WAAW,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,EAEnC,MAAM,EAAE,UAAU,CAAC,EAAE,EACrB,8BAA8B,EAC5B,8BAA8B,EAEhC,sBAAsB,EACpB,sBAAsB,EAExB,yBAAyB,EACvB,kBAAkB;4EAClB,4BAA4B,EAE9B,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,UAAU,EACjB,iBAAiB,EACf,iBAAiB,GAEnB,CACH,CACF,CACkC,CAChB,CACQ,CACT,CACK,CACW,CACb,CACP,CAC1B;oCAEL,sBAAsB,IAAI,CACzB,6BAAK,SAAS,EAAC,eAAe;wCAC5B,6BAAK,SAAS,EAAC,cAAc;4CAC3B,gCACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAC,wCAAwC;gDAElD,8BAAM,SAAS,EAAC,MAAM;oDACpB,oBAAC,YAAY,8BAAmC,CAC3C;gDACP,yCAAiB,CACV,CACL;wCACN,6BAAK,SAAS,EAAC,2CAA2C,IACvD,YAAY,CAAC,GAAG,CACf,CAAC,IAA2B,EAAE,KAAK,EAAE,EAAE,CAAC,CACtC,6BACE,GAAG,EAAE,IAAI,CAAC,EAAE,EACZ,SAAS,EAAE,IAAI,CAAC,0BAA0B,EAAE;gDAC1C,WAAW,EAAE,WAAW,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;gDACvC,cAAc,EAAE,gBAAgB,GAAG,KAAK;gDACxC,uBAAuB,EACrB,WAAW,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;oDAC1B,qBAAqB,CAAC,IAAI,CAAC;6CAC9B,CAAC,GACF,CACH,CACF,CACG;wCACN,6BAAK,SAAS,EAAC,cAAc;4CAC3B,gCACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAC,oCAAoC;gDAE9C,yCAAiB;gDACjB,8BAAM,SAAS,EAAC,MAAM;oDACpB,oBAAC,YAAY,+BAAoC,CAC5C,CACA,CACL,CACF,CACP,CACG;gCACL,CAAC,UAAU,IAAI,CACd,6BAAK,SAAS,EAAC,sCAAsC;oCAClD,WAAW,IAAI,CAAC,UAAU,IAAI,CAC7B,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,0EAA0E,EACpF,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,EACrC,QAAQ,EAAE,SAAS,IAAI,QAAQ;wCAE/B,oBAAC,uBAAuB,IACtB,KAAK,EAAE,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,0CAAE,KAAK,KAAI,YAAY,EAChD,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,0CAAE,IAAI,GAC9B,CACK,CACV;oCACD,8BAAM,SAAS,EAAC,2BAA2B,GAAQ;oCAClD,CAAC,UAAU,IAAI,CACd,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,uEAAuE,EACjF,OAAO,EAAE,YAAY,EACrB,QAAQ,EAAE,SAAS,IAAI,QAAQ;wCAE/B,oBAAC,uBAAuB,IACtB,KAAK,EAAE,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,KAAK,KAAI,QAAQ,EACzC,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,IAAI,GAC3B,CACK,CACV;oCACA,iBAAiB,IAAI,CACpB,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,6FAA6F,EACvG,QAAQ,EAAE,SAAS,IAAI,QAAQ;wCAE/B,oBAAC,uBAAuB,IACtB,KAAK,EACH,UAAU;gDACR,CAAC,CAAC,MAAM;gDACR,CAAC,CAAC,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,KAAK,KAAI,QAAQ,EAExC,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,0CAAE,IAAI,GAC3B,CACK,CACV,CACG,CACP,CACG,CACD;wBAEN,CAAC,UAAU,IAAI,CAAC,SAAS,IAAI,CAC5B,oBAAC,KAAK,CAAC,QAAQ;4BACb,oBAAC,MAAM,IACL,IAAI,EAAE,OAAO,IAAI,CAAC,mBAAmB,EACrC,OAAO,EAAE,uBAAuB,GAChC;4BACF,oBAAC,KAAK,IACJ,MAAM,EAAE,sBAAsB,KAAK,KAAK,EACxC,KAAK,EAAC,iBAAiB,EACvB,aAAa,EAAC,wBAAwB,EACtC,cAAc,EAAC,8BAA8B,EAC7C,aAAa,EAAC,6BAA6B,EAC3C,OAAO,EACL;oCACG,WAAW,IAAI,CACd,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,+DAA+D,EACzE,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;wCAErC,oBAAC,uBAAuB,IACtB,KAAK,EAAE,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,0CAAE,KAAK,KAAI,YAAY,EAChD,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,0CAAE,IAAI,GAC9B,CACK,CACV;oCACD,8BAAM,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAS;oCACjC,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,uDAAuD,EACjE,OAAO,EAAE,eAAe;wCAExB,oBAAC,uBAAuB,IACtB,KAAK,EAAE,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,0CAAE,KAAK,KAAI,MAAM,EAC/C,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,0CAAE,IAAI,GACnC,CACK;oCACT,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,4DAA4D,EACtE,OAAO,EAAE,2BAA2B,EACpC,SAAS;wCAET,oBAAC,uBAAuB,IACtB,KAAK,EAAE,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,0CAAE,KAAK,KAAI,SAAS,EACnD,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,0CAAE,IAAI,GACpC,CACK,CACR;gCAGL,+FAGI,CACE;4BACR,oBAAC,KAAK,IACJ,MAAM,EAAE,0BAA0B,KAAK,IAAI,EAC3C,KAAK,EAAC,+BAA+B,EACrC,aAAa,EAAC,mCAAmC,EACjD,cAAc,EAAC,wCAAwC,EACvD,aAAa,EAAC,uCAAuC,EACrD,OAAO,EACL;oCACE,8BAAM,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAS;oCACjC,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,4DAA4D,EACtE,OAAO,EAAE,wBAAwB,WAG1B;oCACT,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,kEAAkE,EAC5E,OAAO,EAAE,6BAA6B,EACtC,SAAS,qBAGF,CACR;gCAGL,iRAMI,CACE;4BAER,oBAAC,KAAK,IACJ,MAAM,EAAE,8BAA8B,EACtC,KAAK,EAAC,8BAA8B,EACpC,SAAS,EAAC,sCAAsC,EAChD,aAAa,EAAC,8CAA8C,EAC5D,cAAc,EAAC,uBAAuB,EACtC,aAAa,EAAC,sBAAsB,EACpC,OAAO,EACL;oCACG,WAAW,IAAI,CACd,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,8EAA8E,EACxF,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;wCAErC,oBAAC,uBAAuB,IACtB,KAAK,EAAE,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,0CAAE,KAAK,KAAI,YAAY,EAChD,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,0CAAE,IAAI,GAC9B,CACK,CACV;oCACD,8BAAM,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAS;oCACjC,gCACE,SAAS,EAAC,wEAAwE,EAClF,OAAO,EAAE,GAAG,EAAE,CACZ,iCAAiC,CAAC,KAAK,CAAC,aAInC;oCACT,gCACE,SAAS,EAAC,6EAA6E,EACvF,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;4CACb,iCAAiC,CAAC,KAAK,CAAC,CAAA;4CACxC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;wCACxB,CAAC,EACD,SAAS,sBAGF,CACR;gCAGL,2BAAG,SAAS,EAAC,8CAA8C;;oCAGxD,WAAW,IAAI,CACd,8BAAM,SAAS,EAAC,yDAAyD;wCACtE,GAAG;;wCACqB,GAAG;wCAC5B,+BACG,CAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,0CAAE,KAAK,KAAI,YAAY,CACxC;wCAAC,GAAG;mFAEH,CACR,CACC;gCACJ,oBAAC,YAAY,IAAC,SAAS,EAAC,yEAAyE,eAElF,CACT,CACO,CAClB,CACG,CAC4B,CACF,CACL,CACnB,CACjB,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport {\n createTheme as createMuiTheme,\n ThemeProvider,\n Tooltip,\n} from '@mui/material'\nimport { Prompt, useHistory } from 'react-router-dom'\nimport clsx from 'clsx'\nimport * as bulmaToast from 'bulma-toast'\nimport { localisationService, submissionService } from '@oneblink/apps'\nimport {\n FormTypes,\n FormsAppsTypes,\n ScheduledTasksTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport { attachmentsService } from '@oneblink/apps'\nimport * as H from 'history'\n\nimport Modal from './components/renderer/Modal'\nimport cleanFormSubmissionModel from './services/cleanFormSubmissionModel'\nimport PageFormElements from './components/renderer/PageFormElements'\nimport useFormValidation from './hooks/useFormValidation'\nimport useConditionalLogic from './hooks/useConditionalLogic'\nimport usePages from './hooks/usePages'\nimport useLookups from './hooks/useLookups'\nimport { FormDefinitionContext } from './hooks/useFormDefinition'\nimport { InjectPagesContext } from './hooks/useInjectPages'\nimport { FormElementOptionsContextProvider } from './hooks/useDynamicOptionsLoaderState'\nimport { FormElementLookupsContextProvider } from './hooks/useFormElementLookups'\nimport { GoogleMapsApiKeyContext } from './hooks/useGoogleMapsApiKey'\nimport { AbnLookupAuthenticationGuidContext } from './hooks/useAbnLookupAuthenticationGuid'\nimport { CaptchaSiteKeyContext } from './hooks/useCaptchaSiteKey'\nimport { FormIsReadOnlyContext } from './hooks/useFormIsReadOnly'\nimport { AttachmentBlobsProvider } from './hooks/attachments/useAttachmentBlobs'\nimport useIsOffline from './hooks/useIsOffline'\nimport CustomisableButtonInner from './components/renderer/CustomisableButtonInner'\nimport {\n ExecutedLookups,\n FormElementsValidation,\n NestedFormElementValueChangeHandler,\n SetFormSubmission,\n} from './types/form'\nimport checkBsbsAreInvalid from './services/checkBsbsAreInvalid'\nimport checkIfBsbsAreValidating from './services/checkIfBsbsAreValidating'\nimport checkIfAttachmentsExist from './services/checkIfAttachmentsExist'\nimport useAuth from './hooks/useAuth'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport { TaskContext } from './hooks/useTaskContext'\nimport { OnUploadAttachmentContext } from './hooks/useOnUploadAttachment'\nimport { injectOptionsAcrossAllElements } from './services/injectableOptions'\nimport MaterialIcon from './components/MaterialIcon'\n\nexport type OneBlinkReadOnlyFormProps = {\n /**\n * A [Google Maps API\n * Key](https://developers.google.com/maps/documentation/javascript/get-api-key).\n * Required if the form contains a `location` form element.\n */\n googleMapsApiKey?: string\n /** Hex colour value for certain inputs (defaults to `#4c8da7`). */\n primaryColour?: string\n /**\n * Pass a task if the user was attempting to complete a scheduled task via a\n * form submission\n */\n task?: ScheduledTasksTypes.Task\n /**\n * Pass a task group if the user was attempting to complete a scheduled task\n * associated with a group via a form submission\n */\n taskGroup?: ScheduledTasksTypes.TaskGroup\n /**\n * Pass a task group instance if the user was attempting to complete a\n * scheduled task associated with a group via a form submission\n */\n taskGroupInstance?: ScheduledTasksTypes.TaskGroupInstance\n}\n\nexport type OneBlinkFormBaseProps = OneBlinkReadOnlyFormProps & {\n /** The function to call when the user cancels the form */\n onCancel: () => unknown\n /**\n * The function to call when the user submits the form with valid submission\n * data. See\n * [NewFormSubmission](https://oneblink.github.io/apps/modules/submissionService.html#NewFormSubmission)\n * for the structure of the argument.\n */\n onSubmit: (newFormSubmission: submissionService.NewFormSubmission) => unknown\n /** Whether the form is currently able to be submitted. False by default. */\n disabled?: boolean\n /** Whether the form is in preview mode. False by default. */\n isPreview?: boolean\n /**\n * An [ABN Lookup Authentication\n * Guid](https://abr.business.gov.au/Tools/WebServices). Required if the form\n * contains a `abn` form element.\n */\n abnLookupAuthenticationGuid?: string\n /**\n * A [reCAPTCHA Site Key](https://developers.google.com/recaptcha/intro).\n * Required if the form contains a `captcha` form element.\n */\n captchaSiteKey?: string\n /** Change properties for certain buttons on the form. */\n buttons?: FormsAppsTypes.FormsListStyles['buttons']\n /** Number of days attachments are retained for. */\n attachmentRetentionInDays?: number\n /**\n * If set to `false`, submission will be prevented while offline. If set to\n * `true`, the user will be prompted to allow them to continue with\n * attachments uploading in the background later.\n */\n isPendingQueueEnabled: boolean\n /**\n * The function to call when the user wishes to save their submission data as\n * a draft submission. If not specified, drafts cannot be saved. See\n * [NewDraftSubmission](https://oneblink.github.io/apps/modules/submissionService.html#NewDraftSubmission)\n * for the structure of the argument.\n */\n onSaveDraft?: (\n newDraftSubmission: submissionService.NewDraftSubmission,\n ) => unknown\n /**\n * The function to call when the user needs to navigate away from the form.\n * e.g. `history.push`\n */\n handleNavigateAway?: () => unknown\n /**\n * Determines whether the form is submittable or not. Info page type forms\n * show a \"Done\" button instead of a \"Submit\" button. Defaults to\n * \"CALCULATED\"\n */\n isInfoPage?: 'YES' | 'NO' | 'CALCULATED'\n /**\n * The function to call when a user uploads an attachment through an element\n * that allows attachment upload. See\n * [uploadAttachment](https://oneblink.github.io/apps/modules/attachmentsService.html#uploadAttachment)\n * for the structure of the argument and a sample function to be used.\n */\n onUploadAttachment?: typeof attachmentsService.uploadAttachment\n}\n\nexport type OneBlinkFormUncontrolledProps = {\n /** The OneBlink Form to render */\n form: FormTypes.Form\n /** The initial submission data */\n initialSubmission?: SubmissionTypes.S3SubmissionData['submission']\n}\n\nexport type OneBlinkFormControlledProps = {\n definition: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n setFormSubmission: SetFormSubmission\n lastElementUpdated?: FormTypes.FormElement\n executedLookups: ExecutedLookups\n}\n\ntype Props = OneBlinkFormBaseProps &\n OneBlinkFormControlledProps & {\n isReadOnly: boolean\n }\n\nfunction OneBlinkFormBase({\n googleMapsApiKey,\n abnLookupAuthenticationGuid,\n captchaSiteKey,\n definition,\n disabled,\n isPreview,\n submission,\n isReadOnly,\n onCancel,\n onSubmit,\n onSaveDraft,\n setFormSubmission,\n buttons,\n primaryColour,\n attachmentRetentionInDays,\n isPendingQueueEnabled,\n handleNavigateAway,\n isInfoPage: isInfoPageProp,\n lastElementUpdated,\n executedLookups,\n task,\n taskGroup,\n taskGroupInstance,\n onUploadAttachment,\n}: Props) {\n const isOffline = useIsOffline()\n const { isUsingFormsKey, userProfile } = useAuth()\n\n const theme = React.useMemo(\n () =>\n createMuiTheme({\n palette: {\n primary: {\n main: primaryColour || '#4c8da7',\n },\n success: {\n main: '#4caf50',\n },\n },\n }),\n [primaryColour],\n )\n\n const isInfoPage = React.useMemo(() => {\n if (!!isInfoPageProp && isInfoPageProp !== 'CALCULATED') {\n return isInfoPageProp === 'YES'\n }\n return formElementsService.determineIsInfoPage(definition)\n }, [definition, isInfoPageProp])\n\n const taskContextValue = React.useMemo(() => {\n return {\n task,\n taskGroup,\n taskGroupInstance,\n }\n }, [task, taskGroup, taskGroupInstance])\n\n //\n //\n // #region Form Definition\n\n const pages = React.useMemo<FormTypes.PageElement[]>(() => {\n if (definition.isMultiPage) {\n return definition.elements.reduce(\n (\n pageElements: FormTypes.PageElement[],\n formElement: FormTypes.FormElement,\n ) => {\n if (formElement.type === 'page') {\n pageElements.push(formElement)\n }\n return pageElements\n },\n [],\n )\n } else {\n return [\n {\n type: 'page',\n id: definition.id.toString(),\n label: definition.name,\n elements: definition.elements,\n conditionallyShow: false,\n requiresAllConditionallyShowPredicates: false,\n },\n ]\n }\n }, [\n definition.elements,\n definition.id,\n definition.isMultiPage,\n definition.name,\n ])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Unsaved Changed\n\n const history = useHistory()\n\n const [\n { isDirty, isNavigationAllowed, hasConfirmedNavigation, goToLocation },\n setUnsavedChangesState,\n ] = React.useState<{\n isDirty: boolean\n isNavigationAllowed: boolean\n hasConfirmedNavigation: boolean | null\n goToLocation: H.Location | null\n }>({\n isDirty: false,\n isNavigationAllowed: false,\n hasConfirmedNavigation: null,\n goToLocation: null,\n })\n const [promptOfflineSubmissionAttempt, setPromptOfflineSubmissionAttempt] =\n React.useState<boolean>(false)\n const [promptUploadingAttachments, setPromptUploadingAttachments] =\n React.useState<boolean>(false)\n const handleBlockedNavigation = React.useCallback<\n (location: H.Location, action: H.Action) => string | boolean\n >((location) => {\n setUnsavedChangesState((current) => ({\n ...current,\n goToLocation: location,\n hasConfirmedNavigation: false,\n }))\n return false\n }, [])\n\n const handleKeepGoing = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n goToLocation: null,\n hasConfirmedNavigation: null,\n }))\n }, [])\n\n const handleDiscardUnsavedChanges = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n isNavigationAllowed: true,\n hasConfirmedNavigation: true,\n }))\n }, [])\n\n React.useEffect(() => {\n if (hasConfirmedNavigation) {\n // Navigate to the previous blocked location with your navigate function\n if (goToLocation) {\n history.push(`${goToLocation.pathname}${goToLocation.search}`)\n if (handleNavigateAway) {\n handleNavigateAway()\n }\n } else {\n onCancel()\n }\n }\n }, [\n goToLocation,\n handleNavigateAway,\n hasConfirmedNavigation,\n history,\n onCancel,\n ])\n\n const handleCancel = React.useCallback(() => {\n if (isDirty) {\n setUnsavedChangesState((current) => ({\n ...current,\n hasConfirmedNavigation: false,\n }))\n } else {\n onCancel()\n }\n }, [isDirty, onCancel])\n\n const allowNavigation = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n isNavigationAllowed: true,\n }))\n }, [])\n\n // #endregion Unsaved Changed\n //\n //\n\n //\n //\n // #region Conditional Logic\n\n const { formElementsConditionallyShown, conditionalLogicError } =\n useConditionalLogic(definition, submission)\n\n // #endregion\n //\n //\n\n //\n //\n // #region Validation\n\n const { validate } = useFormValidation(pages)\n\n const formElementsValidation = React.useMemo<\n FormElementsValidation | undefined\n >(\n () =>\n !isReadOnly\n ? validate(\n submission,\n formElementsConditionallyShown,\n executedLookups ?? {},\n )\n : undefined,\n [\n formElementsConditionallyShown,\n isReadOnly,\n submission,\n validate,\n executedLookups,\n ],\n )\n\n // #endregion\n //\n //\n\n //\n //\n // #region Pages\n\n const [hasAttemptedSubmit, setHasAttemptedSubmit] = React.useState(false)\n\n const {\n visiblePages,\n isFirstVisiblePage,\n isLastVisiblePage,\n isDisplayingCurrentPageError,\n isShowingMultiplePages,\n isStepsHeaderActive,\n toggleStepsNavigation,\n currentPageIndex,\n currentPage,\n currentPageNumber,\n checkDisplayPageError,\n setPageId,\n goToPreviousPage,\n goToNextPage,\n scrollToTopOfPageHTMLElementRef,\n } = usePages({\n hasAttemptedSubmit,\n pages,\n formElementsValidation,\n formElementsConditionallyShown,\n })\n\n // #endregion\n //\n //\n\n //\n //\n // #region Submissions\n\n const getCurrentSubmissionData = React.useCallback(\n (stripBinaryData: boolean) => {\n const { model, captchaTokens } = cleanFormSubmissionModel(\n submission,\n definition.elements,\n formElementsConditionallyShown,\n stripBinaryData,\n )\n return {\n submission: model,\n captchaTokens,\n }\n },\n [definition.elements, formElementsConditionallyShown, submission],\n )\n\n const obFormContainerHTMLElementRef = React.useRef<HTMLDivElement>(null)\n React.useEffect(() => {\n const obFormContainerHTMLElement = obFormContainerHTMLElementRef.current\n if (obFormContainerHTMLElement) {\n console.log(\n 'Setting toast notifications to be appended to HTML Element',\n obFormContainerHTMLElement,\n )\n bulmaToast.setDefaults({\n position: 'bottom-right',\n opacity: 0.95,\n appendTo: obFormContainerHTMLElement,\n })\n }\n return () => {\n bulmaToast.resetDefaults()\n }\n }, [])\n\n const checkAttachmentsCanBeSubmitted = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n // Prevent submission until all attachment uploads are finished\n // Unless the user is offline, in which case, the uploads will\n // be taken care of by a pending queue if enabled, otherwise\n // the user will be prompted to try again or save a draft.\n if (isOffline) {\n return true\n }\n const attachmentsAreUploading =\n attachmentsService.checkIfAttachmentsAreUploading(\n definition,\n submission,\n )\n\n if (attachmentsAreUploading) {\n if (isUsingFormsKey || !isPendingQueueEnabled) {\n bulmaToast.toast({\n message:\n 'Attachments are still uploading, please wait for them to finish before trying again.',\n type: 'is-primary',\n extraClasses: 'ob-toast cypress-still-uploading-toast',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return false\n } else {\n setPromptUploadingAttachments(true)\n return false\n }\n }\n\n return true\n },\n [definition, isOffline, isPendingQueueEnabled, isUsingFormsKey],\n )\n\n const checkBsbsCanBeSubmitted = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n return !checkBsbsAreInvalid(definition, submission)\n },\n [definition],\n )\n\n const checkBsbAreValidating = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n if (checkIfBsbsAreValidating(definition, submission)) {\n bulmaToast.toast({\n message:\n 'Bsb(s) are still being validated, please wait for them to finish before trying again.',\n type: 'is-primary',\n extraClasses: 'ob-toast cypress-still-validating-toast',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return false\n }\n\n return true\n },\n [definition],\n )\n\n const resetRecaptchas = React.useCallback(() => {\n const updatedModel = { ...submission }\n formElementsService.forEachFormElement(definition.elements, (element) => {\n if (element.type === 'captcha') {\n updatedModel[element.name] = undefined\n }\n })\n setHasAttemptedSubmit(false)\n setFormSubmission((current) => {\n return { ...current, submission: updatedModel }\n })\n }, [definition.elements, setFormSubmission, submission])\n\n const handleSubmit = React.useCallback(\n (\n event:\n | React.FormEvent<HTMLFormElement>\n | React.MouseEvent<HTMLButtonElement, MouseEvent>,\n continueWhilstAttachmentsAreUploading: boolean,\n ) => {\n event.preventDefault()\n if (disabled || isReadOnly) return\n setHasAttemptedSubmit(true)\n\n const submissionData = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submissionData.submission)) {\n return\n }\n if (formElementsValidation) {\n console.log('Validation errors', formElementsValidation)\n bulmaToast.toast({\n message: 'Please fix validation errors',\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n if (!checkBsbsCanBeSubmitted(submissionData.submission)) {\n return\n }\n if (\n !continueWhilstAttachmentsAreUploading &&\n !checkAttachmentsCanBeSubmitted(submissionData.submission)\n ) {\n return\n }\n // check if attachments exist\n const newSubmission = checkIfAttachmentsExist(\n definition,\n submissionData.submission,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n submission: newSubmission,\n }))\n bulmaToast.toast({\n message:\n \"Some files that were included in your submission have been removed based on your administrator's data retention policy, please remove them and upload them again.\",\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n\n if (isOffline && !isPendingQueueEnabled) {\n console.log('User is offline and form does not support a pending queue')\n setPromptOfflineSubmissionAttempt(true)\n return\n }\n\n allowNavigation()\n\n // transplant injected options on the definition\n const elementsWithInjectedOptions = injectOptionsAcrossAllElements({\n elements: definition.elements,\n submission: submissionData.submission,\n taskContext: taskContextValue,\n userProfile: userProfile ?? undefined,\n })\n onSubmit({\n definition: {\n ...definition,\n elements: elementsWithInjectedOptions,\n },\n submission: submissionData.submission,\n captchaTokens: submissionData.captchaTokens,\n })\n resetRecaptchas()\n },\n [\n disabled,\n isReadOnly,\n getCurrentSubmissionData,\n checkBsbAreValidating,\n formElementsValidation,\n checkBsbsCanBeSubmitted,\n checkAttachmentsCanBeSubmitted,\n definition,\n attachmentRetentionInDays,\n isOffline,\n isPendingQueueEnabled,\n allowNavigation,\n taskContextValue,\n userProfile,\n onSubmit,\n resetRecaptchas,\n setFormSubmission,\n ],\n )\n\n const handleSaveDraft = React.useCallback(\n (continueWhilstAttachmentsAreUploading: boolean) => {\n if (disabled) return\n if (onSaveDraft) {\n allowNavigation()\n\n // For drafts we don't need to save the captcha tokens,\n // they will need to prove they are not robot again\n const { submission } = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submission)) {\n return\n }\n if (\n !continueWhilstAttachmentsAreUploading &&\n !checkAttachmentsCanBeSubmitted(submission)\n ) {\n return\n }\n onSaveDraft({\n definition,\n submission,\n backgroundUpload: continueWhilstAttachmentsAreUploading,\n lastElementUpdated,\n })\n }\n },\n [\n allowNavigation,\n checkAttachmentsCanBeSubmitted,\n definition,\n disabled,\n getCurrentSubmissionData,\n onSaveDraft,\n checkBsbAreValidating,\n lastElementUpdated,\n ],\n )\n\n const handleContinueWithAttachments = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n setPromptUploadingAttachments(false)\n if (hasAttemptedSubmit) {\n handleSubmit(e, true)\n } else {\n handleSaveDraft(true)\n }\n },\n [\n handleSubmit,\n setPromptUploadingAttachments,\n hasAttemptedSubmit,\n handleSaveDraft,\n ],\n )\n const handleWaitForAttachments = React.useCallback(() => {\n setPromptUploadingAttachments(false)\n }, [setPromptUploadingAttachments])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Lookups\n\n const { handlePagesLookupResult } = useLookups(\n definition.id,\n setFormSubmission,\n )\n\n // #endregion\n //\n //\n\n //\n //\n // #region Submission/Definition Changes\n\n const handleChange = React.useCallback<NestedFormElementValueChangeHandler>(\n (element, { value, executedLookups }) => {\n if (\n //This will ensure on a read only form that the summary and calculation elements\n //can still be displayed as it needs handleChange so it can render\n //due to the dynamic nature of the summary element.\n (disabled &&\n element.type !== 'summary' &&\n element.type !== 'calculation') ||\n element.type === 'page' ||\n element.type === 'section'\n ) {\n return\n }\n\n setUnsavedChangesState((current) => ({\n ...current,\n isDirty: true,\n }))\n // dont update the last element updated for elements the user cannot set the value of\n if (element.type === 'summary' || element.type === 'calculation') {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n submission: {\n ...currentFormSubmission.submission,\n [element.name]:\n typeof value === 'function'\n ? value(currentFormSubmission.submission[element.name])\n : value,\n },\n }))\n } else {\n setFormSubmission((currentFormSubmission) => {\n return {\n ...currentFormSubmission,\n submission: {\n ...currentFormSubmission.submission,\n [element.name]:\n typeof value === 'function'\n ? value(currentFormSubmission.submission[element.name])\n : value,\n },\n lastElementUpdated: element,\n executedLookups: {\n ...currentFormSubmission.executedLookups,\n [element.name]:\n typeof executedLookups === 'function'\n ? executedLookups(\n currentFormSubmission.executedLookups?.[element.name],\n )\n : executedLookups,\n },\n }\n })\n }\n },\n [disabled, setFormSubmission],\n )\n\n // #endregion\n //\n //\n\n const lastElementUpdatedExistsOnForm = React.useMemo(() => {\n return !!formElementsService.findFormElement(\n definition.elements,\n (el) => el.id === lastElementUpdated?.id,\n )\n }, [definition.elements, lastElementUpdated])\n\n const lastElementUpdatedPage = React.useMemo(() => {\n return definition.elements.find((pageElement: FormTypes.FormElement) => {\n if (pageElement.type === 'page') {\n return formElementsService.findFormElement(\n pageElement.elements,\n (el) => el.id === lastElementUpdated?.id,\n )\n }\n })\n }, [lastElementUpdated, definition])\n\n const [hasResumed, setHasResumed] = React.useState(false)\n React.useEffect(() => {\n if (!hasResumed) {\n if (lastElementUpdated && lastElementUpdatedExistsOnForm) {\n if (lastElementUpdatedPage) {\n setPageId(lastElementUpdatedPage.id)\n }\n const element = document.getElementById(lastElementUpdated.id)\n if (element) {\n window.requestAnimationFrame(() => {\n element.scrollIntoView({ behavior: 'smooth' })\n })\n }\n }\n setHasResumed(true)\n }\n }, [\n lastElementUpdated,\n hasResumed,\n lastElementUpdatedPage,\n lastElementUpdatedExistsOnForm,\n setPageId,\n ])\n\n if (conditionalLogicError) {\n return (\n <>\n <div className=\"has-text-centered\">\n <MaterialIcon className=\"has-text-warning icon-x-large\">\n error\n </MaterialIcon>\n <h3 className=\"title is-3\">Bad Form Configuration</h3>\n <p className=\"cypress-conditional-logic-error-message\">\n {conditionalLogicError.message}\n </p>\n <p className=\"has-text-grey\">\n {localisationService.formatDatetimeLong(new Date())}\n </p>\n </div>\n </>\n )\n }\n\n return (\n <ThemeProvider theme={theme}>\n <FormDefinitionContext.Provider value={definition}>\n <FormElementOptionsContextProvider>\n <FormElementLookupsContextProvider>\n <div\n className=\"ob-form-container\"\n ref={obFormContainerHTMLElementRef}\n >\n <form\n name=\"obForm\"\n className={`ob-form cypress-ob-form ob-form__page-${\n currentPageIndex + 1\n }`}\n noValidate\n onSubmit={(e) => handleSubmit(e, false)}\n >\n <div>\n <div ref={scrollToTopOfPageHTMLElementRef} />\n {isShowingMultiplePages && (\n <div\n className={clsx('ob-steps-navigation', {\n 'is-active': isStepsHeaderActive,\n })}\n >\n <div\n className={clsx('ob-steps-navigation__header', {\n 'is-active': isStepsHeaderActive,\n })}\n onClick={toggleStepsNavigation}\n >\n <span className=\"icon is-invisible\">\n <MaterialIcon>keyboard_arrow_down</MaterialIcon>\n </span>\n <div className=\"steps-header-active-page\">\n {isDisplayingCurrentPageError ? (\n <span className=\"icon\">\n <MaterialIcon className=\"has-text-danger is-size-4\">\n warning\n </MaterialIcon>\n </span>\n ) : (\n <span className=\"steps-header-active-page-icon\">\n {currentPageNumber}\n </span>\n )}\n <span className=\"steps-header-active-page-label cypress-tablet-step-title\">\n {currentPage ? currentPage.label : ''}\n </span>\n </div>\n <span className=\"dropdown icon\">\n <MaterialIcon>keyboard_arrow_down</MaterialIcon>\n </span>\n </div>\n\n <div\n className={clsx('ob-steps-navigation__steps', {\n 'is-active': isStepsHeaderActive,\n })}\n >\n <div className=\"steps is-small is-horizontal-tablet cypress-steps\">\n {visiblePages.map(\n (page: FormTypes.PageElement, index: number) => {\n const hasErrors = checkDisplayPageError(page)\n return (\n <div\n key={page.id}\n id={`steps-navigation-step-${page.id}`}\n className={clsx(\n 'step-item cypress-step-item',\n {\n 'is-active': currentPage.id === page.id,\n 'is-completed': currentPageIndex > index,\n 'is-error': hasErrors,\n },\n )}\n onClick={(e) => {\n e.stopPropagation()\n if (page.id !== currentPage.id) {\n setPageId(page.id)\n }\n }}\n >\n <div\n className=\"step-marker step-marker-error ob-step-marker cypress-step-marker\"\n // @ts-expect-error ???\n name={`cypress-page-stepper-${index + 1}`}\n value={index + 1}\n >\n {hasErrors ? (\n <Tooltip title=\"Page has errors\">\n <span className=\"icon tooltip has-tooltip-top cypress-page-error\">\n <MaterialIcon className=\"has-text-danger is-size-3\">\n warning\n </MaterialIcon>\n </span>\n </Tooltip>\n ) : (\n <span>{index + 1}</span>\n )}\n </div>\n <div className=\"step-details ob-step-details\">\n <p className=\"step-title ob-step-title cypress-desktop-step-title\">\n {page.label}\n </p>\n </div>\n </div>\n )\n },\n )}\n </div>\n </div>\n </div>\n )}\n\n <div\n className={clsx('ob-steps-navigation__background', {\n 'is-active': isStepsHeaderActive,\n })}\n onClick={toggleStepsNavigation}\n />\n\n <div className=\"steps\">\n <div\n className={clsx('steps-content', {\n 'is-single-step': !isShowingMultiplePages,\n })}\n >\n <InjectPagesContext.Provider\n value={handlePagesLookupResult}\n >\n <GoogleMapsApiKeyContext.Provider\n value={googleMapsApiKey}\n >\n <AbnLookupAuthenticationGuidContext.Provider\n value={abnLookupAuthenticationGuid}\n >\n <CaptchaSiteKeyContext.Provider\n value={captchaSiteKey}\n >\n <AttachmentBlobsProvider>\n <FormIsReadOnlyContext.Provider\n value={isReadOnly}\n >\n <TaskContext.Provider\n value={taskContextValue}\n >\n <OnUploadAttachmentContext.Provider\n value={onUploadAttachment}\n >\n {visiblePages.map(\n (\n pageElement: FormTypes.PageElement,\n ) => (\n <PageFormElements\n key={pageElement.id}\n isActive={\n pageElement.id === currentPage.id\n }\n formId={definition.id}\n formElementsConditionallyShown={\n formElementsConditionallyShown\n }\n formElementsValidation={\n formElementsValidation\n }\n displayValidationMessages={\n hasAttemptedSubmit ||\n isDisplayingCurrentPageError\n }\n pageElement={pageElement}\n onChange={handleChange}\n model={submission}\n setFormSubmission={\n setFormSubmission\n }\n />\n ),\n )}\n </OnUploadAttachmentContext.Provider>\n </TaskContext.Provider>\n </FormIsReadOnlyContext.Provider>\n </AttachmentBlobsProvider>\n </CaptchaSiteKeyContext.Provider>\n </AbnLookupAuthenticationGuidContext.Provider>\n </GoogleMapsApiKeyContext.Provider>\n </InjectPagesContext.Provider>\n </div>\n\n {isShowingMultiplePages && (\n <div className=\"steps-actions\">\n <div className=\"steps-action\">\n <button\n type=\"button\"\n onClick={goToPreviousPage}\n disabled={isFirstVisiblePage}\n className=\"button is-light cypress-pages-previous\"\n >\n <span className=\"icon\">\n <MaterialIcon>keyboard_arrow_left</MaterialIcon>\n </span>\n <span>Back</span>\n </button>\n </div>\n <div className=\"step-progress-mobile cypress-steps-mobile\">\n {visiblePages.map(\n (page: FormTypes.PageElement, index) => (\n <div\n key={page.id}\n className={clsx('step-progress-mobile-dot', {\n 'is-active': currentPage.id === page.id,\n 'is-completed': currentPageIndex > index,\n 'has-background-danger':\n currentPage.id !== page.id &&\n checkDisplayPageError(page),\n })}\n />\n ),\n )}\n </div>\n <div className=\"steps-action\">\n <button\n type=\"button\"\n onClick={goToNextPage}\n disabled={isLastVisiblePage}\n className=\"button is-light cypress-pages-next\"\n >\n <span>Next</span>\n <span className=\"icon\">\n <MaterialIcon>keyboard_arrow_right</MaterialIcon>\n </span>\n </button>\n </div>\n </div>\n )}\n </div>\n {!isReadOnly && (\n <div className=\"buttons ob-buttons ob-buttons-submit\">\n {onSaveDraft && !isInfoPage && (\n <button\n type=\"button\"\n className=\"button ob-button is-primary ob-button-save-draft cypress-save-draft-form\"\n onClick={() => handleSaveDraft(false)}\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={buttons?.saveDraft?.label || 'Save Draft'}\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span className=\"ob-buttons-submit__spacer\"></span>\n {!isInfoPage && (\n <button\n type=\"button\"\n className=\"button ob-button is-light ob-button-submit-cancel cypress-cancel-form\"\n onClick={handleCancel}\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={buttons?.cancel?.label || 'Cancel'}\n icon={buttons?.cancel?.icon}\n />\n </button>\n )}\n {isLastVisiblePage && (\n <button\n type=\"submit\"\n className=\"button ob-button is-success ob-button-submit cypress-submit-form-button cypress-submit-form\"\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={\n isInfoPage\n ? 'Done'\n : buttons?.submit?.label || 'Submit'\n }\n icon={buttons?.submit?.icon}\n />\n </button>\n )}\n </div>\n )}\n </div>\n </form>\n\n {!isReadOnly && !isPreview && (\n <React.Fragment>\n <Prompt\n when={isDirty && !isNavigationAllowed}\n message={handleBlockedNavigation}\n />\n <Modal\n isOpen={hasConfirmedNavigation === false}\n title=\"Unsaved Changes\"\n cardClassName=\"cypress-cancel-confirm\"\n titleClassName=\"cypress-cancel-confirm-title\"\n bodyClassName=\"cypress-cancel-confirm-body\"\n actions={\n <>\n {onSaveDraft && (\n <button\n type=\"button\"\n className=\"button ob-button is-success cypress-cancel-confirm-save-draft\"\n onClick={() => handleSaveDraft(false)}\n >\n <CustomisableButtonInner\n label={buttons?.saveDraft?.label || 'Save Draft'}\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span style={{ flex: 1 }}></span>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-cancel-confirm-back\"\n onClick={handleKeepGoing}\n >\n <CustomisableButtonInner\n label={buttons?.cancelPromptNo?.label || 'Back'}\n icon={buttons?.cancelPromptNo?.icon}\n />\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-cancel-confirm-discard\"\n onClick={handleDiscardUnsavedChanges}\n autoFocus\n >\n <CustomisableButtonInner\n label={buttons?.cancelPromptYes?.label || 'Discard'}\n icon={buttons?.cancelPromptYes?.icon}\n />\n </button>\n </>\n }\n >\n <p>\n You have unsaved changes, are you sure you want discard\n them?\n </p>\n </Modal>\n <Modal\n isOpen={promptUploadingAttachments === true}\n title=\"Attachment upload in progress\"\n cardClassName=\"cypress-attachments-wait-continue\"\n titleClassName=\"cypress-attachments-confirm-wait-title\"\n bodyClassName=\"cypress-attachments-confirm-wait-body\"\n actions={\n <>\n <span style={{ flex: 1 }}></span>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-attachments-confirm-wait\"\n onClick={handleWaitForAttachments}\n >\n Wait\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-attachments-confirm-continue\"\n onClick={handleContinueWithAttachments}\n autoFocus\n >\n Continue\n </button>\n </>\n }\n >\n <p>\n Your attachments are still uploading, do you want to wait\n for the uploads to complete or continue using the app? If\n you click continue the attachments will upload in the\n background. Do not close the app until the upload has been\n completed.\n </p>\n </Modal>\n\n <Modal\n isOpen={promptOfflineSubmissionAttempt}\n title=\"It looks like you're Offline\"\n className=\"ob-modal__offline-submission-attempt\"\n cardClassName=\"cypress-submission-offline has-text-centered\"\n titleClassName=\"cypress-offline-title\"\n bodyClassName=\"cypress-offline-body\"\n actions={\n <>\n {onSaveDraft && (\n <button\n type=\"button\"\n className=\"button ob-button ob-button__offline-submission-attempt-save-draft is-success\"\n onClick={() => handleSaveDraft(false)}\n >\n <CustomisableButtonInner\n label={buttons?.saveDraft?.label || 'Save Draft'}\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span style={{ flex: 1 }}></span>\n <button\n className=\"button ob-button ob-button__offline-submission-attempt-cancel is-light\"\n onClick={() =>\n setPromptOfflineSubmissionAttempt(false)\n }\n >\n Cancel\n </button>\n <button\n className=\"button ob-button ob-button__offline-submission-attempt-try-again is-primary\"\n onClick={(e) => {\n setPromptOfflineSubmissionAttempt(false)\n handleSubmit(e, false)\n }}\n autoFocus\n >\n Try Again\n </button>\n </>\n }\n >\n <p className=\"ob-modal__offline-submission-attempt-message\">\n You cannot submit this form while offline, please try\n again when connectivity is restored.\n {onSaveDraft && (\n <span className=\"ob-modal__offline-submission-attempt-save-draft-message\">\n {' '}\n Alternatively, click the{' '}\n <b>\n {buttons?.saveDraft?.label || 'Save Draft'}\n </b>{' '}\n button below to come back to this later.\n </span>\n )}\n </p>\n <MaterialIcon className=\"has-text-warning icon-x-large ob-modal__offline-submission-attempt-icon\">\n wifi_off\n </MaterialIcon>\n </Modal>\n </React.Fragment>\n )}\n </div>\n </FormElementLookupsContextProvider>\n </FormElementOptionsContextProvider>\n </FormDefinitionContext.Provider>\n </ThemeProvider>\n )\n}\n\nexport default React.memo(OneBlinkFormBase)\n"]}
1
+ {"version":3,"file":"OneBlinkFormBase.js","sourceRoot":"","sources":["../src/OneBlinkFormBase.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport {\n createTheme as createMuiTheme,\n ThemeProvider,\n Tooltip,\n} from '@mui/material'\nimport { Prompt, useHistory } from 'react-router-dom'\nimport clsx from 'clsx'\nimport * as bulmaToast from 'bulma-toast'\nimport { localisationService, submissionService } from '@oneblink/apps'\nimport {\n FormTypes,\n FormsAppsTypes,\n ScheduledTasksTypes,\n SubmissionTypes,\n} from '@oneblink/types'\nimport { attachmentsService } from '@oneblink/apps'\nimport * as H from 'history'\n\nimport Modal from './components/renderer/Modal'\nimport cleanFormSubmissionModel from './services/cleanFormSubmissionModel'\nimport PageFormElements from './components/renderer/PageFormElements'\nimport useFormValidation from './hooks/useFormValidation'\nimport useConditionalLogic from './hooks/useConditionalLogic'\nimport usePages from './hooks/usePages'\nimport useLookups from './hooks/useLookups'\nimport { FormDefinitionContext } from './hooks/useFormDefinition'\nimport { InjectPagesContext } from './hooks/useInjectPages'\nimport { FormElementOptionsContextProvider } from './hooks/useDynamicOptionsLoaderState'\nimport { FormElementLookupsContextProvider } from './hooks/useFormElementLookups'\nimport { GoogleMapsApiKeyContext } from './hooks/useGoogleMapsApiKey'\nimport { AbnLookupAuthenticationGuidContext } from './hooks/useAbnLookupAuthenticationGuid'\nimport { CaptchaSiteKeyContext } from './hooks/useCaptchaSiteKey'\nimport { FormIsReadOnlyContext } from './hooks/useFormIsReadOnly'\nimport { AttachmentBlobsProvider } from './hooks/attachments/useAttachmentBlobs'\nimport useIsOffline from './hooks/useIsOffline'\nimport CustomisableButtonInner from './components/renderer/CustomisableButtonInner'\nimport {\n ExecutedLookups,\n FormElementsValidation,\n NestedFormElementValueChangeHandler,\n SetFormSubmission,\n} from './types/form'\nimport checkBsbsAreInvalid from './services/checkBsbsAreInvalid'\nimport checkIfBsbsAreValidating from './services/checkIfBsbsAreValidating'\nimport checkIfAttachmentsExist from './services/checkIfAttachmentsExist'\nimport useAuth from './hooks/useAuth'\nimport { formElementsService } from '@oneblink/sdk-core'\nimport { TaskContext } from './hooks/useTaskContext'\nimport { OnUploadAttachmentContext } from './hooks/useOnUploadAttachment'\nimport { injectOptionsAcrossAllElements } from './services/injectableOptions'\nimport MaterialIcon from './components/MaterialIcon'\n\nexport type OneBlinkReadOnlyFormProps = {\n /**\n * A [Google Maps API\n * Key](https://developers.google.com/maps/documentation/javascript/get-api-key).\n * Required if the form contains a `location` form element.\n */\n googleMapsApiKey?: string\n /** Hex colour value for certain inputs (defaults to `#4c8da7`). */\n primaryColour?: string\n /**\n * Pass a task if the user was attempting to complete a scheduled task via a\n * form submission\n */\n task?: ScheduledTasksTypes.Task\n /**\n * Pass a task group if the user was attempting to complete a scheduled task\n * associated with a group via a form submission\n */\n taskGroup?: ScheduledTasksTypes.TaskGroup\n /**\n * Pass a task group instance if the user was attempting to complete a\n * scheduled task associated with a group via a form submission\n */\n taskGroupInstance?: ScheduledTasksTypes.TaskGroupInstance\n}\n\nexport type OneBlinkFormBaseProps = OneBlinkReadOnlyFormProps & {\n /** The function to call when the user cancels the form */\n onCancel: () => unknown\n /**\n * The function to call when the user submits the form with valid submission\n * data. See\n * [NewFormSubmission](https://oneblink.github.io/apps/modules/submissionService.html#NewFormSubmission)\n * for the structure of the argument.\n */\n onSubmit: (newFormSubmission: submissionService.NewFormSubmission) => unknown\n /** Whether the form is currently able to be submitted. False by default. */\n disabled?: boolean\n /** Whether the form is in preview mode. False by default. */\n isPreview?: boolean\n /**\n * An [ABN Lookup Authentication\n * Guid](https://abr.business.gov.au/Tools/WebServices). Required if the form\n * contains a `abn` form element.\n */\n abnLookupAuthenticationGuid?: string\n /**\n * A [reCAPTCHA Site Key](https://developers.google.com/recaptcha/intro).\n * Required if the form contains a `captcha` form element.\n */\n captchaSiteKey?: string\n /** Change properties for certain buttons on the form. */\n buttons?: FormsAppsTypes.FormsListStyles['buttons']\n /** Number of days attachments are retained for. */\n attachmentRetentionInDays?: number\n /**\n * If set to `false`, submission will be prevented while offline. If set to\n * `true`, the user will be prompted to allow them to continue with\n * attachments uploading in the background later.\n */\n isPendingQueueEnabled: boolean\n /**\n * The function to call when the user wishes to save their submission data as\n * a draft submission. If not specified, drafts cannot be saved. See\n * [NewDraftSubmission](https://oneblink.github.io/apps/modules/submissionService.html#NewDraftSubmission)\n * for the structure of the argument.\n */\n onSaveDraft?: (\n newDraftSubmission: submissionService.NewDraftSubmission,\n ) => unknown\n /**\n * The function to call when the user needs to navigate away from the form.\n * e.g. `history.push`\n */\n handleNavigateAway?: () => unknown\n /**\n * Determines whether the form is submittable or not. Info page type forms\n * show a \"Done\" button instead of a \"Submit\" button. Defaults to\n * \"CALCULATED\"\n */\n isInfoPage?: 'YES' | 'NO' | 'CALCULATED'\n /**\n * The function to call when a user uploads an attachment through an element\n * that allows attachment upload. See\n * [uploadAttachment](https://oneblink.github.io/apps/modules/attachmentsService.html#uploadAttachment)\n * for the structure of the argument and a sample function to be used.\n */\n onUploadAttachment?: typeof attachmentsService.uploadAttachment\n}\n\nexport type OneBlinkFormUncontrolledProps = {\n /** The OneBlink Form to render */\n form: FormTypes.Form\n /** The initial submission data */\n initialSubmission?: SubmissionTypes.S3SubmissionData['submission']\n}\n\nexport type OneBlinkFormControlledProps = {\n definition: FormTypes.Form\n submission: SubmissionTypes.S3SubmissionData['submission']\n setFormSubmission: SetFormSubmission\n lastElementUpdated?: FormTypes.FormElement\n executedLookups: ExecutedLookups\n}\n\ntype Props = OneBlinkFormBaseProps &\n OneBlinkFormControlledProps & {\n isReadOnly: boolean\n }\n\nfunction OneBlinkFormBase({\n googleMapsApiKey,\n abnLookupAuthenticationGuid,\n captchaSiteKey,\n definition,\n disabled,\n isPreview,\n submission,\n isReadOnly,\n onCancel,\n onSubmit,\n onSaveDraft,\n setFormSubmission,\n buttons,\n primaryColour,\n attachmentRetentionInDays,\n isPendingQueueEnabled,\n handleNavigateAway,\n isInfoPage: isInfoPageProp,\n lastElementUpdated,\n executedLookups,\n task,\n taskGroup,\n taskGroupInstance,\n onUploadAttachment,\n}: Props) {\n const isOffline = useIsOffline()\n const { isUsingFormsKey, userProfile } = useAuth()\n\n const theme = React.useMemo(\n () =>\n createMuiTheme({\n palette: {\n primary: {\n main: primaryColour || '#4c8da7',\n },\n success: {\n main: '#4caf50',\n },\n },\n }),\n [primaryColour],\n )\n\n const isInfoPage = React.useMemo(() => {\n if (!!isInfoPageProp && isInfoPageProp !== 'CALCULATED') {\n return isInfoPageProp === 'YES'\n }\n return formElementsService.determineIsInfoPage(definition)\n }, [definition, isInfoPageProp])\n\n const taskContextValue = React.useMemo(() => {\n return {\n task,\n taskGroup,\n taskGroupInstance,\n }\n }, [task, taskGroup, taskGroupInstance])\n\n //\n //\n // #region Form Definition\n\n const pages = React.useMemo<FormTypes.PageElement[]>(() => {\n if (definition.isMultiPage) {\n return definition.elements.reduce(\n (\n pageElements: FormTypes.PageElement[],\n formElement: FormTypes.FormElement,\n ) => {\n if (formElement.type === 'page') {\n pageElements.push(formElement)\n }\n return pageElements\n },\n [],\n )\n } else {\n return [\n {\n type: 'page',\n id: definition.id.toString(),\n label: definition.name,\n elements: definition.elements,\n conditionallyShow: false,\n requiresAllConditionallyShowPredicates: false,\n },\n ]\n }\n }, [\n definition.elements,\n definition.id,\n definition.isMultiPage,\n definition.name,\n ])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Unsaved Changed\n\n const history = useHistory()\n\n const [\n { isDirty, isNavigationAllowed, hasConfirmedNavigation, goToLocation },\n setUnsavedChangesState,\n ] = React.useState<{\n isDirty: boolean\n isNavigationAllowed: boolean\n hasConfirmedNavigation: boolean | null\n goToLocation: H.Location | null\n }>({\n isDirty: false,\n isNavigationAllowed: false,\n hasConfirmedNavigation: null,\n goToLocation: null,\n })\n const [promptOfflineSubmissionAttempt, setPromptOfflineSubmissionAttempt] =\n React.useState<boolean>(false)\n const [promptUploadingAttachments, setPromptUploadingAttachments] =\n React.useState<boolean>(false)\n const handleBlockedNavigation = React.useCallback<\n (location: H.Location, action: H.Action) => string | boolean\n >((location) => {\n setUnsavedChangesState((current) => ({\n ...current,\n goToLocation: location,\n hasConfirmedNavigation: false,\n }))\n return false\n }, [])\n\n const handleKeepGoing = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n goToLocation: null,\n hasConfirmedNavigation: null,\n }))\n }, [])\n\n const handleDiscardUnsavedChanges = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n isNavigationAllowed: true,\n hasConfirmedNavigation: true,\n }))\n }, [])\n\n React.useEffect(() => {\n if (hasConfirmedNavigation) {\n // Navigate to the previous blocked location with your navigate function\n if (goToLocation) {\n history.push(`${goToLocation.pathname}${goToLocation.search}`)\n if (handleNavigateAway) {\n handleNavigateAway()\n }\n } else {\n onCancel()\n }\n }\n }, [\n goToLocation,\n handleNavigateAway,\n hasConfirmedNavigation,\n history,\n onCancel,\n ])\n\n const handleCancel = React.useCallback(() => {\n if (isDirty) {\n setUnsavedChangesState((current) => ({\n ...current,\n hasConfirmedNavigation: false,\n }))\n } else {\n onCancel()\n }\n }, [isDirty, onCancel])\n\n const allowNavigation = React.useCallback(() => {\n setUnsavedChangesState((current) => ({\n ...current,\n isNavigationAllowed: true,\n }))\n }, [])\n\n // #endregion Unsaved Changed\n //\n //\n\n //\n //\n // #region Conditional Logic\n\n const { formElementsConditionallyShown, conditionalLogicError } =\n useConditionalLogic(definition, submission)\n\n // #endregion\n //\n //\n\n //\n //\n // #region Validation\n\n const { validate } = useFormValidation(pages)\n\n const formElementsValidation = React.useMemo<\n FormElementsValidation | undefined\n >(\n () =>\n !isReadOnly\n ? validate(\n submission,\n formElementsConditionallyShown,\n executedLookups ?? {},\n )\n : undefined,\n [\n formElementsConditionallyShown,\n isReadOnly,\n submission,\n validate,\n executedLookups,\n ],\n )\n\n // #endregion\n //\n //\n\n //\n //\n // #region Pages\n\n const [hasAttemptedSubmit, setHasAttemptedSubmit] = React.useState(false)\n\n const {\n visiblePages,\n isFirstVisiblePage,\n isLastVisiblePage,\n isDisplayingCurrentPageError,\n isShowingMultiplePages,\n isStepsHeaderActive,\n toggleStepsNavigation,\n currentPageIndex,\n currentPage,\n currentPageNumber,\n checkDisplayPageError,\n setPageId,\n goToPreviousPage,\n goToNextPage,\n scrollToTopOfPageHTMLElementRef,\n } = usePages({\n hasAttemptedSubmit,\n pages,\n formElementsValidation,\n formElementsConditionallyShown,\n })\n\n // #endregion\n //\n //\n\n //\n //\n // #region Submissions\n\n const getCurrentSubmissionData = React.useCallback(\n (stripBinaryData: boolean) => {\n const { model, captchaTokens } = cleanFormSubmissionModel(\n submission,\n definition.elements,\n formElementsConditionallyShown,\n stripBinaryData,\n )\n return {\n submission: model,\n captchaTokens,\n }\n },\n [definition.elements, formElementsConditionallyShown, submission],\n )\n\n const obFormContainerHTMLElementRef = React.useRef<HTMLDivElement>(null)\n React.useEffect(() => {\n const obFormContainerHTMLElement = obFormContainerHTMLElementRef.current\n if (obFormContainerHTMLElement) {\n console.log(\n 'Setting toast notifications to be appended to HTML Element',\n obFormContainerHTMLElement,\n )\n bulmaToast.setDefaults({\n position: 'bottom-right',\n opacity: 0.95,\n appendTo: obFormContainerHTMLElement,\n })\n }\n return () => {\n bulmaToast.resetDefaults()\n }\n }, [])\n\n const checkAttachmentsCanBeSubmitted = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n // Prevent submission until all attachment uploads are finished\n // Unless the user is offline, in which case, the uploads will\n // be taken care of by a pending queue if enabled, otherwise\n // the user will be prompted to try again or save a draft.\n if (isOffline) {\n return true\n }\n const attachmentsAreUploading =\n attachmentsService.checkIfAttachmentsAreUploading(\n definition,\n submission,\n )\n\n if (attachmentsAreUploading) {\n if (isUsingFormsKey || !isPendingQueueEnabled) {\n bulmaToast.toast({\n message:\n 'Attachments are still uploading, please wait for them to finish before trying again.',\n type: 'is-primary',\n extraClasses: 'ob-toast cypress-still-uploading-toast',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return false\n } else {\n setPromptUploadingAttachments(true)\n return false\n }\n }\n\n return true\n },\n [definition, isOffline, isPendingQueueEnabled, isUsingFormsKey],\n )\n\n const checkBsbsCanBeSubmitted = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n return !checkBsbsAreInvalid(definition, submission)\n },\n [definition],\n )\n\n const checkBsbAreValidating = React.useCallback(\n (submission: SubmissionTypes.S3SubmissionData['submission']) => {\n if (checkIfBsbsAreValidating(definition, submission)) {\n bulmaToast.toast({\n message:\n 'Bsb(s) are still being validated, please wait for them to finish before trying again.',\n type: 'is-primary',\n extraClasses: 'ob-toast cypress-still-validating-toast',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return false\n }\n\n return true\n },\n [definition],\n )\n\n const resetRecaptchas = React.useCallback(() => {\n const updatedModel = { ...submission }\n formElementsService.forEachFormElement(definition.elements, (element) => {\n if (element.type === 'captcha') {\n updatedModel[element.name] = undefined\n }\n })\n setHasAttemptedSubmit(false)\n setFormSubmission((current) => {\n return { ...current, submission: updatedModel }\n })\n }, [definition.elements, setFormSubmission, submission])\n\n const handleSubmit = React.useCallback(\n (\n event:\n | React.FormEvent<HTMLFormElement>\n | React.MouseEvent<HTMLButtonElement, MouseEvent>,\n continueWhilstAttachmentsAreUploading: boolean,\n ) => {\n event.preventDefault()\n if (disabled || isReadOnly) return\n setHasAttemptedSubmit(true)\n\n const submissionData = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submissionData.submission)) {\n return\n }\n if (formElementsValidation) {\n console.log('Validation errors', formElementsValidation)\n bulmaToast.toast({\n message: 'Please fix validation errors',\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n if (!checkBsbsCanBeSubmitted(submissionData.submission)) {\n return\n }\n if (\n !continueWhilstAttachmentsAreUploading &&\n !checkAttachmentsCanBeSubmitted(submissionData.submission)\n ) {\n return\n }\n // check if attachments exist\n const newSubmission = checkIfAttachmentsExist(\n definition,\n submissionData.submission,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n submission: newSubmission,\n }))\n bulmaToast.toast({\n message:\n \"Some files that were included in your submission have been removed based on your administrator's data retention policy, please remove them and upload them again.\",\n type: 'is-danger',\n extraClasses: 'ob-toast cypress-invalid-submit-attempt',\n duration: 4000,\n pauseOnHover: true,\n closeOnClick: true,\n })\n return\n }\n\n if (isOffline && !isPendingQueueEnabled) {\n console.log('User is offline and form does not support a pending queue')\n setPromptOfflineSubmissionAttempt(true)\n return\n }\n\n allowNavigation()\n\n // transplant injected options on the definition\n const elementsWithInjectedOptions = injectOptionsAcrossAllElements({\n contextElements: definition.elements,\n elements: definition.elements,\n submission: submissionData.submission,\n taskContext: taskContextValue,\n userProfile: userProfile ?? undefined,\n })\n onSubmit({\n definition: {\n ...definition,\n elements: elementsWithInjectedOptions,\n },\n submission: submissionData.submission,\n captchaTokens: submissionData.captchaTokens,\n })\n resetRecaptchas()\n },\n [\n disabled,\n isReadOnly,\n getCurrentSubmissionData,\n checkBsbAreValidating,\n formElementsValidation,\n checkBsbsCanBeSubmitted,\n checkAttachmentsCanBeSubmitted,\n definition,\n attachmentRetentionInDays,\n isOffline,\n isPendingQueueEnabled,\n allowNavigation,\n taskContextValue,\n userProfile,\n onSubmit,\n resetRecaptchas,\n setFormSubmission,\n ],\n )\n\n const handleSaveDraft = React.useCallback(\n (continueWhilstAttachmentsAreUploading: boolean) => {\n if (disabled) return\n if (onSaveDraft) {\n allowNavigation()\n\n // For drafts we don't need to save the captcha tokens,\n // they will need to prove they are not robot again\n const { submission } = getCurrentSubmissionData(false)\n if (!checkBsbAreValidating(submission)) {\n return\n }\n if (\n !continueWhilstAttachmentsAreUploading &&\n !checkAttachmentsCanBeSubmitted(submission)\n ) {\n return\n }\n onSaveDraft({\n definition,\n submission,\n backgroundUpload: continueWhilstAttachmentsAreUploading,\n lastElementUpdated,\n })\n }\n },\n [\n allowNavigation,\n checkAttachmentsCanBeSubmitted,\n definition,\n disabled,\n getCurrentSubmissionData,\n onSaveDraft,\n checkBsbAreValidating,\n lastElementUpdated,\n ],\n )\n\n const handleContinueWithAttachments = React.useCallback(\n (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n setPromptUploadingAttachments(false)\n if (hasAttemptedSubmit) {\n handleSubmit(e, true)\n } else {\n handleSaveDraft(true)\n }\n },\n [\n handleSubmit,\n setPromptUploadingAttachments,\n hasAttemptedSubmit,\n handleSaveDraft,\n ],\n )\n const handleWaitForAttachments = React.useCallback(() => {\n setPromptUploadingAttachments(false)\n }, [setPromptUploadingAttachments])\n\n // #endregion\n //\n //\n\n //\n //\n // #region Lookups\n\n const { handlePagesLookupResult } = useLookups(\n definition.id,\n setFormSubmission,\n )\n\n // #endregion\n //\n //\n\n //\n //\n // #region Submission/Definition Changes\n\n const handleChange = React.useCallback<NestedFormElementValueChangeHandler>(\n (element, { value, executedLookups }) => {\n if (\n //This will ensure on a read only form that the summary and calculation elements\n //can still be displayed as it needs handleChange so it can render\n //due to the dynamic nature of the summary element.\n (disabled &&\n element.type !== 'summary' &&\n element.type !== 'calculation') ||\n element.type === 'page' ||\n element.type === 'section'\n ) {\n return\n }\n\n setUnsavedChangesState((current) => ({\n ...current,\n isDirty: true,\n }))\n // dont update the last element updated for elements the user cannot set the value of\n if (element.type === 'summary' || element.type === 'calculation') {\n setFormSubmission((currentFormSubmission) => ({\n ...currentFormSubmission,\n submission: {\n ...currentFormSubmission.submission,\n [element.name]:\n typeof value === 'function'\n ? value(currentFormSubmission.submission[element.name])\n : value,\n },\n }))\n } else {\n setFormSubmission((currentFormSubmission) => {\n return {\n ...currentFormSubmission,\n submission: {\n ...currentFormSubmission.submission,\n [element.name]:\n typeof value === 'function'\n ? value(currentFormSubmission.submission[element.name])\n : value,\n },\n lastElementUpdated: element,\n executedLookups: {\n ...currentFormSubmission.executedLookups,\n [element.name]:\n typeof executedLookups === 'function'\n ? executedLookups(\n currentFormSubmission.executedLookups?.[element.name],\n )\n : executedLookups,\n },\n }\n })\n }\n },\n [disabled, setFormSubmission],\n )\n\n // #endregion\n //\n //\n\n const lastElementUpdatedExistsOnForm = React.useMemo(() => {\n return !!formElementsService.findFormElement(\n definition.elements,\n (el) => el.id === lastElementUpdated?.id,\n )\n }, [definition.elements, lastElementUpdated])\n\n const lastElementUpdatedPage = React.useMemo(() => {\n return definition.elements.find((pageElement: FormTypes.FormElement) => {\n if (pageElement.type === 'page') {\n return formElementsService.findFormElement(\n pageElement.elements,\n (el) => el.id === lastElementUpdated?.id,\n )\n }\n })\n }, [lastElementUpdated, definition])\n\n const [hasResumed, setHasResumed] = React.useState(false)\n React.useEffect(() => {\n if (!hasResumed) {\n if (lastElementUpdated && lastElementUpdatedExistsOnForm) {\n if (lastElementUpdatedPage) {\n setPageId(lastElementUpdatedPage.id)\n }\n const element = document.getElementById(lastElementUpdated.id)\n if (element) {\n window.requestAnimationFrame(() => {\n element.scrollIntoView({ behavior: 'smooth' })\n })\n }\n }\n setHasResumed(true)\n }\n }, [\n lastElementUpdated,\n hasResumed,\n lastElementUpdatedPage,\n lastElementUpdatedExistsOnForm,\n setPageId,\n ])\n\n if (conditionalLogicError) {\n return (\n <>\n <div className=\"has-text-centered\">\n <MaterialIcon className=\"has-text-warning icon-x-large\">\n error\n </MaterialIcon>\n <h3 className=\"title is-3\">Bad Form Configuration</h3>\n <p className=\"cypress-conditional-logic-error-message\">\n {conditionalLogicError.message}\n </p>\n <p className=\"has-text-grey\">\n {localisationService.formatDatetimeLong(new Date())}\n </p>\n </div>\n </>\n )\n }\n\n return (\n <ThemeProvider theme={theme}>\n <FormDefinitionContext.Provider value={definition}>\n <FormElementOptionsContextProvider>\n <FormElementLookupsContextProvider>\n <div\n className=\"ob-form-container\"\n ref={obFormContainerHTMLElementRef}\n >\n <form\n name=\"obForm\"\n className={`ob-form cypress-ob-form ob-form__page-${\n currentPageIndex + 1\n }`}\n noValidate\n onSubmit={(e) => handleSubmit(e, false)}\n >\n <div>\n <div ref={scrollToTopOfPageHTMLElementRef} />\n {isShowingMultiplePages && (\n <div\n className={clsx('ob-steps-navigation', {\n 'is-active': isStepsHeaderActive,\n })}\n >\n <div\n className={clsx('ob-steps-navigation__header', {\n 'is-active': isStepsHeaderActive,\n })}\n onClick={toggleStepsNavigation}\n >\n <span className=\"icon is-invisible\">\n <MaterialIcon>keyboard_arrow_down</MaterialIcon>\n </span>\n <div className=\"steps-header-active-page\">\n {isDisplayingCurrentPageError ? (\n <span className=\"icon\">\n <MaterialIcon className=\"has-text-danger is-size-4\">\n warning\n </MaterialIcon>\n </span>\n ) : (\n <span className=\"steps-header-active-page-icon\">\n {currentPageNumber}\n </span>\n )}\n <span className=\"steps-header-active-page-label cypress-tablet-step-title\">\n {currentPage ? currentPage.label : ''}\n </span>\n </div>\n <span className=\"dropdown icon\">\n <MaterialIcon>keyboard_arrow_down</MaterialIcon>\n </span>\n </div>\n\n <div\n className={clsx('ob-steps-navigation__steps', {\n 'is-active': isStepsHeaderActive,\n })}\n >\n <div className=\"steps is-small is-horizontal-tablet cypress-steps\">\n {visiblePages.map(\n (page: FormTypes.PageElement, index: number) => {\n const hasErrors = checkDisplayPageError(page)\n return (\n <div\n key={page.id}\n id={`steps-navigation-step-${page.id}`}\n className={clsx(\n 'step-item cypress-step-item',\n {\n 'is-active': currentPage.id === page.id,\n 'is-completed': currentPageIndex > index,\n 'is-error': hasErrors,\n },\n )}\n onClick={(e) => {\n e.stopPropagation()\n if (page.id !== currentPage.id) {\n setPageId(page.id)\n }\n }}\n >\n <div\n className=\"step-marker step-marker-error ob-step-marker cypress-step-marker\"\n // @ts-expect-error ???\n name={`cypress-page-stepper-${index + 1}`}\n value={index + 1}\n >\n {hasErrors ? (\n <Tooltip title=\"Page has errors\">\n <span className=\"icon tooltip has-tooltip-top cypress-page-error\">\n <MaterialIcon className=\"has-text-danger is-size-3\">\n warning\n </MaterialIcon>\n </span>\n </Tooltip>\n ) : (\n <span>{index + 1}</span>\n )}\n </div>\n <div className=\"step-details ob-step-details\">\n <p className=\"step-title ob-step-title cypress-desktop-step-title\">\n {page.label}\n </p>\n </div>\n </div>\n )\n },\n )}\n </div>\n </div>\n </div>\n )}\n\n <div\n className={clsx('ob-steps-navigation__background', {\n 'is-active': isStepsHeaderActive,\n })}\n onClick={toggleStepsNavigation}\n />\n\n <div className=\"steps\">\n <div\n className={clsx('steps-content', {\n 'is-single-step': !isShowingMultiplePages,\n })}\n >\n <InjectPagesContext.Provider\n value={handlePagesLookupResult}\n >\n <GoogleMapsApiKeyContext.Provider\n value={googleMapsApiKey}\n >\n <AbnLookupAuthenticationGuidContext.Provider\n value={abnLookupAuthenticationGuid}\n >\n <CaptchaSiteKeyContext.Provider\n value={captchaSiteKey}\n >\n <AttachmentBlobsProvider>\n <FormIsReadOnlyContext.Provider\n value={isReadOnly}\n >\n <TaskContext.Provider\n value={taskContextValue}\n >\n <OnUploadAttachmentContext.Provider\n value={onUploadAttachment}\n >\n {visiblePages.map(\n (\n pageElement: FormTypes.PageElement,\n ) => (\n <PageFormElements\n key={pageElement.id}\n isActive={\n pageElement.id === currentPage.id\n }\n formId={definition.id}\n formElementsConditionallyShown={\n formElementsConditionallyShown\n }\n formElementsValidation={\n formElementsValidation\n }\n displayValidationMessages={\n hasAttemptedSubmit ||\n isDisplayingCurrentPageError\n }\n pageElement={pageElement}\n onChange={handleChange}\n model={submission}\n setFormSubmission={\n setFormSubmission\n }\n />\n ),\n )}\n </OnUploadAttachmentContext.Provider>\n </TaskContext.Provider>\n </FormIsReadOnlyContext.Provider>\n </AttachmentBlobsProvider>\n </CaptchaSiteKeyContext.Provider>\n </AbnLookupAuthenticationGuidContext.Provider>\n </GoogleMapsApiKeyContext.Provider>\n </InjectPagesContext.Provider>\n </div>\n\n {isShowingMultiplePages && (\n <div className=\"steps-actions\">\n <div className=\"steps-action\">\n <button\n type=\"button\"\n onClick={goToPreviousPage}\n disabled={isFirstVisiblePage}\n className=\"button is-light cypress-pages-previous\"\n >\n <span className=\"icon\">\n <MaterialIcon>keyboard_arrow_left</MaterialIcon>\n </span>\n <span>Back</span>\n </button>\n </div>\n <div className=\"step-progress-mobile cypress-steps-mobile\">\n {visiblePages.map(\n (page: FormTypes.PageElement, index) => (\n <div\n key={page.id}\n className={clsx('step-progress-mobile-dot', {\n 'is-active': currentPage.id === page.id,\n 'is-completed': currentPageIndex > index,\n 'has-background-danger':\n currentPage.id !== page.id &&\n checkDisplayPageError(page),\n })}\n />\n ),\n )}\n </div>\n <div className=\"steps-action\">\n <button\n type=\"button\"\n onClick={goToNextPage}\n disabled={isLastVisiblePage}\n className=\"button is-light cypress-pages-next\"\n >\n <span>Next</span>\n <span className=\"icon\">\n <MaterialIcon>keyboard_arrow_right</MaterialIcon>\n </span>\n </button>\n </div>\n </div>\n )}\n </div>\n {!isReadOnly && (\n <div className=\"buttons ob-buttons ob-buttons-submit\">\n {onSaveDraft && !isInfoPage && (\n <button\n type=\"button\"\n className=\"button ob-button is-primary ob-button-save-draft cypress-save-draft-form\"\n onClick={() => handleSaveDraft(false)}\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={buttons?.saveDraft?.label || 'Save Draft'}\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span className=\"ob-buttons-submit__spacer\"></span>\n {!isInfoPage && (\n <button\n type=\"button\"\n className=\"button ob-button is-light ob-button-submit-cancel cypress-cancel-form\"\n onClick={handleCancel}\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={buttons?.cancel?.label || 'Cancel'}\n icon={buttons?.cancel?.icon}\n />\n </button>\n )}\n {isLastVisiblePage && (\n <button\n type=\"submit\"\n className=\"button ob-button is-success ob-button-submit cypress-submit-form-button cypress-submit-form\"\n disabled={isPreview || disabled}\n >\n <CustomisableButtonInner\n label={\n isInfoPage\n ? 'Done'\n : buttons?.submit?.label || 'Submit'\n }\n icon={buttons?.submit?.icon}\n />\n </button>\n )}\n </div>\n )}\n </div>\n </form>\n\n {!isReadOnly && !isPreview && (\n <React.Fragment>\n <Prompt\n when={isDirty && !isNavigationAllowed}\n message={handleBlockedNavigation}\n />\n <Modal\n isOpen={hasConfirmedNavigation === false}\n title=\"Unsaved Changes\"\n cardClassName=\"cypress-cancel-confirm\"\n titleClassName=\"cypress-cancel-confirm-title\"\n bodyClassName=\"cypress-cancel-confirm-body\"\n actions={\n <>\n {onSaveDraft && (\n <button\n type=\"button\"\n className=\"button ob-button is-success cypress-cancel-confirm-save-draft\"\n onClick={() => handleSaveDraft(false)}\n >\n <CustomisableButtonInner\n label={buttons?.saveDraft?.label || 'Save Draft'}\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span style={{ flex: 1 }}></span>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-cancel-confirm-back\"\n onClick={handleKeepGoing}\n >\n <CustomisableButtonInner\n label={buttons?.cancelPromptNo?.label || 'Back'}\n icon={buttons?.cancelPromptNo?.icon}\n />\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-cancel-confirm-discard\"\n onClick={handleDiscardUnsavedChanges}\n autoFocus\n >\n <CustomisableButtonInner\n label={buttons?.cancelPromptYes?.label || 'Discard'}\n icon={buttons?.cancelPromptYes?.icon}\n />\n </button>\n </>\n }\n >\n <p>\n You have unsaved changes, are you sure you want discard\n them?\n </p>\n </Modal>\n <Modal\n isOpen={promptUploadingAttachments === true}\n title=\"Attachment upload in progress\"\n cardClassName=\"cypress-attachments-wait-continue\"\n titleClassName=\"cypress-attachments-confirm-wait-title\"\n bodyClassName=\"cypress-attachments-confirm-wait-body\"\n actions={\n <>\n <span style={{ flex: 1 }}></span>\n <button\n type=\"button\"\n className=\"button ob-button is-light cypress-attachments-confirm-wait\"\n onClick={handleWaitForAttachments}\n >\n Wait\n </button>\n <button\n type=\"button\"\n className=\"button ob-button is-primary cypress-attachments-confirm-continue\"\n onClick={handleContinueWithAttachments}\n autoFocus\n >\n Continue\n </button>\n </>\n }\n >\n <p>\n Your attachments are still uploading, do you want to wait\n for the uploads to complete or continue using the app? If\n you click continue the attachments will upload in the\n background. Do not close the app until the upload has been\n completed.\n </p>\n </Modal>\n\n <Modal\n isOpen={promptOfflineSubmissionAttempt}\n title=\"It looks like you're Offline\"\n className=\"ob-modal__offline-submission-attempt\"\n cardClassName=\"cypress-submission-offline has-text-centered\"\n titleClassName=\"cypress-offline-title\"\n bodyClassName=\"cypress-offline-body\"\n actions={\n <>\n {onSaveDraft && (\n <button\n type=\"button\"\n className=\"button ob-button ob-button__offline-submission-attempt-save-draft is-success\"\n onClick={() => handleSaveDraft(false)}\n >\n <CustomisableButtonInner\n label={buttons?.saveDraft?.label || 'Save Draft'}\n icon={buttons?.saveDraft?.icon}\n />\n </button>\n )}\n <span style={{ flex: 1 }}></span>\n <button\n className=\"button ob-button ob-button__offline-submission-attempt-cancel is-light\"\n onClick={() =>\n setPromptOfflineSubmissionAttempt(false)\n }\n >\n Cancel\n </button>\n <button\n className=\"button ob-button ob-button__offline-submission-attempt-try-again is-primary\"\n onClick={(e) => {\n setPromptOfflineSubmissionAttempt(false)\n handleSubmit(e, false)\n }}\n autoFocus\n >\n Try Again\n </button>\n </>\n }\n >\n <p className=\"ob-modal__offline-submission-attempt-message\">\n You cannot submit this form while offline, please try\n again when connectivity is restored.\n {onSaveDraft && (\n <span className=\"ob-modal__offline-submission-attempt-save-draft-message\">\n {' '}\n Alternatively, click the{' '}\n <b>\n {buttons?.saveDraft?.label || 'Save Draft'}\n </b>{' '}\n button below to come back to this later.\n </span>\n )}\n </p>\n <MaterialIcon className=\"has-text-warning icon-x-large ob-modal__offline-submission-attempt-icon\">\n wifi_off\n </MaterialIcon>\n </Modal>\n </React.Fragment>\n )}\n </div>\n </FormElementLookupsContextProvider>\n </FormElementOptionsContextProvider>\n </FormDefinitionContext.Provider>\n </ThemeProvider>\n )\n}\n\nexport default React.memo(OneBlinkFormBase)\n"]}
@@ -30,20 +30,25 @@ function FormElementGoogleAddress({ id, element, value, displayValidationMessage
30
30
  input,
31
31
  }, (predictions, status) => {
32
32
  switch (status) {
33
+ case google.maps.places.PlacesServiceStatus.OK:
33
34
  case google.maps.places.PlacesServiceStatus.ZERO_RESULTS: {
34
- resolve([]);
35
+ resolve(predictions !== null && predictions !== void 0 ? predictions : []);
35
36
  break;
36
37
  }
37
- case google.maps.places.PlacesServiceStatus.REQUEST_DENIED: {
38
- reject(new OneBlinkAppsError('Google Maps API key has not been configured correctly'));
38
+ case google.maps.places.PlacesServiceStatus.OVER_QUERY_LIMIT: {
39
+ reject(new OneBlinkAppsError('This application has gone over its Google Address querying quota. Please contact an administrator to rectify the issue or try again later.'));
39
40
  break;
40
41
  }
41
- case google.maps.places.PlacesServiceStatus.OK: {
42
- resolve(predictions !== null && predictions !== void 0 ? predictions : []);
42
+ case google.maps.places.PlacesServiceStatus.INVALID_REQUEST: {
43
+ reject(new OneBlinkAppsError('Google Maps API key may not have been configured correctly, the request to retrieve address suggestions is invalid. Please contact an administrator to rectify the issue.'));
44
+ break;
45
+ }
46
+ case google.maps.places.PlacesServiceStatus.REQUEST_DENIED: {
47
+ reject(new OneBlinkAppsError('Google Maps API key has not been configured correctly. Please contact an administrator to rectify the issue.'));
43
48
  break;
44
49
  }
45
50
  default: {
46
- reject(new OneBlinkAppsError('An unknown error has occurred. Please contact support if the problem persists.'));
51
+ reject(new OneBlinkAppsError('An unknown error has occurred. Please try again and contact support if the problem persists.'));
47
52
  }
48
53
  }
49
54
  });
@@ -68,6 +73,7 @@ function FormElementGoogleAddress({ id, element, value, displayValidationMessage
68
73
  throw new OneBlinkAppsError('An unknown error has occurred. Please contact support if the problem persists.');
69
74
  }, [autocompleteService]);
70
75
  const handleChange = React.useCallback(async (placeId) => {
76
+ var _a, _b, _c, _d;
71
77
  if (!placeId) {
72
78
  onChange(element, { value: undefined });
73
79
  return;
@@ -99,7 +105,17 @@ function FormElementGoogleAddress({ id, element, value, displayValidationMessage
99
105
  resolve(place);
100
106
  });
101
107
  });
102
- onChange(element, { value: place });
108
+ onChange(element, {
109
+ value: {
110
+ place_id: place.place_id,
111
+ formatted_address: place.formatted_address,
112
+ address_components: place.address_components,
113
+ geometry: {
114
+ location: (_b = (_a = place.geometry) === null || _a === void 0 ? void 0 : _a.location) === null || _b === void 0 ? void 0 : _b.toJSON(),
115
+ viewport: (_d = (_c = place.geometry) === null || _c === void 0 ? void 0 : _c.viewport) === null || _d === void 0 ? void 0 : _d.toJSON(),
116
+ },
117
+ },
118
+ });
103
119
  }
104
120
  catch (newError) {
105
121
  if (isMounted.current) {
@@ -1 +1 @@
1
- {"version":3,"file":"FormElementGoogleAddress.js","sourceRoot":"","sources":["../../src/form-elements/FormElementGoogleAddress.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes, GoogleTypes } from '@oneblink/types'\nimport { OneBlinkAppsError, Sentry } from '@oneblink/apps'\n\nimport AutocompleteDropdown from '../components/renderer/AutocompleteDropdown'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport useGoogle from '../hooks/useGoogle'\nimport useIsMounted from '../hooks/useIsMounted'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\n\ntype Props = {\n formId: number\n id: string\n element: FormTypes.GoogleAddressElement\n value: GoogleTypes.GoogleMapsAddress | undefined\n displayValidationMessage: boolean\n validationMessage: string | undefined\n onChange: FormElementValueChangeHandler<GoogleTypes.GoogleMapsAddress>\n} & IsDirtyProps\n\nfunction FormElementGoogleAddress({\n id,\n element,\n value,\n displayValidationMessage,\n validationMessage,\n onChange,\n isDirty,\n setIsDirty,\n}: Props) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const isMounted = useIsMounted()\n const [label, setLabel] = React.useState('')\n const [error, setError] = React.useState<Error | undefined>()\n const [isLoadingAddressDetails, setIsLoadingAddressDetails] =\n React.useState(false)\n\n const { isLoaded } = useGoogle()\n\n const autocompleteService = React.useMemo(() => {\n if (isLoaded) {\n return new google.maps.places.AutocompleteService()\n }\n }, [isLoaded])\n\n const dummyMap = React.useMemo(() => {\n if (isLoaded) {\n return new google.maps.Map(document.createElement('div'))\n }\n }, [isLoaded])\n\n const handleSearch = React.useCallback(\n async (input: string, abortSignal: AbortSignal) => {\n setError(undefined)\n if (autocompleteService) {\n const predictions = await new Promise<\n google.maps.places.QueryAutocompletePrediction[]\n >((resolve, reject) => {\n autocompleteService.getQueryPredictions(\n {\n input,\n },\n (predictions, status) => {\n switch (status) {\n case google.maps.places.PlacesServiceStatus.ZERO_RESULTS: {\n resolve([])\n break\n }\n case google.maps.places.PlacesServiceStatus.REQUEST_DENIED: {\n reject(\n new OneBlinkAppsError(\n 'Google Maps API key has not been configured correctly',\n ),\n )\n break\n }\n case google.maps.places.PlacesServiceStatus.OK: {\n resolve(predictions ?? [])\n break\n }\n default: {\n reject(\n new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n ),\n )\n }\n }\n },\n )\n }).catch((e) => {\n if (!abortSignal.aborted) {\n Sentry.captureException(e)\n }\n throw e\n })\n\n if (!abortSignal.aborted) {\n return predictions.reduce<Array<{ value: string; label: string }>>(\n (results, prediction) => {\n if (prediction.place_id) {\n results.push({\n value: prediction.place_id,\n label: prediction.description,\n })\n }\n return results\n },\n [],\n )\n }\n }\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n )\n },\n [autocompleteService],\n )\n\n const handleChange = React.useCallback(\n async (placeId: string | undefined) => {\n if (!placeId) {\n onChange(element, { value: undefined })\n return\n }\n\n setIsLoadingAddressDetails(true)\n try {\n //this should not happen, we can't get a place Id without google being present\n if (!isLoaded || !dummyMap) {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: new Error(\n 'Google Places library has not be initialised',\n ),\n },\n )\n }\n\n const placeService = new google.maps.places.PlacesService(dummyMap)\n const place = await new Promise<GoogleTypes.GoogleMapsAddress>(\n (resolve, reject) => {\n placeService.getDetails(\n {\n placeId,\n fields: [\n 'place_id',\n 'formatted_address',\n 'geometry',\n 'address_components',\n ],\n },\n (place, status) => {\n if (\n status !== google.maps.places.PlacesServiceStatus.OK ||\n !place\n ) {\n reject(\n new OneBlinkAppsError(\n `Could not find address details for place with id: ${placeId}`,\n ),\n )\n return\n }\n resolve(place)\n },\n )\n },\n )\n onChange(element, { value: place })\n } catch (newError) {\n if (isMounted.current) {\n setError(newError as Error)\n }\n }\n if (isMounted.current) {\n setIsLoadingAddressDetails(false)\n }\n },\n [isMounted, onChange, element, isLoaded, dummyMap],\n )\n\n // Ensure the label is set if the value is set outside of this component\n React.useEffect(() => {\n if (value) {\n const newLabel = value.formatted_address || value.place_id\n setLabel(newLabel ?? '')\n }\n }, [value])\n\n return (\n <div className=\"cypress-google-address-element\">\n <FormElementLabelContainer\n className=\"ob-google-address ob-autocomplete\"\n element={element}\n id={id}\n required={element.required}\n >\n <AutocompleteDropdown\n id={id}\n label={label}\n disabled={element.readOnly || isLoadingAddressDetails}\n placeholder={element.placeholderValue}\n required={element.required}\n value={value}\n validationMessage={validationMessage}\n displayValidationMessage={displayValidationMessage}\n onChangeValue={handleChange}\n isLoading={isLoadingAddressDetails}\n hasError={!!error}\n onChangeLabel={setLabel}\n searchDebounceMs={750}\n searchMinCharacters={4}\n onSearch={handleSearch}\n isDirty={isDirty}\n setIsDirty={setIsDirty}\n aria-describedby={ariaDescribedby}\n branding={\n <a className=\"dropdown-item cypress-powered-by-google ob-autocomplete__drop-down-item-powered-by-google\">\n powered by{' '}\n <img src=\"https://developers.google.com/static/maps/documentation/images/google_on_white.png\" />\n </a>\n }\n />\n </FormElementLabelContainer>\n\n {error && (\n <div role=\"alert\" className=\"has-margin-top-8\">\n <div className=\"has-text-danger ob-error__text cypress-google-address-details-error-message\">\n {error.message}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default React.memo(FormElementGoogleAddress)\n"]}
1
+ {"version":3,"file":"FormElementGoogleAddress.js","sourceRoot":"","sources":["../../src/form-elements/FormElementGoogleAddress.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport { FormTypes, GoogleTypes } from '@oneblink/types'\nimport { OneBlinkAppsError, Sentry } from '@oneblink/apps'\n\nimport AutocompleteDropdown from '../components/renderer/AutocompleteDropdown'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport useGoogle from '../hooks/useGoogle'\nimport useIsMounted from '../hooks/useIsMounted'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\n\ntype Props = {\n formId: number\n id: string\n element: FormTypes.GoogleAddressElement\n value: GoogleTypes.GoogleMapsAddress | undefined\n displayValidationMessage: boolean\n validationMessage: string | undefined\n onChange: FormElementValueChangeHandler<GoogleTypes.GoogleMapsAddress>\n} & IsDirtyProps\n\nfunction FormElementGoogleAddress({\n id,\n element,\n value,\n displayValidationMessage,\n validationMessage,\n onChange,\n isDirty,\n setIsDirty,\n}: Props) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const isMounted = useIsMounted()\n const [label, setLabel] = React.useState('')\n const [error, setError] = React.useState<Error | undefined>()\n const [isLoadingAddressDetails, setIsLoadingAddressDetails] =\n React.useState(false)\n\n const { isLoaded } = useGoogle()\n\n const autocompleteService = React.useMemo(() => {\n if (isLoaded) {\n return new google.maps.places.AutocompleteService()\n }\n }, [isLoaded])\n\n const dummyMap = React.useMemo(() => {\n if (isLoaded) {\n return new google.maps.Map(document.createElement('div'))\n }\n }, [isLoaded])\n\n const handleSearch = React.useCallback(\n async (input: string, abortSignal: AbortSignal) => {\n setError(undefined)\n if (autocompleteService) {\n const predictions = await new Promise<\n google.maps.places.QueryAutocompletePrediction[]\n >((resolve, reject) => {\n autocompleteService.getQueryPredictions(\n {\n input,\n },\n (predictions, status) => {\n switch (status) {\n case google.maps.places.PlacesServiceStatus.OK:\n case google.maps.places.PlacesServiceStatus.ZERO_RESULTS: {\n resolve(predictions ?? [])\n break\n }\n case google.maps.places.PlacesServiceStatus.OVER_QUERY_LIMIT: {\n reject(\n new OneBlinkAppsError(\n 'This application has gone over its Google Address querying quota. Please contact an administrator to rectify the issue or try again later.',\n ),\n )\n break\n }\n case google.maps.places.PlacesServiceStatus.INVALID_REQUEST: {\n reject(\n new OneBlinkAppsError(\n 'Google Maps API key may not have been configured correctly, the request to retrieve address suggestions is invalid. Please contact an administrator to rectify the issue.',\n ),\n )\n break\n }\n case google.maps.places.PlacesServiceStatus.REQUEST_DENIED: {\n reject(\n new OneBlinkAppsError(\n 'Google Maps API key has not been configured correctly. Please contact an administrator to rectify the issue.',\n ),\n )\n break\n }\n default: {\n reject(\n new OneBlinkAppsError(\n 'An unknown error has occurred. Please try again and contact support if the problem persists.',\n ),\n )\n }\n }\n },\n )\n }).catch((e) => {\n if (!abortSignal.aborted) {\n Sentry.captureException(e)\n }\n throw e\n })\n\n if (!abortSignal.aborted) {\n return predictions.reduce<Array<{ value: string; label: string }>>(\n (results, prediction) => {\n if (prediction.place_id) {\n results.push({\n value: prediction.place_id,\n label: prediction.description,\n })\n }\n return results\n },\n [],\n )\n }\n }\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n )\n },\n [autocompleteService],\n )\n\n const handleChange = React.useCallback(\n async (placeId: string | undefined) => {\n if (!placeId) {\n onChange(element, { value: undefined })\n return\n }\n\n setIsLoadingAddressDetails(true)\n try {\n //this should not happen, we can't get a place Id without google being present\n if (!isLoaded || !dummyMap) {\n throw new OneBlinkAppsError(\n 'An unknown error has occurred. Please contact support if the problem persists.',\n {\n originalError: new Error(\n 'Google Places library has not be initialised',\n ),\n },\n )\n }\n\n const placeService = new google.maps.places.PlacesService(dummyMap)\n const place = await new Promise<google.maps.places.PlaceResult>(\n (resolve, reject) => {\n placeService.getDetails(\n {\n placeId,\n fields: [\n 'place_id',\n 'formatted_address',\n 'geometry',\n 'address_components',\n ],\n },\n (place, status) => {\n if (\n status !== google.maps.places.PlacesServiceStatus.OK ||\n !place\n ) {\n reject(\n new OneBlinkAppsError(\n `Could not find address details for place with id: ${placeId}`,\n ),\n )\n return\n }\n resolve(place)\n },\n )\n },\n )\n onChange(element, {\n value: {\n place_id: place.place_id,\n formatted_address: place.formatted_address,\n address_components: place.address_components,\n geometry: {\n location: place.geometry?.location?.toJSON(),\n viewport: place.geometry?.viewport?.toJSON(),\n },\n },\n })\n } catch (newError) {\n if (isMounted.current) {\n setError(newError as Error)\n }\n }\n if (isMounted.current) {\n setIsLoadingAddressDetails(false)\n }\n },\n [isMounted, onChange, element, isLoaded, dummyMap],\n )\n\n // Ensure the label is set if the value is set outside of this component\n React.useEffect(() => {\n if (value) {\n const newLabel = value.formatted_address || value.place_id\n setLabel(newLabel ?? '')\n }\n }, [value])\n\n return (\n <div className=\"cypress-google-address-element\">\n <FormElementLabelContainer\n className=\"ob-google-address ob-autocomplete\"\n element={element}\n id={id}\n required={element.required}\n >\n <AutocompleteDropdown\n id={id}\n label={label}\n disabled={element.readOnly || isLoadingAddressDetails}\n placeholder={element.placeholderValue}\n required={element.required}\n value={value}\n validationMessage={validationMessage}\n displayValidationMessage={displayValidationMessage}\n onChangeValue={handleChange}\n isLoading={isLoadingAddressDetails}\n hasError={!!error}\n onChangeLabel={setLabel}\n searchDebounceMs={750}\n searchMinCharacters={4}\n onSearch={handleSearch}\n isDirty={isDirty}\n setIsDirty={setIsDirty}\n aria-describedby={ariaDescribedby}\n branding={\n <a className=\"dropdown-item cypress-powered-by-google ob-autocomplete__drop-down-item-powered-by-google\">\n powered by{' '}\n <img src=\"https://developers.google.com/static/maps/documentation/images/google_on_white.png\" />\n </a>\n }\n />\n </FormElementLabelContainer>\n\n {error && (\n <div role=\"alert\" className=\"has-margin-top-8\">\n <div className=\"has-text-danger ob-error__text cypress-google-address-details-error-message\">\n {error.message}\n </div>\n </div>\n )}\n </div>\n )\n}\n\nexport default React.memo(FormElementGoogleAddress)\n"]}
@@ -10,6 +10,7 @@ export default function processInjectableOption({ option, submission, formElemen
10
10
  }): FormTypes.ChoiceElementOption[];
11
11
  export declare function injectOptionsAcrossAllElements({ submission, ...params }: {
12
12
  elements: FormTypes.FormElement[];
13
+ contextElements: FormTypes.FormElement[];
13
14
  submission: SubmissionTypes.S3SubmissionData['submission'];
14
15
  taskContext: TaskContext;
15
16
  userProfile: MiscTypes.UserProfile | undefined;
@@ -90,7 +90,7 @@ export default function processInjectableOption({ option, submission, formElemen
90
90
  });
91
91
  return generatedOptions;
92
92
  }
93
- function injectOptionsAcrossEntriesElements({ elements, entries, taskContext, userProfile, }) {
93
+ function injectOptionsAcrossEntriesElements({ contextElements, elements, entries, taskContext, userProfile, }) {
94
94
  return elements.map((e) => {
95
95
  switch (e.type) {
96
96
  case 'page':
@@ -98,6 +98,8 @@ function injectOptionsAcrossEntriesElements({ elements, entries, taskContext, us
98
98
  return {
99
99
  ...e,
100
100
  elements: injectOptionsAcrossEntriesElements({
101
+ // info elements on other pages/sections will need the parent definition
102
+ contextElements,
101
103
  elements: e.elements,
102
104
  entries,
103
105
  taskContext,
@@ -110,6 +112,8 @@ function injectOptionsAcrossEntriesElements({ elements, entries, taskContext, us
110
112
  return {
111
113
  ...e,
112
114
  elements: injectOptionsAcrossEntriesElements({
115
+ // sub-forms do not have context of parent elements
116
+ contextElements: e.elements,
113
117
  elements: e.elements,
114
118
  entries: entries.reduce((memo, entry) => {
115
119
  if (entry[e.name]) {
@@ -130,6 +134,8 @@ function injectOptionsAcrossEntriesElements({ elements, entries, taskContext, us
130
134
  return {
131
135
  ...e,
132
136
  elements: injectOptionsAcrossEntriesElements({
137
+ // repeatable set entries may only know about elements within entry
138
+ contextElements: e.elements,
133
139
  elements: e.elements,
134
140
  entries: entries.reduce((memo, entry) => {
135
141
  const nestedEntries = entry[e.name];
@@ -154,7 +160,7 @@ function injectOptionsAcrossEntriesElements({ elements, entries, taskContext, us
154
160
  const injected = processInjectableOption({
155
161
  option: o,
156
162
  submission,
157
- formElements: elements,
163
+ formElements: contextElements,
158
164
  taskContext,
159
165
  userProfile,
160
166
  });
@@ -1 +1 @@
1
- {"version":3,"file":"injectableOptions.js","sourceRoot":"","sources":["../../src/services/injectableOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { formElementsService, typeCastService } from '@oneblink/sdk-core'\nimport { localisationService } from '@oneblink/apps'\nimport { v4 as uuidv4 } from 'uuid'\nimport { MiscTypes } from '@oneblink/types'\nimport { TaskContext } from '../hooks/useTaskContext'\n\ntype Option = Pick<FormTypes.ChoiceElementOption, 'value' | 'label'>\n\nfunction processInjectableDynamicOption({\n option,\n submission,\n formElements,\n ...params\n}: {\n option: Option\n submission: SubmissionTypes.S3SubmissionData['submission']\n formElements: FormTypes.FormElement[]\n taskContext: TaskContext\n userProfile: MiscTypes.UserProfile | undefined\n}): Map<string, string> {\n const newOptions: Map<string, string> = new Map()\n\n // Replace root level form element values\n const replaceableParams: Parameters<\n typeof localisationService.replaceInjectablesWithElementValues\n >[1] = {\n ...params,\n submission,\n formElements,\n task: params.taskContext.task,\n taskGroup: params.taskContext.taskGroup,\n taskGroupInstance: params.taskContext.taskGroupInstance,\n excludeNestedElements: true,\n }\n const {\n text: label,\n hadAllInjectablesReplaced: hadAllInjectablesReplacedInLabel,\n } = localisationService.replaceInjectablesWithElementValues(\n option.label,\n replaceableParams,\n )\n if (!hadAllInjectablesReplacedInLabel) {\n return newOptions\n }\n\n const {\n text: value,\n hadAllInjectablesReplaced: hadAllInjectablesReplacedInValue,\n } = localisationService.replaceInjectablesWithElementValues(\n option.value,\n replaceableParams,\n )\n if (!hadAllInjectablesReplacedInValue) {\n return newOptions\n }\n\n // Find nested form elements\n const matches: Map<string, boolean> = new Map()\n formElementsService.matchElementsTagRegex(\n {\n text: label + ' ' + value,\n excludeNestedElements: false,\n },\n ({ elementName }) => {\n const [repeatableSetElementName, ...elementNames] = elementName.split('|')\n matches.set(repeatableSetElementName, !!elementNames.length)\n },\n )\n\n if (matches.size) {\n matches.forEach((hasNestedFormElements, repeatableSetElementName) => {\n if (hasNestedFormElements) {\n // Attempt to create a new option for each entry in the repeatable set.\n const entries = submission?.[repeatableSetElementName]\n if (Array.isArray(entries)) {\n const repeatableSetElement = formElementsService.findFormElement(\n formElements,\n (formElement) => {\n return (\n 'name' in formElement &&\n formElement.name === repeatableSetElementName\n )\n },\n )\n if (\n repeatableSetElement &&\n 'elements' in repeatableSetElement &&\n Array.isArray(repeatableSetElement.elements)\n ) {\n for (const entry of entries) {\n const nestedOptions = processInjectableDynamicOption({\n ...params,\n option: {\n label: label.replaceAll(\n `{ELEMENT:${repeatableSetElementName}|`,\n '{ELEMENT:',\n ),\n value: value.replaceAll(\n `{ELEMENT:${repeatableSetElementName}|`,\n '{ELEMENT:',\n ),\n },\n submission: entry,\n formElements: repeatableSetElement.elements,\n })\n if (nestedOptions.size) {\n nestedOptions.forEach((nestedLabel, nestedValue) => {\n if (!newOptions.has(nestedValue)) {\n newOptions.set(nestedValue, nestedLabel)\n }\n })\n }\n }\n }\n }\n }\n })\n } else {\n newOptions.set(value, label)\n }\n\n return newOptions\n}\n\nexport default function processInjectableOption({\n option,\n submission,\n formElements,\n taskContext,\n userProfile,\n}: {\n option: FormTypes.ChoiceElementOption\n submission: SubmissionTypes.S3SubmissionData['submission']\n formElements: FormTypes.FormElement[]\n taskContext: TaskContext\n userProfile: MiscTypes.UserProfile | undefined\n}): FormTypes.ChoiceElementOption[] {\n const options = processInjectableDynamicOption({\n option,\n submission,\n formElements,\n taskContext,\n userProfile,\n })\n\n const generatedOptions: FormTypes.ChoiceElementOption[] = []\n\n options.forEach((label, value) => {\n generatedOptions.push({\n ...option,\n id: options.size === 1 ? option.id : uuidv4(),\n label,\n value,\n })\n })\n\n return generatedOptions\n}\n\nfunction injectOptionsAcrossEntriesElements({\n elements,\n entries,\n taskContext,\n userProfile,\n}: {\n elements: FormTypes.FormElement[]\n entries: SubmissionTypes.S3SubmissionData['submission'][]\n taskContext: TaskContext\n userProfile: MiscTypes.UserProfile | undefined\n}): FormTypes.FormElement[] {\n return elements.map<FormTypes.FormElement>((e) => {\n switch (e.type) {\n case 'page':\n case 'section': {\n return {\n ...e,\n elements: injectOptionsAcrossEntriesElements({\n elements: e.elements,\n entries,\n taskContext,\n userProfile,\n }),\n }\n }\n case 'form': {\n if (Array.isArray(e.elements)) {\n return {\n ...e,\n elements: injectOptionsAcrossEntriesElements({\n elements: e.elements,\n entries: entries.reduce<\n SubmissionTypes.S3SubmissionData['submission'][]\n >((memo, entry) => {\n if (entry[e.name]) {\n memo.push(\n entry[\n e.name\n ] as SubmissionTypes.S3SubmissionData['submission'],\n )\n }\n return memo\n }, []),\n taskContext,\n userProfile,\n }),\n }\n } else {\n return e\n }\n }\n case 'repeatableSet': {\n return {\n ...e,\n elements: injectOptionsAcrossEntriesElements({\n elements: e.elements,\n entries: entries.reduce<\n SubmissionTypes.S3SubmissionData['submission'][]\n >((memo, entry) => {\n const nestedEntries = entry[e.name]\n if (Array.isArray(nestedEntries)) {\n memo.push(\n ...(nestedEntries as SubmissionTypes.S3SubmissionData['submission'][]),\n )\n }\n return memo\n }, []),\n taskContext,\n userProfile,\n }),\n }\n }\n default: {\n const optionsElement = typeCastService.formElements.toOptionsElement(e)\n if (optionsElement) {\n return {\n ...optionsElement,\n options: entries.reduce<FormTypes.ChoiceElementOption[]>(\n (newOptions, submission) => {\n optionsElement.options?.forEach((o) => {\n const injected = processInjectableOption({\n option: o,\n submission,\n formElements: elements,\n taskContext,\n userProfile,\n })\n\n newOptions.push(\n ...injected.filter((generatedOption) => {\n return !newOptions.some(\n (addedOption) =>\n addedOption.value === generatedOption.value,\n )\n }),\n )\n })\n return newOptions\n },\n [],\n ),\n }\n }\n return e\n }\n }\n })\n}\n\nexport function injectOptionsAcrossAllElements({\n submission,\n ...params\n}: {\n elements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n taskContext: TaskContext\n userProfile: MiscTypes.UserProfile | undefined\n}): FormTypes.FormElement[] {\n // We iterate over entries as an array of submission objects because\n // child elements of a repeatable set that have injected options\n // need to include all of the injected options from the same elements\n // in sibling entries within the set. Otherwise we will not have the\n // labels for each available option to display the submission.\n return injectOptionsAcrossEntriesElements({\n ...params,\n entries: [submission],\n })\n}\n"]}
1
+ {"version":3,"file":"injectableOptions.js","sourceRoot":"","sources":["../../src/services/injectableOptions.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { formElementsService, typeCastService } from '@oneblink/sdk-core'\nimport { localisationService } from '@oneblink/apps'\nimport { v4 as uuidv4 } from 'uuid'\nimport { MiscTypes } from '@oneblink/types'\nimport { TaskContext } from '../hooks/useTaskContext'\n\ntype Option = Pick<FormTypes.ChoiceElementOption, 'value' | 'label'>\n\nfunction processInjectableDynamicOption({\n option,\n submission,\n formElements,\n ...params\n}: {\n option: Option\n submission: SubmissionTypes.S3SubmissionData['submission']\n formElements: FormTypes.FormElement[]\n taskContext: TaskContext\n userProfile: MiscTypes.UserProfile | undefined\n}): Map<string, string> {\n const newOptions: Map<string, string> = new Map()\n\n // Replace root level form element values\n const replaceableParams: Parameters<\n typeof localisationService.replaceInjectablesWithElementValues\n >[1] = {\n ...params,\n submission,\n formElements,\n task: params.taskContext.task,\n taskGroup: params.taskContext.taskGroup,\n taskGroupInstance: params.taskContext.taskGroupInstance,\n excludeNestedElements: true,\n }\n const {\n text: label,\n hadAllInjectablesReplaced: hadAllInjectablesReplacedInLabel,\n } = localisationService.replaceInjectablesWithElementValues(\n option.label,\n replaceableParams,\n )\n if (!hadAllInjectablesReplacedInLabel) {\n return newOptions\n }\n\n const {\n text: value,\n hadAllInjectablesReplaced: hadAllInjectablesReplacedInValue,\n } = localisationService.replaceInjectablesWithElementValues(\n option.value,\n replaceableParams,\n )\n if (!hadAllInjectablesReplacedInValue) {\n return newOptions\n }\n\n // Find nested form elements\n const matches: Map<string, boolean> = new Map()\n formElementsService.matchElementsTagRegex(\n {\n text: label + ' ' + value,\n excludeNestedElements: false,\n },\n ({ elementName }) => {\n const [repeatableSetElementName, ...elementNames] = elementName.split('|')\n matches.set(repeatableSetElementName, !!elementNames.length)\n },\n )\n\n if (matches.size) {\n matches.forEach((hasNestedFormElements, repeatableSetElementName) => {\n if (hasNestedFormElements) {\n // Attempt to create a new option for each entry in the repeatable set.\n const entries = submission?.[repeatableSetElementName]\n if (Array.isArray(entries)) {\n const repeatableSetElement = formElementsService.findFormElement(\n formElements,\n (formElement) => {\n return (\n 'name' in formElement &&\n formElement.name === repeatableSetElementName\n )\n },\n )\n if (\n repeatableSetElement &&\n 'elements' in repeatableSetElement &&\n Array.isArray(repeatableSetElement.elements)\n ) {\n for (const entry of entries) {\n const nestedOptions = processInjectableDynamicOption({\n ...params,\n option: {\n label: label.replaceAll(\n `{ELEMENT:${repeatableSetElementName}|`,\n '{ELEMENT:',\n ),\n value: value.replaceAll(\n `{ELEMENT:${repeatableSetElementName}|`,\n '{ELEMENT:',\n ),\n },\n submission: entry,\n formElements: repeatableSetElement.elements,\n })\n if (nestedOptions.size) {\n nestedOptions.forEach((nestedLabel, nestedValue) => {\n if (!newOptions.has(nestedValue)) {\n newOptions.set(nestedValue, nestedLabel)\n }\n })\n }\n }\n }\n }\n }\n })\n } else {\n newOptions.set(value, label)\n }\n\n return newOptions\n}\n\nexport default function processInjectableOption({\n option,\n submission,\n formElements,\n taskContext,\n userProfile,\n}: {\n option: FormTypes.ChoiceElementOption\n submission: SubmissionTypes.S3SubmissionData['submission']\n formElements: FormTypes.FormElement[]\n taskContext: TaskContext\n userProfile: MiscTypes.UserProfile | undefined\n}): FormTypes.ChoiceElementOption[] {\n const options = processInjectableDynamicOption({\n option,\n submission,\n formElements,\n taskContext,\n userProfile,\n })\n\n const generatedOptions: FormTypes.ChoiceElementOption[] = []\n\n options.forEach((label, value) => {\n generatedOptions.push({\n ...option,\n id: options.size === 1 ? option.id : uuidv4(),\n label,\n value,\n })\n })\n\n return generatedOptions\n}\n\nfunction injectOptionsAcrossEntriesElements({\n contextElements,\n elements,\n entries,\n taskContext,\n userProfile,\n}: {\n contextElements: FormTypes.FormElement[]\n elements: FormTypes.FormElement[]\n entries: SubmissionTypes.S3SubmissionData['submission'][]\n taskContext: TaskContext\n userProfile: MiscTypes.UserProfile | undefined\n}): FormTypes.FormElement[] {\n return elements.map<FormTypes.FormElement>((e) => {\n switch (e.type) {\n case 'page':\n case 'section': {\n return {\n ...e,\n elements: injectOptionsAcrossEntriesElements({\n // info elements on other pages/sections will need the parent definition\n contextElements,\n elements: e.elements,\n entries,\n taskContext,\n userProfile,\n }),\n }\n }\n case 'form': {\n if (Array.isArray(e.elements)) {\n return {\n ...e,\n elements: injectOptionsAcrossEntriesElements({\n // sub-forms do not have context of parent elements\n contextElements: e.elements,\n elements: e.elements,\n entries: entries.reduce<\n SubmissionTypes.S3SubmissionData['submission'][]\n >((memo, entry) => {\n if (entry[e.name]) {\n memo.push(\n entry[\n e.name\n ] as SubmissionTypes.S3SubmissionData['submission'],\n )\n }\n return memo\n }, []),\n taskContext,\n userProfile,\n }),\n }\n } else {\n return e\n }\n }\n case 'repeatableSet': {\n return {\n ...e,\n elements: injectOptionsAcrossEntriesElements({\n // repeatable set entries may only know about elements within entry\n contextElements: e.elements,\n elements: e.elements,\n entries: entries.reduce<\n SubmissionTypes.S3SubmissionData['submission'][]\n >((memo, entry) => {\n const nestedEntries = entry[e.name]\n if (Array.isArray(nestedEntries)) {\n memo.push(\n ...(nestedEntries as SubmissionTypes.S3SubmissionData['submission'][]),\n )\n }\n return memo\n }, []),\n taskContext,\n userProfile,\n }),\n }\n }\n default: {\n const optionsElement = typeCastService.formElements.toOptionsElement(e)\n if (optionsElement) {\n return {\n ...optionsElement,\n options: entries.reduce<FormTypes.ChoiceElementOption[]>(\n (newOptions, submission) => {\n optionsElement.options?.forEach((o) => {\n const injected = processInjectableOption({\n option: o,\n submission,\n formElements: contextElements,\n taskContext,\n userProfile,\n })\n\n newOptions.push(\n ...injected.filter((generatedOption) => {\n return !newOptions.some(\n (addedOption) =>\n addedOption.value === generatedOption.value,\n )\n }),\n )\n })\n return newOptions\n },\n [],\n ),\n }\n }\n return e\n }\n }\n })\n}\n\nexport function injectOptionsAcrossAllElements({\n submission,\n ...params\n}: {\n elements: FormTypes.FormElement[]\n contextElements: FormTypes.FormElement[]\n submission: SubmissionTypes.S3SubmissionData['submission']\n taskContext: TaskContext\n userProfile: MiscTypes.UserProfile | undefined\n}): FormTypes.FormElement[] {\n // We iterate over entries as an array of submission objects because\n // child elements of a repeatable set that have injected options\n // need to include all of the injected options from the same elements\n // in sibling entries within the set. Otherwise we will not have the\n // labels for each available option to display the submission.\n return injectOptionsAcrossEntriesElements({\n ...params,\n entries: [submission],\n })\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@oneblink/apps-react",
3
3
  "description": "Helper functions for OneBlink apps in ReactJS.",
4
- "version": "6.1.0-beta.4",
4
+ "version": "6.1.0-beta.6",
5
5
  "author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
6
6
  "bugs": {
7
7
  "url": "https://github.com/oneblink/apps-react/issues"