@nyaruka/temba-components 0.129.4 → 0.129.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.
- package/CHANGELOG.md +8 -1
- package/dist/temba-components.js +4 -4
- package/dist/temba-components.js.map +1 -1
- package/out-tsc/src/flow/NodeEditor.js +11 -0
- package/out-tsc/src/flow/NodeEditor.js.map +1 -1
- package/out-tsc/src/form/select/Select.js +29 -14
- package/out-tsc/src/form/select/Select.js.map +1 -1
- package/out-tsc/src/live/ContactChat.js +1 -1
- package/out-tsc/src/live/ContactChat.js.map +1 -1
- package/out-tsc/test/temba-select.test.js +73 -0
- package/out-tsc/test/temba-select.test.js.map +1 -1
- package/package.json +1 -1
- package/src/flow/NodeEditor.ts +11 -0
- package/src/form/select/Select.ts +30 -14
- package/src/live/ContactChat.ts +1 -1
- package/test/temba-select.test.ts +107 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContactChat.js","sourceRoot":"","sources":["../../../src/live/ContactChat.ts"],"names":[],"mappings":";AAAA,qDAAqD;AACrD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAoC,MAAM,KAAK,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAEL,eAAe,EAIhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,OAAO,EAER,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAiB5D,OAAO,EAAmB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnD;;;;;;EAME;AAEF,MAAM,CAAN,IAAY,MAwBX;AAxBD,WAAY,MAAM;IAChB,yCAA+B,CAAA;IAC/B,2CAAiC,CAAA;IACjC,iDAAuC,CAAA;IACvC,qCAA2B,CAAA;IAC3B,uCAA6B,CAAA;IAE7B,qCAA2B,CAAA;IAC3B,yDAA+C,CAAA;IAC/C,2DAAiD,CAAA;IACjD,uDAA6C,CAAA;IAC7C,uDAA6C,CAAA;IAC7C,yCAA+B,CAAA;IAC/B,+DAAqD,CAAA;IACrD,qDAA2C,CAAA;IAC3C,uCAA6B,CAAA;IAC7B,uCAA6B,CAAA;IAC7B,6CAAmC,CAAA;IACnC,iDAAuC,CAAA;IACvC,yCAA+B,CAAA;IAC/B,yCAA+B,CAAA;IAC/B,6CAAmC,CAAA;IACnC,uDAA6C,CAAA;IAC7C,6CAAmC,CAAA;AACrC,CAAC,EAxBW,MAAM,KAAN,MAAM,QAwBjB;AAED,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAE,MAAc,EAAE,KAAY,EAAE,EAAE;IACxE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,QAAQ,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxB,OAAO,GAAG,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAmB,EAAU,EAAE;;IACzD,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,sBAAsB,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,sBAAsB,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;QACnD,OAAO,sBAAsB,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,iBAAiB,EAAE,CAAC;QAC1D,OAAO,sBAAsB,CAAC;IAChC,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC3C,OAAO,UAAU,CAAC;IACpB,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACzC,OAAO,UAAU,CAAC;IACpB,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,qBAAqB,CAAC;IAC/B,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;QACzC,OAAO,qBAAqB,CAAC;IAC/B,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;QACvC,OAAO,iBAAiB,MAAA,KAAK,CAAC,KAAK,CAAC,KAAK,0CAAE,IAAI,IAAI,CAAC;IACtD,CAAC;SAAM,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;QACxC,OAAO,kBAAkB,MAAA,KAAK,CAAC,KAAK,CAAC,KAAK,0CAAE,IAAI,IAAI,CAAC;IACvD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAgB,EAAU,EAAE;IACnD,IAAI,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,YAAY,EAAE,CAAC;YACvC,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAuB,EAAU,EAAE;IAC5D,OAAO,KAAK,CAAC,KAAK;QAChB,CAAC,CAAC,aAAa,KAAK,CAAC,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI;QAC9D,CAAC,CAAC,aAAa,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAAuB,EAAU,EAAE;IAC5D,OAAO,iCAAiC,KAAK,CAAC,IAAI,IAAI,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,KAAuB,EAAU,EAAE;IACnE,OAAO,uBAAuB,QAAQ,CACpC,KAAK,CAAC,IAAI,EACV,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAC1D,EAAE,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAChC,KAAkB,EAClB,MAAc,EACN,EAAE;IACV,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,KAAK,cAAc,CACxB,KAAK,CAAC,UAAU,CACjB,MAAM,MAAM,oCAAoC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;IAC3E,CAAC;IACD,OAAO,mCAAmC,KAAK,CAAC,MAAM,CAAC,IAAI,cAAc,MAAM,IAAI,CAAC;AACtF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAkB,EAAU,EAAE;IACjE,OAAO,KAAK,CAAC,QAAQ;QACnB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE;YACzC,CAAC,CAAC,KAAK,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,qBAAqB;YAC5D,CAAC,CAAC,GAAG,cAAc,CACf,KAAK,CAAC,UAAU,CACjB,8BAA8B,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI;QACrE,CAAC,CAAC,KAAK,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,2BAA2B,CAAC;AACvE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,KAAyB,EAAU,EAAE;IAC5E,MAAM,WAAW,GAAG,KAA2B,CAAC;IAChD,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,cAAc,CACnB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,CAAC,YAAY,CACzB,CAAC;IACJ,CAAC;SAAM,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;QACtC,OAAO,cAAc,CACnB,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,CAAC,cAAc,CAC3B,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAkB,EAAU,EAAE;IAC/D,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAC3C,KAA8B,EACtB,EAAE;IACV,IAAI,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,yBAAyB,CAAC;IACnC,CAAC;IACD,OAAO,iBAAiB,KAAK,CAAC,aAAa,MAAM,KAAK,CAAC,QAAQ,aAAa,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAW,EAAE;IACjD,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,KAAkC,EAC1B,EAAE;IACV,OAAO,yBAAyB,KAAK,CAAC,QAAQ,IAAI,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAA0B,EAAU,EAAE;IACzE,OAAO,wBAAwB,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,OAAO,WAAY,SAAQ,mBAAmB;IAC3C,MAAM,KAAK,MAAM;QACtB,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuMT,CAAC;IACJ,CAAC;IA6CD;QACE,KAAK,EAAE,CAAC;QAxCV,qBAAgB,GAAG,uBAAuB,CAAC;QAG3C,gBAAW,GAAG,EAAE,CAAC;QAGjB,gBAAW,GAAG,IAAI,CAAC;QAGnB,kBAAa,GAAW,IAAI,CAAC;QAG7B,mBAAc,GAAY,IAAI,CAAC;QAG/B,UAAK,GAAG,EAAE,CAAC;QAGX,kBAAa,GAAG,KAAK,CAAC;QAGtB,kBAAa,GAAG,KAAK,CAAC;QAGtB,WAAM,GAAG,cAAc,CAAC;QASxB,WAAM,GAAG,IAAI,CAAC;QACd,kBAAa,GAAG,IAAI,CAAC;QACrB,oBAAe,GAAG,IAAI,CAAC;QACvB,cAAS,GAAG,IAAI,CAAC;QACjB,YAAO,GAAG,KAAK,CAAC;IAIhB,CAAC;IAEM,YAAY,CACjB,OAA0D;QAE1D,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAEM,iBAAiB;QACtB,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IAC1D,CAAC;IAEM,oBAAoB;QACzB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAEM,OAAO,CAAC,iBAAmC;QAChD,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAEjC,yCAAyC;QACzC,IACE,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7B,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EACvC,CAAC;YACD,oCAAoC;YACpC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACxB,CAAC;YAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC;QAClC,CAAC;QAED,IAAI,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YACxD,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK;QACX,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,CAAY,CAAC;QAC1E,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,SAAS,EAAE;YAC9C,OAAO,EAAE,IAAI,CAAC,cAAc;SAC7B,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,eAAe,CAAY,CAAC;QAC1E,OAAO,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC;IAEO,UAAU,CAAC,GAAgB;QACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,MAAM,UAAU,GAAG,GAAG,CAAC,aAAwB,CAAC;QAChD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAiB,CAAC;QAE7D,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI;SAClC,CAAC;QAEF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACxC,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC1E,OAAO,CAAC,aAAa,CAAC,GAAG,gBAAgB,CAAC;QAC5C,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QAC9C,CAAC;QAED,MAAM,YAAY,GAAG,gCAAgC,CAAC;QACtD,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;aACvC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC1B,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;YACnC,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACnC,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,oBAAoB,IAAI,CAAC,OAAO,gBAAgB,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,eAAe;QACrB,yDAAyD;QACzD,uDAAuD;QACvD,IAAI,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,IAAI,CAAC;QAEvE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QAED,iCAAiC;QACjC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAEjC,0BAA0B;QAC1B,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEhC,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC;IAEM,eAAe,CAAC,KAAmB;QACxC,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,aAAa;gBACvB,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,kBAAkB,CAAC,KAAoB,EAAE,QAAQ,CAAC;iBACzD,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,eAAe;gBACzB,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,oBAAoB,CAAC,KAAoB,CAAC;iBACjD,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,eAAe;gBACzB,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,kBAAkB,CAAC,KAAoB,EAAE,UAAU,CAAC;iBAC3D,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,aAAa;gBACvB,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,kBAAkB,CAAC,KAAoB,EAAE,QAAQ,CAAC;iBACzD,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,oBAAoB;gBAC9B,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,sBAAuB,KAAqB,CAAC,KAAK,CAAC,IAAI,IAAI;iBAClE,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,YAAY,CAAC;YACzB,KAAK,MAAM,CAAC,WAAW;gBACrB,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,eAAe,CAAC,KAAkB,CAAC;iBAC1C,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,qBAAqB;gBAC/B,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,iBAAiB,CAAC,KAAyB,CAAC;iBACnD,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,oBAAoB;gBAC9B,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,iBAAiB,CAAC,KAAyB,CAAC;iBACnD,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,oBAAoB;gBAC9B,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,wBAAwB,CAAC,KAAyB,CAAC;iBAC1D,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,sBAAsB;gBAChC,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,wBAAwB,CAAC,KAA2B,CAAC;iBAC5D,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,mBAAmB;gBAC7B,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,6BAA6B,CAAC,KAAgC,CAAC;iBACtE,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,YAAY;gBACtB,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,sBAAsB,EAAE;iBAC/B,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,aAAa;gBACvB,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,kBAAkB,CAAC,KAAqB,CAAC;iBAChD,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,wBAAwB;gBAClC,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,iCAAiC,CACrC,KAAoC,CACrC;iBACF,CAAC;gBACF,MAAM;YACR,KAAK,MAAM,CAAC,eAAe;gBACzB,OAAO,GAAG;oBACR,IAAI,EAAE,WAAW,CAAC,MAAM;oBACxB,IAAI,EAAE,oBAAoB,CAAC,KAA4B,CAAC;iBACzD,CAAC;gBACF,MAAM;QACV,CAAC;QAED,IAAI,OAAO,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,eAAe,CAAC,KAA6B;QACnD,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,IAAI,GAAG;gBACL,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI;aAC/B,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAC5B,IAAI,GAAG;gBACL,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK;gBAC7B,IAAI,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE;gBAC3E,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM;aAChC,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,cAAc,CAAC,IAAwB;QAC7C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC5B,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC;gBACvD,IAAI,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC9B,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;gBAC5B,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;oBACvC,MAAM,WAAW,GAAG,KAAoB,CAAC;oBACzC,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,WAAW,CAAC,IAAI;wBACtB,EAAE,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI;wBACjC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;wBACvC,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;wBACtC,IAAI,EAAE,WAAW,CAAC,IAAI;qBACvB,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;oBAC1C,8CAA8C;oBAC9C,MAAM,WAAW,GAAG,KAAoB,CAAC;oBACzC,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,WAAW,CAAC,IAAI;wBACtB,EAAE,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,GAAG,OAAO;wBAC3C,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC;wBACvC,IAAI,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;wBACtC,IAAI,EAAE,WAAW,CAAC,IAAI;qBACvB,CAAC,CAAC;oBAEH,kDAAkD;oBAClD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7C,CAAC;qBAAM,IACL,KAAK,CAAC,IAAI,KAAK,aAAa;oBAC5B,KAAK,CAAC,IAAI,KAAK,cAAc;oBAC7B,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAClC,CAAC;oBACD,MAAM,QAAQ,GAAG,KAAiB,CAAC;oBACnC,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;wBAC7D,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;wBACpC,IAAI,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;wBACnC,WAAW,EAAE,QAAQ,CAAC,GAAG,CAAC,WAAW;wBACrC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI;wBACvB,SAAS,EAAE,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;wBAC7D,KAAK,EAAE,IAAI,CAAA;;;;;0BAKG,QAAQ,CAAC,UAAU;;;;kBAI3B,QAAQ,CAAC,KAAK;4BACd,CAAC,CAAC,IAAI,CAAA;wBACA,QAAQ,CAAC,KAAK,CAAC,IAAI;2BAChB;4BACT,CAAC,CAAC,IAAI;kBACN,QAAQ,CAAC,qBAAqB;4BAC9B,CAAC,CAAC,IAAI,CAAA;;;;0BAIE,QAAQ,CAAC,qBAAqB;;qBAEnC;4BACH,CAAC,CAAC,IAAI;;gBAER,QAAQ,CAAC,QAAQ;4BACjB,CAAC,CAAC,IAAI,CAAA,sCAAsC,QAAQ,CAAC,QAAQ;;wBAErD;4BACR,CAAC,CAAC,IAAI;oBACF;qBACT,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,yCAAyC;YACzC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3C,OAAO,QAAuB,CAAC;QACjC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,mBAAmB;;QACzB,+BAA+B;QAC/B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAChD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YAE9C,mBAAmB,CACjB,KAAK,EACL,QAAQ,EACR,MAAA,IAAI,CAAC,aAAa,0CAAE,IAAI,EACxB,IAAI,EACJ,IAAI,CAAC,eAAe,CACrB,CAAC,IAAI,CAAC,CAAC,IAAwB,EAAE,EAAE;gBAClC,IAAI,YAAY,KAAK,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;oBAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC;oBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;oBAC3C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC1B,WAAW,CAAC,aAAa,GAAG,IAAI,CAAC;oBACnC,CAAC;oBACD,QAAQ,CAAC,OAAO,EAAE,CAAC;oBACnB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzC,CAAC;gBACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,qBAAqB;;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YAED,mBAAmB,CACjB,KAAK,EACL,QAAQ,EACR,MAAA,IAAI,CAAC,aAAa,0CAAE,IAAI,EACxB,IAAI,CAAC,aAAa,CACnB,CAAC,IAAI,CAAC,CAAC,IAAwB,EAAE,EAAE;gBAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC;gBACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAC3C,QAAQ,CAAC,OAAO,EAAE,CAAC;gBAEnB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,WAAW,CAAC,aAAa,GAAG,IAAI,CAAC;gBACnC,CAAC;gBACD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAC3B,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACnE,uDAAuD;gBACvD,OAAO,IAAI,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;oBAClC,iDAAiD;oBACjD,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACnE,uDAAuD;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,OAAO,IAAI,CAAA;;;;;;;0BAOW,CAAC,IAAI,CAAC,aAAa;6BAChB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;;;UAG7C,IAAI,CAAC,YAAY;YACjB,CAAC,CAAC,IAAI,CAAA;2CAC2B,IAAI,CAAC,YAAY;;;yBAGnC,IAAI,CAAC,WAAW;;mBAEtB;YACT,CAAC,CAAC,IAAI;aACH,CAAC;IACZ,CAAC;IAEO,uBAAuB,CAAC,GAAgB;QAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,aAA2B,CAAC;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEjC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,EAAE,CAAC;IACf,CAAC;IAEO,kBAAkB,CAAC,GAAgB;QACzC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAqB,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YACjD,QAAQ,CAAC,6BAA6B,EAAE;gBACtC,OAAO,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAClC,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,KAAK,CAAC,IAAI;aAClB,CAAC;iBACC,IAAI,CAAC,GAAG,EAAE;gBACT,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,QAAa,EAAE,EAAE;gBACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC;IAEM,YAAY,CAAC,KAAa;QAC/B,8CAA8C;QAC9C,IACE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ;YAC1B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,KAAK,KAAK,CAAC;YAC9C,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,EACxD,CAAC;YACD,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,6BAA6B,EAAE;YACtC,OAAO,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YAClC,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,KAAK;SAChB,CAAC;aACC,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,QAAa,EAAE,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACL,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,aAAa;QAClB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,6BAA6B,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CACvE,CAAC,MAAM,EAAE,EAAE;gBACT,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;oBACtD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtB,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,aAAa,EAAE;4BAClD,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;4BACjB,QAAQ,EAAE,IAAI,CAAC,aAAa;yBAC7B,CAAC,CAAC;wBACH,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,YAAY;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QACrC,QAAQ,CAAC,6BAA6B,EAAE;YACtC,OAAO,EAAE,CAAC,IAAI,CAAC;YACf,MAAM,EAAE,QAAQ;SACjB,CAAC;aACC,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,QAAa,EAAE,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,WAAW;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QACrC,QAAQ,CAAC,6BAA6B,EAAE;YACtC,OAAO,EAAE,CAAC,IAAI,CAAC;YACf,MAAM,EAAE,OAAO;SAChB,CAAC;aACC,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,QAAa,EAAE,EAAE;YACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,MAAM;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAE/D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;QAExE,OAAO,IAAI,CAAA;QACP,IAAI,CAAC,cAAc;YACnB,CAAC,CAAC,IAAI,CAAA;wCAC0B,IAAI,CAAC,qBAAqB;sCAC5B,IAAI,CAAC,aAAa;uBACjC,IAAI,CAAC,MAAM;;;gBAGlB,MAAM;gBACN,CAAC,CAAC,IAAI,CAAA;;;;;;;;mDAQ6B,IAAI,CAAC,cAAc,CAAC,IAAI;qBAC1C,IAAI;iCACJ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI;;;;0BAIpC,IAAI,CAAC,aAAa;oBAClB,CAAC,CAAC,IAAI,CAAA;;;;uCAIO,IAAI,CAAC,eAAe;;;4CAGf;oBAClB,CAAC,CAAC,IAAI;;;mBAGb;gBACH,CAAC,CAAC,IAAI;;;cAGR,QAAQ;gBACR,CAAC,CAAC,IAAI,CAAA;;;;;;;gCAOY,IAAI,CAAC,aAAa,CAAC,QAAQ;oBACnC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAC/B,CAAC,CAAC,EAAE;gCACI,IAAI,CAAC,uBAAuB;kCAC1B,YAAY;;;;;;;;gCAQd,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;gCAC1B,IAAI,CAAC,kBAAkB;kCACrB,YAAY;;;sBAGxB,IAAI,CAAC,aAAa,CAAC,SAAS;oBAC5B,CAAC,CAAC,IAAI,CAAA;;;qCAGS,IAAI,CAAC,YAAY;;yBAE7B;oBACH,CAAC,CAAC,IAAI,CAAA;;;;qCAIS,IAAI,CAAC,WAAW;;yBAE5B;;wBAED;gBACV,CAAC,CAAC,IAAI;cACN,IAAI,CAAC,eAAe,EAAE,EAAE;YAC9B,CAAC,CAAC,IAAI;WACH,CAAC;IACV,CAAC;CACF;AArsBC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;+CAC7B;AAGnB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;qDACgB;AAG3C;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDACV;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gDACT;AAGnB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;kDACE;AAG7B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDACI;AAG/B;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0CAChB;AAGX;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;kDACN;AAGtB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;kDACN;AAGtB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2CACH;AAGxB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDACN;AAwqBvB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAwB,EAAE;IAChE,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,OAAO,CAAC,kBAAkB,IAAI,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AACnE,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAgB,EAAoB,EAAE;IACjE,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9C,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,QAAmB,EAAE,EAAE;YAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,KAAc,EACd,QAAgB,EAChB,MAAc,EACd,SAAiB,SAAS,EAC1B,QAAgB,SAAS,EACI,EAAE;IAC/B,IAAI,KAAK,EAAE,CAAC;QACV,eAAe,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;YACrC,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,eAAe,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,OAAO,CAAqB,CAAC,OAAO,EAAE,EAAE;QACjD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEjC,IAAI,GAAG,GAAG,QAAQ,CAAC;QACnB,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,IAAI,WAAW,MAAM,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,IAAI,UAAU,KAAK,EAAE,CAAC;QAC3B,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,IAAI,WAAW,MAAM,EAAE,CAAC;QAC7B,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAU,CAAC;QAE7D,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC;aACpB,IAAI,CAAC,CAAC,QAAqB,EAAE,EAAE;YAC9B,0CAA0C;YAC1C,eAAe,GAAG,eAAe,CAAC,MAAM,CACtC,CAAC,UAA2B,EAAE,EAAE;gBAC9B,OAAO,QAAQ,CAAC,UAAU,KAAK,UAAU,CAAC;YAC5C,CAAC,CACF,CAAC;YAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAA0B,CAAC;YACjD,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACxD,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,WAAW;QACb,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAU,EAAE,EAAE;IAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAK,IAAkB,CAAC,IAAI,EAAE,CAAC;QAC7B,OAAQ,IAAkB,CAAC,IAAI,CAAC;IAClC,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC,CAAC;AACF,MAAM,CAAC,IAAI,eAAe,GAAsB,EAAE,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport {\n Contact,\n CustomEventType,\n NamedUser,\n Ticket,\n User\n} from '../interfaces';\nimport {\n fetchResults,\n getUrl,\n oxfordFn,\n postJSON,\n postUrl,\n WebResponse\n} from '../utils';\nimport { ContactStoreElement } from './ContactStoreElement';\nimport { Compose, ComposeValue } from '../form/Compose';\nimport {\n AirtimeTransferredEvent,\n ChannelEvent,\n ContactEvent,\n ContactGroupsEvent,\n ContactHistoryPage,\n ContactLanguageChangedEvent,\n FlowEvent,\n MsgEvent,\n NameChangedEvent,\n OptinRequestedEvent,\n TicketEvent,\n UpdateFieldEvent,\n URNsChangedEvent\n} from '../events';\nimport { Chat, ChatEvent, MessageType } from '../display/Chat';\nimport { getUserDisplay } from '../webchat';\nimport { DEFAULT_AVATAR } from '../webchat/assets';\nimport { UserSelect } from '../form/select/UserSelect';\nimport { Select } from '../form/select/Select';\nimport { Store } from '../store/Store';\n\n/*\nexport const SCROLL_THRESHOLD = 100;\nexport const SIMULATED_WEB_SLOWNESS = 0;\nexport const MAX_CHAT_REFRESH = 10000;\nexport const MIN_CHAT_REFRESH = 500;\nexport const BODY_SNIPPET_LENGTH = 250;\n*/\n\nexport enum Events {\n MESSAGE_CREATED = 'msg_created',\n MESSAGE_RECEIVED = 'msg_received',\n BROADCAST_CREATED = 'broadcast_created',\n IVR_CREATED = 'ivr_created',\n FLOW_ENTERED = 'flow_entered',\n\n FLOW_EXITED = 'flow_exited',\n CONTACT_FIELD_CHANGED = 'contact_field_changed',\n CONTACT_GROUPS_CHANGED = 'contact_groups_changed',\n CONTACT_NAME_CHANGED = 'contact_name_changed',\n CONTACT_URNS_CHANGED = 'contact_urns_changed',\n CHANNEL_EVENT = 'channel_event',\n CONTACT_LANGUAGE_CHANGED = 'contact_language_changed',\n AIRTIME_TRANSFERRED = 'airtime_transferred',\n CALL_STARTED = 'call_started',\n NOTE_CREATED = 'note_created',\n TICKET_ASSIGNED = 'ticket_assigned',\n TICKET_NOTE_ADDED = 'ticket_note_added',\n TICKET_CLOSED = 'ticket_closed',\n TICKET_OPENED = 'ticket_opened',\n TICKET_REOPENED = 'ticket_reopened',\n TICKET_TOPIC_CHANGED = 'ticket_topic_changed',\n OPTIN_REQUESTED = 'optin_requested'\n}\n\nconst renderInfoList = (singular: string, plural: string, items: any[]) => {\n if (items.length === 1) {\n return `${singular} **${items[0].name}**`;\n } else {\n const list = items.map((item) => `**${item.name}**`);\n if (list.length === 2) {\n return `${plural} ${list.join(' and ')}`;\n } else {\n const last = list.pop();\n return `${plural} ${list.join(', ')}, and ${last}`;\n }\n }\n};\n\nconst renderChannelEvent = (event: ChannelEvent): string => {\n if (event.event.type === 'mt_miss') {\n return 'Missed outgoing call';\n } else if (event.event.type === 'mo_miss') {\n return 'Missed incoming call';\n } else if (event.event.type === 'new_conversation') {\n return 'Started conversation';\n } else if (event.channel_event_type === 'welcome_message') {\n return 'Welcome Message Sent';\n } else if (event.event.type === 'referral') {\n return 'Referred';\n } else if (event.event.type === 'follow') {\n return 'Followed';\n } else if (event.event.type === 'stop_contact') {\n return 'Stopped';\n } else if (event.event.type === 'mt_call') {\n return 'Outgoing Phone Call';\n } else if (event.event.type == 'mo_call') {\n return 'Incoming Phone call';\n } else if (event.event.type == 'optin') {\n return `Opted in to **${event.event.optin?.name}**`;\n } else if (event.event.type == 'optout') {\n return `Opted out of **${event.event.optin?.name}**`;\n }\n};\n\nconst renderFlowEvent = (event: FlowEvent): string => {\n let verb = 'Interrupted';\n if (event.status !== 'I') {\n if (event.type === Events.FLOW_ENTERED) {\n verb = 'Started';\n } else {\n verb = 'Completed';\n }\n }\n return `${verb} [**${event.flow.name}**](/flow/editor/${event.flow.uuid}/)`;\n};\n\nconst renderUpdateEvent = (event: UpdateFieldEvent): string => {\n return event.value\n ? `Updated **${event.field.name}** to **${event.value.text}**`\n : `Cleared **${event.field.name}**`;\n};\n\nconst renderNameChanged = (event: NameChangedEvent): string => {\n return `Updated **Contact Name** to **${event.name}**`;\n};\n\nconst renderContactURNsChanged = (event: URNsChangedEvent): string => {\n return `Updated **URNs** to ${oxfordFn(\n event.urns,\n (urn: string) => `**${urn.split(':')[1].split('?')[0]}**`\n )}`;\n};\n\nexport const renderTicketAction = (\n event: TicketEvent,\n action: string\n): string => {\n if (event.created_by) {\n return `**${getUserDisplay(\n event.created_by\n )}** ${action} a **[ticket](/ticket/all/closed/${event.ticket.uuid}/)**`;\n }\n return `A **[ticket](/ticket/all/closed/${event.ticket.uuid}/)** was **${action}**`;\n};\n\nexport const renderTicketAssigned = (event: TicketEvent): string => {\n return event.assignee\n ? event.assignee.id === event.created_by.id\n ? `**${getDisplayName(event.created_by)}** took this ticket`\n : `${getDisplayName(\n event.created_by\n )} assigned this ticket to **${getDisplayName(event.assignee)}**`\n : `**${getDisplayName(event.created_by)}** unassigned this ticket`;\n};\n\nexport const renderContactGroupsEvent = (event: ContactGroupsEvent): string => {\n const groupsEvent = event as ContactGroupsEvent;\n if (groupsEvent.groups_added) {\n return renderInfoList(\n 'Added to group',\n 'Added to groups',\n groupsEvent.groups_added\n );\n } else if (groupsEvent.groups_removed) {\n return renderInfoList(\n 'Removed from group',\n 'Removed from groups',\n groupsEvent.groups_removed\n );\n }\n};\n\nexport const renderTicketOpened = (event: TicketEvent): string => {\n return `${event.ticket.topic.name} ticket was opened`;\n};\n\nexport const renderAirtimeTransferredEvent = (\n event: AirtimeTransferredEvent\n): string => {\n if (parseFloat(event.actual_amount) === 0) {\n return `Airtime transfer failed`;\n }\n return `Transferred **${event.actual_amount}** ${event.currency} of airtime`;\n};\n\nexport const renderCallStartedEvent = (): string => {\n return `Call Started`;\n};\n\nexport const renderContactLanguageChangedEvent = (\n event: ContactLanguageChangedEvent\n): string => {\n return `Language updated to **${event.language}**`;\n};\n\nexport const renderOptinRequested = (event: OptinRequestedEvent): string => {\n return `Requested opt-in for ${event.optin.name}`;\n};\n\nexport class ContactChat extends ContactStoreElement {\n public static get styles() {\n return css`\n :host {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n --compose-shadow: none;\n --compose-border: none;\n --compose-padding: 3px;\n --compose-curvature: none;\n border-top: 1px inset rgba(0, 0, 0, 0.05);\n\n\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n min-height: 0;\n background: #f9f9f9;\n }\n\n temba-contact-history {\n border-bottom: 1px solid #f6f6f6;\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .compose {\n background: #fff;\n display: flex;\n flex-direction: column;\n --textarea-min-height: 8em;\n --textarea-height: 0.5em;\n --widget-box-shadow-focused: none;\n --compose-curvature: 0px;\n overflow: hidden;\n }\n\n .closed-footer {\n padding: 1em;\n background: #f2f2f2;\n border-top: 3px solid #e1e1e1;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n a {\n color: var(--color-link-primary);\n }\n\n a:hover {\n text-decoration: underline;\n color: var(--color-link-primary-hover);\n }\n\n temba-button {\n margin: 0.1em 0.25em;\n }\n\n temba-completion {\n --widget-box-shadow: none;\n --color-widget-border: transparent;\n --widget-box-shadow-focused: none;\n --color-focus: transparent;\n --color-widget-bg-focused: transparent;\n }\n\n .border {\n }\n\n temba-compose {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n --temba-tabs-options-padding: 0.5em 0.5em 0 0.5em;\n --temba-tabs-border-left: none;\n --temba-tabs-border-right: none;\n --temba-tabs-border-bottom: none;\n }\n\n .error-gutter {\n display: flex;\n padding: 0.5em 1em;\n background: #f9f9f9;\n item-align: center;\n }\n\n .error-message {\n color: var(--color-error);\n padding-right: 1em;\n flex-grow: 1;\n align-self: center;\n }\n\n temba-chat {\n border-bottom: 1px solid #ddd;\n background: linear-gradient(0deg, #fff, #fff);\n --chat-border-in: 1px solid #eee;\n --color-chat-out: var(--color-message)\n );\n }\n\n .action-bar {\n }\n\n .in-flow {\n border-radius: 0.8em;\n align-items: center;\n background: #666;\n padding: 0.5em 1em;\n margin: 1em;\n margin-right: 2em;\n display: inline-flex;\n opacity: 0.9;\n }\n\n .in-flow:hover {\n opacity: 1;\n }\n\n .in-flow .flow-name {\n display: flex;\n color: #fff;\n }\n\n .in-flow a {\n font-weight: bold;\n color: #fff;\n }\n\n .in-flow .interrupt-button {\n margin-left: 1em;\n }\n\n .in-flow .interrupt {\n text-align: center;\n align-self: stretch;\n display: flex;\n align-items: center;\n cursor: pointer;\n justify-content: center;\n padding: 0.5em 1em;\n font-weight: bold;\n }\n\n .in-flow .interrupt:hover {\n background: rgba(var(--error-rgb), 0.92);\n }\n\n .in-flow temba-icon,\n .in-ticket temba-icon {\n margin-right: 0.5em;\n }\n\n .in-ticket-wrapper {\n }\n\n .in-ticket {\n box-shadow: none;\n padding: 0.5em 0.5em;\n text-align: center;\n align-items: center;\n border-bottom: 1px solid #ddd;\n display: flex;\n box-shadow: none;\n margin: 0em;\n background: rgba(0, 0, 0, 0.03);\n }\n\n temba-user {\n border: 1px solid #ddd;\n padding: 0.2em 0.5em;\n border-radius: var(--curvature);\n min-width: 10em;\n background: #fff;\n }\n\n temba-user:hover {\n border: 1px solid #ddd;\n background: #f9f9f9;\n }\n\n .assign-button {\n --button-mask: #ebebeb;\n color: #333;\n margin: 0.25em;\n }\n\n temba-user-select {\n width: 250px;\n }\n\n temba-button {\n --button-border: 1px solid #ddd;\n }\n `;\n }\n\n @property({ type: String, attribute: 'ticket' })\n ticketUUID: string;\n\n @property({ type: String })\n contactsEndpoint = '/api/v2/contacts.json';\n\n @property({ type: String })\n currentNote = '';\n\n @property({ type: Boolean })\n showDetails = true;\n\n @property({ type: Object })\n currentTicket: Ticket = null;\n\n @property({ type: Object })\n currentContact: Contact = null;\n\n @property({ type: String })\n agent = '';\n\n @property({ type: Boolean })\n blockFetching = false;\n\n @property({ type: Boolean })\n showInterrupt = false;\n\n @property({ type: String })\n avatar = DEFAULT_AVATAR;\n\n @property({ type: String })\n errorMessage: string;\n\n // http promise to monitor for completeness\n public httpComplete: Promise<void>;\n private chat: Chat;\n\n ticket = null;\n lastEventTime = null;\n newestEventTime = null;\n refreshId = null;\n polling = false;\n\n constructor() {\n super();\n }\n\n public firstUpdated(\n changed: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changed);\n }\n\n public connectedCallback() {\n super.connectedCallback();\n this.chat = this.shadowRoot.querySelector('temba-chat');\n }\n\n public disconnectedCallback() {\n super.disconnectedCallback();\n if (this.refreshId) {\n clearInterval(this.refreshId);\n }\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // if we don't have an endpoint infer one\n if (\n changedProperties.has('data') ||\n changedProperties.has('currentContact')\n ) {\n // unschedule any previous refreshes\n if (this.refreshId) {\n clearTimeout(this.refreshId);\n this.refreshId = null;\n }\n\n this.currentContact = this.data;\n }\n\n if (changedProperties.has('currentContact')) {\n this.chat = this.shadowRoot.querySelector('temba-chat');\n this.reset();\n this.fetchPreviousMessages();\n }\n }\n\n private reset() {\n if (this.chat) {\n this.chat.reset();\n }\n this.blockFetching = false;\n this.ticket = null;\n this.lastEventTime = null;\n this.newestEventTime = null;\n this.refreshId = null;\n this.polling = false;\n this.errorMessage = null;\n\n const compose = this.shadowRoot.querySelector('temba-compose') as Compose;\n if (compose) {\n compose.reset();\n }\n }\n\n private handleInterrupt() {\n this.fireCustomEvent(CustomEventType.Interrupt, {\n contact: this.currentContact\n });\n }\n\n private handleRetry() {\n const compose = this.shadowRoot.querySelector('temba-compose') as Compose;\n compose.triggerSend();\n }\n\n private handleSend(evt: CustomEvent) {\n this.errorMessage = null;\n const composeEle = evt.currentTarget as Compose;\n const compose = evt.detail.langValues['und'] as ComposeValue;\n\n const payload = {\n contact: this.currentContact.uuid\n };\n\n const text = compose.text;\n if (text && text.length > 0) {\n payload['text'] = text;\n }\n const attachments = compose.attachments;\n if (attachments && attachments.length > 0) {\n const attachment_uuids = attachments.map((attachment) => attachment.uuid);\n payload['attachments'] = attachment_uuids;\n }\n\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n const genericError = 'Send failed, please try again.';\n postJSON(`/api/v2/messages.json`, payload)\n .then((response) => {\n if (response.status < 400) {\n this.checkForNewMessages();\n composeEle.reset();\n this.fireCustomEvent(CustomEventType.MessageSent, { msg: payload });\n } else {\n this.errorMessage = genericError;\n }\n })\n .catch(() => {\n this.errorMessage = genericError;\n });\n }\n\n private getEndpoint() {\n if (this.contact) {\n return `/contact/history/${this.contact}/?_format=json`;\n }\n return null;\n }\n\n private scheduleRefresh() {\n // knock five seconds off the newest event time so we are\n // a little more aggressive about refreshing short term\n let window = new Date().getTime() - this.newestEventTime / 1000 - 5000;\n\n if (this.refreshId) {\n clearTimeout(this.refreshId);\n this.refreshId = null;\n }\n\n // wait no longer than 15 seconds\n window = Math.min(window, 15000);\n\n // wait at least 2 seconds\n window = Math.max(window, 2000);\n\n this.refreshId = setTimeout(() => {\n this.checkForNewMessages();\n }, window);\n }\n\n public getEventMessage(event: ContactEvent): ChatEvent {\n let message = null;\n switch (event.type) {\n case Events.TICKET_OPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'opened')\n };\n break;\n case Events.TICKET_ASSIGNED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAssigned(event as TicketEvent)\n };\n break;\n case Events.TICKET_REOPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'reopened')\n };\n break;\n case Events.TICKET_CLOSED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'closed')\n };\n break;\n case Events.TICKET_TOPIC_CHANGED:\n message = {\n type: MessageType.Inline,\n text: `Topic changed to **${(event as TicketEvent).topic.name}**`\n };\n break;\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n message = {\n type: MessageType.Inline,\n text: renderFlowEvent(event as FlowEvent)\n };\n break;\n case Events.CONTACT_FIELD_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderUpdateEvent(event as UpdateFieldEvent)\n };\n break;\n case Events.CONTACT_NAME_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderNameChanged(event as NameChangedEvent)\n };\n break;\n case Events.CONTACT_URNS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactURNsChanged(event as URNsChangedEvent)\n };\n break;\n case Events.CONTACT_GROUPS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactGroupsEvent(event as ContactGroupsEvent)\n };\n break;\n case Events.AIRTIME_TRANSFERRED:\n message = {\n type: MessageType.Inline,\n text: renderAirtimeTransferredEvent(event as AirtimeTransferredEvent)\n };\n break;\n case Events.CALL_STARTED:\n message = {\n type: MessageType.Inline,\n text: renderCallStartedEvent()\n };\n break;\n case Events.CHANNEL_EVENT:\n message = {\n type: MessageType.Inline,\n text: renderChannelEvent(event as ChannelEvent)\n };\n break;\n case Events.CONTACT_LANGUAGE_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactLanguageChangedEvent(\n event as ContactLanguageChangedEvent\n )\n };\n break;\n case Events.OPTIN_REQUESTED:\n message = {\n type: MessageType.Inline,\n text: renderOptinRequested(event as OptinRequestedEvent)\n };\n break;\n }\n\n if (message && event.created_on) {\n message.date = new Date(event.created_on);\n } else {\n console.error('Unknown event type', event);\n }\n\n return message;\n }\n\n private getUserForEvent(event: MsgEvent | TicketEvent) {\n let user = null;\n if (event.type === 'msg_received') {\n user = {\n name: this.currentContact.name\n };\n } else if (event.created_by) {\n user = {\n email: event.created_by.email,\n name: `${event.created_by.first_name} ${event.created_by.last_name}`.trim(),\n avatar: event.created_by.avatar\n };\n }\n return user;\n }\n\n private createMessages(page: ContactHistoryPage): ChatEvent[] {\n if (page.events) {\n let messages = [];\n page.events.forEach((event) => {\n const ts = new Date(event.created_on).getTime() * 1000;\n if (ts > this.newestEventTime) {\n this.newestEventTime = ts;\n }\n\n if (event.type === 'ticket_note_added') {\n const ticketEvent = event as TicketEvent;\n messages.push({\n type: MessageType.Note,\n id: event.created_on + event.type,\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n });\n } else if (event.type === 'ticket_opened') {\n // ticket open events can have a note attached\n const ticketEvent = event as TicketEvent;\n messages.push({\n type: MessageType.Note,\n id: event.created_on + event.type + '_note',\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n });\n\n // but the opening of the ticket is a normal event\n messages.push(this.getEventMessage(event));\n } else if (\n event.type === 'msg_created' ||\n event.type === 'msg_received' ||\n event.type === 'broadcast_created'\n ) {\n const msgEvent = event as MsgEvent;\n messages.push({\n uuid: event.uuid,\n type: msgEvent.type === 'msg_received' ? 'msg_in' : 'msg_out',\n user: this.getUserForEvent(msgEvent),\n date: new Date(msgEvent.created_on),\n attachments: msgEvent.msg.attachments,\n text: msgEvent.msg.text,\n sendError: msgEvent.status === 'E' || msgEvent.status === 'F',\n popup: html`<div\n style=\"display: flex; flex-direction: row; align-items:center; justify-content: space-between;font-size:0.9em;line-height:1em;min-width:10em\"\n >\n <div style=\"justify-content:left;text-align:left\">\n <temba-date\n value=${msgEvent.created_on}\n display=\"duration\"\n ></temba-date>\n\n ${msgEvent.optin\n ? html`<div style=\"font-size:0.9em;color:#aaa\">\n ${msgEvent.optin.name}\n </div>`\n : null}\n ${msgEvent.failed_reason_display\n ? html`\n <div\n style=\"margin-top:0.2em;margin-right: 0.5em;min-width:10em;max-width:15em;color:var(--color-error);font-size:0.9em\"\n >\n ${msgEvent.failed_reason_display}\n </div>\n `\n : null}\n </div>\n ${msgEvent.logs_url\n ? html`<a style=\"margin-left:0.5em\" href=\"${msgEvent.logs_url}\"\n ><temba-icon name=\"log\"></temba-icon\n ></a>`\n : null}\n </div> `\n });\n } else {\n messages.push(this.getEventMessage(event));\n }\n });\n\n // remove any messages we don't recognize\n messages = messages.filter((msg) => !!msg);\n return messages as ChatEvent[];\n }\n return [];\n }\n\n private checkForNewMessages() {\n // we are already working on it\n if (this.polling) {\n return;\n }\n\n const chat = this.chat;\n const contactChat = this;\n if (this.currentContact && this.newestEventTime) {\n this.polling = true;\n const endpoint = this.getEndpoint();\n if (!endpoint) {\n return;\n }\n\n const fetchContact = this.currentContact.uuid;\n\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n null,\n this.newestEventTime\n ).then((page: ContactHistoryPage) => {\n if (fetchContact === this.currentContact.uuid) {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n messages.reverse();\n chat.addMessages(messages, null, true);\n }\n this.polling = false;\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchPreviousMessages() {\n const chat = this.chat;\n const contactChat = this;\n if (!chat || chat.fetching || contactChat.blockFetching) {\n return;\n }\n\n chat.fetching = true;\n if (this.currentContact) {\n const endpoint = this.getEndpoint();\n if (!endpoint) {\n return;\n }\n\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n this.lastEventTime\n ).then((page: ContactHistoryPage) => {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n messages.reverse();\n\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n chat.addMessages(messages);\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchComplete() {\n if (this.chat) {\n this.chat.fetching = false;\n }\n }\n\n private getTembaCompose(): TemplateResult {\n if (this.currentTicket) {\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n if (!this.currentTicket.closed_on) {\n //chatbox for active contacts with an open ticket\n return this.getCompose();\n } else {\n return null;\n }\n }\n }\n\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n //chatbox for active contacts\n return this.getCompose();\n }\n }\n\n private getCompose(): TemplateResult {\n return html`<div class=\"border\"></div>\n <div class=\"compose\">\n <temba-compose\n attachments\n counter\n autogrow\n shortcuts\n ?embeddedTabs=${!this.currentTicket}\n @temba-submitted=${this.handleSend.bind(this)}\n >\n </temba-compose>\n ${this.errorMessage\n ? html` <div class=\"error-gutter\">\n <div class=\"error-message\">${this.errorMessage}</div>\n <temba-button\n name=\"Retry\"\n @click=${this.handleRetry}\n ></temba-button>\n </div>`\n : null}\n </div>`;\n }\n\n private handleAssignmentChanged(evt: CustomEvent) {\n const users = evt.currentTarget as UserSelect;\n const assignee = users.values[0];\n\n this.assignTicket(assignee ? assignee.email : null);\n users.blur();\n }\n\n private handleTopicChanged(evt: CustomEvent) {\n const select = evt.target as Select<any>;\n const topic = select.values[0];\n\n if (this.currentTicket.topic.uuid !== topic.uuid) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [this.currentTicket.uuid],\n action: 'change_topic',\n topic: topic.uuid\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n }\n\n public assignTicket(email: string) {\n // if its already assigned to use, it's a noop\n if (\n (this.currentTicket.assignee &&\n this.currentTicket.assignee.email === email) ||\n (this.currentTicket.assignee === null && email === null)\n ) {\n return;\n }\n\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [this.currentTicket.uuid],\n action: 'assign',\n assignee: email\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n return true;\n }\n\n public refreshTicket() {\n if (this.currentTicket) {\n fetchResults(`/api/v2/tickets.json?uuid=${this.currentTicket.uuid}`).then(\n (values) => {\n this.store.resolveUsers(values, ['assignee']).then(() => {\n if (values.length > 0) {\n this.fireCustomEvent(CustomEventType.TicketUpdated, {\n ticket: values[0],\n previous: this.currentTicket\n });\n this.currentTicket = values[0];\n }\n });\n }\n );\n }\n }\n\n private handleReopen() {\n const uuid = this.currentTicket.uuid;\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'reopen'\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleClose() {\n const uuid = this.currentTicket.uuid;\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close'\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public render(): TemplateResult {\n const inFlow = this.currentContact && this.currentContact.flow;\n\n const inTicket = this.currentTicket;\n const ticketClosed = this.currentTicket && this.currentTicket.closed_on;\n\n return html`<div class=\"chat-wrapper\">\n ${this.currentContact\n ? html`<temba-chat\n @temba-scroll-threshold=${this.fetchPreviousMessages}\n @temba-fetch-complete=${this.fetchComplete}\n avatar=${this.avatar}\n agent\n >\n ${inFlow\n ? html`\n <div slot=\"footer\" style=\"text-align:center;\">\n <div class=\"in-flow\">\n <div class=\"flow-name\">\n <temba-icon name=\"flow\" size=\"1.2\"></temba-icon>\n <div>\n Currently in\n <a\n href=\"/flow/editor/${this.currentContact.flow\n .uuid}/\"\n >${this.currentContact.flow.name}</a\n >\n </div>\n </div>\n ${this.showInterrupt\n ? html`<temba-button\n class=\"interrupt-button\"\n destructive\n small\n @click=${this.handleInterrupt}\n name=\"Interrupt\"\n >\n </temba-button>`\n : null}\n </div>\n </div>\n `\n : null}\n <div slot=\"footer\"></div>\n </temba-chat>\n ${inTicket\n ? html`<div class=\"in-ticket-wrapper\">\n <div class=\"in-ticket\">\n <temba-user-select\n placeholder=\"Assign to..\"\n searchable\n searchOnFocus\n clearable\n .values=${this.currentTicket.assignee\n ? [this.currentTicket.assignee]\n : []}\n @change=${this.handleAssignmentChanged}\n ?disabled=${ticketClosed}\n ></temba-user-select>\n\n <temba-select\n style=\"margin:0 0.5em; flex-grow:1\"\n endpoint=\"/api/v2/topics.json\"\n searchable\n valuekey=\"uuid\"\n .values=${[this.currentTicket.topic]}\n @change=${this.handleTopicChanged}\n ?disabled=${ticketClosed}\n ></temba-select>\n\n ${this.currentTicket.closed_on\n ? html`\n <temba-button\n name=\"Reopen\"\n @click=${this.handleReopen}\n ></temba-button>\n `\n : html`\n <temba-button\n name=\"Close\"\n destructive\n @click=${this.handleClose}\n ></temba-button>\n `}\n </div>\n </div> `\n : null}\n ${this.getTembaCompose()}`\n : null}\n </div>`;\n }\n}\nexport const closeTicket = (uuid: string): Promise<WebResponse> => {\n const formData = new FormData();\n formData.append('status', 'C');\n return postUrl(`/ticket/update/${uuid}/?_format=json`, formData);\n};\nexport const fetchContact = (endpoint: string): Promise<Contact> => {\n return new Promise<Contact>((resolve, reject) => {\n fetchResults(endpoint).then((contacts: Contact[]) => {\n if (contacts && contacts.length === 1) {\n resolve(contacts[0]);\n } else {\n reject('No contact found');\n }\n });\n });\n};\nexport const fetchContactHistory = (\n reset: boolean,\n endpoint: string,\n ticket: string,\n before: number = undefined,\n after: number = undefined\n): Promise<ContactHistoryPage> => {\n if (reset) {\n pendingRequests.forEach((controller) => {\n controller.abort();\n });\n pendingRequests = [];\n }\n\n return new Promise<ContactHistoryPage>((resolve) => {\n const controller = new AbortController();\n pendingRequests.push(controller);\n\n let url = endpoint;\n if (before) {\n url += `&before=${before}`;\n }\n\n if (after) {\n url += `&after=${after}`;\n }\n\n if (ticket) {\n url += `&ticket=${ticket}`;\n }\n\n const store = document.querySelector('temba-store') as Store;\n\n getUrl(url, controller)\n .then((response: WebResponse) => {\n // on success, remove our abort controller\n pendingRequests = pendingRequests.filter(\n (controller: AbortController) => {\n return response.controller === controller;\n }\n );\n\n const page = response.json as ContactHistoryPage;\n store.resolveUsers(page.events, ['created_by']).then(() => {\n resolve(page);\n });\n })\n .catch(() => {\n // canceled\n });\n });\n};\nexport const getDisplayName = (user: User) => {\n if (!user) {\n return 'Somebody';\n }\n\n if ((user as NamedUser).name) {\n return (user as NamedUser).name;\n }\n\n if (user.first_name && user.last_name) {\n return `${user.first_name} ${user.last_name}`;\n }\n\n if (user.first_name) {\n return user.first_name;\n }\n\n return user.email;\n};\nexport let pendingRequests: AbortController[] = [];\n"]}
|
|
1
|
+
{"version":3,"file":"ContactChat.js","sourceRoot":"","sources":["../../../src/live/ContactChat.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport { css, html, PropertyValueMap, TemplateResult } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport {\n Contact,\n CustomEventType,\n NamedUser,\n Ticket,\n User\n} from '../interfaces';\nimport {\n fetchResults,\n getUrl,\n oxfordFn,\n postJSON,\n postUrl,\n WebResponse\n} from '../utils';\nimport { ContactStoreElement } from './ContactStoreElement';\nimport { Compose, ComposeValue } from '../form/Compose';\nimport {\n AirtimeTransferredEvent,\n ChannelEvent,\n ContactEvent,\n ContactGroupsEvent,\n ContactHistoryPage,\n ContactLanguageChangedEvent,\n FlowEvent,\n MsgEvent,\n NameChangedEvent,\n OptinRequestedEvent,\n TicketEvent,\n UpdateFieldEvent,\n URNsChangedEvent\n} from '../events';\nimport { Chat, ChatEvent, MessageType } from '../display/Chat';\nimport { getUserDisplay } from '../webchat';\nimport { DEFAULT_AVATAR } from '../webchat/assets';\nimport { UserSelect } from '../form/select/UserSelect';\nimport { Select } from '../form/select/Select';\nimport { Store } from '../store/Store';\n\n/*\nexport const SCROLL_THRESHOLD = 100;\nexport const SIMULATED_WEB_SLOWNESS = 0;\nexport const MAX_CHAT_REFRESH = 10000;\nexport const MIN_CHAT_REFRESH = 500;\nexport const BODY_SNIPPET_LENGTH = 250;\n*/\n\nexport enum Events {\n MESSAGE_CREATED = 'msg_created',\n MESSAGE_RECEIVED = 'msg_received',\n BROADCAST_CREATED = 'broadcast_created',\n IVR_CREATED = 'ivr_created',\n FLOW_ENTERED = 'flow_entered',\n\n FLOW_EXITED = 'flow_exited',\n CONTACT_FIELD_CHANGED = 'contact_field_changed',\n CONTACT_GROUPS_CHANGED = 'contact_groups_changed',\n CONTACT_NAME_CHANGED = 'contact_name_changed',\n CONTACT_URNS_CHANGED = 'contact_urns_changed',\n CHANNEL_EVENT = 'channel_event',\n CONTACT_LANGUAGE_CHANGED = 'contact_language_changed',\n AIRTIME_TRANSFERRED = 'airtime_transferred',\n CALL_STARTED = 'call_started',\n NOTE_CREATED = 'note_created',\n TICKET_ASSIGNED = 'ticket_assigned',\n TICKET_NOTE_ADDED = 'ticket_note_added',\n TICKET_CLOSED = 'ticket_closed',\n TICKET_OPENED = 'ticket_opened',\n TICKET_REOPENED = 'ticket_reopened',\n TICKET_TOPIC_CHANGED = 'ticket_topic_changed',\n OPTIN_REQUESTED = 'optin_requested'\n}\n\nconst renderInfoList = (singular: string, plural: string, items: any[]) => {\n if (items.length === 1) {\n return `${singular} **${items[0].name}**`;\n } else {\n const list = items.map((item) => `**${item.name}**`);\n if (list.length === 2) {\n return `${plural} ${list.join(' and ')}`;\n } else {\n const last = list.pop();\n return `${plural} ${list.join(', ')}, and ${last}`;\n }\n }\n};\n\nconst renderChannelEvent = (event: ChannelEvent): string => {\n if (event.event.type === 'mt_miss') {\n return 'Missed outgoing call';\n } else if (event.event.type === 'mo_miss') {\n return 'Missed incoming call';\n } else if (event.event.type === 'new_conversation') {\n return 'Started conversation';\n } else if (event.channel_event_type === 'welcome_message') {\n return 'Welcome Message Sent';\n } else if (event.event.type === 'referral') {\n return 'Referred';\n } else if (event.event.type === 'follow') {\n return 'Followed';\n } else if (event.event.type === 'stop_contact') {\n return 'Stopped';\n } else if (event.event.type === 'mt_call') {\n return 'Outgoing Phone Call';\n } else if (event.event.type == 'mo_call') {\n return 'Incoming Phone call';\n } else if (event.event.type == 'optin') {\n return `Opted in to **${event.event.optin?.name}**`;\n } else if (event.event.type == 'optout') {\n return `Opted out of **${event.event.optin?.name}**`;\n }\n};\n\nconst renderFlowEvent = (event: FlowEvent): string => {\n let verb = 'Interrupted';\n if (event.status !== 'I') {\n if (event.type === Events.FLOW_ENTERED) {\n verb = 'Started';\n } else {\n verb = 'Completed';\n }\n }\n return `${verb} [**${event.flow.name}**](/flow/editor/${event.flow.uuid}/)`;\n};\n\nconst renderUpdateEvent = (event: UpdateFieldEvent): string => {\n return event.value\n ? `Updated **${event.field.name}** to **${event.value.text}**`\n : `Cleared **${event.field.name}**`;\n};\n\nconst renderNameChanged = (event: NameChangedEvent): string => {\n return `Updated **Contact Name** to **${event.name}**`;\n};\n\nconst renderContactURNsChanged = (event: URNsChangedEvent): string => {\n return `Updated **URNs** to ${oxfordFn(\n event.urns,\n (urn: string) => `**${urn.split(':')[1].split('?')[0]}**`\n )}`;\n};\n\nexport const renderTicketAction = (\n event: TicketEvent,\n action: string\n): string => {\n if (event.created_by) {\n return `**${getUserDisplay(\n event.created_by\n )}** ${action} a **[ticket](/ticket/all/closed/${event.ticket.uuid}/)**`;\n }\n return `A **[ticket](/ticket/all/closed/${event.ticket.uuid}/)** was **${action}**`;\n};\n\nexport const renderTicketAssigned = (event: TicketEvent): string => {\n return event.assignee\n ? event.assignee.id === event.created_by.id\n ? `**${getDisplayName(event.created_by)}** took this ticket`\n : `${getDisplayName(\n event.created_by\n )} assigned this ticket to **${getDisplayName(event.assignee)}**`\n : `**${getDisplayName(event.created_by)}** unassigned this ticket`;\n};\n\nexport const renderContactGroupsEvent = (event: ContactGroupsEvent): string => {\n const groupsEvent = event as ContactGroupsEvent;\n if (groupsEvent.groups_added) {\n return renderInfoList(\n 'Added to group',\n 'Added to groups',\n groupsEvent.groups_added\n );\n } else if (groupsEvent.groups_removed) {\n return renderInfoList(\n 'Removed from group',\n 'Removed from groups',\n groupsEvent.groups_removed\n );\n }\n};\n\nexport const renderTicketOpened = (event: TicketEvent): string => {\n return `${event.ticket.topic.name} ticket was opened`;\n};\n\nexport const renderAirtimeTransferredEvent = (\n event: AirtimeTransferredEvent\n): string => {\n if (parseFloat(event.actual_amount) === 0) {\n return `Airtime transfer failed`;\n }\n return `Transferred **${event.actual_amount}** ${event.currency} of airtime`;\n};\n\nexport const renderCallStartedEvent = (): string => {\n return `Call Started`;\n};\n\nexport const renderContactLanguageChangedEvent = (\n event: ContactLanguageChangedEvent\n): string => {\n return `Language updated to **${event.language}**`;\n};\n\nexport const renderOptinRequested = (event: OptinRequestedEvent): string => {\n return `Requested opt-in for ${event.optin.name}`;\n};\n\nexport class ContactChat extends ContactStoreElement {\n public static get styles() {\n return css`\n :host {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n min-height: 0;\n --compose-shadow: none;\n --compose-border: none;\n --compose-padding: 3px;\n --compose-curvature: none;\n border-top: 1px inset rgba(0, 0, 0, 0.05);\n\n\n }\n\n .chat-wrapper {\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n min-height: 0;\n background: #f9f9f9;\n }\n\n temba-contact-history {\n border-bottom: 1px solid #f6f6f6;\n flex-grow: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .compose {\n background: #fff;\n display: flex;\n flex-direction: column;\n --textarea-min-height: 8em;\n --textarea-height: 0.5em;\n --widget-box-shadow-focused: none;\n --compose-curvature: 0px;\n overflow: hidden;\n }\n\n .closed-footer {\n padding: 1em;\n background: #f2f2f2;\n border-top: 3px solid #e1e1e1;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n a {\n color: var(--color-link-primary);\n }\n\n a:hover {\n text-decoration: underline;\n color: var(--color-link-primary-hover);\n }\n\n temba-button {\n margin: 0.1em 0.25em;\n }\n\n temba-completion {\n --widget-box-shadow: none;\n --color-widget-border: transparent;\n --widget-box-shadow-focused: none;\n --color-focus: transparent;\n --color-widget-bg-focused: transparent;\n }\n\n .border {\n }\n\n temba-compose {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n --temba-tabs-options-padding: 0.5em 0.5em 0 0.5em;\n --temba-tabs-border-left: none;\n --temba-tabs-border-right: none;\n --temba-tabs-border-bottom: none;\n }\n\n .error-gutter {\n display: flex;\n padding: 0.5em 1em;\n background: #f9f9f9;\n item-align: center;\n }\n\n .error-message {\n color: var(--color-error);\n padding-right: 1em;\n flex-grow: 1;\n align-self: center;\n }\n\n temba-chat {\n border-bottom: 1px solid #ddd;\n background: linear-gradient(0deg, #fff, #fff);\n --chat-border-in: 1px solid #eee;\n --color-chat-out: var(--color-message)\n );\n }\n\n .action-bar {\n }\n\n .in-flow {\n border-radius: 0.8em;\n align-items: center;\n background: #666;\n padding: 0.5em 1em;\n margin: 1em;\n margin-right: 2em;\n display: inline-flex;\n opacity: 0.9;\n }\n\n .in-flow:hover {\n opacity: 1;\n }\n\n .in-flow .flow-name {\n display: flex;\n color: #fff;\n }\n\n .in-flow a {\n font-weight: bold;\n color: #fff;\n }\n\n .in-flow .interrupt-button {\n margin-left: 1em;\n }\n\n .in-flow .interrupt {\n text-align: center;\n align-self: stretch;\n display: flex;\n align-items: center;\n cursor: pointer;\n justify-content: center;\n padding: 0.5em 1em;\n font-weight: bold;\n }\n\n .in-flow .interrupt:hover {\n background: rgba(var(--error-rgb), 0.92);\n }\n\n .in-flow temba-icon,\n .in-ticket temba-icon {\n margin-right: 0.5em;\n }\n\n .in-ticket-wrapper {\n }\n\n .in-ticket {\n box-shadow: none;\n padding: 0.5em 0.5em;\n text-align: center;\n align-items: center;\n border-bottom: 1px solid #ddd;\n display: flex;\n box-shadow: none;\n margin: 0em;\n background: rgba(0, 0, 0, 0.03);\n }\n\n temba-user {\n border: 1px solid #ddd;\n padding: 0.2em 0.5em;\n border-radius: var(--curvature);\n min-width: 10em;\n background: #fff;\n }\n\n temba-user:hover {\n border: 1px solid #ddd;\n background: #f9f9f9;\n }\n\n .assign-button {\n --button-mask: #ebebeb;\n color: #333;\n margin: 0.25em;\n }\n\n temba-user-select {\n width: 250px;\n }\n\n temba-button {\n --button-border: 1px solid #ddd;\n }\n `;\n }\n\n @property({ type: String, attribute: 'ticket' })\n ticketUUID: string;\n\n @property({ type: String })\n contactsEndpoint = '/api/v2/contacts.json';\n\n @property({ type: String })\n currentNote = '';\n\n @property({ type: Boolean })\n showDetails = true;\n\n @property({ type: Object })\n currentTicket: Ticket = null;\n\n @property({ type: Object })\n currentContact: Contact = null;\n\n @property({ type: String })\n agent = '';\n\n @property({ type: Boolean })\n blockFetching = false;\n\n @property({ type: Boolean })\n showInterrupt = false;\n\n @property({ type: String })\n avatar = DEFAULT_AVATAR;\n\n @property({ type: String })\n errorMessage: string;\n\n // http promise to monitor for completeness\n public httpComplete: Promise<void>;\n private chat: Chat;\n\n ticket = null;\n lastEventTime = null;\n newestEventTime = null;\n refreshId = null;\n polling = false;\n\n constructor() {\n super();\n }\n\n public firstUpdated(\n changed: PropertyValueMap<any> | Map<PropertyKey, unknown>\n ): void {\n super.firstUpdated(changed);\n }\n\n public connectedCallback() {\n super.connectedCallback();\n this.chat = this.shadowRoot.querySelector('temba-chat');\n }\n\n public disconnectedCallback() {\n super.disconnectedCallback();\n if (this.refreshId) {\n clearInterval(this.refreshId);\n }\n }\n\n public updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n\n // if we don't have an endpoint infer one\n if (\n changedProperties.has('data') ||\n changedProperties.has('currentContact')\n ) {\n // unschedule any previous refreshes\n if (this.refreshId) {\n clearTimeout(this.refreshId);\n this.refreshId = null;\n }\n\n this.currentContact = this.data;\n }\n\n if (changedProperties.has('currentContact')) {\n this.chat = this.shadowRoot.querySelector('temba-chat');\n this.reset();\n this.fetchPreviousMessages();\n }\n }\n\n private reset() {\n if (this.chat) {\n this.chat.reset();\n }\n this.blockFetching = false;\n this.ticket = null;\n this.lastEventTime = null;\n this.newestEventTime = null;\n this.refreshId = null;\n this.polling = false;\n this.errorMessage = null;\n\n const compose = this.shadowRoot.querySelector('temba-compose') as Compose;\n if (compose) {\n compose.reset();\n }\n }\n\n private handleInterrupt() {\n this.fireCustomEvent(CustomEventType.Interrupt, {\n contact: this.currentContact\n });\n }\n\n private handleRetry() {\n const compose = this.shadowRoot.querySelector('temba-compose') as Compose;\n compose.triggerSend();\n }\n\n private handleSend(evt: CustomEvent) {\n this.errorMessage = null;\n const composeEle = evt.currentTarget as Compose;\n const compose = evt.detail.langValues['und'] as ComposeValue;\n\n const payload = {\n contact: this.currentContact.uuid\n };\n\n const text = compose.text;\n if (text && text.length > 0) {\n payload['text'] = text;\n }\n const attachments = compose.attachments;\n if (attachments && attachments.length > 0) {\n const attachment_uuids = attachments.map((attachment) => attachment.uuid);\n payload['attachments'] = attachment_uuids;\n }\n\n if (this.currentTicket) {\n payload['ticket'] = this.currentTicket.uuid;\n }\n\n const genericError = 'Send failed, please try again.';\n postJSON(`/api/v2/messages.json`, payload)\n .then((response) => {\n if (response.status < 400) {\n this.checkForNewMessages();\n composeEle.reset();\n this.fireCustomEvent(CustomEventType.MessageSent, { msg: payload });\n } else {\n this.errorMessage = genericError;\n }\n })\n .catch(() => {\n this.errorMessage = genericError;\n });\n }\n\n private getEndpoint() {\n if (this.contact) {\n return `/contact/history/${this.contact}/?_format=json`;\n }\n return null;\n }\n\n private scheduleRefresh() {\n // knock five seconds off the newest event time so we are\n // a little more aggressive about refreshing short term\n let window = new Date().getTime() - this.newestEventTime / 1000 - 5000;\n\n if (this.refreshId) {\n clearTimeout(this.refreshId);\n this.refreshId = null;\n }\n\n // wait no longer than 15 seconds\n window = Math.min(window, 15000);\n\n // wait at least 2 seconds\n window = Math.max(window, 2000);\n\n this.refreshId = setTimeout(() => {\n this.checkForNewMessages();\n }, window);\n }\n\n public getEventMessage(event: ContactEvent): ChatEvent {\n let message = null;\n switch (event.type) {\n case Events.TICKET_OPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'opened')\n };\n break;\n case Events.TICKET_ASSIGNED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAssigned(event as TicketEvent)\n };\n break;\n case Events.TICKET_REOPENED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'reopened')\n };\n break;\n case Events.TICKET_CLOSED:\n message = {\n type: MessageType.Inline,\n text: renderTicketAction(event as TicketEvent, 'closed')\n };\n break;\n case Events.TICKET_TOPIC_CHANGED:\n message = {\n type: MessageType.Inline,\n text: `Topic changed to **${(event as TicketEvent).topic.name}**`\n };\n break;\n case Events.FLOW_ENTERED:\n case Events.FLOW_EXITED:\n message = {\n type: MessageType.Inline,\n text: renderFlowEvent(event as FlowEvent)\n };\n break;\n case Events.CONTACT_FIELD_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderUpdateEvent(event as UpdateFieldEvent)\n };\n break;\n case Events.CONTACT_NAME_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderNameChanged(event as NameChangedEvent)\n };\n break;\n case Events.CONTACT_URNS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactURNsChanged(event as URNsChangedEvent)\n };\n break;\n case Events.CONTACT_GROUPS_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactGroupsEvent(event as ContactGroupsEvent)\n };\n break;\n case Events.AIRTIME_TRANSFERRED:\n message = {\n type: MessageType.Inline,\n text: renderAirtimeTransferredEvent(event as AirtimeTransferredEvent)\n };\n break;\n case Events.CALL_STARTED:\n message = {\n type: MessageType.Inline,\n text: renderCallStartedEvent()\n };\n break;\n case Events.CHANNEL_EVENT:\n message = {\n type: MessageType.Inline,\n text: renderChannelEvent(event as ChannelEvent)\n };\n break;\n case Events.CONTACT_LANGUAGE_CHANGED:\n message = {\n type: MessageType.Inline,\n text: renderContactLanguageChangedEvent(\n event as ContactLanguageChangedEvent\n )\n };\n break;\n case Events.OPTIN_REQUESTED:\n message = {\n type: MessageType.Inline,\n text: renderOptinRequested(event as OptinRequestedEvent)\n };\n break;\n }\n\n if (message && event.created_on) {\n message.date = new Date(event.created_on);\n } else {\n console.error('Unknown event type', event);\n }\n\n return message;\n }\n\n private getUserForEvent(event: MsgEvent | TicketEvent) {\n let user = null;\n if (event.type === 'msg_received') {\n user = {\n name: this.currentContact.name\n };\n } else if (event.created_by) {\n user = {\n email: event.created_by.email,\n name: `${event.created_by.first_name} ${event.created_by.last_name}`.trim(),\n avatar: event.created_by.avatar\n };\n }\n return user;\n }\n\n private createMessages(page: ContactHistoryPage): ChatEvent[] {\n if (page.events) {\n let messages = [];\n page.events.forEach((event) => {\n const ts = new Date(event.created_on).getTime() * 1000;\n if (ts > this.newestEventTime) {\n this.newestEventTime = ts;\n }\n\n if (event.type === 'ticket_note_added') {\n const ticketEvent = event as TicketEvent;\n messages.push({\n type: MessageType.Note,\n id: event.created_on + event.type,\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n });\n } else if (event.type === 'ticket_opened') {\n // ticket open events can have a note attached\n const ticketEvent = event as TicketEvent;\n messages.push({\n type: MessageType.Note,\n id: event.created_on + event.type + '_note',\n user: this.getUserForEvent(ticketEvent),\n date: new Date(ticketEvent.created_on),\n text: ticketEvent.note\n });\n\n // but the opening of the ticket is a normal event\n messages.push(this.getEventMessage(event));\n } else if (\n event.type === 'msg_created' ||\n event.type === 'msg_received' ||\n event.type === 'broadcast_created'\n ) {\n const msgEvent = event as MsgEvent;\n messages.push({\n id: event.uuid,\n type: msgEvent.type === 'msg_received' ? 'msg_in' : 'msg_out',\n user: this.getUserForEvent(msgEvent),\n date: new Date(msgEvent.created_on),\n attachments: msgEvent.msg.attachments,\n text: msgEvent.msg.text,\n sendError: msgEvent.status === 'E' || msgEvent.status === 'F',\n popup: html`<div\n style=\"display: flex; flex-direction: row; align-items:center; justify-content: space-between;font-size:0.9em;line-height:1em;min-width:10em\"\n >\n <div style=\"justify-content:left;text-align:left\">\n <temba-date\n value=${msgEvent.created_on}\n display=\"duration\"\n ></temba-date>\n\n ${msgEvent.optin\n ? html`<div style=\"font-size:0.9em;color:#aaa\">\n ${msgEvent.optin.name}\n </div>`\n : null}\n ${msgEvent.failed_reason_display\n ? html`\n <div\n style=\"margin-top:0.2em;margin-right: 0.5em;min-width:10em;max-width:15em;color:var(--color-error);font-size:0.9em\"\n >\n ${msgEvent.failed_reason_display}\n </div>\n `\n : null}\n </div>\n ${msgEvent.logs_url\n ? html`<a style=\"margin-left:0.5em\" href=\"${msgEvent.logs_url}\"\n ><temba-icon name=\"log\"></temba-icon\n ></a>`\n : null}\n </div> `\n });\n } else {\n messages.push(this.getEventMessage(event));\n }\n });\n\n // remove any messages we don't recognize\n messages = messages.filter((msg) => !!msg);\n return messages as ChatEvent[];\n }\n return [];\n }\n\n private checkForNewMessages() {\n // we are already working on it\n if (this.polling) {\n return;\n }\n\n const chat = this.chat;\n const contactChat = this;\n if (this.currentContact && this.newestEventTime) {\n this.polling = true;\n const endpoint = this.getEndpoint();\n if (!endpoint) {\n return;\n }\n\n const fetchContact = this.currentContact.uuid;\n\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n null,\n this.newestEventTime\n ).then((page: ContactHistoryPage) => {\n if (fetchContact === this.currentContact.uuid) {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n messages.reverse();\n chat.addMessages(messages, null, true);\n }\n this.polling = false;\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchPreviousMessages() {\n const chat = this.chat;\n const contactChat = this;\n if (!chat || chat.fetching || contactChat.blockFetching) {\n return;\n }\n\n chat.fetching = true;\n if (this.currentContact) {\n const endpoint = this.getEndpoint();\n if (!endpoint) {\n return;\n }\n\n fetchContactHistory(\n false,\n endpoint,\n this.currentTicket?.uuid,\n this.lastEventTime\n ).then((page: ContactHistoryPage) => {\n this.lastEventTime = page.next_before;\n const messages = this.createMessages(page);\n messages.reverse();\n\n if (messages.length === 0) {\n contactChat.blockFetching = true;\n }\n chat.addMessages(messages);\n this.scheduleRefresh();\n });\n }\n }\n\n private fetchComplete() {\n if (this.chat) {\n this.chat.fetching = false;\n }\n }\n\n private getTembaCompose(): TemplateResult {\n if (this.currentTicket) {\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n if (!this.currentTicket.closed_on) {\n //chatbox for active contacts with an open ticket\n return this.getCompose();\n } else {\n return null;\n }\n }\n }\n\n if (this.currentContact && this.currentContact.status !== 'active') {\n //no chatbox for archived, blocked, or stopped contacts\n return null;\n } else {\n //chatbox for active contacts\n return this.getCompose();\n }\n }\n\n private getCompose(): TemplateResult {\n return html`<div class=\"border\"></div>\n <div class=\"compose\">\n <temba-compose\n attachments\n counter\n autogrow\n shortcuts\n ?embeddedTabs=${!this.currentTicket}\n @temba-submitted=${this.handleSend.bind(this)}\n >\n </temba-compose>\n ${this.errorMessage\n ? html` <div class=\"error-gutter\">\n <div class=\"error-message\">${this.errorMessage}</div>\n <temba-button\n name=\"Retry\"\n @click=${this.handleRetry}\n ></temba-button>\n </div>`\n : null}\n </div>`;\n }\n\n private handleAssignmentChanged(evt: CustomEvent) {\n const users = evt.currentTarget as UserSelect;\n const assignee = users.values[0];\n\n this.assignTicket(assignee ? assignee.email : null);\n users.blur();\n }\n\n private handleTopicChanged(evt: CustomEvent) {\n const select = evt.target as Select<any>;\n const topic = select.values[0];\n\n if (this.currentTicket.topic.uuid !== topic.uuid) {\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [this.currentTicket.uuid],\n action: 'change_topic',\n topic: topic.uuid\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n }\n\n public assignTicket(email: string) {\n // if its already assigned to use, it's a noop\n if (\n (this.currentTicket.assignee &&\n this.currentTicket.assignee.email === email) ||\n (this.currentTicket.assignee === null && email === null)\n ) {\n return;\n }\n\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [this.currentTicket.uuid],\n action: 'assign',\n assignee: email\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n return true;\n }\n\n public refreshTicket() {\n if (this.currentTicket) {\n fetchResults(`/api/v2/tickets.json?uuid=${this.currentTicket.uuid}`).then(\n (values) => {\n this.store.resolveUsers(values, ['assignee']).then(() => {\n if (values.length > 0) {\n this.fireCustomEvent(CustomEventType.TicketUpdated, {\n ticket: values[0],\n previous: this.currentTicket\n });\n this.currentTicket = values[0];\n }\n });\n }\n );\n }\n }\n\n private handleReopen() {\n const uuid = this.currentTicket.uuid;\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'reopen'\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n private handleClose() {\n const uuid = this.currentTicket.uuid;\n postJSON(`/api/v2/ticket_actions.json`, {\n tickets: [uuid],\n action: 'close'\n })\n .then(() => {\n this.refreshTicket();\n })\n .catch((response: any) => {\n console.error(response);\n });\n }\n\n public render(): TemplateResult {\n const inFlow = this.currentContact && this.currentContact.flow;\n\n const inTicket = this.currentTicket;\n const ticketClosed = this.currentTicket && this.currentTicket.closed_on;\n\n return html`<div class=\"chat-wrapper\">\n ${this.currentContact\n ? html`<temba-chat\n @temba-scroll-threshold=${this.fetchPreviousMessages}\n @temba-fetch-complete=${this.fetchComplete}\n avatar=${this.avatar}\n agent\n >\n ${inFlow\n ? html`\n <div slot=\"footer\" style=\"text-align:center;\">\n <div class=\"in-flow\">\n <div class=\"flow-name\">\n <temba-icon name=\"flow\" size=\"1.2\"></temba-icon>\n <div>\n Currently in\n <a\n href=\"/flow/editor/${this.currentContact.flow\n .uuid}/\"\n >${this.currentContact.flow.name}</a\n >\n </div>\n </div>\n ${this.showInterrupt\n ? html`<temba-button\n class=\"interrupt-button\"\n destructive\n small\n @click=${this.handleInterrupt}\n name=\"Interrupt\"\n >\n </temba-button>`\n : null}\n </div>\n </div>\n `\n : null}\n <div slot=\"footer\"></div>\n </temba-chat>\n ${inTicket\n ? html`<div class=\"in-ticket-wrapper\">\n <div class=\"in-ticket\">\n <temba-user-select\n placeholder=\"Assign to..\"\n searchable\n searchOnFocus\n clearable\n .values=${this.currentTicket.assignee\n ? [this.currentTicket.assignee]\n : []}\n @change=${this.handleAssignmentChanged}\n ?disabled=${ticketClosed}\n ></temba-user-select>\n\n <temba-select\n style=\"margin:0 0.5em; flex-grow:1\"\n endpoint=\"/api/v2/topics.json\"\n searchable\n valuekey=\"uuid\"\n .values=${[this.currentTicket.topic]}\n @change=${this.handleTopicChanged}\n ?disabled=${ticketClosed}\n ></temba-select>\n\n ${this.currentTicket.closed_on\n ? html`\n <temba-button\n name=\"Reopen\"\n @click=${this.handleReopen}\n ></temba-button>\n `\n : html`\n <temba-button\n name=\"Close\"\n destructive\n @click=${this.handleClose}\n ></temba-button>\n `}\n </div>\n </div> `\n : null}\n ${this.getTembaCompose()}`\n : null}\n </div>`;\n }\n}\nexport const closeTicket = (uuid: string): Promise<WebResponse> => {\n const formData = new FormData();\n formData.append('status', 'C');\n return postUrl(`/ticket/update/${uuid}/?_format=json`, formData);\n};\nexport const fetchContact = (endpoint: string): Promise<Contact> => {\n return new Promise<Contact>((resolve, reject) => {\n fetchResults(endpoint).then((contacts: Contact[]) => {\n if (contacts && contacts.length === 1) {\n resolve(contacts[0]);\n } else {\n reject('No contact found');\n }\n });\n });\n};\nexport const fetchContactHistory = (\n reset: boolean,\n endpoint: string,\n ticket: string,\n before: number = undefined,\n after: number = undefined\n): Promise<ContactHistoryPage> => {\n if (reset) {\n pendingRequests.forEach((controller) => {\n controller.abort();\n });\n pendingRequests = [];\n }\n\n return new Promise<ContactHistoryPage>((resolve) => {\n const controller = new AbortController();\n pendingRequests.push(controller);\n\n let url = endpoint;\n if (before) {\n url += `&before=${before}`;\n }\n\n if (after) {\n url += `&after=${after}`;\n }\n\n if (ticket) {\n url += `&ticket=${ticket}`;\n }\n\n const store = document.querySelector('temba-store') as Store;\n\n getUrl(url, controller)\n .then((response: WebResponse) => {\n // on success, remove our abort controller\n pendingRequests = pendingRequests.filter(\n (controller: AbortController) => {\n return response.controller === controller;\n }\n );\n\n const page = response.json as ContactHistoryPage;\n store.resolveUsers(page.events, ['created_by']).then(() => {\n resolve(page);\n });\n })\n .catch(() => {\n // canceled\n });\n });\n};\nexport const getDisplayName = (user: User) => {\n if (!user) {\n return 'Somebody';\n }\n\n if ((user as NamedUser).name) {\n return (user as NamedUser).name;\n }\n\n if (user.first_name && user.last_name) {\n return `${user.first_name} ${user.last_name}`;\n }\n\n if (user.first_name) {\n return user.first_name;\n }\n\n return user.email;\n};\nexport let pendingRequests: AbortController[] = [];\n"]}
|
|
@@ -489,6 +489,79 @@ describe('temba-select', () => {
|
|
|
489
489
|
expect(select.values[0].name).to.equal('Green');
|
|
490
490
|
await assertScreenshot('select/static-initial-via-selected', getClip(select));
|
|
491
491
|
});
|
|
492
|
+
it('fires change event when static option sets initial value', async () => {
|
|
493
|
+
const changeEvent = sinon.spy();
|
|
494
|
+
// Create a basic select element with manual HTML
|
|
495
|
+
const parentNode = document.createElement('div');
|
|
496
|
+
parentNode.innerHTML = `<temba-select name="test">
|
|
497
|
+
<temba-option name="Red" value="0"></temba-option>
|
|
498
|
+
<temba-option name="Green" value="1" selected></temba-option>
|
|
499
|
+
<temba-option name="Blue" value="2"></temba-option>
|
|
500
|
+
</temba-select>`;
|
|
501
|
+
const select = parentNode.querySelector('temba-select');
|
|
502
|
+
document.body.appendChild(parentNode);
|
|
503
|
+
// Add event listener before triggering initialization
|
|
504
|
+
select.addEventListener('change', changeEvent);
|
|
505
|
+
// Manually trigger slot change to process the selected attribute
|
|
506
|
+
select.handleSlotChange();
|
|
507
|
+
clock.runAll();
|
|
508
|
+
await select.updateComplete;
|
|
509
|
+
// The change event should have been fired when the initial value was set
|
|
510
|
+
assert(changeEvent.called, 'change event should fire when static option sets initial value');
|
|
511
|
+
expect(select.values[0].name).to.equal('Green');
|
|
512
|
+
document.body.removeChild(parentNode);
|
|
513
|
+
});
|
|
514
|
+
it('fires change event when static option sets initial value via value attribute', async () => {
|
|
515
|
+
const changeEvent = sinon.spy();
|
|
516
|
+
// Create a basic select element with value attribute
|
|
517
|
+
const parentNode = document.createElement('div');
|
|
518
|
+
parentNode.innerHTML = `<temba-select name="test" value="1">
|
|
519
|
+
<temba-option name="Red" value="0"></temba-option>
|
|
520
|
+
<temba-option name="Green" value="1"></temba-option>
|
|
521
|
+
<temba-option name="Blue" value="2"></temba-option>
|
|
522
|
+
</temba-select>`;
|
|
523
|
+
const select = parentNode.querySelector('temba-select');
|
|
524
|
+
document.body.appendChild(parentNode);
|
|
525
|
+
// Add event listener before triggering initialization
|
|
526
|
+
select.addEventListener('change', changeEvent);
|
|
527
|
+
// First process the static options
|
|
528
|
+
select.handleSlotChange();
|
|
529
|
+
// Then check for selected option based on value attribute
|
|
530
|
+
select.setSelectedValue(select.getAttribute('value'));
|
|
531
|
+
clock.runAll();
|
|
532
|
+
await select.updateComplete;
|
|
533
|
+
// The change event should have been fired when the initial value was set
|
|
534
|
+
assert(changeEvent.called, 'change event should fire when value attribute sets initial value');
|
|
535
|
+
expect(select.values[0].name).to.equal('Green');
|
|
536
|
+
document.body.removeChild(parentNode);
|
|
537
|
+
});
|
|
538
|
+
it('creates proper form inputs for static options', async () => {
|
|
539
|
+
// Create a form with a select that has static options
|
|
540
|
+
const form = document.createElement('form');
|
|
541
|
+
form.innerHTML = `<temba-select name="color" value="1">
|
|
542
|
+
<temba-option name="Red" value="0"></temba-option>
|
|
543
|
+
<temba-option name="Green" value="1"></temba-option>
|
|
544
|
+
<temba-option name="Blue" value="2"></temba-option>
|
|
545
|
+
</temba-select>`;
|
|
546
|
+
document.body.appendChild(form);
|
|
547
|
+
const select = form.querySelector('temba-select');
|
|
548
|
+
// Wait for component to be ready
|
|
549
|
+
await select.updateComplete;
|
|
550
|
+
// Process the static options and set initial value
|
|
551
|
+
select.handleSlotChange();
|
|
552
|
+
select.setSelectedValue(select.getAttribute('value'));
|
|
553
|
+
clock.runAll();
|
|
554
|
+
await select.updateComplete;
|
|
555
|
+
// Check that the select has the correct value
|
|
556
|
+
expect(select.values[0].name).to.equal('Green');
|
|
557
|
+
expect(select.values[0].value).to.equal('1');
|
|
558
|
+
// For single-mode selects, check the value property
|
|
559
|
+
expect(select.value).to.equal('1');
|
|
560
|
+
// Test FormData - it should include the select's value
|
|
561
|
+
const formData = new FormData(form);
|
|
562
|
+
expect(formData.get('color')).to.equal('1');
|
|
563
|
+
document.body.removeChild(form);
|
|
564
|
+
});
|
|
492
565
|
});
|
|
493
566
|
describe('endpoints', () => {
|
|
494
567
|
it('can load from an endpoint', async () => {
|